Esempio n. 1
0
 def test_name_with_translations_fallback(self, get_json_data):
     get_json_data.return_value = {
         'name': 'Blah',
         'description': 'Blah Description',
         'developer': {
             'name': 'Mozilla Marketplace Testing'
         },
         'default_locale': 'en-US',
         'locales': {
             'fr': {
                 'description': 'Blah Description (fr)',
             },
             'es': {
                 'name': 'Blah (es)',
             }
         }
     }
     # The argument to parse() is supposed to be a filename, it doesn't
     # matter here though since we are mocking get_json_data().
     parsed_results = WebAppParser().parse('')
     eq_(parsed_results['name'].get('fr'), 'Blah')  # Falls back to default.
     eq_(parsed_results['name'].get('es'), 'Blah (es)')
     eq_(parsed_results['name'].get('en-US'), 'Blah')
     eq_(parsed_results['name'].get('de'), None)
     eq_(parsed_results['default_locale'], 'en-US')
 def test_no_manifest_at_root(self):
     with self.assertRaises(forms.ValidationError) as exc:
         WebAppParser().parse(
             self.packaged_app_path('no-manifest-at-root.zip'))
     m = exc.exception.messages[0]
     assert m.startswith('The file "manifest.webapp" was not found'), (
         'Unexpected: %s' % m)
Esempio n. 3
0
 def test_non_ascii(self):
     wm = json.dumps(dict(name=u'まつもとゆきひろ',
                          version='1.0',
                          developer=dict(name=u'まつもとゆきひろ')),
                     encoding='shift-jis')
     wp = WebAppParser().parse(self.webapp(contents=wm))
     eq_(wp['name'], {'en-US': u'まつもとゆきひろ'})
Esempio n. 4
0
    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})
Esempio n. 5
0
def _update_developer_name(id):
    try:
        webapp = Webapp.objects.get(pk=id)
    except Webapp.DoesNotExist:
        _log(id, u'Webapp does not exist')
        return

    version = webapp.current_version

    # If the app doesn't have a current_version, don't bother.
    if not version:
        _log(id, u'Webapp does not have a current_version')
        return

    # If the current_version already has a non-empty developer_name set, don't
    # touch it and bail.
    if version._developer_name:
        _log(id, u'Webapp already has a non-empty developer_name')
        return

    try:
        data = WebAppParser().parse(webapp.get_latest_file().file_path)
    except ValidationError:
        _log(id, u'Webapp manifest can not be parsed')
        return

    max_len = version._meta.get_field_by_name('_developer_name')[0].max_length
    version.update(_developer_name=data['developer_name'][:max_len])
Esempio n. 6
0
 def test_non_ascii(self):
     wm = json.dumps({
         'name': u'まつもとゆきひろ',
         'version': '1.0'
     },
                     encoding='shift-jis')
     wp = WebAppParser().parse(self.webapp(contents=wm))
     eq_(wp['name'], {'en-US': u'まつもとゆきひろ'})
Esempio n. 7
0
 def test_no_locales(self):
     wp = WebAppParser().parse(
         self.webapp(
             dict(name='foo',
                  version='1.0',
                  description='description',
                  developer=dict(name='bar'))))
     eq_(wp['description']['en-US'], u'description')
Esempio n. 8
0
    def get_manifest_json(self, file_obj=None):
        file_ = file_obj or self.get_latest_file()
        if not file_:
            return
        if self.status == amo.STATUS_REJECTED:
            file_path = file_.guarded_file_path
        else:
            file_path = file_.file_path

        return WebAppParser().get_json_data(file_path)
 def test_parse_packaged_BOM(self):
     wp = WebAppParser().parse(self.packaged_app_path('mozBOM.zip'))
     eq_(wp['guid'], None)
     eq_(wp['type'], amo.ADDON_WEBAPP)
     eq_(wp['name']['en-US'], u'Packaged MozBOM ょ')
     eq_(wp['summary']['en-US'], u'Exciting BOM action!')
     eq_(wp['summary']['es'], u'¡Acción BOM!')
     eq_(wp['summary']['it'], u'Azione BOM!')
     eq_(wp['version'], '1.0')
     eq_(wp['default_locale'], 'en-US')
Esempio n. 10
0
 def test_no_developer_name(self, get_json_data):
     get_json_data.return_value = {
         'name': 'Blah'
     }
     with self.assertRaises(forms.ValidationError) as e:
         # The argument to parse() is supposed to be a filename, it doesn't
         # matter here though since we are mocking get_json_data().
         WebAppParser().parse('')
     eq_(e.exception.messages, ["Developer name is required in the manifest"
                                " in order to display it on the app's "
                                "listing."])
Esempio n. 11
0
 def test_parse(self):
     wp = WebAppParser().parse(self.webapp_path)
     eq_(wp['guid'], None)
     eq_(wp['type'], amo.ADDON_WEBAPP)
     eq_(wp['summary']['en-US'], u'Exciting Open Web development action!')
     eq_(wp['summary']['es'],
         u'\u9686Acci\u8d38n abierta emocionante del desarrollo del Web!')
     eq_(wp['summary']['it'],
         u'Azione aperta emozionante di sviluppo di fotoricettore!')
     eq_(wp['version'], '1.0')
     eq_(wp['default_locale'], 'en-US')
Esempio n. 12
0
 def test_developer_name(self, get_json_data):
     get_json_data.return_value = {
         'name': 'Blah',
         'developer': {
             'name': 'Mozilla Marketplace Testing'
         }
     }
     # The argument to parse() is supposed to be a filename, it doesn't
     # matter here though since we are mocking get_json_data().
     parsed_results = WebAppParser().parse('')
     eq_(parsed_results['developer_name'], 'Mozilla Marketplace Testing')
Esempio n. 13
0
 def test_parse_packaged(self):
     wp = WebAppParser().parse(self.packaged_app_path('mozball.zip'))
     eq_(wp['guid'], None)
     eq_(wp['type'], amo.ADDON_WEBAPP)
     eq_(wp['name']['en-US'], u'Packaged MozillaBall ょ')
     eq_(wp['summary']['en-US'], u'Exciting Open Web development action!')
     eq_(wp['summary']['es'],
         u'¡Acción abierta emocionante del desarrollo del Web!')
     eq_(wp['summary']['it'],
         u'Azione aperta emozionante di sviluppo di fotoricettore!')
     eq_(wp['version'], '1.0')
     eq_(wp['default_locale'], 'en-US')
Esempio n. 14
0
    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,
                })
Esempio n. 15
0
 def test_parse(self):
     wp = WebAppParser().parse(self.webapp_path)
     eq_(wp['guid'], None)
     eq_(wp['type'], amo.ADDON_WEBAPP)
     eq_(wp['description']['en-US'],
         u'Exciting Open Web development action!')
     # UTF-8 byte string decoded to unicode.
     eq_(wp['description']['es'],
         u'\xa1Acci\xf3n abierta emocionante del desarrollo del Web!')
     eq_(wp['description']['it'],
         u'Azione aperta emozionante di sviluppo di fotoricettore!')
     eq_(wp['version'], '1.0')
     eq_(wp['default_locale'], 'en-US')
Esempio n. 16
0
    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,
                })
Esempio n. 17
0
def import_manifests(ids, **kw):
    for app in Webapp.objects.filter(id__in=ids):
        for version in app.versions.all():
            try:
                file_ = version.files.latest()
                if file_.status == amo.STATUS_DISABLED:
                    file_path = file_.guarded_file_path
                else:
                    file_path = file_.file_path
                manifest = WebAppParser().get_json_data(file_path)
                m, c = AppManifest.objects.get_or_create(
                    version=version, manifest=json.dumps(manifest))
                if c:
                    task_log.info(
                        '[Webapp:%s] Imported manifest for version %s' % (
                            app.id, version.id))
                else:
                    task_log.info(
                        '[Webapp:%s] App manifest exists for version %s' % (
                            app.id, version.id))
            except Exception as e:
                task_log.info('[Webapp:%s] Error loading manifest for version '
                              '%s: %s' % (app.id, version.id, e))
Esempio n. 18
0
 def test_packaged_with_BOM(self):
     # Exercise separate code paths to loading the packaged app manifest.
     self.setup_files('mozBOM.zip')
     assert WebAppParser().parse(self.file.file_path)
     self.assertTrue(self.app.has_icon_in_manifest())
Esempio n. 19
0
 def test_no_description(self):
     wp = WebAppParser().parse(
         self.webapp(
             dict(name='foo', version='1.0', developer=dict(name='bar'))))
     eq_(wp['description'], {})
Esempio n. 20
0
 def test_utf32_bom(self):
     data = json.dumps(self.manifest, encoding='utf8')
     wm = data.decode('utf8').encode('utf32')  # BOM added automatically
     wp = WebAppParser().parse(self.webapp(contents=wm))
     eq_(wp['version'], '1.0')
Esempio n. 21
0
 def test_utf8_bom(self):
     wm = codecs.BOM_UTF8 + json.dumps(self.manifest, encoding='utf8')
     wp = WebAppParser().parse(self.webapp(contents=wm))
     eq_(wp['version'], '1.0')
Esempio n. 22
0
 def test_syntax_error(self):
     with self.assertRaises(forms.ValidationError) as exc:
         WebAppParser().parse(self.webapp(contents='}]'))
     m = exc.exception.messages[0]
     assert m.startswith('Could not parse webapp manifest'), (
         'Unexpected: %s' % m)
Esempio n. 23
0
 def test_no_description(self):
     wp = WebAppParser().parse(self.webapp(dict(name='foo', version='1.0')))
     eq_(wp['summary'], {})
Esempio n. 24
0
 def test_no_locales(self):
     wp = WebAppParser().parse(
         self.webapp(dict(name='foo', version='1.0',
                          description='summary')))
     eq_(wp['summary']['en-US'], u'summary')