Files
ryan4yin | 二花 818965a11f feat(nixpak): unify desktop app sandboxes (#491)
* refactor(nixpak): unify desktop app sandboxes

Move common GUI, portal, and network policy into reusable modules and migrate browsers plus Zoom/WeChat/QQ/Telegram to the same boundary.

Assisted-by: DeepSeek Harness (deepseek-flash)
2026-10-31 22:27:58 +08:00

71 lines
1.6 KiB
Nix

{
lib,
zoom-us,
buildFHSEnv,
mkNixPak,
buildEnv,
makeDesktopItem,
runCommandLocal,
...
}:
let
appId = "us.zoom.Zoom";
# Preserve the upstream FHS wrapper and /opt mount; its root mounts omit the
# metadata file needed for portal identification inside the nested sandbox.
package = zoom-us.override {
xdgDesktopPortalSupport = true;
buildFHSEnv =
args:
buildFHSEnv (
args
// {
extraBwrapArgs = (args.extraBwrapArgs or [ ]) ++ [
"--ro-bind /.flatpak-info /.flatpak-info"
];
}
);
};
wrapped = mkNixPak {
config = {
imports = [ ./modules/zoom-policy.nix ];
app = {
inherit package;
binPath = "bin/zoom";
};
flatpak = { inherit appId; };
};
};
exe = lib.getExe wrapped.config.script;
assets = runCommandLocal "zoom-desktop-assets" { } ''
mkdir -p $out/share
for directory in icons pixmaps; do
if [ -d ${package}/share/$directory ]; then
ln -s ${package}/share/$directory $out/share/$directory
fi
done
'';
in
buildEnv {
inherit (wrapped.config.script) name meta passthru;
paths = [
wrapped.config.script
assets
(makeDesktopItem {
name = "Zoom";
desktopName = "Zoom Workplace";
comment = "Zoom Video Conference";
exec = "${exe} %U";
icon = "Zoom";
terminal = false;
startupWMClass = "zoom";
categories = [ "Network" ];
mimeTypes = [
"x-scheme-handler/zoommtg"
"x-scheme-handler/zoomus"
"application/x-zoom"
];
extraConfig.X-Flatpak = appId;
})
];
}