def test_ascii_names(self): fu = FileUpload.from_post("", u"jétpack.xpi", 0) assert "xpi" in fu.name fu = FileUpload.from_post("", u"мозила_србија-0.11-fx.xpi", 0) assert "xpi" in fu.name fu = FileUpload.from_post("", u"フォクすけといっしょ.xpi", 0) assert "xpi" in fu.name fu = FileUpload.from_post("", u"\u05d0\u05d5\u05e1\u05e3.xpi", 0) assert "xpi" in fu.name
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 test_ascii_names(self): fu = FileUpload.from_post('', u'jétpack.xpi', 0) assert 'xpi' in fu.name fu = FileUpload.from_post('', u'мозила_србија-0.11-fx.xpi', 0) assert 'xpi' in fu.name fu = FileUpload.from_post('', u'フォクすけといっしょ.xpi', 0) assert 'xpi' in fu.name fu = FileUpload.from_post('', u'\u05d0\u05d5\u05e1\u05e3.xpi', 0) assert 'xpi' in fu.name
def get_upload(self, filename, validation=None): xpi = open(self.file_path(filename)).read() upload = FileUpload.from_post([xpi], filename=filename, size=1234) upload.validation = (validation or json.dumps(dict(errors=0, warnings=1, notices=2))) upload.save() return upload
def get_upload(self, filename=None, abspath=None, validation=None): xpi = open(abspath if abspath else self.file_path(filename)).read() upload = FileUpload.from_post([xpi], 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 clean_upload(self): upload = self.cleaned_data["upload"] if upload.size > self.max_size: msg = "Packaged app too large for submission." big = json.dumps( { "errors": 1, "success": False, "messages": [ { "type": "error", "message": [msg, "Packages must be less than %s." % filesizeformat(self.max_size)], "tier": 1, } ], } ) # Persist the error with this into FileUpload, but do not persist # the file contents, which are too large. self.file_upload = FileUpload.objects.create(is_webapp=True, user=self.user, validation=big) # Raise an error so the form is invalid. raise forms.ValidationError(msg) else: self.file_upload = FileUpload.from_post(upload, upload.name, upload.size, is_webapp=True) self.file_upload.user = self.user self.file_upload.save()
def clean_upload(self): upload = self.cleaned_data['upload'] if upload.size > self.max_size: msg = 'Packaged app too large for submission.' big = json.dumps({ 'errors': 1, 'success': False, 'messages': [{ 'type': 'error', 'message': [ msg, 'Packages must be less than %s.' % filesizeformat(self.max_size)], 'tier': 1}]}) # Persist the error with this into FileUpload, but do not persist # the file contents, which are too large. self.file_upload = FileUpload.objects.create( is_webapp=True, user=self.user, validation=big) # Raise an error so the form is invalid. raise forms.ValidationError(msg) else: self.file_upload = FileUpload.from_post( upload, upload.name, upload.size, is_webapp=True) self.file_upload.user = self.user self.file_upload.save()
def get_upload(self, filename=None, abspath=None, validation=None): xpi = open(abspath if abspath else self.file_path(filename)).read() upload = FileUpload.from_post([xpi], filename=abspath or filename, size=1234) upload.validation = (validation or json.dumps(dict(errors=0, warnings=1, notices=2, metadata={}, messages=[]))) upload.save() return upload
def upload(request): if request.method == 'POST': filedata = request.FILES['upload'] fu = FileUpload.from_post(filedata, filedata.name, filedata.size) if request.user.is_authenticated(): fu.user = request.amo_user fu.save() tasks.validator.delay(fu.pk) return redirect('devhub.upload_detail', fu.pk, 'json') return jingo.render(request, 'devhub/upload.html')
def manifest_updated(self, manifest): """The manifest has updated, create a version and file.""" with open(manifest) as fh: chunks = fh.read() # We'll only create a file upload when we detect that the manifest # has changed, otherwise we'll be creating an awful lot of these. upload = FileUpload.from_post(chunks, manifest, len(chunks)) # This does most of the heavy work. Version.from_upload(upload, self, [Platform.objects.get(id=amo.PLATFORM_ALL.id)]) # Triggering this ensures that the current_version gets updated. self.update_version() amo.log(amo.LOG.MANIFEST_UPDATED, self)
def upload(request, addon_slug=None, is_standalone=False): filedata = request.FILES["upload"] fu = FileUpload.from_post(filedata, filedata.name, filedata.size, is_webapp=True) log.info("Packaged App FileUpload created: %s" % fu.pk) if request.user.is_authenticated(): fu.user = request.amo_user fu.save() tasks.validator.delay(fu.pk) if addon_slug: return redirect("mkt.developers.upload_detail_for_addon", addon_slug, fu.pk) elif is_standalone: return redirect("mkt.developers.standalone_upload_detail", fu.pk) else: return redirect("mkt.developers.upload_detail", fu.pk, "json")
def upload(request): if request.method == 'POST': #TODO(gkoberger): Bug 610800 - Don't load uploads into memory. filedata = request.raw_post_data try: filename = request.META['HTTP_X_FILE_NAME'] size = request.META['HTTP_X_FILE_SIZE'] except KeyError: return http.HttpResponseBadRequest() fu = FileUpload.from_post([filedata], filename, size) if request.user.is_authenticated(): fu.user = request.amo_user fu.save() tasks.validator.delay(fu.pk) return redirect('devhub.upload_detail', fu.pk, 'json') return jingo.render(request, 'devhub/upload.html')
def upload(request, addon_slug=None, is_standalone=False): filedata = request.FILES["upload"] fu = FileUpload.from_post(filedata, filedata.name, filedata.size) log.info("FileUpload created: %s" % fu.pk) if request.user.is_authenticated(): fu.user = request.amo_user fu.save() if request.POST.get("app_id") and request.POST.get("version_id"): app = get_object_or_404(Application, pk=request.POST["app_id"]) ver = get_object_or_404(AppVersion, pk=request.POST["version_id"]) tasks.compatibility_check.delay(fu.pk, app.guid, ver.version) else: tasks.validator.delay(fu.pk) if addon_slug: return redirect("mkt.developers.upload_detail_for_addon", addon_slug, fu.pk) elif is_standalone: return redirect("mkt.developers.standalone_upload_detail", fu.pk) else: return redirect("mkt.developers.upload_detail", fu.pk, "json")
def upload(self): # The data should be in chunks. data = list(amo.utils.chunked(self.data, 3)) return FileUpload.from_post(data, 'filename.xpi', 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 less than %s.' % filesizeformat( self.max_size)), 'tier': 1, }) manifest = None try: # Be careful to keep this as in-memory zip reading. manifest = ZipFile(upload, 'r').read('manifest.webapp') except Exception as e: errors.append({ 'type': 'error', 'message': _('Error extracting manifest from zip file.'), 'tier': 1, }) 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: # Persist the error with this into FileUpload, but do not persist # the file contents, which are too large. validation = { 'errors': len(errors), 'success': False, 'messages': errors, } self.file_upload = FileUpload.objects.create( is_webapp=True, user=self.user, name=getattr(upload, 'name', ''), validation=json.dumps(validation)) # Raise an error so the form is invalid. raise forms.ValidationError(' '.join( [e['message'] for e in errors][0])) # Everything passed validation. self.file_upload = FileUpload.from_post( upload, upload.name, upload.size, is_webapp=True) self.file_upload.user = self.user self.file_upload.save()
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. manifest = ZipFile(upload, 'r').read('manifest.webapp') except Exception as e: errors.append({ 'type': 'error', 'message': _('Error extracting manifest from zip file.'), 'tier': 1, }) 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, is_webapp=True) self.file_upload.user = self.user self.file_upload.save()
def upload(self): # The data should be in chunks. data = [''.join(x) for x in amo.utils.chunked(self.data, 3)] return FileUpload.from_post(data, 'filename.xpi', len(self.data))