| Index: packagerSafari.py |
| =================================================================== |
| --- a/packagerSafari.py |
| +++ b/packagerSafari.py |
| @@ -89,7 +89,8 @@ |
| endScripts=(get_optional('contentScripts', 'document_end') or '').split(), |
| menus=parse_section('menus', 2), |
| toolbarItems=parse_section('toolbar_items'), |
| - popovers=parse_section('popovers') |
| + popovers=parse_section('popovers'), |
| + developerIdentifier=params.get('developerIdentifier') |
| ).encode('utf-8') |
| def createBackgroundPage(params): |
| @@ -113,7 +114,36 @@ |
| content, re.S | re.I |
| ) |
| -def createSignedXarArchive(outFile, files, keyFile): |
| +def get_certificates_and_key(keyfile): |
| + import M2Crypto |
| + |
| + certs = [] |
| + bio = M2Crypto.BIO.openfile(keyfile) |
| + |
| + try: |
| + key = M2Crypto.RSA.load_key_bio(bio) |
| + bio.reset() |
| + while True: |
| + try: |
| + certs.append(M2Crypto.X509.load_cert_bio(bio)) |
| + except M2Crypto.X509.X509Error: |
| + break |
| + finally: |
| + bio.close() |
| + |
| + return certs, key |
| + |
| +def get_developer_identifier(certs): |
| + for cert in certs: |
| + subject = cert.get_subject() |
| + for entry in subject.get_entries_by_nid(subject.nid['CN']): |
| + m = re.match(r'Safari Developer: \((.*?)\)', entry.get_data().as_text()) |
| + if m: |
| + return m.group(1) |
| + |
| + raise Exception('No Safari developer certificate found in chain') |
| + |
| +def createSignedXarArchive(outFile, files, certs, key): |
| import subprocess |
| import tempfile |
| import shutil |
| @@ -142,28 +172,15 @@ |
| certificate_filenames = [] |
| try: |
| - # load key and certificates from the all-in-one key file |
| - # and write each certificate in DER format to a seperate |
| + # write each certificate in DER format to a separate |
| # temporary file, that they can be passed to xar |
| - bio = M2Crypto.BIO.openfile(keyFile) |
| - try: |
| - key = M2Crypto.RSA.load_key_bio(bio) |
| - |
| - bio.reset() |
| - while True: |
| - try: |
| - cert = M2Crypto.X509.load_cert_bio(bio) |
| - except M2Crypto.X509.X509Error: |
| - break |
| - |
| - fd, filename = tempfile.mkstemp() |
| - try: |
| - certificate_filenames.append(filename) |
| - os.write(fd, cert.as_der()) |
| - finally: |
| - os.close(fd) |
| - finally: |
| - bio.close() |
| + for cert in certs: |
| + fd, filename = tempfile.mkstemp() |
| + try: |
| + certificate_filenames.append(filename) |
| + os.write(fd, cert.as_der()) |
| + finally: |
| + os.close(fd) |
| # add certificates and placeholder signature |
| # to the xar archive, and get data to sign |
| @@ -241,6 +258,10 @@ |
| if metadata.has_section('import_locales'): |
| importGeckoLocales(params, files) |
| + if keyFile: |
| + certs, key = get_certificates_and_key(keyFile) |
| + params['developerIdentifier'] = get_developer_identifier(certs) |
| + |
| files['lib/info.js'] = createInfoModule(params) |
| files['background.html'] = createBackgroundPage(params) |
| files['Info.plist'] = createManifest(params, files) |
| @@ -252,6 +273,6 @@ |
| files[os.path.join(dirname, filename)] = files.pop(filename) |
| if not devenv and keyFile: |
| - createSignedXarArchive(outFile, files, keyFile) |
| + createSignedXarArchive(outFile, files, certs, key) |
| else: |
| files.zip(outFile) |