Adding nix firefox extension support
This commit is contained in:
parent
1cd16d50b4
commit
eedee46f2f
1 changed files with 194 additions and 2 deletions
|
@ -1,4 +1,6 @@
|
|||
{ stdenv, lib, makeDesktopItem, makeWrapper, lndir, config
|
||||
{ stdenv, lib, makeDesktopItem, makeWrapper, lndir, config,
|
||||
|
||||
replace, fetchurl, zip, unzip, jq
|
||||
|
||||
## various stuff that can be plugged in
|
||||
, flashplayer, hal-flash
|
||||
|
@ -31,6 +33,12 @@ let
|
|||
, forceWayland ? false
|
||||
, useGlvnd ? true
|
||||
, cfg ? config.${browserName} or {}
|
||||
|
||||
## Following options are needed for extra prefs & policies
|
||||
, extraPrefs ? ""
|
||||
, extraPolicies ? {}
|
||||
, firefoxLibName ? "firefox"
|
||||
, extraExtensions ? [ ]
|
||||
}:
|
||||
|
||||
assert forceWayland -> (browser ? gtk3); # Can only use the wayland backend if gtk3 is being used
|
||||
|
@ -81,6 +89,88 @@ let
|
|||
++ pkcs11Modules;
|
||||
gtk_modules = [ libcanberra-gtk2 ];
|
||||
|
||||
#########################
|
||||
# #
|
||||
# EXTRA PREF CHANGES #
|
||||
# #
|
||||
#########################
|
||||
policiesJson = builtins.toFile "policies.json"
|
||||
(builtins.toJSON enterprisePolicies);
|
||||
|
||||
extensions = builtins.map (a:
|
||||
if ! (builtins.hasAttr "name" a) || ! (builtins.isString a.name) then
|
||||
throw "Firefox addon needs a name attribute"
|
||||
else if ! (builtins.hasAttr "url" a) || ! (builtins.isString a.url) then
|
||||
throw "Addon ${a.pname} needs an url"
|
||||
else if ! (builtins.hasAttr "sha256" a) || ! (builtins.isString a.sha256) then
|
||||
throw "Addon ${a.pname} needs an sha256 checksum"
|
||||
else stdenv.mkDerivation rec {
|
||||
pname = a.name;
|
||||
version = "1.0";
|
||||
src = fetchurl {
|
||||
url = a.url;
|
||||
sha256 = a.sha256;
|
||||
};
|
||||
|
||||
phases = [ "buildPhase" ];
|
||||
|
||||
extid = "${a.sha256}@${a.name}";
|
||||
|
||||
buildInputs = [ zip unzip jq ];
|
||||
|
||||
buildPhase = ''
|
||||
UUID="${extid}"
|
||||
mkdir -p "$out/$UUID"
|
||||
unzip -q ${src} -d "$out/$UUID"
|
||||
NEW_MANIFEST=$(jq '. + {"applications": { "gecko": { "id": "${extid}" }}, "browser_specific_settings":{"gecko":{"id": "${extid}"}}}' "$out/$UUID/manifest.json")
|
||||
echo "$NEW_MANIFEST" > "$out/$UUID/manifest.json"
|
||||
cd "$out/$UUID"
|
||||
zip -r -q -FS "$out/$UUID.xpi" *
|
||||
rm -r "$out/$UUID"
|
||||
'';
|
||||
}
|
||||
) extraExtensions;
|
||||
|
||||
enterprisePolicies =
|
||||
{
|
||||
policies = {
|
||||
DisableAppUpdate = true;
|
||||
} //
|
||||
{
|
||||
ExtensionSettings = {
|
||||
"*" = {
|
||||
blocked_install_message = "You can't have manual extension mixed with nix extensions";
|
||||
installation_mode = "blocked";
|
||||
};
|
||||
|
||||
} // lib.foldr (e: ret:
|
||||
ret // {
|
||||
"${e.extid}" = {
|
||||
installation_mode = "allowed";
|
||||
};
|
||||
}
|
||||
) {} extensions;
|
||||
}
|
||||
// extraPolicies;
|
||||
};
|
||||
|
||||
mozillaCfg = builtins.toFile "mozilla.cfg" ''
|
||||
// First line must be a comment
|
||||
|
||||
// Disables addon signature checking
|
||||
// to be able to install addons that do not have an extid
|
||||
// Security is maintained because only user whitelisted addons
|
||||
// with a checksum can be installed
|
||||
lockPref("xpinstall.signatures.required", false);
|
||||
${extraPrefs}
|
||||
'';
|
||||
|
||||
#############################
|
||||
# #
|
||||
# END EXTRA PREF CHANGES #
|
||||
# #
|
||||
#############################
|
||||
|
||||
in stdenv.mkDerivation {
|
||||
inherit pname version;
|
||||
|
||||
|
@ -106,6 +196,7 @@ let
|
|||
nativeBuildInputs = [ makeWrapper lndir ];
|
||||
buildInputs = lib.optional (browser ? gtk3) browser.gtk3;
|
||||
|
||||
|
||||
buildCommand = lib.optionalString stdenv.isDarwin ''
|
||||
mkdir -p $out/Applications
|
||||
cp -R --no-preserve=mode,ownership ${browser}/Applications/${browserName}.app $out/Applications
|
||||
|
@ -117,7 +208,66 @@ let
|
|||
exit 1
|
||||
fi
|
||||
|
||||
makeWrapper "$(readlink -v --canonicalize-existing "${browser}${browser.execdir or "/bin"}/${browserName}")" \
|
||||
#########################
|
||||
# #
|
||||
# EXTRA PREF CHANGES #
|
||||
# #
|
||||
#########################
|
||||
# Link the runtime. The executable itself has to be copied,
|
||||
# because it will resolve paths relative to its true location.
|
||||
# Any symbolic links have to be replicated as well.
|
||||
cd "${browser}"
|
||||
find . -type d -exec mkdir -p "$out"/{} \;
|
||||
|
||||
find . -type f \( -not -name "${browserName}" \) -exec ln -sT "${browser}"/{} "$out"/{} \;
|
||||
|
||||
find . -type f -name "${browserName}" -print0 | while read -d $'\0' f; do
|
||||
cp -P --no-preserve=mode,ownership "${browser}/$f" "$out/$f"
|
||||
chmod a+rwx "$out/$f"
|
||||
done
|
||||
|
||||
# fix links and absolute references
|
||||
cd "${browser}"
|
||||
|
||||
find . -type l -print0 | while read -d $'\0' l; do
|
||||
target="$(readlink "$l" | ${replace}/bin/replace-literal -es -- "${browser}" "$out")"
|
||||
ln -sfT "$target" "$out/$l"
|
||||
done
|
||||
|
||||
# This will not patch binaries, only "text" files.
|
||||
# Its there for the wrapper mostly.
|
||||
cd "$out"
|
||||
${replace}/bin/replace-literal -esfR -- "${browser}" "$out"
|
||||
|
||||
# create the wrapper
|
||||
|
||||
executablePrefix="$out${browser.execdir or "/bin"}"
|
||||
executablePath="$executablePrefix/${browserName}"
|
||||
|
||||
if [ ! -x "$executablePath" ]
|
||||
then
|
||||
echo "cannot find executable file \`${browser}${browser.execdir or "/bin"}/${browserName}'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -L "$executablePath" ]
|
||||
then
|
||||
# Careful here, the file at executablePath may already be
|
||||
# a wrapper. That is why we postfix it with -old instead
|
||||
# of -wrapped.
|
||||
oldExe="$executablePrefix"/".${browserName}"-old
|
||||
mv "$executablePath" "$oldExe"
|
||||
else
|
||||
oldExe="$(readlink -v --canonicalize-existing "$executablePath")"
|
||||
fi
|
||||
|
||||
if [ ! -x "${browser}${browser.execdir or "/bin"}/${browserName}" ]
|
||||
then
|
||||
echo "cannot find executable file \`${browser}${browser.execdir or "/bin"}/${browserName}'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
makeWrapper "$oldExe" \
|
||||
"$out${browser.execdir or "/bin"}/${browserName}${nameSuffix}" \
|
||||
--suffix-each MOZ_PLUGIN_PATH ':' "$plugins" \
|
||||
--suffix LD_LIBRARY_PATH ':' "$libs" \
|
||||
|
@ -137,6 +287,11 @@ let
|
|||
--suffix XDG_DATA_DIRS : '${gnome3.adwaita-icon-theme}/share'
|
||||
''
|
||||
}
|
||||
#############################
|
||||
# #
|
||||
# END EXTRA PREF CHANGES #
|
||||
# #
|
||||
#############################
|
||||
|
||||
if [ -e "${browser}/share/icons" ]; then
|
||||
mkdir -p "$out/share"
|
||||
|
@ -166,6 +321,43 @@ let
|
|||
# For manpages, in case the program supplies them
|
||||
mkdir -p $out/nix-support
|
||||
echo ${browser} > $out/nix-support/propagated-user-env-packages
|
||||
|
||||
|
||||
#########################
|
||||
# #
|
||||
# EXTRA PREF CHANGES #
|
||||
# #
|
||||
#########################
|
||||
# user customization
|
||||
mkdir -p $out/lib/${firefoxLibName}
|
||||
|
||||
# creating policies.json
|
||||
mkdir -p "$out/lib/${firefoxLibName}/distribution"
|
||||
|
||||
POL_PATH="$out/lib/${firefoxLibName}/distribution/policies.json"
|
||||
rm -f "$POL_PATH"
|
||||
cat ${policiesJson} >> "$POL_PATH"
|
||||
|
||||
# preparing for autoconfig
|
||||
mkdir -p "$out/lib/${firefoxLibName}/defaults/pref"
|
||||
|
||||
cat > "$out/lib/${firefoxLibName}/defaults/pref/autoconfig.js" <<EOF
|
||||
pref("general.config.filename", "mozilla.cfg");
|
||||
pref("general.config.obscure_value", 0);
|
||||
EOF
|
||||
|
||||
cat > "$out/lib/${firefoxLibName}/mozilla.cfg" < ${mozillaCfg}
|
||||
|
||||
mkdir -p $out/lib/${firefoxLibName}/distribution/extensions
|
||||
|
||||
for i in ${toString extensions}; do
|
||||
ln -s -t $out/lib/${firefoxLibName}/distribution/extensions $i/*
|
||||
done
|
||||
#############################
|
||||
# #
|
||||
# END EXTRA PREF CHANGES #
|
||||
# #
|
||||
#############################
|
||||
'';
|
||||
|
||||
preferLocalBuild = true;
|
||||
|
|
Loading…
Reference in a new issue