DMG Install Helper
When the user runs Firefox from inside the downloaded DMG we ask them if they want to install Firefox into /Applications. This is done because a new user sometimes doesn’t know how to install an application on macOS, assuming it to be like Windows. The second reason is because Firefox data is tied to the executable’s file system location, so confusion about why bookmarks, settings and tabs have disappeared or reset can occur. Data loss is also possible. For these reasons, running from a DMG (and any location other than /Applications) is strongly discouraged unless you know what you’re doing.
When the user acknowledges that they do want Firefox installed into /Applications the app bundle is simply copied from the DMG into /Applications. If /Applications is not writable by the user, however, the DMG Install Helper comes into play.
The DMG Install Helper is a simple helper application that is run by launchd with elevated permissions, and all it does is copy the given app bundle into /Applications.
Debugging
Debugging elevated launchd applications is tricky and a few things need to be set up first.
You need an official Mozilla signing certificate for
org.mozilla.nightly(see instructions on firefox-source-docs)You need these two options in mozconfig
ac_add_options --enable-mac-elevated-updates-with-generic-certs
ac_add_options --enable-dmg-install-helper-debug
You need to turn off
--enable-debugin mozconfig (--enable-debugsets the bundleid toorg.mozilla.nightlydebugand the certificate obtained in the first step is only fororg.mozilla.nightly)No app called
Nightly.appin/Applications(If/Applications/Nightly.appexists, Firefox will offer to launch it instead of installing over the top of it.)After building, you need to create a Firefox package, mount it, take
Nightly.appout, sign the app bundle and then create a new DMG with the signed binary. You’ll want to make a script to do this
#! /bin/bash
# package
./mach package
# remove previous attempts
umount /Volumes/Nightly
umount /Volumes/DMGInstallTest
rm -rf /tmp/Nightly.app
rm -f /tmp/tmp.dmg
# move the built Fx out of DMG, so it can be signed
hdiutil attach <path-to-firefox-dmg>
cp -R /Volumes/Nightly/Nightly.app /tmp/
umount /Volumes/Nightly
# sign the Fx app bundle
./mach macos-sign -a /tmp/Nightly.app -s <your-signing-certificate-id> -e production
# repack signed Fx bundle into a new DMG
hdiutil create -fs HFS+ -volname DMGInstallTest -srcfolder /tmp/Nightly.app /tmp/tmp.dmg
open /tmp/tmp.dmg
After that the DMG install path will be enabled at start up, and running from DMG will offer to install it.
To force the elevated DMG installer (so that you don’t have to change the permissions on /Applications) you can set an environment variable before launching Firefox:
launchctl setenv MOZ_DMG_INSTALL_HELPER_ALWAYS_ELEVATE 1
You can turn this off again with
launchctl unsetenv MOZ_DMG_INSTALL_HELPER_ALWAYS_ELEVATE
Uninstalling
The DMG Install Helper should clean up after itself, but if it doesn’t you can run the following script. If you’ve been making changes to the DMG Install Helper and aren’t seeing them executed, then it’s possible that launchd is still using the older version because it didn’t clean up correctly. This script will fix that.
#! /bin/sh
sudo launchctl unload /Library/LaunchDaemons/org.mozilla.dmgInstallHelper.plist
sudo rm /Library/LaunchDaemons/org.mozilla.dmgInstallHelper.plist
sudo rm /Library/PrivilegedHelperTools/org.mozilla.dmgInstallHelper