Exemple #1
0
    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
Exemple #2
0
    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
Exemple #3
0
    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
Exemple #4
0
 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
Exemple #5
0
 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
Exemple #6
0
 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()
Exemple #7
0
 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()
Exemple #8
0
 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
Exemple #9
0
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')
Exemple #10
0
    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)
Exemple #11
0
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")
Exemple #12
0
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')
Exemple #13
0
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")
Exemple #14
0
 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))
Exemple #15
0
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()
Exemple #16
0
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()
Exemple #17
0
 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))
Exemple #18
0
 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))