def test_adds_all_scanners(self, mock_chain): self.create_switch('enable-customs', active=True) self.create_switch('enable-wat', active=True) self.create_switch('enable-yara', 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_yara.s(file_upload.pk), run_customs.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), )
def create_file_upload_tasks(self, upload_pk, channel, is_mozilla_signed): """ This method creates the validation chain used during the submission process, combining tasks in parallel (chord) with tasks chained together (where the output is used as input of the next task). """ tasks_in_parallel = [tasks.forward_linter_results.s(upload_pk)] if waffle.switch_is_active('enable-yara'): tasks_in_parallel.append(run_yara.s(upload_pk)) if waffle.switch_is_active('enable-customs'): 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 [ tasks.create_initial_validation_results.si(), repack_fileupload.s(upload_pk), tasks.validate_upload.s(upload_pk, channel), tasks.check_for_api_keys_in_file.s(upload_pk), chord(tasks_in_parallel, call_mad_api.s(upload_pk)), tasks.handle_upload_validation_result.s(upload_pk, channel, is_mozilla_signed), ]
def __init__(self, file_, addon=None, listed=None, final_task=None): self.addon = addon self.file = None self.prev_file = None if isinstance(file_, FileUpload): assert listed is not None channel = (amo.RELEASE_CHANNEL_LISTED if listed else amo.RELEASE_CHANNEL_UNLISTED) is_mozilla_signed = False # We're dealing with a bare file upload. Try to extract the # metadata that we need to match it against a previous upload # from the file itself. try: addon_data = parse_addon(file_, minimal=True) is_mozilla_signed = addon_data.get( 'is_mozilla_signed_extension', False) except ValidationError as form_error: log.info('could not parse addon for upload {}: {}' .format(file_.pk, form_error)) addon_data = None else: file_.update(version=addon_data.get('version')) assert not file_.validation tasks_in_parallel = [tasks.forward_linter_results.s(file_.pk)] if waffle.switch_is_active('enable-yara'): tasks_in_parallel.append(run_yara.s(file_.pk)) if waffle.switch_is_active('enable-customs'): tasks_in_parallel.append(run_customs.s(file_.pk)) if waffle.switch_is_active('enable-wat'): tasks_in_parallel.append(run_wat.s(file_.pk)) validation_tasks = [ tasks.create_initial_validation_results.si(), repack_fileupload.s(file_.pk), tasks.validate_upload.s(file_.pk, channel), tasks.check_for_api_keys_in_file.s(file_.pk), chord( tasks_in_parallel, tasks.handle_upload_validation_result.s(file_.pk, channel, is_mozilla_signed) ), ] elif isinstance(file_, File): # The listed flag for a File object should always come from # the status of its owner Addon. If the caller tries to override # this, something is wrong. assert listed is None channel = file_.version.channel is_mozilla_signed = file_.is_mozilla_signed_extension self.file = file_ self.addon = self.file.version.addon addon_data = {'guid': self.addon.guid, 'version': self.file.version.version} validation_tasks = [ tasks.create_initial_validation_results.si(), tasks.validate_file.s(file_.pk), tasks.handle_file_validation_result.s(file_.pk) ] else: raise ValueError if final_task: validation_tasks.append(final_task) self.task = chain(*validation_tasks) # Create a cache key for the task, so multiple requests to validate the # same object do not result in duplicate tasks. opts = file_._meta self.cache_key = 'validation-task:{0}.{1}:{2}:{3}'.format( opts.app_label, opts.object_name, file_.pk, listed)