| 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) |