base16-schemes: unstable-2024-06-21 -> unstable-2024-11-12 (#356361)
[NixPkgs.git] / pkgs / tools / networking / curl-impersonate / firefox / default.nix
blob73b4458ec8db8486d8b276d80d57f515ff9e3799
2   lib,
3   stdenv,
4   fetchFromGitHub,
5   fetchpatch,
6   callPackage,
7   buildGoModule,
8   installShellFiles,
9   buildPackages,
10   zlib,
11   sqlite,
12   cmake,
13   python3,
14   ninja,
15   perl,
16   autoconf,
17   automake,
18   libtool,
19   cctools,
20   cacert,
21   unzip,
22   go,
23   p11-kit,
25 stdenv.mkDerivation rec {
26   pname = "curl-impersonate-ff";
27   version = "0.6.1";
29   outputs = [
30     "out"
31     "dev"
32   ];
34   src = fetchFromGitHub {
35     owner = "lwthiker";
36     repo = "curl-impersonate";
37     rev = "v${version}";
38     hash = "sha256-ExmEhjJC8FPzx08RuKOhRxKgJ4Dh+ElEl+OUHzRCzZc=";
39   };
41   patches = [
42     # Fix shebangs and commands in the NSS build scripts
43     # (can't just patchShebangs or substituteInPlace since makefile unpacks it)
44     ./curl-impersonate-0.6.1-fix-command-paths.patch
46     # SOCKS5 heap buffer overflow - https://curl.se/docs/CVE-2023-38545.html
47     (fetchpatch {
48       name = "curl-impersonate-patch-cve-2023-38545.patch";
49       url = "https://github.com/lwthiker/curl-impersonate/commit/e7b90a0d9c61b6954aca27d346750240e8b6644e.diff";
50       hash = "sha256-jFrz4Q+MJGfNmwwzHhThado4c9hTd/+b/bfRsr3FW5k=";
51     })
52   ];
54   # Disable blanket -Werror to fix build on `gcc-13` related to minor
55   # warnings on `boringssl`.
56   env.NIX_CFLAGS_COMPILE = "-Wno-error";
58   strictDeps = true;
60   depsBuildBuild = lib.optionals (stdenv.buildPlatform != stdenv.hostPlatform) [
61     buildPackages.stdenv.cc
62   ];
64   nativeBuildInputs =
65     lib.optionals stdenv.hostPlatform.isDarwin [
66       # Must come first so that it shadows the 'libtool' command but leaves 'libtoolize'
67       cctools
68     ]
69     ++ [
70       installShellFiles
71       cmake
72       python3
73       python3.pythonOnBuildForHost.pkgs.gyp
74       ninja
75       perl
76       autoconf
77       automake
78       libtool
79       unzip
80       go
81     ];
83   buildInputs = [
84     zlib
85     sqlite
86   ];
88   configureFlags = [
89     "--with-ca-bundle=${
90       if stdenv.hostPlatform.isDarwin then "/etc/ssl/cert.pem" else "/etc/ssl/certs/ca-certificates.crt"
91     }"
92     "--with-ca-path=${cacert}/etc/ssl/certs"
93   ];
95   buildFlags = [ "firefox-build" ];
96   checkTarget = "firefox-checkbuild";
97   installTargets = [ "firefox-install" ];
99   doCheck = true;
101   dontUseCmakeConfigure = true;
102   dontUseNinjaBuild = true;
103   dontUseNinjaInstall = true;
104   dontUseNinjaCheck = true;
106   postUnpack = lib.concatStringsSep "\n" (
107     lib.mapAttrsToList (name: dep: "ln -sT ${dep.outPath} source/${name}") (
108       lib.filterAttrs (n: v: v ? outPath) passthru.deps
109     )
110   );
112   preConfigure = ''
113     export GOCACHE=$TMPDIR/go-cache
114     export GOPATH=$TMPDIR/go
115     export GOPROXY=file://${passthru.boringssl-go-modules}
116     export GOSUMDB=off
118     # Need to get value of $out for this flag
119     configureFlagsArray+=("--with-libnssckbi=$out/lib")
120   '';
122   postInstall =
123     ''
124       # Remove vestigial *-config script
125       rm $out/bin/curl-impersonate-ff-config
127       # Patch all shebangs of installed scripts
128       patchShebangs $out/bin
130       # Install headers
131       make -C curl-*/include install
132     ''
133     + lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) ''
134       # Build and install completions for each curl binary
136       # Patch in correct binary name and alias it to all scripts
137       perl curl-*/scripts/completion.pl --curl $out/bin/curl-impersonate-ff --shell zsh >$TMPDIR/curl-impersonate-ff.zsh
138       substituteInPlace $TMPDIR/curl-impersonate-ff.zsh \
139         --replace-fail \
140           '#compdef curl' \
141           "#compdef curl-impersonate-ff$(find $out/bin -name 'curl_*' -printf ' %f=curl-impersonate-ff')"
143       perl curl-*/scripts/completion.pl --curl $out/bin/curl-impersonate-ff --shell fish >$TMPDIR/curl-impersonate-ff.fish
144       substituteInPlace $TMPDIR/curl-impersonate-ff.fish \
145         --replace-fail \
146           '--command curl' \
147           "--command curl-impersonate-ff$(find $out/bin -name 'curl_*' -printf ' --command %f')"
149       # Install zsh and fish completions
150       installShellCompletion $TMPDIR/curl-impersonate-ff.{zsh,fish}
151     '';
153   preFixup =
154     let
155       libext = stdenv.hostPlatform.extensions.sharedLibrary;
156     in
157     ''
158       # If libnssckbi.so is needed, link libnssckbi.so without needing nss in closure
159       if grep -F nssckbi $out/lib/libcurl-impersonate-*${libext} &>/dev/null; then
160         ln -s ${p11-kit}/lib/pkcs11/p11-kit-trust${libext} $out/lib/libnssckbi${libext}
161         ${lib.optionalString stdenv.hostPlatform.isElf ''
162           patchelf --add-needed libnssckbi${libext} $out/lib/libcurl-impersonate-*${libext}
163         ''}
164       fi
165     '';
167   disallowedReferences = [ go ];
169   passthru = {
170     deps = callPackage ./deps.nix { };
172     updateScript = ./update.sh;
174     boringssl-go-modules =
175       (buildGoModule {
176         inherit (passthru.deps."boringssl.zip") name;
178         src = passthru.deps."boringssl.zip";
179         vendorHash = "sha256-SNUsBiKOGWmkRdTVABVrlbLAVMfu0Q9IgDe+kFC5vXs=";
181         nativeBuildInputs = [ unzip ];
183         proxyVendor = true;
184       }).goModules;
185   };
187   meta = with lib; {
188     description = "Special build of curl that can impersonate Chrome & Firefox";
189     homepage = "https://github.com/lwthiker/curl-impersonate";
190     license = with licenses; [
191       curl
192       mit
193     ];
194     maintainers = with maintainers; [ deliciouslytyped ];
195     platforms = platforms.unix;
196     mainProgram = "curl-impersonate-ff";
197   };