blob: f852861c9b433b90d9b3aaf95764b2fb4e0f901c [file] [log] [blame]
Jouni Malinencd4e3c32015-10-29 12:39:56 +02001/*
2 * Sigma Control API DUT (server)
3 * Copyright (c) 2014, Qualcomm Atheros, Inc.
Jouni Malinen72ac93c2018-09-04 13:12:59 +03004 * Copyright (c) 2018, The Linux Foundation
Jouni Malinencd4e3c32015-10-29 12:39:56 +02005 * All Rights Reserved.
6 * Licensed under the Clear BSD license. See README for more details.
7 */
8
9#include "sigma_dut.h"
Jouni Malinen3b17d532018-09-04 19:10:58 +030010#include <sqlite3.h>
11
12#ifndef SERVER_DB
13#define SERVER_DB "/home/user/hs20-server/AS/DB/eap_user.db"
14#endif /* SERVER_DB */
Jouni Malinencd4e3c32015-10-29 12:39:56 +020015
16
Jouni Malinen72ac93c2018-09-04 13:12:59 +030017static int cmd_server_ca_get_version(struct sigma_dut *dut,
18 struct sigma_conn *conn,
19 struct sigma_cmd *cmd)
20{
21 send_resp(dut, conn, SIGMA_COMPLETE, "version,1.0");
22 return 0;
23}
24
25
26static int cmd_server_get_info(struct sigma_dut *dut,
27 struct sigma_conn *conn,
28 struct sigma_cmd *cmd)
29{
30 send_resp(dut, conn, SIGMA_COMPLETE, "vendor,OSU,model,OS,version,1.0");
31 return 0;
32}
33
34
Jouni Malinen3b17d532018-09-04 19:10:58 +030035static int server_reset_user(struct sigma_dut *dut, const char *user)
36{
37 sqlite3 *db;
38 int res = -1;
39 char *sql = NULL;
40 const char *realm = "wi-fi.org";
41 const char *methods = "TTLS-MSCHAPV2";
42 const char *password = "ChangeMe";
43 int phase2 = 1;
44 int machine_managed = 1;
45 int remediation = 0;
46 int fetch_pps = 0;
47 const char *osu_user = NULL;
48 const char *osu_password = NULL;
49
50 sigma_dut_print(dut, DUT_MSG_DEBUG, "Reset user %s", user);
51
52 if (sqlite3_open(SERVER_DB, &db)) {
53 sigma_dut_print(dut, DUT_MSG_ERROR,
54 "Failed to open SQLite database %s",
55 SERVER_DB);
56 return -1;
57 }
58
59 if (strcmp(user, "test01") == 0) {
60 } else if (strcmp(user, "test02") == 0) {
61 machine_managed = 0;
62 } else if (strcmp(user, "test03") == 0) {
63 } else if (strcmp(user, "test04") == 0) {
64 } else if (strcmp(user, "test05") == 0) {
65 } else if (strcmp(user, "test06") == 0) {
66 realm = "example.com";
67 } else if (strcmp(user, "test07") == 0) {
68 } else if (strcmp(user, "test08") == 0) {
69 osu_user = "testdmacc08";
70 osu_password = "P@ssw0rd";
71 } else if (strcmp(user, "test09") == 0) {
72 } else if (strcmp(user, "test10") == 0) {
73 methods = "TLS";
74 } else if (strcmp(user, "test11") == 0) {
75 } else if (strcmp(user, "test12") == 0) {
76 methods = "TLS";
77 } else if (strcmp(user, "test20") == 0) {
78 } else if (strcmp(user, "test26") == 0) {
79 /* TODO: Cred01 with username/password? */
80 user = "1310026000000001";
81 methods = "SIM";
82 } else if (strcmp(user, "test30") == 0) {
83 osu_user = "testdmacc30";
84 osu_password = "P@ssw0rd";
85 } else if (strcmp(user, "test31") == 0) {
86 osu_user = "testdmacc31";
87 osu_password = "P@ssw0rd";
88 } else if (strcmp(user, "test32") == 0) {
89 osu_user = "testdmacc32";
90 osu_password = "P@ssw0rd";
91 } else if (strcmp(user, "test33") == 0) {
92 osu_user = "testdmacc33";
93 osu_password = "P@ssw0rd";
94 } else if (strcmp(user, "test34") == 0) {
95 osu_user = "testdmacc34";
96 osu_password = "P@ssw0rd";
97 } else if (strcmp(user, "test35") == 0) {
98 osu_user = "testdmacc35";
99 osu_password = "P@ssw0rd";
100 } else if (strcmp(user, "test36") == 0) {
101 } else if (strcmp(user, "test37") == 0) {
102 osu_user = "testdmacc37";
103 osu_password = "P@ssw0rd";
104 } else {
105 sigma_dut_print(dut, DUT_MSG_INFO, "Unsupported username '%s'",
106 user);
107 goto fail;
108 }
109
110 sql = sqlite3_mprintf("INSERT OR REPLACE INTO users(identity,realm,methods,password,phase2,machine_managed,remediation,fetch_pps,osu_user,osu_password) VALUES (%Q,%Q,%Q,%Q,%d,%d,%d,%d,%Q,%Q)",
111 user, realm, methods, password,
112 phase2, machine_managed, remediation, fetch_pps,
113 osu_user, osu_password);
114
115 if (!sql)
116 goto fail;
117
118 sigma_dut_print(dut, DUT_MSG_DEBUG, "SQL: %s", sql);
119
120 if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) {
121 sigma_dut_print(dut, DUT_MSG_ERROR, "SQL operation failed: %s",
122 sqlite3_errmsg(db));
123 } else {
124 res = 0;
125 }
126
127 sqlite3_free(sql);
128
129fail:
130 sqlite3_close(db);
131
132 return res;
133}
134
135
Jouni Malinencd4e3c32015-10-29 12:39:56 +0200136static int cmd_server_reset_default(struct sigma_dut *dut,
137 struct sigma_conn *conn,
138 struct sigma_cmd *cmd)
139{
140 const char *var;
Jouni Malinen94d7b122018-09-04 13:16:41 +0300141 enum sigma_program prog;
Jouni Malinencd4e3c32015-10-29 12:39:56 +0200142
143 var = get_param(cmd, "Program");
Jouni Malinen94d7b122018-09-04 13:16:41 +0300144 if (!var) {
145 send_resp(dut, conn, SIGMA_ERROR,
146 "errorCode,Missing program parameter");
147 return 0;
148 }
149
150 prog = sigma_program_to_enum(var);
151 if (prog != PROGRAM_HS2_R2 && prog != PROGRAM_HS2_R3) {
Jouni Malinencd4e3c32015-10-29 12:39:56 +0200152 send_resp(dut, conn, SIGMA_ERROR,
153 "errorCode,Unsupported program");
154 return 0;
155 }
156
157 var = get_param(cmd, "UserName");
Jouni Malinen3b17d532018-09-04 19:10:58 +0300158 if (var && server_reset_user(dut, var) < 0) {
159 send_resp(dut, conn, SIGMA_ERROR,
160 "errorCode,Failed to reset user account to defaults");
161 return 0;
Jouni Malinencd4e3c32015-10-29 12:39:56 +0200162 }
163
164 var = get_param(cmd, "SerialNo");
165 if (var) {
166 sigma_dut_print(dut, DUT_MSG_DEBUG, "Reset serial number %s",
167 var);
168 /* TODO */
169 }
170
171 return 1;
172}
173
174
175static int cmd_server_request_status(struct sigma_dut *dut,
176 struct sigma_conn *conn,
177 struct sigma_cmd *cmd)
178{
179 const char *var, *username, *serialno, *imsi, *addr, *status;
180 int osu, timeout;
181 char resp[500];
182
183 var = get_param(cmd, "Program");
184 if (var == NULL || strcasecmp(var, "HS2-R2") != 0) {
185 send_resp(dut, conn, SIGMA_ERROR,
186 "errorCode,Unsupported program");
187 return 0;
188 }
189
190 var = get_param(cmd, "Device");
191 if (!var ||
192 (strcasecmp(var, "AAAServer") != 0 &&
193 strcasecmp(var, "OSUServer") != 0)) {
194 send_resp(dut, conn, SIGMA_ERROR,
195 "errorCode,Unsupported device type");
196 return 0;
197 }
198 osu = strcasecmp(var, "OSUServer") == 0;
199
200 var = get_param(cmd, "Timeout");
201 if (!var) {
202 send_resp(dut, conn, SIGMA_ERROR,
203 "errorCode,Missing timeout");
204 return 0;
205 }
206 timeout = atoi(var);
207 sigma_dut_print(dut, DUT_MSG_DEBUG, "timeout: %d", timeout);
208
209 username = get_param(cmd, "UserName");
210 if (username)
211 sigma_dut_print(dut, DUT_MSG_DEBUG, "UserName: %s", username);
212 serialno = get_param(cmd, "SerialNo");
213 if (serialno)
214 sigma_dut_print(dut, DUT_MSG_DEBUG, "SerialNo: %s", serialno);
215 imsi = get_param(cmd, "imsi_val");
216 if (imsi)
217 sigma_dut_print(dut, DUT_MSG_DEBUG, "imsi_val: %s", imsi);
218 addr = get_param(cmd, "ClientMACAddr");
219 if (addr)
220 sigma_dut_print(dut, DUT_MSG_DEBUG, "ClientMACAddr: %s", addr);
221 status = get_param(cmd, "Status");
222 if (status)
223 sigma_dut_print(dut, DUT_MSG_DEBUG, "Status: %s", status);
224
225 if (osu && status && strcasecmp(status, "Remediation") == 0) {
226 /* TODO */
227 sleep(1);
228 snprintf(resp, sizeof(resp),
229 "RemediationStatus,Remediation Complete");
230 send_resp(dut, conn, SIGMA_COMPLETE, resp);
231 return 0;
232 }
233
234 return 1;
235}
236
237
238void server_register_cmds(void)
239{
Jouni Malinen72ac93c2018-09-04 13:12:59 +0300240 sigma_dut_reg_cmd("server_ca_get_version", NULL,
241 cmd_server_ca_get_version);
242 sigma_dut_reg_cmd("server_get_info", NULL,
243 cmd_server_get_info);
Jouni Malinencd4e3c32015-10-29 12:39:56 +0200244 sigma_dut_reg_cmd("server_reset_default", NULL,
245 cmd_server_reset_default);
246 sigma_dut_reg_cmd("server_request_status", NULL,
247 cmd_server_request_status);
248}