def upload(self, addon, path): """Create FileUpload instance from local file.""" self.info('Creating FileUpload...') package_file = open(path) package_size = os.stat(path).st_size upload = FileUpload() upload.user = addon.authors.all()[0] upload.add_file(package_file.read(), 'marketplace-package.zip', package_size) self.info('Created FileUpload %s.' % upload) return upload
def test_ascii_names(self): fu = FileUpload.from_post('', u'mözball.zip', 0) assert 'zip' in fu.name fu = FileUpload.from_post('', u'мозила_србија-0.11.zip', 0) assert 'zip' in fu.name fu = FileUpload.from_post('', u'フォクすけといっしょ.zip', 0) assert 'zip' in fu.name fu = FileUpload.from_post('', u'\u05d0\u05d5\u05e1\u05e3.zip', 0) assert 'zip' in fu.name
def get_upload(self, filename=None, abspath=None, validation=None): zip = open(abspath if abspath else self.file_path(filename)).read() upload = FileUpload.from_post([zip], filename=abspath or filename, size=1234) # Simulate what fetch_manifest() does after uploading an app. upload.validation = (validation or json.dumps(dict(errors=0, warnings=1, notices=2, metadata={}, messages=[]))) upload.save() return upload
def create(self, request, *args, **kwargs): file_obj = request.FILES.get('file', None) if not file_obj: raise exceptions.ParseError(_('Missing file in request.')) user = request.user if request.user.is_authenticated() else None # ExtensionValidator will raise ParseError exceptions if appropriate. ExtensionValidator(file_obj).validate() upload = FileUpload.from_post( file_obj, file_obj.name, file_obj.size, user=user) upload.update(valid=True) serializer = self.get_serializer(upload) return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
def get_upload(self, filename=None, abspath=None, validation=None, user=None): zip = open(abspath).read() upload = FileUpload.from_post([zip], filename=abspath or filename, size=1234) # Simulate what fetch_manifest() does after uploading an app. upload.validation = (validation or json.dumps(dict(errors=0, warnings=1, notices=2, metadata={}, messages=[]))) if user: upload.user = user upload.save() return upload
def create(self, request, *args, **kwargs): file_obj = request.FILES.get('file', None) if not file_obj: raise exceptions.ParseError(_('Missing file in request.')) self.validate_upload(file_obj) # Will raise exceptions if appropriate. user = request.user if request.user.is_authenticated() else None upload = FileUpload.from_post( file_obj, file_obj.name, file_obj.size, user=user) # FIXME: spawn validate task that does the real validation checks. # Right now we cheat and just set the upload as valid and processed # directly. upload.update(valid=True) serializer = self.get_serializer(upload) return Response(serializer.data, status=status.HTTP_202_ACCEPTED)
def upload(self): # The data should be in chunks. data = [''.join(x) for x in chunked(self.data, 3)] return FileUpload.from_post(data, 'filename.zip', len(self.data))
class NewPackagedAppForm(happyforms.Form): upload = forms.FileField() def __init__(self, *args, **kwargs): self.max_size = kwargs.pop('max_size', MAX_PACKAGED_APP_SIZE) self.user = kwargs.pop('user', get_user()) self.addon = kwargs.pop('addon', None) self.file_upload = None super(NewPackagedAppForm, self).__init__(*args, **kwargs) def clean_upload(self): upload = self.cleaned_data['upload'] errors = [] if upload.size > self.max_size: errors.append({ 'type': 'error', 'message': _('Packaged app too large for submission. Packages ' 'must be smaller than %s.' % filesizeformat( self.max_size)), 'tier': 1, }) # Immediately raise an error, do not process the rest of the view, # which would read the file. raise self.persist_errors(errors, upload) manifest = None try: # Be careful to keep this as in-memory zip reading. safe_zip = SafeUnzip(upload, 'r') safe_zip.is_valid() # Will throw ValidationError if necessary. manifest = safe_zip.extract_path('manifest.webapp') except forms.ValidationError as e: errors.append({ 'type': 'error', 'message': ''.join(e.messages), 'tier': 1, }) except Exception as e: errors.append({ 'type': 'error', 'message': _('Error extracting manifest from zip file.'), 'tier': 1, }) finally: safe_zip.close() origin = None if manifest: try: origin = WebAppParser.decode_manifest(manifest).get('origin') except forms.ValidationError as e: errors.append({ 'type': 'error', 'message': ''.join(e.messages), 'tier': 1, }) if origin: try: verify_app_domain(origin, packaged=True, exclude=self.addon) except forms.ValidationError, e: errors.append({ 'type': 'error', 'message': ''.join(e.messages), 'tier': 1, }) if errors: raise self.persist_errors(errors, upload) # Everything passed validation. self.file_upload = FileUpload.from_post( upload, upload.name, upload.size, user=self.user)