nixpkgs/pkgs/applications/networking/instant-messengers/teams/default.nix
Olli Helenius cce2b65151
teams: fix absolute path usages
There are some references to absolute paths in the Teams application
code:

  * /usr/share/pixmaps - The application icon.
  * /usr/bin/xdg-mime - Uses absolute path to invoke.
  * /usr/bin/teams - Uses absolute path in the autostart file if
                     configured to start automatically at login.

Though the paths are hardcoded they can be easily changed within
the application’s main JavaScript code bundle and so we’ll do just
that.

This should at least fix auto-start not working, even when enabled.
2021-06-26 17:31:30 +03:00

123 lines
3.7 KiB
Nix

{ lib
, stdenv
, fetchurl
, autoPatchelfHook
, wrapGAppsHook
, dpkg
, atomEnv
, libuuid
, libappindicator-gtk3
, pulseaudio
, at-spi2-atk
, coreutils
, gawk
, xdg-utils
, systemd
, nodePackages
, enableRectOverlay ? false }:
stdenv.mkDerivation rec {
pname = "teams";
version = "1.4.00.13653";
src = fetchurl {
url = "https://packages.microsoft.com/repos/ms-teams/pool/main/t/teams/teams_${version}_amd64.deb";
sha256 = "1kx4j837fd344zy90nl0j3r8cdvihy6i6gf56wd5n56zngx1fhjv";
};
nativeBuildInputs = [ dpkg autoPatchelfHook wrapGAppsHook nodePackages.asar ];
unpackCmd = "dpkg -x $curSrc .";
buildInputs = atomEnv.packages ++ [
libuuid
at-spi2-atk
];
runtimeDependencies = [
(lib.getLib systemd)
pulseaudio
libappindicator-gtk3
];
preFixup = ''
gappsWrapperArgs+=(--prefix PATH : "${coreutils}/bin:${gawk}/bin")
gappsWrapperArgs+=(--add-flags --disable-namespace-sandbox)
gappsWrapperArgs+=(--add-flags --disable-setuid-sandbox)
'';
buildPhase = ''
runHook preBuild
asar extract share/teams/resources/app.asar "$TMP/work"
substituteInPlace $TMP/work/main.bundle.js \
--replace "/usr/share/pixmaps/" "$out/share/pixmaps" \
--replace "/usr/bin/xdg-mime" "${xdg-utils}/bin/xdg-mime" \
--replace "Exec=/usr/bin/" "Exec=" # Remove usage of absolute path in autostart.
asar pack --unpack='{*.node,*.ftz,rect-overlay}' "$TMP/work" share/teams/resources/app.asar
runHook postBuild
'';
preferLocalBuild = true;
installPhase = ''
runHook preInstall
mkdir -p $out/{opt,bin}
mv share/teams $out/opt/
mv share $out/share
substituteInPlace $out/share/applications/teams.desktop \
--replace /usr/bin/ ""
ln -s $out/opt/teams/teams $out/bin/
${lib.optionalString (!enableRectOverlay) ''
# Work-around screen sharing bug
# https://docs.microsoft.com/en-us/answers/questions/42095/sharing-screen-not-working-anymore-bug.html
rm $out/opt/teams/resources/app.asar.unpacked/node_modules/slimcore/bin/rect-overlay
''}
runHook postInstall
'';
dontAutoPatchelf = true;
# Includes runtimeDependencies in the RPATH of the included Node modules
# so that dynamic loading works. We cannot use directly runtimeDependencies
# here, since the libraries from runtimeDependencies are not propagated
# to the dynamically loadable node modules because of a condition in
# autoPatchElfHook since *.node modules have Type: DYN (Shared object file)
# instead of EXEC or INTERP it expects.
# Fixes: https://github.com/NixOS/nixpkgs/issues/85449
postFixup = ''
autoPatchelf "$out"
runtime_rpath="${lib.makeLibraryPath runtimeDependencies}"
for mod in $(find "$out/opt/teams" -name '*.node'); do
mod_rpath="$(patchelf --print-rpath "$mod")"
echo "Adding runtime dependencies to RPATH of Node module $mod"
patchelf --set-rpath "$runtime_rpath:$mod_rpath" "$mod"
done;
# fix for https://docs.microsoft.com/en-us/answers/questions/298724/open-teams-meeting-link-on-linux-doens39t-work.html?childToView=309406#comment-309406
# while we create the wrapper ourselves, gappsWrapperArgs leads to the same issue
# another option would be to introduce gappsWrapperAppendedArgs, to allow control of positioning
substituteInPlace "$out/bin/teams" --replace '.teams-wrapped" --disable-namespace-sandbox --disable-setuid-sandbox "$@"' '.teams-wrapped" "$@" --disable-namespace-sandbox --disable-setuid-sandbox'
'';
meta = with lib; {
description = "Microsoft Teams";
homepage = "https://teams.microsoft.com";
downloadPage = "https://teams.microsoft.com/downloads";
license = licenses.unfree;
maintainers = [ maintainers.liff ];
platforms = [ "x86_64-linux" ];
};
}