diff --git a/python/mozbuild/mozpack/dmg.py b/python/mozbuild/mozpack/dmg.py index ade25aeac3..b231f731b8 100644 --- a/python/mozbuild/mozpack/dmg.py +++ b/python/mozbuild/mozpack/dmg.py @@ -5,6 +5,7 @@ import errno import mozfile import os +import fnmatch import platform import shutil import subprocess @@ -46,11 +47,11 @@ def create_dmg_from_staged(stagedir, output_dmg, tmpdir, volume_name): if not is_linux: # Running on OS X hybrid = os.path.join(tmpdir, 'hybrid.dmg') - subprocess.check_call(['hdiutil', 'makehybrid', '-hfs', - '-hfs-volume-name', volume_name, - '-hfs-openfolder', stagedir, - '-ov', stagedir, - '-o', hybrid]) + subprocess.check_call(['hdiutil', 'create', + '-fs', 'HFS+', + '-volname', volume_name, + '-srcfolder', stagedir, + '-ov', hybrid]) subprocess.check_call(['hdiutil', 'convert', '-format', 'UDBZ', '-imagekey', 'bzip2-level=9', '-ov', hybrid, '-o', output_dmg]) @@ -70,8 +71,8 @@ def create_dmg_from_staged(stagedir, output_dmg, tmpdir, volume_name): uncompressed, output_dmg ], - # dmg is seriously chatty - stdout=open(os.devnull, 'wb')) + # dmg is seriously chatty + stdout=open(os.devnull, 'wb')) def check_tools(*tools): ''' @@ -87,7 +88,6 @@ def check_tools(*tools): if not os.access(path, os.X_OK): raise Exception('Required tool "%s" at path "%s" is not executable' % (tool, path)) - def create_dmg(source_directory, output_dmg, volume_name, extra_files): ''' Create a DMG disk image at the path output_dmg from source_directory. @@ -122,6 +122,16 @@ def create_dmg(source_directory, output_dmg, volume_name, extra_files): if not is_linux: identity = buildconfig.substs['MOZ_MACBUNDLE_IDENTITY'] if identity != '': + dylibs = [] appbundle = os.path.join(stagedir, buildconfig.substs['MOZ_MACBUNDLE_NAME']) - subprocess.check_call(['codesign', '--deep', '-s', identity, appbundle]) + # If the -bin file is in Resources add it to the dylibs as well + resourcebin = os.path.join(appbundle, 'Contents/Resources/' + buildconfig.substs['MOZ_APP_NAME'] + '-bin') + if os.path.isfile(resourcebin): + dylibs.append(resourcebin) + # Create a list of dylibs in Contents/Resources that won't get signed by --deep + for root, dirnames, filenames in os.walk('Contents/Resources/'): + for filename in fnmatch.filter(filenames, '*.dylib'): + dylibs.append(os.path.join(root, filename)) + entitlement = os.path.abspath(os.path.join(os.getcwd(), '../../platform/security/mac/production.entitlements.xml')) + subprocess.check_call(['codesign', '--deep', '--timestamp', '--options', 'runtime', '--entitlements', entitlement, '-s', identity] + dylibs + [appbundle]) create_dmg_from_staged(stagedir, output_dmg, tmpdir, volume_name) diff --git a/security/mac/developer.entitlements.xml b/security/mac/developer.entitlements.xml new file mode 100644 index 0000000000..1560ab9c62 --- /dev/null +++ b/security/mac/developer.entitlements.xml @@ -0,0 +1,38 @@ + + + + + + + com.apple.security.cs.allow-unsigned-executable-memory + + + com.apple.security.cs.disable-library-validation + + + com.apple.security.cs.allow-dyld-environment-variables + + + com.apple.security.get-task-allow + + + com.apple.security.device.audio-input + + + com.apple.security.device.camera + + + com.apple.security.personal-information.location + + diff --git a/security/mac/production.entitlements.xml b/security/mac/production.entitlements.xml new file mode 100644 index 0000000000..6c2d751728 --- /dev/null +++ b/security/mac/production.entitlements.xml @@ -0,0 +1,23 @@ + + + + + + + com.apple.security.cs.allow-unsigned-executable-memory + + + com.apple.security.cs.disable-library-validation + + + com.apple.security.device.audio-input + + + com.apple.security.device.camera + + + com.apple.security.personal-information.location + +