Remove code related to the wat scanner (#19153)
This commit is contained in:
Родитель
f5265e7ad2
Коммит
6ea321ace0
|
@ -4,7 +4,6 @@ services:
|
||||||
worker:
|
worker:
|
||||||
depends_on:
|
depends_on:
|
||||||
- customs
|
- customs
|
||||||
- wat
|
|
||||||
|
|
||||||
customs:
|
customs:
|
||||||
build:
|
build:
|
||||||
|
@ -16,14 +15,3 @@ services:
|
||||||
- "nginx:olympia.test"
|
- "nginx:olympia.test"
|
||||||
depends_on:
|
depends_on:
|
||||||
- web
|
- web
|
||||||
|
|
||||||
wat:
|
|
||||||
build:
|
|
||||||
context: ./private/addons-wat
|
|
||||||
environment:
|
|
||||||
- ALLOWED_ORIGIN=http://olympia.test
|
|
||||||
- PORT=10102
|
|
||||||
links:
|
|
||||||
- "nginx:olympia.test"
|
|
||||||
depends_on:
|
|
||||||
- web
|
|
||||||
|
|
|
@ -7,7 +7,6 @@ This folder should contain some of our private tools. In the following, we descr
|
||||||
Make sure to clone:
|
Make sure to clone:
|
||||||
|
|
||||||
1. the `customs` repo in `private/addons-customs-scanner`
|
1. the `customs` repo in `private/addons-customs-scanner`
|
||||||
2. the `wat` repo in `private/addons-wat`
|
|
||||||
|
|
||||||
Specify the [`docker-compose.private.yml`](../docker-compose.private.yml) file to `docker-compose` (together with the default [`docker-compose.yml`](../docker-compose.yml) file) to build the Docker images:
|
Specify the [`docker-compose.private.yml`](../docker-compose.private.yml) file to `docker-compose` (together with the default [`docker-compose.yml`](../docker-compose.yml) file) to build the Docker images:
|
||||||
|
|
||||||
|
@ -30,15 +29,6 @@ $ make shell
|
||||||
$ [root@<docker>:/code#] ./manage.py waffle_switch enable-customs on
|
$ [root@<docker>:/code#] ./manage.py waffle_switch enable-customs on
|
||||||
```
|
```
|
||||||
|
|
||||||
### wat
|
|
||||||
|
|
||||||
A waffle switch is used to enable/disable the `wat` Celery task:
|
|
||||||
|
|
||||||
```
|
|
||||||
$ make shell
|
|
||||||
$ [root@<docker>:/code#] ./manage.py waffle_switch enable-wat on
|
|
||||||
```
|
|
||||||
|
|
||||||
## Yara
|
## Yara
|
||||||
|
|
||||||
If you have access to `yara`, you should first clone it in `private/addons-yara`.
|
If you have access to `yara`, you should first clone it in `private/addons-yara`.
|
||||||
|
|
|
@ -152,8 +152,6 @@ INBOUND_EMAIL_VALIDATION_KEY = 'totally-unsecure-validation-string'
|
||||||
# Sectools
|
# Sectools
|
||||||
CUSTOMS_API_URL = 'http://customs:10101/'
|
CUSTOMS_API_URL = 'http://customs:10101/'
|
||||||
CUSTOMS_API_KEY = 'customssecret'
|
CUSTOMS_API_KEY = 'customssecret'
|
||||||
WAT_API_URL = 'http://wat:10102/'
|
|
||||||
WAT_API_KEY = 'watsecret'
|
|
||||||
|
|
||||||
REMOTE_SETTINGS_IS_TEST_SERVER = True
|
REMOTE_SETTINGS_IS_TEST_SERVER = True
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,14 @@ from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
CUSTOMS = 1
|
CUSTOMS = 1
|
||||||
WAT = 2
|
# We do not use the WAT scanner anymore but we keep this constant for the model
|
||||||
|
# definition. We shouldn't use this constant, though.
|
||||||
|
# See: https://github.com/mozilla/addons-server/issues/19152
|
||||||
|
_WAT = 2
|
||||||
YARA = 3
|
YARA = 3
|
||||||
MAD = 4
|
MAD = 4
|
||||||
|
|
||||||
SCANNERS = {CUSTOMS: 'customs', WAT: 'wat', YARA: 'yara', MAD: 'mad'}
|
SCANNERS = {CUSTOMS: 'customs', _WAT: 'wat', YARA: 'yara', MAD: 'mad'}
|
||||||
|
|
||||||
# Action IDs are also used for severity (the higher, the more severe).
|
# Action IDs are also used for severity (the higher, the more severe).
|
||||||
# The field is a PositiveSmallIntegerField, it should go up to 65535.
|
# The field is a PositiveSmallIntegerField, it should go up to 65535.
|
||||||
|
|
|
@ -27,7 +27,7 @@ from olympia.applications.models import AppVersion
|
||||||
from olympia.devhub import tasks, utils
|
from olympia.devhub import tasks, utils
|
||||||
from olympia.files.tasks import repack_fileupload
|
from olympia.files.tasks import repack_fileupload
|
||||||
from olympia.files.tests.test_models import UploadMixin
|
from olympia.files.tests.test_models import UploadMixin
|
||||||
from olympia.scanners.tasks import run_customs, run_wat, run_yara, call_mad_api
|
from olympia.scanners.tasks import run_customs, run_yara, call_mad_api
|
||||||
from olympia.versions.models import Version
|
from olympia.versions.models import Version
|
||||||
|
|
||||||
|
|
||||||
|
@ -439,49 +439,6 @@ class TestValidator(UploadMixin, TestCase):
|
||||||
tasks.handle_upload_validation_result.s(file_upload.pk, channel, False),
|
tasks.handle_upload_validation_result.s(file_upload.pk, channel, False),
|
||||||
)
|
)
|
||||||
|
|
||||||
@mock.patch('olympia.devhub.utils.chain')
|
|
||||||
def test_adds_run_wat_when_enabled(self, mock_chain):
|
|
||||||
self.create_switch('enable-wat', active=True)
|
|
||||||
file_upload = self.get_upload('webextension.xpi', with_validation=False)
|
|
||||||
channel = amo.RELEASE_CHANNEL_LISTED
|
|
||||||
|
|
||||||
utils.Validator(file_upload, listed=True)
|
|
||||||
|
|
||||||
mock_chain.assert_called_once_with(
|
|
||||||
tasks.create_initial_validation_results.si(),
|
|
||||||
repack_fileupload.s(file_upload.pk),
|
|
||||||
tasks.validate_upload.s(file_upload.pk, channel),
|
|
||||||
tasks.check_for_api_keys_in_file.s(file_upload.pk),
|
|
||||||
chord(
|
|
||||||
[
|
|
||||||
tasks.forward_linter_results.s(file_upload.pk),
|
|
||||||
run_wat.s(file_upload.pk),
|
|
||||||
],
|
|
||||||
call_mad_api.s(file_upload.pk),
|
|
||||||
),
|
|
||||||
tasks.handle_upload_validation_result.s(file_upload.pk, channel, False),
|
|
||||||
)
|
|
||||||
|
|
||||||
@mock.patch('olympia.devhub.utils.chain')
|
|
||||||
def test_does_not_add_run_wat_when_disabled(self, mock_chain):
|
|
||||||
self.create_switch('enable-wat', active=False)
|
|
||||||
file_upload = self.get_upload('webextension.xpi', with_validation=False)
|
|
||||||
channel = amo.RELEASE_CHANNEL_LISTED
|
|
||||||
|
|
||||||
utils.Validator(file_upload, listed=True)
|
|
||||||
|
|
||||||
mock_chain.assert_called_once_with(
|
|
||||||
tasks.create_initial_validation_results.si(),
|
|
||||||
repack_fileupload.s(file_upload.pk),
|
|
||||||
tasks.validate_upload.s(file_upload.pk, channel),
|
|
||||||
tasks.check_for_api_keys_in_file.s(file_upload.pk),
|
|
||||||
chord(
|
|
||||||
[tasks.forward_linter_results.s(file_upload.pk)],
|
|
||||||
call_mad_api.s(file_upload.pk),
|
|
||||||
),
|
|
||||||
tasks.handle_upload_validation_result.s(file_upload.pk, channel, False),
|
|
||||||
)
|
|
||||||
|
|
||||||
@mock.patch('olympia.devhub.utils.chain')
|
@mock.patch('olympia.devhub.utils.chain')
|
||||||
def test_adds_yara_and_customs(self, mock_chain):
|
def test_adds_yara_and_customs(self, mock_chain):
|
||||||
self.create_switch('enable-customs', active=True)
|
self.create_switch('enable-customs', active=True)
|
||||||
|
@ -510,7 +467,6 @@ class TestValidator(UploadMixin, TestCase):
|
||||||
@mock.patch('olympia.devhub.utils.chain')
|
@mock.patch('olympia.devhub.utils.chain')
|
||||||
def test_adds_all_scanners(self, mock_chain):
|
def test_adds_all_scanners(self, mock_chain):
|
||||||
self.create_switch('enable-customs', active=True)
|
self.create_switch('enable-customs', active=True)
|
||||||
self.create_switch('enable-wat', active=True)
|
|
||||||
self.create_switch('enable-yara', active=True)
|
self.create_switch('enable-yara', active=True)
|
||||||
file_upload = self.get_upload('webextension.xpi', with_validation=False)
|
file_upload = self.get_upload('webextension.xpi', with_validation=False)
|
||||||
channel = amo.RELEASE_CHANNEL_LISTED
|
channel = amo.RELEASE_CHANNEL_LISTED
|
||||||
|
@ -527,7 +483,6 @@ class TestValidator(UploadMixin, TestCase):
|
||||||
tasks.forward_linter_results.s(file_upload.pk),
|
tasks.forward_linter_results.s(file_upload.pk),
|
||||||
run_yara.s(file_upload.pk),
|
run_yara.s(file_upload.pk),
|
||||||
run_customs.s(file_upload.pk),
|
run_customs.s(file_upload.pk),
|
||||||
run_wat.s(file_upload.pk),
|
|
||||||
],
|
],
|
||||||
call_mad_api.s(file_upload.pk),
|
call_mad_api.s(file_upload.pk),
|
||||||
),
|
),
|
||||||
|
@ -536,7 +491,6 @@ class TestValidator(UploadMixin, TestCase):
|
||||||
|
|
||||||
def test_create_file_upload_tasks(self):
|
def test_create_file_upload_tasks(self):
|
||||||
self.create_switch('enable-customs', active=True)
|
self.create_switch('enable-customs', active=True)
|
||||||
self.create_switch('enable-wat', active=True)
|
|
||||||
self.create_switch('enable-yara', active=True)
|
self.create_switch('enable-yara', active=True)
|
||||||
file_upload = self.get_upload('webextension.xpi', with_validation=False)
|
file_upload = self.get_upload('webextension.xpi', with_validation=False)
|
||||||
channel = amo.RELEASE_CHANNEL_LISTED
|
channel = amo.RELEASE_CHANNEL_LISTED
|
||||||
|
@ -565,7 +519,6 @@ class TestValidator(UploadMixin, TestCase):
|
||||||
'olympia.devhub.tasks.forward_linter_results',
|
'olympia.devhub.tasks.forward_linter_results',
|
||||||
'olympia.scanners.tasks.run_yara',
|
'olympia.scanners.tasks.run_yara',
|
||||||
'olympia.scanners.tasks.run_customs',
|
'olympia.scanners.tasks.run_customs',
|
||||||
'olympia.scanners.tasks.run_wat',
|
|
||||||
]
|
]
|
||||||
assert len(scanners_chord.tasks) == len(expected_parallel_tasks)
|
assert len(scanners_chord.tasks) == len(expected_parallel_tasks)
|
||||||
assert expected_parallel_tasks == [task.name for task in scanners_chord.tasks]
|
assert expected_parallel_tasks == [task.name for task in scanners_chord.tasks]
|
||||||
|
|
|
@ -17,7 +17,7 @@ from olympia.amo.urlresolvers import linkify_and_clean
|
||||||
from olympia.files.models import File, FileUpload
|
from olympia.files.models import File, FileUpload
|
||||||
from olympia.files.tasks import repack_fileupload
|
from olympia.files.tasks import repack_fileupload
|
||||||
from olympia.files.utils import parse_addon, parse_xpi
|
from olympia.files.utils import parse_addon, parse_xpi
|
||||||
from olympia.scanners.tasks import run_customs, run_wat, run_yara, call_mad_api
|
from olympia.scanners.tasks import run_customs, run_yara, call_mad_api
|
||||||
from olympia.versions.models import Version
|
from olympia.versions.models import Version
|
||||||
from olympia.versions.utils import process_color_value
|
from olympia.versions.utils import process_color_value
|
||||||
|
|
||||||
|
@ -265,9 +265,6 @@ class Validator:
|
||||||
if waffle.switch_is_active('enable-customs'):
|
if waffle.switch_is_active('enable-customs'):
|
||||||
tasks_in_parallel.append(run_customs.s(upload_pk))
|
tasks_in_parallel.append(run_customs.s(upload_pk))
|
||||||
|
|
||||||
if waffle.switch_is_active('enable-wat'):
|
|
||||||
tasks_in_parallel.append(run_wat.s(upload_pk))
|
|
||||||
|
|
||||||
return [
|
return [
|
||||||
tasks.create_initial_validation_results.si(),
|
tasks.create_initial_validation_results.si(),
|
||||||
repack_fileupload.s(upload_pk),
|
repack_fileupload.s(upload_pk),
|
||||||
|
|
|
@ -856,7 +856,6 @@ CELERY_TASK_ROUTES = {
|
||||||
'olympia.devhub.tasks.validate_upload': {'queue': 'devhub'},
|
'olympia.devhub.tasks.validate_upload': {'queue': 'devhub'},
|
||||||
'olympia.files.tasks.repack_fileupload': {'queue': 'devhub'},
|
'olympia.files.tasks.repack_fileupload': {'queue': 'devhub'},
|
||||||
'olympia.scanners.tasks.run_customs': {'queue': 'devhub'},
|
'olympia.scanners.tasks.run_customs': {'queue': 'devhub'},
|
||||||
'olympia.scanners.tasks.run_wat': {'queue': 'devhub'},
|
|
||||||
'olympia.scanners.tasks.run_yara': {'queue': 'devhub'},
|
'olympia.scanners.tasks.run_yara': {'queue': 'devhub'},
|
||||||
'olympia.scanners.tasks.call_mad_api': {'queue': 'devhub'},
|
'olympia.scanners.tasks.call_mad_api': {'queue': 'devhub'},
|
||||||
# Activity (goes to devhub queue).
|
# Activity (goes to devhub queue).
|
||||||
|
@ -1489,8 +1488,6 @@ EXTENSION_WORKSHOP_URL = env(
|
||||||
SCANNER_TIMEOUT = 60 # seconds
|
SCANNER_TIMEOUT = 60 # seconds
|
||||||
CUSTOMS_API_URL = env('CUSTOMS_API_URL', default=None)
|
CUSTOMS_API_URL = env('CUSTOMS_API_URL', default=None)
|
||||||
CUSTOMS_API_KEY = env('CUSTOMS_API_KEY', default=None)
|
CUSTOMS_API_KEY = env('CUSTOMS_API_KEY', default=None)
|
||||||
WAT_API_URL = env('WAT_API_URL', default=None)
|
|
||||||
WAT_API_KEY = env('WAT_API_KEY', default=None)
|
|
||||||
MAD_API_URL = env('MAD_API_URL', default=None)
|
MAD_API_URL = env('MAD_API_URL', default=None)
|
||||||
MAD_API_TIMEOUT = 5 # seconds
|
MAD_API_TIMEOUT = 5 # seconds
|
||||||
# Git(Hub) repository names, e.g., `owner/repo-name`
|
# Git(Hub) repository names, e.g., `owner/repo-name`
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
def remove_waffle_switch(apps, schema_editor):
|
||||||
|
Switch = apps.get_model('waffle', 'Switch')
|
||||||
|
|
||||||
|
Switch.objects.filter(name='enable-wat').delete()
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [('scanners', '0045_auto_20210604_1340')]
|
||||||
|
|
||||||
|
operations = [migrations.RunPython(remove_waffle_switch)]
|
|
@ -0,0 +1,17 @@
|
||||||
|
# Generated by Django 3.2.13 on 2022-04-25 09:33
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
def delete_scanner_results(apps, schema_editor):
|
||||||
|
ScannerResult = apps.get_model('scanners', 'ScannerResult')
|
||||||
|
|
||||||
|
# 2 = WAT
|
||||||
|
ScannerResult.objects.filter(scanner=2).delete()
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [('scanners', '0046_delete_waffle_switch')]
|
||||||
|
|
||||||
|
operations = [migrations.RunPython(delete_scanner_results)]
|
|
@ -34,7 +34,6 @@ from olympia.constants.scanners import (
|
||||||
SCANNERS,
|
SCANNERS,
|
||||||
SCHEDULED,
|
SCHEDULED,
|
||||||
UNKNOWN,
|
UNKNOWN,
|
||||||
WAT,
|
|
||||||
YARA,
|
YARA,
|
||||||
)
|
)
|
||||||
from olympia.files.models import FileUpload
|
from olympia.files.models import FileUpload
|
||||||
|
@ -123,10 +122,10 @@ class AbstractScannerResult(ModelBase):
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def can_report_feedback(self):
|
def can_report_feedback(self):
|
||||||
return self.state == UNKNOWN and self.scanner not in [WAT, MAD]
|
return self.state == UNKNOWN and self.scanner not in [MAD]
|
||||||
|
|
||||||
def can_revert_feedback(self):
|
def can_revert_feedback(self):
|
||||||
return self.state != UNKNOWN and self.scanner not in [WAT, MAD]
|
return self.state != UNKNOWN and self.scanner not in [MAD]
|
||||||
|
|
||||||
def get_git_repository(self):
|
def get_git_repository(self):
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -24,7 +24,6 @@ from olympia.constants.scanners import (
|
||||||
MAD,
|
MAD,
|
||||||
RUNNING,
|
RUNNING,
|
||||||
SCANNERS,
|
SCANNERS,
|
||||||
WAT,
|
|
||||||
YARA,
|
YARA,
|
||||||
)
|
)
|
||||||
from olympia.devhub.tasks import validation_task
|
from olympia.devhub.tasks import validation_task
|
||||||
|
@ -158,29 +157,6 @@ def run_customs(results, upload_pk):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@validation_task
|
|
||||||
def run_wat(results, upload_pk):
|
|
||||||
"""
|
|
||||||
Run the wat scanner on a FileUpload and store the results.
|
|
||||||
|
|
||||||
This task is intended to be run as part of the submission process only.
|
|
||||||
When a version is created from a FileUpload, the files are removed. In
|
|
||||||
addition, we usually delete old FileUpload entries after 180 days.
|
|
||||||
|
|
||||||
- `results` are the validation results passed in the validation chain. This
|
|
||||||
task is a validation task, which is why it must receive the validation
|
|
||||||
results as first argument.
|
|
||||||
- `upload_pk` is the FileUpload ID.
|
|
||||||
"""
|
|
||||||
return run_scanner(
|
|
||||||
results,
|
|
||||||
upload_pk,
|
|
||||||
scanner=WAT,
|
|
||||||
api_url=settings.WAT_API_URL,
|
|
||||||
api_key=settings.WAT_API_KEY,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@validation_task
|
@validation_task
|
||||||
def run_yara(results, upload_pk):
|
def run_yara(results, upload_pk):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -34,7 +34,6 @@ from olympia.constants.scanners import (
|
||||||
SCHEDULED,
|
SCHEDULED,
|
||||||
TRUE_POSITIVE,
|
TRUE_POSITIVE,
|
||||||
UNKNOWN,
|
UNKNOWN,
|
||||||
WAT,
|
|
||||||
YARA,
|
YARA,
|
||||||
)
|
)
|
||||||
from olympia.files.models import FileUpload
|
from olympia.files.models import FileUpload
|
||||||
|
@ -240,11 +239,6 @@ class TestScannerResultAdmin(TestCase):
|
||||||
# version.
|
# version.
|
||||||
assert '/browse/' not in self.admin.formatted_matched_rules_with_files(result)
|
assert '/browse/' not in self.admin.formatted_matched_rules_with_files(result)
|
||||||
|
|
||||||
def test_formatted_score_when_scanner_is_not_mad_or_customs(self):
|
|
||||||
result = ScannerResult(score=0.123, scanner=WAT)
|
|
||||||
|
|
||||||
assert self.admin.formatted_score(result) == '-'
|
|
||||||
|
|
||||||
def test_formatted_score_for_customs(self):
|
def test_formatted_score_for_customs(self):
|
||||||
result = ScannerResult(score=0.123, scanner=CUSTOMS)
|
result = ScannerResult(score=0.123, scanner=CUSTOMS)
|
||||||
|
|
||||||
|
@ -264,9 +258,6 @@ class TestScannerResultAdmin(TestCase):
|
||||||
ScannerResult.objects.create(
|
ScannerResult.objects.create(
|
||||||
scanner=CUSTOMS, version=addon_factory().current_version
|
scanner=CUSTOMS, version=addon_factory().current_version
|
||||||
)
|
)
|
||||||
ScannerResult.objects.create(
|
|
||||||
scanner=WAT, version=addon_factory().current_version
|
|
||||||
)
|
|
||||||
deleted_addon = addon_factory(name='a deleted add-on')
|
deleted_addon = addon_factory(name='a deleted add-on')
|
||||||
ScannerResult.objects.create(
|
ScannerResult.objects.create(
|
||||||
scanner=CUSTOMS, version=deleted_addon.current_version
|
scanner=CUSTOMS, version=deleted_addon.current_version
|
||||||
|
|
|
@ -21,7 +21,6 @@ from olympia.constants.scanners import (
|
||||||
SCANNERS,
|
SCANNERS,
|
||||||
SCHEDULED,
|
SCHEDULED,
|
||||||
UNKNOWN,
|
UNKNOWN,
|
||||||
WAT,
|
|
||||||
YARA,
|
YARA,
|
||||||
)
|
)
|
||||||
from olympia.files.models import FileUpload
|
from olympia.files.models import FileUpload
|
||||||
|
@ -47,9 +46,6 @@ class TestScannerResultMixin:
|
||||||
def create_customs_result(self):
|
def create_customs_result(self):
|
||||||
return self.model.objects.create(scanner=CUSTOMS)
|
return self.model.objects.create(scanner=CUSTOMS)
|
||||||
|
|
||||||
def create_wat_result(self):
|
|
||||||
return self.model.objects.create(scanner=WAT)
|
|
||||||
|
|
||||||
def create_mad_result(self):
|
def create_mad_result(self):
|
||||||
return self.model.objects.create(scanner=MAD)
|
return self.model.objects.create(scanner=MAD)
|
||||||
|
|
||||||
|
@ -134,10 +130,6 @@ class TestScannerResultMixin:
|
||||||
|
|
||||||
assert result.extract_rule_names() == [rule1, rule2]
|
assert result.extract_rule_names() == [rule1, rule2]
|
||||||
|
|
||||||
def test_extract_rule_names_returns_empty_list_for_unsupported_scanner(self):
|
|
||||||
result = self.create_wat_result()
|
|
||||||
assert result.extract_rule_names() == []
|
|
||||||
|
|
||||||
def test_extract_rule_names_with_no_customs_matched_rules_attribute(self):
|
def test_extract_rule_names_with_no_customs_matched_rules_attribute(self):
|
||||||
result = self.create_customs_result()
|
result = self.create_customs_result()
|
||||||
result.results = {}
|
result.results = {}
|
||||||
|
@ -171,7 +163,7 @@ class TestScannerResultMixin:
|
||||||
assert result.get_git_repository() == git_repo
|
assert result.get_git_repository() == git_repo
|
||||||
|
|
||||||
def test_get_git_repository_returns_none_if_not_supported(self):
|
def test_get_git_repository_returns_none_if_not_supported(self):
|
||||||
result = self.create_wat_result()
|
result = self.create_customs_result()
|
||||||
assert result.get_git_repository() is None
|
assert result.get_git_repository() is None
|
||||||
|
|
||||||
def test_can_report_feedback(self):
|
def test_can_report_feedback(self):
|
||||||
|
@ -183,10 +175,6 @@ class TestScannerResultMixin:
|
||||||
result.state = FALSE_POSITIVE
|
result.state = FALSE_POSITIVE
|
||||||
assert not result.can_report_feedback()
|
assert not result.can_report_feedback()
|
||||||
|
|
||||||
def test_can_report_feedback_is_false_when_scanner_is_wat(self):
|
|
||||||
result = self.create_wat_result()
|
|
||||||
assert not result.can_report_feedback()
|
|
||||||
|
|
||||||
def test_can_report_feedback_is_false_when_scanner_is_mad(self):
|
def test_can_report_feedback_is_false_when_scanner_is_mad(self):
|
||||||
result = self.create_mad_result()
|
result = self.create_mad_result()
|
||||||
assert not result.can_report_feedback()
|
assert not result.can_report_feedback()
|
||||||
|
@ -201,10 +189,6 @@ class TestScannerResultMixin:
|
||||||
assert result.state == UNKNOWN
|
assert result.state == UNKNOWN
|
||||||
assert not result.can_revert_feedback()
|
assert not result.can_revert_feedback()
|
||||||
|
|
||||||
def test_get_files_by_matched_rules_for_wat(self):
|
|
||||||
result = self.create_wat_result()
|
|
||||||
assert result.get_files_by_matched_rules() == {}
|
|
||||||
|
|
||||||
def test_get_files_by_matched_rules_with_no_yara_results(self):
|
def test_get_files_by_matched_rules_with_no_yara_results(self):
|
||||||
result = self.create_yara_result()
|
result = self.create_yara_result()
|
||||||
assert result.get_files_by_matched_rules() == {}
|
assert result.get_files_by_matched_rules() == {}
|
||||||
|
@ -305,10 +289,6 @@ class TestScannerResult(TestScannerResultMixin, TestCase):
|
||||||
upload = self.create_file_upload()
|
upload = self.create_file_upload()
|
||||||
return self.model.objects.create(upload=upload, scanner=CUSTOMS)
|
return self.model.objects.create(upload=upload, scanner=CUSTOMS)
|
||||||
|
|
||||||
def create_wat_result(self):
|
|
||||||
upload = self.create_file_upload()
|
|
||||||
return self.model.objects.create(upload=upload, scanner=WAT)
|
|
||||||
|
|
||||||
def create_yara_result(self):
|
def create_yara_result(self):
|
||||||
upload = self.create_file_upload()
|
upload = self.create_file_upload()
|
||||||
return self.model.objects.create(upload=upload, scanner=YARA)
|
return self.model.objects.create(upload=upload, scanner=YARA)
|
||||||
|
@ -329,10 +309,10 @@ class TestScannerResult(TestScannerResultMixin, TestCase):
|
||||||
upload = self.create_file_upload()
|
upload = self.create_file_upload()
|
||||||
|
|
||||||
customs_result = self.model.objects.create(upload=upload, scanner=CUSTOMS)
|
customs_result = self.model.objects.create(upload=upload, scanner=CUSTOMS)
|
||||||
wat_result = self.model.objects.create(upload=upload, scanner=WAT)
|
yara_result = self.model.objects.create(upload=upload, scanner=YARA)
|
||||||
|
|
||||||
assert customs_result.scanner == CUSTOMS
|
assert customs_result.scanner == CUSTOMS
|
||||||
assert wat_result.scanner == WAT
|
assert yara_result.scanner == YARA
|
||||||
|
|
||||||
def test_upload_constraint(self):
|
def test_upload_constraint(self):
|
||||||
upload = self.create_file_upload()
|
upload = self.create_file_upload()
|
||||||
|
|
|
@ -24,7 +24,6 @@ from olympia.constants.scanners import (
|
||||||
NEW,
|
NEW,
|
||||||
RUNNING,
|
RUNNING,
|
||||||
SCHEDULED,
|
SCHEDULED,
|
||||||
WAT,
|
|
||||||
YARA,
|
YARA,
|
||||||
)
|
)
|
||||||
from olympia.files.models import File
|
from olympia.files.models import File
|
||||||
|
@ -41,7 +40,6 @@ from olympia.scanners.tasks import (
|
||||||
mark_yara_query_rule_as_completed_or_aborted,
|
mark_yara_query_rule_as_completed_or_aborted,
|
||||||
run_customs,
|
run_customs,
|
||||||
run_scanner,
|
run_scanner,
|
||||||
run_wat,
|
|
||||||
run_yara,
|
run_yara,
|
||||||
run_yara_query_rule,
|
run_yara_query_rule,
|
||||||
run_yara_query_rule_on_versions_chunk,
|
run_yara_query_rule_on_versions_chunk,
|
||||||
|
@ -248,44 +246,6 @@ class TestRunCustoms(TestCase):
|
||||||
assert returned_results == self.results
|
assert returned_results == self.results
|
||||||
|
|
||||||
|
|
||||||
class TestRunWat(TestCase):
|
|
||||||
API_URL = 'http://wat.example.org'
|
|
||||||
API_KEY = 'some-api-key'
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super().setUp()
|
|
||||||
|
|
||||||
self.upload_pk = 1234
|
|
||||||
self.results = {**amo.VALIDATOR_SKELETON_RESULTS}
|
|
||||||
|
|
||||||
@override_settings(WAT_API_URL=API_URL, WAT_API_KEY=API_KEY)
|
|
||||||
@mock.patch('olympia.scanners.tasks.run_scanner')
|
|
||||||
def test_calls_run_scanner_with_mock(self, run_scanner_mock):
|
|
||||||
run_scanner_mock.return_value = self.results
|
|
||||||
|
|
||||||
returned_results = run_wat(self.results, self.upload_pk)
|
|
||||||
|
|
||||||
assert run_scanner_mock.called
|
|
||||||
run_scanner_mock.assert_called_once_with(
|
|
||||||
self.results,
|
|
||||||
self.upload_pk,
|
|
||||||
scanner=WAT,
|
|
||||||
api_url=self.API_URL,
|
|
||||||
api_key=self.API_KEY,
|
|
||||||
)
|
|
||||||
assert returned_results == self.results
|
|
||||||
|
|
||||||
@override_settings(WAT_API_URL=API_URL, WAT_API_KEY=API_KEY)
|
|
||||||
@mock.patch('olympia.scanners.tasks.run_scanner')
|
|
||||||
def test_does_not_run_when_results_contain_errors(self, run_scanner_mock):
|
|
||||||
self.results.update({'errors': 1})
|
|
||||||
|
|
||||||
returned_results = run_wat(self.results, self.upload_pk)
|
|
||||||
|
|
||||||
assert not run_scanner_mock.called
|
|
||||||
assert returned_results == self.results
|
|
||||||
|
|
||||||
|
|
||||||
class TestRunYara(UploadMixin, TestCase):
|
class TestRunYara(UploadMixin, TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super().setUp()
|
super().setUp()
|
||||||
|
|
|
@ -19,7 +19,6 @@ from olympia.constants.scanners import (
|
||||||
LABEL_BAD,
|
LABEL_BAD,
|
||||||
MAD,
|
MAD,
|
||||||
TRUE_POSITIVE,
|
TRUE_POSITIVE,
|
||||||
WAT,
|
|
||||||
YARA,
|
YARA,
|
||||||
)
|
)
|
||||||
from olympia.blocklist.models import Block
|
from olympia.blocklist.models import Block
|
||||||
|
@ -72,7 +71,7 @@ class TestScannerResultViewInternal(TestCase):
|
||||||
# result labelled as "good" because it has been approved
|
# result labelled as "good" because it has been approved
|
||||||
good_version_1 = version_factory(addon=addon_factory())
|
good_version_1 = version_factory(addon=addon_factory())
|
||||||
good_result_1 = ScannerResult.objects.create(
|
good_result_1 = ScannerResult.objects.create(
|
||||||
scanner=WAT, version=good_version_1
|
scanner=CUSTOMS, version=good_version_1
|
||||||
)
|
)
|
||||||
ActivityLog.create(amo.LOG.APPROVE_VERSION, good_version_1, user=self.user)
|
ActivityLog.create(amo.LOG.APPROVE_VERSION, good_version_1, user=self.user)
|
||||||
# result labelled as "good" because auto-approve has been confirmed
|
# result labelled as "good" because auto-approve has been confirmed
|
||||||
|
@ -158,7 +157,7 @@ class TestScannerResultViewInternal(TestCase):
|
||||||
)
|
)
|
||||||
# result labelled as "good" because it has been approved
|
# result labelled as "good" because it has been approved
|
||||||
good_version = version_factory(addon=addon_factory())
|
good_version = version_factory(addon=addon_factory())
|
||||||
ScannerResult.objects.create(scanner=WAT, version=good_version)
|
ScannerResult.objects.create(scanner=CUSTOMS, version=good_version)
|
||||||
VersionLog.objects.create(
|
VersionLog.objects.create(
|
||||||
activity_log=ActivityLog.create(
|
activity_log=ActivityLog.create(
|
||||||
action=amo.LOG.APPROVE_VERSION,
|
action=amo.LOG.APPROVE_VERSION,
|
||||||
|
@ -197,7 +196,7 @@ class TestScannerResultViewInternal(TestCase):
|
||||||
)
|
)
|
||||||
# result labelled as "good" because it has been approved
|
# result labelled as "good" because it has been approved
|
||||||
good_version = version_factory(addon=addon_factory())
|
good_version = version_factory(addon=addon_factory())
|
||||||
ScannerResult.objects.create(scanner=WAT, version=good_version)
|
ScannerResult.objects.create(scanner=CUSTOMS, version=good_version)
|
||||||
VersionLog.objects.create(
|
VersionLog.objects.create(
|
||||||
activity_log=ActivityLog.create(
|
activity_log=ActivityLog.create(
|
||||||
action=amo.LOG.APPROVE_VERSION,
|
action=amo.LOG.APPROVE_VERSION,
|
||||||
|
@ -215,9 +214,11 @@ class TestScannerResultViewInternal(TestCase):
|
||||||
response = self.client.get('{}'.format(f'{self.url}?scanner=yara&label=bad'))
|
response = self.client.get('{}'.format(f'{self.url}?scanner=yara&label=bad'))
|
||||||
self.assert_json_results(response, expected_results=1)
|
self.assert_json_results(response, expected_results=1)
|
||||||
|
|
||||||
response = self.client.get('{}'.format(f'{self.url}?scanner=wat&label=bad'))
|
response = self.client.get('{}'.format(f'{self.url}?scanner=customs&label=bad'))
|
||||||
self.assert_json_results(response, expected_results=0)
|
self.assert_json_results(response, expected_results=0)
|
||||||
response = self.client.get('{}'.format(f'{self.url}?scanner=wat&label=good'))
|
response = self.client.get(
|
||||||
|
'{}'.format(f'{self.url}?scanner=customs&label=good')
|
||||||
|
)
|
||||||
self.assert_json_results(response, expected_results=1)
|
self.assert_json_results(response, expected_results=1)
|
||||||
|
|
||||||
def test_get_results_with_blocked_versions(self):
|
def test_get_results_with_blocked_versions(self):
|
||||||
|
|
|
@ -34,7 +34,7 @@ from olympia.constants.promoted import (
|
||||||
SPOTLIGHT,
|
SPOTLIGHT,
|
||||||
STRATEGIC,
|
STRATEGIC,
|
||||||
)
|
)
|
||||||
from olympia.constants.scanners import CUSTOMS, WAT, YARA, MAD
|
from olympia.constants.scanners import CUSTOMS, YARA, MAD
|
||||||
from olympia.files.models import File
|
from olympia.files.models import File
|
||||||
from olympia.files.tests.test_models import UploadMixin
|
from olympia.files.tests.test_models import UploadMixin
|
||||||
from olympia.files.utils import parse_addon
|
from olympia.files.utils import parse_addon
|
||||||
|
@ -1462,21 +1462,6 @@ class TestExtensionVersionFromUpload(TestVersionFromUpload):
|
||||||
scanners_result.refresh_from_db()
|
scanners_result.refresh_from_db()
|
||||||
assert scanners_result.version == version
|
assert scanners_result.version == version
|
||||||
|
|
||||||
def test_set_version_to_wat_scanners_result(self):
|
|
||||||
self.create_switch('enable-wat', active=True)
|
|
||||||
scanners_result = ScannerResult.objects.create(upload=self.upload, scanner=WAT)
|
|
||||||
assert scanners_result.version is None
|
|
||||||
|
|
||||||
version = Version.from_upload(
|
|
||||||
self.upload,
|
|
||||||
self.addon,
|
|
||||||
amo.RELEASE_CHANNEL_LISTED,
|
|
||||||
selected_apps=[self.selected_app],
|
|
||||||
parsed_data=self.dummy_parsed_data,
|
|
||||||
)
|
|
||||||
scanners_result.refresh_from_db()
|
|
||||||
assert scanners_result.version == version
|
|
||||||
|
|
||||||
def test_set_version_to_yara_scanners_result(self):
|
def test_set_version_to_yara_scanners_result(self):
|
||||||
self.create_switch('enable-yara', active=True)
|
self.create_switch('enable-yara', active=True)
|
||||||
scanners_result = ScannerResult.objects.create(upload=self.upload, scanner=YARA)
|
scanners_result = ScannerResult.objects.create(upload=self.upload, scanner=YARA)
|
||||||
|
@ -1495,7 +1480,6 @@ class TestExtensionVersionFromUpload(TestVersionFromUpload):
|
||||||
|
|
||||||
def test_does_nothing_when_no_scanner_is_enabled(self):
|
def test_does_nothing_when_no_scanner_is_enabled(self):
|
||||||
self.create_switch('enable-customs', active=False)
|
self.create_switch('enable-customs', active=False)
|
||||||
self.create_switch('enable-wat', active=False)
|
|
||||||
self.create_switch('enable-yara', active=False)
|
self.create_switch('enable-yara', active=False)
|
||||||
scanners_result = ScannerResult.objects.create(
|
scanners_result = ScannerResult.objects.create(
|
||||||
upload=self.upload, scanner=CUSTOMS
|
upload=self.upload, scanner=CUSTOMS
|
||||||
|
|
Загрузка…
Ссылка в новой задаче