summary refs log tree commit diff
path: root/pkgs/applications/networking/remote/citrix-receiver/default.nix
blob: 0645e9cb606131a27c22444484899d714bebd8de (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
{ stdenv
, requireFile
, makeWrapper
, libredirect
, busybox
, file
, makeDesktopItem
, tzdata
, cacert
, glib
, gtk2
, atk
, gdk_pixbuf
, cairo
, pango
, gnome3
, xlibs
, libpng12
, freetype
, fontconfig
, gtk_engines
, alsaLib
, libidn
, zlib
}:

let versionRec = { major = "13"; minor = "7"; patch = "0"; };
in stdenv.mkDerivation rec {
  name = "citrix-receiver-${version}";
  version = with versionRec; "${major}.${minor}.${patch}";
  homepage = https://www.citrix.com/downloads/citrix-receiver/linux/receiver-for-linux-latest.html;

  prefixWithBitness = if stdenv.is64bit then "linuxx64" else "linuxx86";

  src = with versionRec; requireFile rec {
    name =
      if stdenv.is64bit
      then "${prefixWithBitness}-${version}.10276927.tar.gz"
      else "${prefixWithBitness}-${version}.10276925.tar.gz";
    sha256 =
      if stdenv.is64bit
      then "18fb374b9fb8e249b79178500dddca7a1f275411c6537e7695da5dcf19c5ba91"
      else "4c68723b0327cf6f12da824056fce2b7853c38e6163a48c9d222b93dd8da75b6";
    message = ''
      In order to use Citrix Receiver, you need to comply with the Citrix EULA and download
      the ${if stdenv.is64bit then "64-bit" else "32-bit"} binaries, .tar.gz from:

      ${homepage}

      (if you do not find version ${version} there, try at
      https://www.citrix.com/downloads/citrix-receiver/legacy-receiver-for-linux/receiver-for-linux-latest-${major}-${minor}.html
      or at https://www.citrix.com/downloads/citrix-receiver/ under "Earlier Versions of Receiver for Linux")

      Once you have downloaded the file, please use the following command and re-run the
      installation:

      nix-prefetch-url file://\$PWD/${name}
    '';
  };

  phases = [ "unpackPhase" "installPhase" ];

  sourceRoot = ".";

  buildInputs = [
    makeWrapper
    busybox
    file
    gtk2
    gdk_pixbuf
  ];

  libPath = stdenv.lib.makeLibraryPath [
    glib
    gtk2
    atk
    gdk_pixbuf
    cairo
    pango
    gnome3.dconf
    xlibs.libX11
    xlibs.libXext
    xlibs.libXrender
    xlibs.libXinerama
    xlibs.libXfixes
    libpng12
    libidn
    zlib
    gtk_engines
    freetype
    fontconfig
    alsaLib
    stdenv.cc.cc # Fixes: Can not load [..]/opt/citrix-icaclient/lib/ctxh264_fb.so:(null)
  ];

  desktopItem = makeDesktopItem {
    name = "wfica";
    desktopName = "Citrix Receiver";
    genericName = "Citrix Receiver";
    exec = "wfica";
    icon = "wfica";
    comment = "Connect to remote Citrix server";
    categories = "GTK;GNOME;X-GNOME-NetworkSettings;Network;";
    mimeType = "application/x-ica";
  };

  installPhase = ''
    export ICAInstDir="$out/opt/citrix-icaclient"

    sed -i \
      -e 's,^main_install_menu$,install_ICA_client,g' \
      -e 's,^integrate_ICA_client(),alias integrate_ICA_client=true\nintegrate_ICA_client_old(),g' \
      -e 's,^ANSWER=""$,ANSWER="$INSTALLER_YES",' \
      -e 's,/bin/true,true,g' \
      ./${prefixWithBitness}/hinst

    # Run the installer...
    ./${prefixWithBitness}/hinst CDROM "`pwd`"

    echo "Deleting broken links..."
    for link in `find $ICAInstDir -type l `
    do
      [ -f "$link" ] || rm -v "$link"
    done

    echo "Expanding certificates..."
    # As explained in https://wiki.archlinux.org/index.php/Citrix#Security_Certificates
    pushd "$ICAInstDir/keystore/cacerts"
    awk 'BEGIN {c=0;} /BEGIN CERT/{c++} { print > "cert." c ".pem"}' < ${cacert}/etc/ssl/certs/ca-bundle.crt
    popd

    echo "Patching executables..."
    find $ICAInstDir -type f -exec file {} \; |
      grep 'ELF.*executable' |
      cut -f 1 -d : |
      while read f
      do
        echo "Patching ELF intrepreter and rpath for $f"
        chmod u+w "$f"
        patchelf \
          --set-interpreter $(cat $NIX_CC/nix-support/dynamic-linker) \
          --set-rpath "$ICAInstDir:$libPath" "$f"
      done

    echo "Wrapping wfica..."
    mkdir "$out/bin"

    makeWrapper "$ICAInstDir/wfica" "$out/bin/wfica" \
      --add-flags "-icaroot $ICAInstDir" \
      --set ICAROOT "$ICAInstDir" \
      --set GTK_PATH "${gtk2.out}/lib/gtk-2.0:${gnome3.gnome_themes_standard}/lib/gtk-2.0" \
      --set GDK_PIXBUF_MODULE_FILE "$GDK_PIXBUF_MODULE_FILE" \
      --set LD_PRELOAD "${libredirect}/lib/libredirect.so" \
      --set LD_LIBRARY_PATH "$libPath" \
      --set NIX_REDIRECTS "/usr/share/zoneinfo=${tzdata}/share/zoneinfo:/etc/zoneinfo=${tzdata}/share/zoneinfo:/etc/timezone=$ICAInstDir/timezone"

    echo "We arbitrarily set the timezone to UTC. No known consequences at this point."
    echo UTC > "$ICAInstDir/timezone"

    echo "Installing desktop item..."
    mkdir -p $out/share/applications
    cp ${desktopItem}/share/applications/* $out/share/applications

    # We introduce a dependency on the source file so that it need not be redownloaded everytime
    echo $src >> "$out/share/nix_dependencies.pin"
  '';

  meta = with stdenv.lib; {
    license = stdenv.lib.licenses.unfree;
    homepage = homepage;
    description = "Citrix Receiver";
    maintainers = with maintainers; [ obadz a1russell ];
    platforms = platforms.linux;
  };
}