Index: packagerSafari.py |
diff --git a/packagerSafari.py b/packagerSafari.py |
deleted file mode 100644 |
index 288ba8d467e81ecbadd6146285e8d35f0f6d09f7..0000000000000000000000000000000000000000 |
--- a/packagerSafari.py |
+++ /dev/null |
@@ -1,181 +0,0 @@ |
-# This Source Code Form is subject to the terms of the Mozilla Public |
-# License, v. 2.0. If a copy of the MPL was not distributed with this |
-# file, You can obtain one at http://mozilla.org/MPL/2.0/. |
- |
-import base64 |
-import ConfigParser |
-import json |
-import os |
-import re |
-from urlparse import urlparse |
- |
-from packager import readMetadata, getDefaultFileName, getBuildVersion, getTemplate, Files |
-from packagerChrome import convertJS, import_locales, getIgnoredFiles, getPackageFiles, defaultLocale, createScriptPage |
- |
- |
-def processFile(path, data, params): |
- return data |
- |
- |
-def createManifest(params, files): |
- template = getTemplate('Info.plist.tmpl', autoEscape=True) |
- metadata = params['metadata'] |
- catalog = json.loads(files['_locales/%s/messages.json' % defaultLocale]) |
- |
- def parse_section(section, depth=1): |
- result = {} |
- |
- if not metadata.has_section(section): |
- return result |
- |
- for opt in metadata.options(section): |
- bits = opt.split('_', depth) |
- key = bits.pop().replace('_', ' ').title() |
- val = metadata.get(section, opt) |
- |
- try: |
- val = int(val) |
- except ValueError: |
- try: |
- val = float(val) |
- except ValueError: |
- pass |
- |
- reduce(lambda d, x: d.setdefault(x, {}), bits, result)[key] = val |
- |
- return result |
- |
- def get_optional(*args): |
- try: |
- return metadata.get(*args) |
- except ConfigParser.Error: |
- return None |
- |
- allowedDomains = set() |
- allowAllDomains = False |
- allowSecurePages = False |
- |
- for perm in metadata.get('general', 'permissions').split(): |
- if perm == '<all_urls>': |
- allowAllDomains = True |
- allowSecurePages = True |
- continue |
- |
- url = urlparse(perm) |
- |
- if url.scheme == 'https': |
- allowSecurePages = True |
- elif url.scheme != 'http': |
- continue |
- |
- if '*' in url.hostname: |
- allowAllDomains = True |
- continue |
- |
- allowedDomains.add(url.hostname) |
- |
- return template.render( |
- basename=metadata.get('general', 'basename'), |
- version=params['version'], |
- releaseBuild=params['releaseBuild'], |
- name=catalog['name']['message'], |
- description=catalog['description']['message'], |
- author=get_optional('general', 'author'), |
- homepage=get_optional('general', 'homepage'), |
- updateURL=get_optional('general', 'updateURL'), |
- allowedDomains=allowedDomains, |
- allowAllDomains=allowAllDomains, |
- allowSecurePages=allowSecurePages, |
- startScripts=(get_optional('contentScripts', 'document_start') or '').split(), |
- endScripts=(get_optional('contentScripts', 'document_end') or '').split(), |
- menus=parse_section('menus', 2), |
- toolbarItems=parse_section('toolbar_items'), |
- popovers=parse_section('popovers'), |
- developerIdentifier=params.get('developerIdentifier') |
- ).encode('utf-8') |
- |
- |
-def createInfoModule(params): |
- template = getTemplate('safariInfo.js.tmpl') |
- return template.render(params).encode('utf-8') |
- |
- |
-def _get_sequence(data): |
- from Crypto.Util import asn1 |
- sequence = asn1.DerSequence() |
- sequence.decode(data) |
- return sequence |
- |
- |
-def get_developer_identifier(certs): |
- for cert in certs: |
- # See https://tools.ietf.org/html/rfc5280#section-4 |
- tbscertificate = _get_sequence(base64.b64decode(cert))[0] |
- subject = _get_sequence(tbscertificate)[5] |
- |
- # We could decode the subject but since we have to apply a regular |
- # expression on CN entry anyway we can just skip that. |
- m = re.search(r'Safari Developer: \((\S*?)\)', subject) |
- if m: |
- return m.group(1) |
- |
- raise Exception('No Safari developer certificate found in chain') |
- |
- |
-def createBuild(baseDir, type, outFile=None, buildNum=None, releaseBuild=False, keyFile=None, devenv=False): |
- metadata = readMetadata(baseDir, type) |
- version = getBuildVersion(baseDir, metadata, releaseBuild, buildNum) |
- |
- if not outFile: |
- outFile = getDefaultFileName(metadata, version, 'safariextz' if keyFile else 'zip') |
- |
- params = { |
- 'type': type, |
- 'baseDir': baseDir, |
- 'releaseBuild': releaseBuild, |
- 'version': version, |
- 'devenv': devenv, |
- 'metadata': metadata, |
- } |
- |
- mapped = metadata.items('mapping') if metadata.has_section('mapping') else [] |
- files = Files(getPackageFiles(params), getIgnoredFiles(params), |
- process=lambda path, data: processFile(path, data, params)) |
- files.readMappedFiles(mapped) |
- files.read(baseDir, skip=[opt for opt, _ in mapped]) |
- |
- if metadata.has_section('convert_js'): |
- convertJS(params, files) |
- |
- if metadata.has_section('preprocess'): |
- files.preprocess( |
- [f for f, _ in metadata.items('preprocess')], |
- {'needsExt': True} |
- ) |
- |
- if metadata.has_section('import_locales'): |
- import_locales(params, files) |
- |
- if metadata.has_option('general', 'testScripts'): |
- files['qunit/index.html'] = createScriptPage(params, 'testIndex.html.tmpl', |
- ('general', 'testScripts')) |
- |
- if keyFile: |
- from buildtools import xarfile |
- certs, key = xarfile.read_certificates_and_key(keyFile) |
- params['developerIdentifier'] = get_developer_identifier(certs) |
- |
- files['lib/info.js'] = createInfoModule(params) |
- files['background.html'] = createScriptPage(params, 'background.html.tmpl', |
- ('general', 'backgroundScripts')) |
- files['Info.plist'] = createManifest(params, files) |
- |
- dirname = metadata.get('general', 'basename') + '.safariextension' |
- for filename in files.keys(): |
- files[os.path.join(dirname, filename)] = files.pop(filename) |
- |
- if not devenv and keyFile: |
- from buildtools import xarfile |
- xarfile.create(outFile, files, keyFile) |
- else: |
- files.zip(outFile) |