1{
2 lib,
3 stdenv,
4 fetchurl,
5 fetchpatch,
6 openssl,
7 pkg-config,
8 libnl,
9 nixosTests,
10 wpa_supplicant_gui,
11 dbusSupport ? !stdenv.hostPlatform.isStatic,
12 dbus,
13 withReadline ? true,
14 readline,
15 withPcsclite ? !stdenv.hostPlatform.isStatic,
16 pcsclite,
17}:
18
19stdenv.mkDerivation rec {
20 version = "2.11";
21
22 pname = "wpa_supplicant";
23
24 src = fetchurl {
25 url = "https://w1.fi/releases/${pname}-${version}.tar.gz";
26 sha256 = "sha256-kS6gb3TjCo42+7aAZNbN/yGNjVkdsPxddd7myBrH/Ao=";
27 };
28
29 patches = [
30 (fetchpatch {
31 name = "revert-change-breaking-auth-broadcom.patch";
32 url = "https://w1.fi/cgit/hostap/patch/?id=41638606054a09867fe3f9a2b5523aa4678cbfa5";
33 hash = "sha256-X6mBbj7BkW66aYeSCiI3JKBJv10etLQxaTRfRgwsFmM=";
34 revert = true;
35 })
36 ./unsurprising-ext-password.patch
37 (fetchpatch {
38 name = "suppress-ctrl-event-signal-change.patch";
39 url = "https://w1.fi/cgit/hostap/patch/?id=c330b5820eefa8e703dbce7278c2a62d9c69166a";
40 hash = "sha256-5ti5OzgnZUFznjU8YH8Cfktrj4YBzsbbrEbNvec+ppQ=";
41 })
42 ];
43
44 # TODO: Patch epoll so that the dbus actually responds
45 # TODO: Figure out how to get privsep working, currently getting SIGBUS
46 extraConfig = ''
47 #CONFIG_ELOOP_EPOLL=y
48 #CONFIG_PRIVSEP=y
49 #CONFIG_TLSV12=y see #8332
50 CONFIG_AP=y
51 CONFIG_BGSCAN_LEARN=y
52 CONFIG_BGSCAN_SIMPLE=y
53 CONFIG_DEBUG_SYSLOG=y
54 CONFIG_EAP_EKE=y
55 CONFIG_EAP_FAST=y
56 CONFIG_EAP_GPSK=y
57 CONFIG_EAP_GPSK_SHA256=y
58 CONFIG_EAP_IKEV2=y
59 CONFIG_EAP_PAX=y
60 CONFIG_EAP_PWD=y
61 CONFIG_EAP_SAKE=y
62 CONFIG_ELOOP=eloop
63 CONFIG_EXT_PASSWORD_FILE=y
64 CONFIG_HS20=y
65 CONFIG_HT_OVERRIDES=y
66 CONFIG_IEEE80211AC=y
67 CONFIG_IEEE80211AX=y
68 CONFIG_IEEE80211BE=y
69 CONFIG_IEEE80211N=y
70 CONFIG_IEEE80211R=y
71 CONFIG_IEEE80211W=y
72 CONFIG_INTERNETWORKING=y
73 CONFIG_L2_PACKET=linux
74 CONFIG_LIBNL32=y
75 CONFIG_MESH=y
76 CONFIG_OWE=y
77 CONFIG_P2P=y
78 CONFIG_SAE_PK=y
79 CONFIG_TDLS=y
80 CONFIG_TLS=openssl
81 CONFIG_TLSV11=y
82 CONFIG_VHT_OVERRIDES=y
83 CONFIG_WNM=y
84 CONFIG_WPS=y
85 CONFIG_WPS_ER=y
86 CONFIG_WPS_NFS=y
87 CONFIG_SUITEB=y
88 CONFIG_SUITEB192=y
89 ''
90 + lib.optionalString withPcsclite ''
91 CONFIG_EAP_SIM=y
92 CONFIG_EAP_AKA=y
93 CONFIG_EAP_AKA_PRIME=y
94 CONFIG_PCSC=y
95 ''
96 + lib.optionalString dbusSupport ''
97 CONFIG_CTRL_IFACE_DBUS=y
98 CONFIG_CTRL_IFACE_DBUS_NEW=y
99 CONFIG_CTRL_IFACE_DBUS_INTRO=y
100 ''
101 # Upstream uses conditionals based on ifdef, so opposite of =y is
102 # not =n, as one may expect, but undefine.
103 #
104 # This config is sourced into makefile.
105 + lib.optionalString (!dbusSupport) ''
106 undefine CONFIG_CTRL_IFACE_DBUS
107 undefine CONFIG_CTRL_IFACE_DBUS_NEW
108 undefine CONFIG_CTRL_IFACE_DBUS_INTRO
109 ''
110 + (
111 if withReadline then
112 ''
113 CONFIG_READLINE=y
114 ''
115 else
116 ''
117 CONFIG_WPA_CLI_EDIT=y
118 ''
119 );
120
121 preBuild = ''
122 for manpage in wpa_supplicant/doc/docbook/wpa_supplicant.conf* ; do
123 substituteInPlace "$manpage" --replace /usr/share/doc $out/share/doc
124 done
125 cd wpa_supplicant
126 cp -v defconfig .config
127 echo "$extraConfig" >> .config
128 cat -n .config
129 substituteInPlace Makefile --replace /usr/local $out
130 export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE \
131 -I$(echo "${lib.getDev libnl}"/include/libnl*/) \
132 ${lib.optionalString withPcsclite "-I${lib.getDev pcsclite}/include/PCSC/"}"
133 '';
134
135 buildInputs = [
136 openssl
137 libnl
138 ]
139 ++ lib.optional dbusSupport dbus
140 ++ lib.optional withReadline readline
141 ++ lib.optional withPcsclite pcsclite;
142
143 nativeBuildInputs = [ pkg-config ];
144
145 postInstall = ''
146 mkdir -p $out/share/man/man5 $out/share/man/man8
147 cp -v "doc/docbook/"*.5 $out/share/man/man5/
148 cp -v "doc/docbook/"*.8 $out/share/man/man8/
149 ''
150 + lib.optionalString dbusSupport ''
151 mkdir -p $out/share/dbus-1/system.d $out/share/dbus-1/system-services $out/etc/systemd/system
152 cp -v "dbus/"*service $out/share/dbus-1/system-services
153 cp -v dbus/dbus-wpa_supplicant.conf $out/share/dbus-1/system.d
154 cp -v "systemd/"*.service $out/etc/systemd/system
155 ''
156 + ''
157 rm $out/share/man/man8/wpa_priv.8
158 install -Dm444 wpa_supplicant.conf $out/share/doc/wpa_supplicant/wpa_supplicant.conf.example
159 '';
160
161 passthru.tests = {
162 inherit (nixosTests) wpa_supplicant;
163 inherit wpa_supplicant_gui; # inherits the src+version updates
164 };
165
166 meta = with lib; {
167 homepage = "https://w1.fi/wpa_supplicant/";
168 description = "Tool for connecting to WPA and WPA2-protected wireless networks";
169 license = licenses.bsd3;
170 maintainers = with maintainers; [
171 marcweber
172 ma27
173 ];
174 platforms = platforms.linux;
175 };
176}