xref: /wlan-dirver/utils/sigma-dut/server.c (revision fcaeee186ce178245b7f7045a8e6715477167dd2)
1cd4e3c3eSJouni Malinen /*
2cd4e3c3eSJouni Malinen  * Sigma Control API DUT (server)
3cd4e3c3eSJouni Malinen  * Copyright (c) 2014, Qualcomm Atheros, Inc.
4*fcaeee18SJouni Malinen  * Copyright (c) 2018-2019, The Linux Foundation
5cd4e3c3eSJouni Malinen  * All Rights Reserved.
6cd4e3c3eSJouni Malinen  * Licensed under the Clear BSD license. See README for more details.
7cd4e3c3eSJouni Malinen  */
8cd4e3c3eSJouni Malinen 
9cd4e3c3eSJouni Malinen #include "sigma_dut.h"
103b17d530SJouni Malinen #include <sqlite3.h>
113b17d530SJouni Malinen 
12c54710deSJouni Malinen #ifndef ROOT_DIR
13c54710deSJouni Malinen #define ROOT_DIR "/home/user/hs20-server"
14c54710deSJouni Malinen #endif /* ROOT_DIR */
15c54710deSJouni Malinen 
163b17d530SJouni Malinen #ifndef SERVER_DB
17c54710deSJouni Malinen #define SERVER_DB ROOT_DIR "/AS/DB/eap_user.db"
183b17d530SJouni Malinen #endif /* SERVER_DB */
19cd4e3c3eSJouni Malinen 
2093b170b6SJouni Malinen #ifndef CERT_DIR
21c54710deSJouni Malinen #define CERT_DIR ROOT_DIR "/certs"
2293b170b6SJouni Malinen #endif /* CERT_DIR */
2393b170b6SJouni Malinen 
24cd4e3c3eSJouni Malinen 
cmd_server_ca_get_version(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)25*fcaeee18SJouni Malinen static enum sigma_cmd_result cmd_server_ca_get_version(struct sigma_dut *dut,
2672ac93ccSJouni Malinen 						       struct sigma_conn *conn,
2772ac93ccSJouni Malinen 						       struct sigma_cmd *cmd)
2872ac93ccSJouni Malinen {
29df866471SJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, "version," SIGMA_DUT_VER);
30*fcaeee18SJouni Malinen 	return STATUS_SENT;
3172ac93ccSJouni Malinen }
3272ac93ccSJouni Malinen 
3372ac93ccSJouni Malinen 
cmd_server_get_info(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)34*fcaeee18SJouni Malinen static enum sigma_cmd_result cmd_server_get_info(struct sigma_dut *dut,
3572ac93ccSJouni Malinen 						 struct sigma_conn *conn,
3672ac93ccSJouni Malinen 						 struct sigma_cmd *cmd)
3772ac93ccSJouni Malinen {
38c54710deSJouni Malinen 	char ver[128], resp[256];
39c54710deSJouni Malinen 
40c54710deSJouni Malinen 	get_ver(ROOT_DIR "/spp/hs20_spp_server -v", ver, sizeof(ver));
41c54710deSJouni Malinen 
42c54710deSJouni Malinen 	snprintf(resp, sizeof(resp), "vendor,OSU,model,OS,version,%s", ver);
43c54710deSJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, resp);
44*fcaeee18SJouni Malinen 	return STATUS_SENT;
4572ac93ccSJouni Malinen }
4672ac93ccSJouni Malinen 
4772ac93ccSJouni Malinen 
server_reset_user(struct sigma_dut * dut,const char * user)483b17d530SJouni Malinen static int server_reset_user(struct sigma_dut *dut, const char *user)
493b17d530SJouni Malinen {
503b17d530SJouni Malinen 	sqlite3 *db;
513b17d530SJouni Malinen 	int res = -1;
523b17d530SJouni Malinen 	char *sql = NULL;
533b17d530SJouni Malinen 	const char *realm = "wi-fi.org";
543b17d530SJouni Malinen 	const char *methods = "TTLS-MSCHAPV2";
553b17d530SJouni Malinen 	const char *password = "ChangeMe";
563b17d530SJouni Malinen 	int phase2 = 1;
573b17d530SJouni Malinen 	int machine_managed = 1;
58657bde6aSJouni Malinen 	const char *remediation = "";
593b17d530SJouni Malinen 	int fetch_pps = 0;
603b17d530SJouni Malinen 	const char *osu_user = NULL;
613b17d530SJouni Malinen 	const char *osu_password = NULL;
627aab205bSJouni Malinen 	const char *policy = NULL;
633b17d530SJouni Malinen 
643b17d530SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "Reset user %s", user);
653b17d530SJouni Malinen 
663b17d530SJouni Malinen 	if (sqlite3_open(SERVER_DB, &db)) {
673b17d530SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
683b17d530SJouni Malinen 				"Failed to open SQLite database %s",
693b17d530SJouni Malinen 				SERVER_DB);
703b17d530SJouni Malinen 		return -1;
713b17d530SJouni Malinen 	}
723b17d530SJouni Malinen 
733b17d530SJouni Malinen 	if (strcmp(user, "test01") == 0) {
74657bde6aSJouni Malinen 		remediation = "machine";
753b17d530SJouni Malinen 	} else if (strcmp(user, "test02") == 0) {
76657bde6aSJouni Malinen 		remediation = "user";
773b17d530SJouni Malinen 		machine_managed = 0;
783b17d530SJouni Malinen 	} else if (strcmp(user, "test03") == 0) {
79657bde6aSJouni Malinen 		/* UpdateInterval-based client trigger for policy update */
807aab205bSJouni Malinen 		policy = "ruckus130";
813b17d530SJouni Malinen 	} else if (strcmp(user, "test04") == 0) {
823b17d530SJouni Malinen 	} else if (strcmp(user, "test05") == 0) {
833b17d530SJouni Malinen 	} else if (strcmp(user, "test06") == 0) {
843b17d530SJouni Malinen 		realm = "example.com";
853b17d530SJouni Malinen 	} else if (strcmp(user, "test07") == 0) {
863b17d530SJouni Malinen 	} else if (strcmp(user, "test08") == 0) {
87657bde6aSJouni Malinen 		remediation = "machine";
883b17d530SJouni Malinen 		osu_user = "testdmacc08";
893b17d530SJouni Malinen 		osu_password = "P@ssw0rd";
903b17d530SJouni Malinen 	} else if (strcmp(user, "test09") == 0) {
91657bde6aSJouni Malinen 		/* UpdateInterval-based client trigger for policy update */
927aab205bSJouni Malinen 		policy = "ruckus130";
93364c0818SJouni Malinen 		osu_user = "testdmacc09";
94364c0818SJouni Malinen 		osu_password = "P@ssw0rd";
953b17d530SJouni Malinen 	} else if (strcmp(user, "test10") == 0) {
96657bde6aSJouni Malinen 		remediation = "machine";
973b17d530SJouni Malinen 		methods = "TLS";
983b17d530SJouni Malinen 	} else if (strcmp(user, "test11") == 0) {
993b17d530SJouni Malinen 	} else if (strcmp(user, "test12") == 0) {
100657bde6aSJouni Malinen 		remediation = "user";
1013b17d530SJouni Malinen 		methods = "TLS";
1023b17d530SJouni Malinen 	} else if (strcmp(user, "test20") == 0) {
1033b17d530SJouni Malinen 	} else if (strcmp(user, "test26") == 0) {
1043b17d530SJouni Malinen 		/* TODO: Cred01 with username/password? */
1053b17d530SJouni Malinen 		user = "1310026000000001";
1063b17d530SJouni Malinen 		methods = "SIM";
1073b17d530SJouni Malinen 	} else if (strcmp(user, "test30") == 0) {
1083b17d530SJouni Malinen 		osu_user = "testdmacc30";
1093b17d530SJouni Malinen 		osu_password = "P@ssw0rd";
1103b17d530SJouni Malinen 	} else if (strcmp(user, "test31") == 0) {
1113b17d530SJouni Malinen 		osu_user = "testdmacc31";
1123b17d530SJouni Malinen 		osu_password = "P@ssw0rd";
1133b17d530SJouni Malinen 	} else if (strcmp(user, "test32") == 0) {
1143b17d530SJouni Malinen 		osu_user = "testdmacc32";
1153b17d530SJouni Malinen 		osu_password = "P@ssw0rd";
1163b17d530SJouni Malinen 	} else if (strcmp(user, "test33") == 0) {
1173b17d530SJouni Malinen 		osu_user = "testdmacc33";
1183b17d530SJouni Malinen 		osu_password = "P@ssw0rd";
1193b17d530SJouni Malinen 	} else if (strcmp(user, "test34") == 0) {
1203b17d530SJouni Malinen 		osu_user = "testdmacc34";
1213b17d530SJouni Malinen 		osu_password = "P@ssw0rd";
1223b17d530SJouni Malinen 	} else if (strcmp(user, "test35") == 0) {
1233b17d530SJouni Malinen 		osu_user = "testdmacc35";
1243b17d530SJouni Malinen 		osu_password = "P@ssw0rd";
1253b17d530SJouni Malinen 	} else if (strcmp(user, "test36") == 0) {
1263b17d530SJouni Malinen 	} else if (strcmp(user, "test37") == 0) {
1273b17d530SJouni Malinen 		osu_user = "testdmacc37";
1283b17d530SJouni Malinen 		osu_password = "P@ssw0rd";
129364c0818SJouni Malinen 	} else if (strcmp(user, "testdmacc08") == 0 ||
130364c0818SJouni Malinen 		   strcmp(user, "testdmacc09") == 0) {
131364c0818SJouni Malinen 		/* No need to set anything separate for testdmacc* users */
132364c0818SJouni Malinen 		sqlite3_close(db);
133364c0818SJouni Malinen 		return 0;
1343b17d530SJouni Malinen 	} else {
1353b17d530SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO, "Unsupported username '%s'",
1363b17d530SJouni Malinen 				user);
1373b17d530SJouni Malinen 		goto fail;
1383b17d530SJouni Malinen 	}
1393b17d530SJouni Malinen 
1407aab205bSJouni Malinen 	sql = sqlite3_mprintf("INSERT OR REPLACE INTO users(identity,realm,methods,password,phase2,machine_managed,remediation,fetch_pps,osu_user,osu_password,policy) VALUES (%Q,%Q,%Q,%Q,%d,%d,%Q,%d,%Q,%Q,%Q)",
1413b17d530SJouni Malinen 			      user, realm, methods, password,
1423b17d530SJouni Malinen 			      phase2, machine_managed, remediation, fetch_pps,
1437aab205bSJouni Malinen 			      osu_user, osu_password, policy);
1443b17d530SJouni Malinen 
1453b17d530SJouni Malinen 	if (!sql)
1463b17d530SJouni Malinen 		goto fail;
1473b17d530SJouni Malinen 
1483b17d530SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "SQL: %s", sql);
1493b17d530SJouni Malinen 
1503b17d530SJouni Malinen 	if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) {
1513b17d530SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR, "SQL operation failed: %s",
1523b17d530SJouni Malinen 				sqlite3_errmsg(db));
1533b17d530SJouni Malinen 	} else {
1543b17d530SJouni Malinen 		res = 0;
1553b17d530SJouni Malinen 	}
1563b17d530SJouni Malinen 
1573b17d530SJouni Malinen 	sqlite3_free(sql);
1583b17d530SJouni Malinen 
1593b17d530SJouni Malinen fail:
1603b17d530SJouni Malinen 	sqlite3_close(db);
1613b17d530SJouni Malinen 
1623b17d530SJouni Malinen 	return res;
1633b17d530SJouni Malinen }
1643b17d530SJouni Malinen 
1653b17d530SJouni Malinen 
server_reset_serial(struct sigma_dut * dut,const char * serial)166bbe959f9SJouni Malinen static int server_reset_serial(struct sigma_dut *dut, const char *serial)
167bbe959f9SJouni Malinen {
168bbe959f9SJouni Malinen 	sqlite3 *db;
169bbe959f9SJouni Malinen 	int res = -1;
170bbe959f9SJouni Malinen 	char *sql = NULL;
171bbe959f9SJouni Malinen 	const char *realm = "wi-fi.org";
172bbe959f9SJouni Malinen 	const char *methods = "TLS";
173bbe959f9SJouni Malinen 	int phase2 = 0;
174bbe959f9SJouni Malinen 	int machine_managed = 1;
175bbe959f9SJouni Malinen 	const char *remediation = "";
176bbe959f9SJouni Malinen 	int fetch_pps = 0;
177bbe959f9SJouni Malinen 	const char *osu_user = NULL;
178bbe959f9SJouni Malinen 	const char *osu_password = NULL;
179bbe959f9SJouni Malinen 	const char *policy = NULL;
180bbe959f9SJouni Malinen 	char user[128];
1812508a59dSJouni Malinen 	const char *cert = "";
1822508a59dSJouni Malinen 	const char *subrem = "";
183bbe959f9SJouni Malinen 
184bbe959f9SJouni Malinen 	snprintf(user, sizeof(user), "cert-%s", serial);
185bbe959f9SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "Reset user %s (serial number: %s)",
186bbe959f9SJouni Malinen 			user, serial);
187bbe959f9SJouni Malinen 
188bbe959f9SJouni Malinen 	if (sqlite3_open(SERVER_DB, &db)) {
189bbe959f9SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
190bbe959f9SJouni Malinen 				"Failed to open SQLite database %s",
191bbe959f9SJouni Malinen 				SERVER_DB);
192bbe959f9SJouni Malinen 		return -1;
193bbe959f9SJouni Malinen 	}
194bbe959f9SJouni Malinen 
195bbe959f9SJouni Malinen 	if (strcmp(serial, "1046") == 0) {
196bbe959f9SJouni Malinen 		remediation = "machine";
1972508a59dSJouni Malinen 		cert = "3786eb9ef44778fe8048f9fa6f8c3e611f2dbdd15f239fa93edcc417debefa5a";
1982508a59dSJouni Malinen 		subrem = "homeoi";
199bbe959f9SJouni Malinen 	} else if (strcmp(serial, "1047") == 0) {
200bbe959f9SJouni Malinen 		remediation = "user";
2012508a59dSJouni Malinen 		cert = "55cd0af162f2fb6de5b9481e37a0b0887f42e477ab09586b0c10f24b269b893f";
202bbe959f9SJouni Malinen 	} else {
203bbe959f9SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_INFO,
204bbe959f9SJouni Malinen 				"Unsupported serial number '%s'", serial);
205bbe959f9SJouni Malinen 		goto fail;
206bbe959f9SJouni Malinen 	}
207bbe959f9SJouni Malinen 
2082508a59dSJouni Malinen 	sql = sqlite3_mprintf("INSERT OR REPLACE INTO users(identity,realm,methods,phase2,machine_managed,remediation,fetch_pps,osu_user,osu_password,policy,cert,subrem) VALUES (%Q,%Q,%Q,%d,%d,%Q,%d,%Q,%Q,%Q,%Q,%Q)",
209bbe959f9SJouni Malinen 			      user, realm, methods,
210bbe959f9SJouni Malinen 			      phase2, machine_managed, remediation, fetch_pps,
2112508a59dSJouni Malinen 			      osu_user, osu_password, policy, cert, subrem);
212bbe959f9SJouni Malinen 
213bbe959f9SJouni Malinen 	if (!sql)
214bbe959f9SJouni Malinen 		goto fail;
215bbe959f9SJouni Malinen 
216bbe959f9SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "SQL: %s", sql);
217bbe959f9SJouni Malinen 
218bbe959f9SJouni Malinen 	if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) {
219bbe959f9SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR, "SQL operation failed: %s",
220bbe959f9SJouni Malinen 				sqlite3_errmsg(db));
221bbe959f9SJouni Malinen 	} else {
222bbe959f9SJouni Malinen 		res = 0;
223bbe959f9SJouni Malinen 	}
224bbe959f9SJouni Malinen 
225bbe959f9SJouni Malinen 	sqlite3_free(sql);
226bbe959f9SJouni Malinen 
227bbe959f9SJouni Malinen fail:
228bbe959f9SJouni Malinen 	sqlite3_close(db);
229bbe959f9SJouni Malinen 
230bbe959f9SJouni Malinen 	return res;
231bbe959f9SJouni Malinen }
232bbe959f9SJouni Malinen 
233bbe959f9SJouni Malinen 
server_reset_cert_enroll(struct sigma_dut * dut,const char * addr)23405630abeSJouni Malinen static int server_reset_cert_enroll(struct sigma_dut *dut, const char *addr)
23505630abeSJouni Malinen {
23605630abeSJouni Malinen 	sqlite3 *db;
23705630abeSJouni Malinen 	char *sql;
23805630abeSJouni Malinen 
23905630abeSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG,
24005630abeSJouni Malinen 			"Reset certificate enrollment status for %s", addr);
24105630abeSJouni Malinen 
24205630abeSJouni Malinen 	if (sqlite3_open(SERVER_DB, &db)) {
24305630abeSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
24405630abeSJouni Malinen 				"Failed to open SQLite database %s",
24505630abeSJouni Malinen 				SERVER_DB);
24605630abeSJouni Malinen 		return -1;
24705630abeSJouni Malinen 	}
24805630abeSJouni Malinen 	sql = sqlite3_mprintf("DELETE FROM cert_enroll WHERE mac_addr=%Q",
24905630abeSJouni Malinen 			      addr);
25005630abeSJouni Malinen 	if (!sql) {
25105630abeSJouni Malinen 		sqlite3_close(db);
25205630abeSJouni Malinen 		return -1;
25305630abeSJouni Malinen 	}
25405630abeSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "SQL: %s", sql);
25505630abeSJouni Malinen 
25605630abeSJouni Malinen 	if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) {
25705630abeSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
25805630abeSJouni Malinen 				"SQL operation failed: %s",
25905630abeSJouni Malinen 				sqlite3_errmsg(db));
26005630abeSJouni Malinen 		sqlite3_free(sql);
26105630abeSJouni Malinen 		sqlite3_close(db);
26205630abeSJouni Malinen 		return -1;
26305630abeSJouni Malinen 	}
26405630abeSJouni Malinen 
26505630abeSJouni Malinen 	sqlite3_free(sql);
26605630abeSJouni Malinen 	sqlite3_close(db);
26705630abeSJouni Malinen 
26805630abeSJouni Malinen 	return 0;
26905630abeSJouni Malinen }
27005630abeSJouni Malinen 
27105630abeSJouni Malinen 
server_reset_imsi(struct sigma_dut * dut,const char * imsi)2724ec26fe1SJouni Malinen static int server_reset_imsi(struct sigma_dut *dut, const char *imsi)
2734ec26fe1SJouni Malinen {
2744ec26fe1SJouni Malinen 	sqlite3 *db;
2754ec26fe1SJouni Malinen 	char *sql;
2764ec26fe1SJouni Malinen 
2774ec26fe1SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "Reset policy provisioning for %s",
2784ec26fe1SJouni Malinen 			imsi);
2794ec26fe1SJouni Malinen 
2804ec26fe1SJouni Malinen 	if (sqlite3_open(SERVER_DB, &db)) {
2814ec26fe1SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
2824ec26fe1SJouni Malinen 				"Failed to open SQLite database %s",
2834ec26fe1SJouni Malinen 				SERVER_DB);
2844ec26fe1SJouni Malinen 		return -1;
2854ec26fe1SJouni Malinen 	}
2864ec26fe1SJouni Malinen 	sql = sqlite3_mprintf("DELETE FROM users WHERE identity=%Q", imsi);
2874ec26fe1SJouni Malinen 	if (!sql) {
2884ec26fe1SJouni Malinen 		sqlite3_close(db);
2894ec26fe1SJouni Malinen 		return -1;
2904ec26fe1SJouni Malinen 	}
2914ec26fe1SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "SQL: %s", sql);
2924ec26fe1SJouni Malinen 
2934ec26fe1SJouni Malinen 	if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) {
2944ec26fe1SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
2954ec26fe1SJouni Malinen 				"SQL operation failed: %s",
2964ec26fe1SJouni Malinen 				sqlite3_errmsg(db));
2974ec26fe1SJouni Malinen 		sqlite3_free(sql);
2984ec26fe1SJouni Malinen 		sqlite3_close(db);
2994ec26fe1SJouni Malinen 		return -1;
3004ec26fe1SJouni Malinen 	}
3014ec26fe1SJouni Malinen 
3024ec26fe1SJouni Malinen 	sqlite3_free(sql);
3034ec26fe1SJouni Malinen 	sqlite3_close(db);
3044ec26fe1SJouni Malinen 
3054ec26fe1SJouni Malinen 	return 0;
3064ec26fe1SJouni Malinen }
3074ec26fe1SJouni Malinen 
3084ec26fe1SJouni Malinen 
cmd_server_reset_default(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)309*fcaeee18SJouni Malinen static enum sigma_cmd_result cmd_server_reset_default(struct sigma_dut *dut,
310cd4e3c3eSJouni Malinen 						      struct sigma_conn *conn,
311cd4e3c3eSJouni Malinen 						      struct sigma_cmd *cmd)
312cd4e3c3eSJouni Malinen {
313cd4e3c3eSJouni Malinen 	const char *var;
31494d7b122SJouni Malinen 	enum sigma_program prog;
315cd4e3c3eSJouni Malinen 
316cd4e3c3eSJouni Malinen 	var = get_param(cmd, "Program");
31794d7b122SJouni Malinen 	if (!var) {
31894d7b122SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
31994d7b122SJouni Malinen 			  "errorCode,Missing program parameter");
320*fcaeee18SJouni Malinen 		return STATUS_SENT;
32194d7b122SJouni Malinen 	}
32294d7b122SJouni Malinen 
32394d7b122SJouni Malinen 	prog = sigma_program_to_enum(var);
32494d7b122SJouni Malinen 	if (prog != PROGRAM_HS2_R2 && prog != PROGRAM_HS2_R3) {
325cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
326cd4e3c3eSJouni Malinen 			  "errorCode,Unsupported program");
327*fcaeee18SJouni Malinen 		return STATUS_SENT;
328cd4e3c3eSJouni Malinen 	}
329cd4e3c3eSJouni Malinen 
330cd4e3c3eSJouni Malinen 	var = get_param(cmd, "UserName");
3313b17d530SJouni Malinen 	if (var && server_reset_user(dut, var) < 0) {
3323b17d530SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
3333b17d530SJouni Malinen 			  "errorCode,Failed to reset user account to defaults");
334*fcaeee18SJouni Malinen 		return STATUS_SENT;
335cd4e3c3eSJouni Malinen 	}
336cd4e3c3eSJouni Malinen 
337cd4e3c3eSJouni Malinen 	var = get_param(cmd, "SerialNo");
338bbe959f9SJouni Malinen 	if (var && server_reset_serial(dut, var)) {
339bbe959f9SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
340bbe959f9SJouni Malinen 			  "errorCode,Failed to reset user account to defaults");
341*fcaeee18SJouni Malinen 		return STATUS_SENT;
342cd4e3c3eSJouni Malinen 	}
343cd4e3c3eSJouni Malinen 
34405630abeSJouni Malinen 	var = get_param(cmd, "ClientMACAddr");
34505630abeSJouni Malinen 	if (var && server_reset_cert_enroll(dut, var) < 0) {
34605630abeSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
34705630abeSJouni Malinen 			  "errorCode,Failed to reset cert enroll to defaults");
348*fcaeee18SJouni Malinen 		return STATUS_SENT;
34905630abeSJouni Malinen 	}
35005630abeSJouni Malinen 
3514ec26fe1SJouni Malinen 	var = get_param(cmd, "imsi_val");
3524ec26fe1SJouni Malinen 	if (var && server_reset_imsi(dut, var) < 0) {
3534ec26fe1SJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
3544ec26fe1SJouni Malinen 			  "errorCode,Failed to reset IMSI/SIM user");
355*fcaeee18SJouni Malinen 		return STATUS_SENT;
3564ec26fe1SJouni Malinen 	}
3574ec26fe1SJouni Malinen 
358*fcaeee18SJouni Malinen 	return SUCCESS_SEND_STATUS;
359cd4e3c3eSJouni Malinen }
360cd4e3c3eSJouni Malinen 
361cd4e3c3eSJouni Malinen 
get_last_msk_cb(void * ctx,int argc,char * argv[],char * col[])3620f1614baSJouni Malinen static int get_last_msk_cb(void *ctx, int argc, char *argv[], char *col[])
3630f1614baSJouni Malinen {
3640f1614baSJouni Malinen 	char **last_msk = ctx;
3650f1614baSJouni Malinen 
3660f1614baSJouni Malinen 	if (argc < 1 || !argv[0])
3670f1614baSJouni Malinen 		return 0;
3680f1614baSJouni Malinen 
3690f1614baSJouni Malinen 	free(*last_msk);
3700f1614baSJouni Malinen 	*last_msk = strdup(argv[0]);
3710f1614baSJouni Malinen 
3720f1614baSJouni Malinen 	return 0;
3730f1614baSJouni Malinen }
3740f1614baSJouni Malinen 
3750f1614baSJouni Malinen 
get_last_msk(struct sigma_dut * dut,sqlite3 * db,const char * username)3760f1614baSJouni Malinen static char * get_last_msk(struct sigma_dut *dut, sqlite3 *db,
3770f1614baSJouni Malinen 			   const char *username)
3780f1614baSJouni Malinen {
3790f1614baSJouni Malinen 	char *sql, *last_msk = NULL;
3800f1614baSJouni Malinen 
3810f1614baSJouni Malinen 	sql = sqlite3_mprintf("SELECT last_msk FROM users WHERE identity=%Q",
3820f1614baSJouni Malinen 			      username);
3830f1614baSJouni Malinen 	if (!sql)
3840f1614baSJouni Malinen 		return NULL;
3850f1614baSJouni Malinen 
3860f1614baSJouni Malinen 	if (sqlite3_exec(db, sql, get_last_msk_cb, &last_msk, NULL) !=
3870f1614baSJouni Malinen 	    SQLITE_OK) {
3880f1614baSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
3890f1614baSJouni Malinen 				"SQL operation to fetch last_msk failed: %s",
3900f1614baSJouni Malinen 				sqlite3_errmsg(db));
3910f1614baSJouni Malinen 		sqlite3_free(sql);
3920f1614baSJouni Malinen 		return NULL;
3930f1614baSJouni Malinen 	}
3940f1614baSJouni Malinen 
3950f1614baSJouni Malinen 	sqlite3_free(sql);
3960f1614baSJouni Malinen 
3970f1614baSJouni Malinen 	return last_msk;
3980f1614baSJouni Malinen }
3990f1614baSJouni Malinen 
4000f1614baSJouni Malinen 
401*fcaeee18SJouni Malinen static enum sigma_cmd_result
aaa_auth_status(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd,const char * username,int timeout)402*fcaeee18SJouni Malinen aaa_auth_status(struct sigma_dut *dut, struct sigma_conn *conn,
403*fcaeee18SJouni Malinen 		struct sigma_cmd *cmd, const char *username, int timeout)
4040f1614baSJouni Malinen {
4050f1614baSJouni Malinen 	sqlite3 *db;
4060f1614baSJouni Malinen 	char *sql = NULL;
4070f1614baSJouni Malinen 	int i;
4080f1614baSJouni Malinen 	char resp[500];
4090f1614baSJouni Malinen 
4100f1614baSJouni Malinen 	if (sqlite3_open(SERVER_DB, &db)) {
4110f1614baSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
4120f1614baSJouni Malinen 				"Failed to open SQLite database %s",
4130f1614baSJouni Malinen 				SERVER_DB);
414*fcaeee18SJouni Malinen 		return INVALID_SEND_STATUS;
4150f1614baSJouni Malinen 	}
4160f1614baSJouni Malinen 
4170f1614baSJouni Malinen 	sql = sqlite3_mprintf("UPDATE users SET last_msk=NULL WHERE identity=%Q",
4180f1614baSJouni Malinen 			      username);
4190f1614baSJouni Malinen 	if (!sql) {
4200f1614baSJouni Malinen 		sqlite3_close(db);
421*fcaeee18SJouni Malinen 		return ERROR_SEND_STATUS;
4220f1614baSJouni Malinen 	}
4230f1614baSJouni Malinen 
4240f1614baSJouni Malinen 	if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) {
4250f1614baSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
4260f1614baSJouni Malinen 				"SQL operation to clear last_msk failed: %s",
4270f1614baSJouni Malinen 				sqlite3_errmsg(db));
4280f1614baSJouni Malinen 		sqlite3_free(sql);
4290f1614baSJouni Malinen 		sqlite3_close(db);
430*fcaeee18SJouni Malinen 		return ERROR_SEND_STATUS;
4310f1614baSJouni Malinen 	}
4320f1614baSJouni Malinen 
4330f1614baSJouni Malinen 	sqlite3_free(sql);
4340f1614baSJouni Malinen 
43589dfb22eSJouni Malinen 	if (sqlite3_changes(db) < 1) {
43689dfb22eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
43789dfb22eSJouni Malinen 				"No DB rows modified (specified user not found)");
43889dfb22eSJouni Malinen 		sqlite3_close(db);
439*fcaeee18SJouni Malinen 		return ERROR_SEND_STATUS;
44089dfb22eSJouni Malinen 	}
44189dfb22eSJouni Malinen 
4420f1614baSJouni Malinen 	snprintf(resp, sizeof(resp), "AuthStatus,TIMEOUT,MSK,NULL");
4430f1614baSJouni Malinen 
4440f1614baSJouni Malinen 	for (i = 0; i < timeout; i++) {
4450f1614baSJouni Malinen 		char *last_msk;
4460f1614baSJouni Malinen 
4470f1614baSJouni Malinen 		last_msk = get_last_msk(dut, db, username);
4480f1614baSJouni Malinen 		if (last_msk) {
4490f1614baSJouni Malinen 			if (strcmp(last_msk, "FAIL") == 0) {
4500f1614baSJouni Malinen 				snprintf(resp, sizeof(resp),
4510f1614baSJouni Malinen 					 "AuthStatus,FAIL,MSK,NULL");
4520f1614baSJouni Malinen 			} else {
4530f1614baSJouni Malinen 				snprintf(resp, sizeof(resp),
4540f1614baSJouni Malinen 					 "AuthStatus,SUCCESS,MSK,%s", last_msk);
4550f1614baSJouni Malinen 			}
4560f1614baSJouni Malinen 			free(last_msk);
4570f1614baSJouni Malinen 			break;
4580f1614baSJouni Malinen 		}
4590f1614baSJouni Malinen 		sleep(1);
4600f1614baSJouni Malinen 	}
4610f1614baSJouni Malinen 
4620f1614baSJouni Malinen 	sqlite3_close(db);
4630f1614baSJouni Malinen 
4640f1614baSJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, resp);
465*fcaeee18SJouni Malinen 	return STATUS_SENT;
4660f1614baSJouni Malinen }
4670f1614baSJouni Malinen 
4680f1614baSJouni Malinen 
get_last_serial_cb(void * ctx,int argc,char * argv[],char * col[])46905630abeSJouni Malinen static int get_last_serial_cb(void *ctx, int argc, char *argv[], char *col[])
47005630abeSJouni Malinen {
47105630abeSJouni Malinen 	char **last_serial = ctx;
47205630abeSJouni Malinen 
47305630abeSJouni Malinen 	if (argc < 1 || !argv[0])
47405630abeSJouni Malinen 		return 0;
47505630abeSJouni Malinen 
47605630abeSJouni Malinen 	free(*last_serial);
47705630abeSJouni Malinen 	*last_serial = strdup(argv[0]);
47805630abeSJouni Malinen 
47905630abeSJouni Malinen 	return 0;
48005630abeSJouni Malinen }
48105630abeSJouni Malinen 
48205630abeSJouni Malinen 
get_last_serial(struct sigma_dut * dut,sqlite3 * db,const char * addr)48305630abeSJouni Malinen static char * get_last_serial(struct sigma_dut *dut, sqlite3 *db,
48405630abeSJouni Malinen 			      const char *addr)
48505630abeSJouni Malinen {
48605630abeSJouni Malinen 	char *sql, *last_serial = NULL;
48705630abeSJouni Malinen 
48805630abeSJouni Malinen 	sql = sqlite3_mprintf("SELECT serialnum FROM cert_enroll WHERE mac_addr=%Q",
48905630abeSJouni Malinen 			      addr);
49005630abeSJouni Malinen 	if (!sql)
49105630abeSJouni Malinen 		return NULL;
49205630abeSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "SQL: %s", sql);
49305630abeSJouni Malinen 
49405630abeSJouni Malinen 	if (sqlite3_exec(db, sql, get_last_serial_cb, &last_serial, NULL) !=
49505630abeSJouni Malinen 	    SQLITE_OK) {
49605630abeSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
49705630abeSJouni Malinen 				"SQL operation to fetch last_serial failed: %s",
49805630abeSJouni Malinen 				sqlite3_errmsg(db));
49905630abeSJouni Malinen 		sqlite3_free(sql);
50005630abeSJouni Malinen 		return NULL;
50105630abeSJouni Malinen 	}
50205630abeSJouni Malinen 
50305630abeSJouni Malinen 	sqlite3_free(sql);
50405630abeSJouni Malinen 
50505630abeSJouni Malinen 	return last_serial;
50605630abeSJouni Malinen }
50705630abeSJouni Malinen 
50805630abeSJouni Malinen 
509*fcaeee18SJouni Malinen static enum sigma_cmd_result
osu_cert_enroll_status(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd,const char * addr,int timeout)510*fcaeee18SJouni Malinen osu_cert_enroll_status(struct sigma_dut *dut, struct sigma_conn *conn,
511*fcaeee18SJouni Malinen 		       struct sigma_cmd *cmd, const char *addr, int timeout)
51205630abeSJouni Malinen {
51305630abeSJouni Malinen 	sqlite3 *db;
51405630abeSJouni Malinen 	int i;
51505630abeSJouni Malinen 	char resp[500];
51605630abeSJouni Malinen 
51705630abeSJouni Malinen 	if (sqlite3_open(SERVER_DB, &db)) {
51805630abeSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
51905630abeSJouni Malinen 				"Failed to open SQLite database %s",
52005630abeSJouni Malinen 				SERVER_DB);
521*fcaeee18SJouni Malinen 		return INVALID_SEND_STATUS;
52205630abeSJouni Malinen 	}
52305630abeSJouni Malinen 
52405630abeSJouni Malinen 	snprintf(resp, sizeof(resp), "OSUStatus,TIMEOUT");
52505630abeSJouni Malinen 
52605630abeSJouni Malinen 	for (i = 0; i < timeout; i++) {
52705630abeSJouni Malinen 		char *last_serial;
52805630abeSJouni Malinen 
52905630abeSJouni Malinen 		last_serial = get_last_serial(dut, db, addr);
53005630abeSJouni Malinen 		if (last_serial) {
53105630abeSJouni Malinen 			if (strcmp(last_serial, "FAIL") == 0) {
53205630abeSJouni Malinen 				snprintf(resp, sizeof(resp),
53305630abeSJouni Malinen 					 "OSUStatus,FAIL");
53405630abeSJouni Malinen 			} else if (strlen(last_serial) > 0) {
53505630abeSJouni Malinen 				snprintf(resp, sizeof(resp),
53605630abeSJouni Malinen 					 "OSUStatus,SUCCESS,SerialNo,%s",
53705630abeSJouni Malinen 					 last_serial);
53805630abeSJouni Malinen 			}
53905630abeSJouni Malinen 			free(last_serial);
54005630abeSJouni Malinen 			break;
54105630abeSJouni Malinen 		}
54205630abeSJouni Malinen 		sleep(1);
54305630abeSJouni Malinen 	}
54405630abeSJouni Malinen 
54505630abeSJouni Malinen 	sqlite3_close(db);
54605630abeSJouni Malinen 
54705630abeSJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, resp);
548*fcaeee18SJouni Malinen 	return STATUS_SENT;
54905630abeSJouni Malinen }
55005630abeSJouni Malinen 
55105630abeSJouni Malinen 
get_user_field_cb(void * ctx,int argc,char * argv[],char * col[])5524ea3acb2SJouni Malinen static int get_user_field_cb(void *ctx, int argc, char *argv[], char *col[])
5534ea3acb2SJouni Malinen {
5544ea3acb2SJouni Malinen 	char **val = ctx;
5554ea3acb2SJouni Malinen 
5564ea3acb2SJouni Malinen 	if (argc < 1 || !argv[0])
5574ea3acb2SJouni Malinen 		return 0;
5584ea3acb2SJouni Malinen 
5594ea3acb2SJouni Malinen 	free(*val);
5604ea3acb2SJouni Malinen 	*val = strdup(argv[0]);
5614ea3acb2SJouni Malinen 
5624ea3acb2SJouni Malinen 	return 0;
5634ea3acb2SJouni Malinen }
5644ea3acb2SJouni Malinen 
5654ea3acb2SJouni Malinen 
get_user_field_helper(struct sigma_dut * dut,sqlite3 * db,const char * id_field,const char * identity,const char * field)566de664c35SJouni Malinen static char * get_user_field_helper(struct sigma_dut *dut, sqlite3 *db,
567de664c35SJouni Malinen 				    const char *id_field,
5684ea3acb2SJouni Malinen 				    const char *identity, const char *field)
5694ea3acb2SJouni Malinen {
5704ea3acb2SJouni Malinen 	char *sql, *val = NULL;
5714ea3acb2SJouni Malinen 
572de664c35SJouni Malinen 	sql = sqlite3_mprintf("SELECT %s FROM users WHERE %s=%Q",
573de664c35SJouni Malinen 			      field, id_field, identity);
5744ea3acb2SJouni Malinen 	if (!sql)
5754ea3acb2SJouni Malinen 		return NULL;
5764ea3acb2SJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "SQL: %s", sql);
5774ea3acb2SJouni Malinen 
5784ea3acb2SJouni Malinen 	if (sqlite3_exec(db, sql, get_user_field_cb, &val, NULL) != SQLITE_OK) {
5794ea3acb2SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
5804ea3acb2SJouni Malinen 				"SQL operation to fetch user field failed: %s",
5814ea3acb2SJouni Malinen 				sqlite3_errmsg(db));
5824ea3acb2SJouni Malinen 		sqlite3_free(sql);
5834ea3acb2SJouni Malinen 		return NULL;
5844ea3acb2SJouni Malinen 	}
5854ea3acb2SJouni Malinen 
5864ea3acb2SJouni Malinen 	sqlite3_free(sql);
5874ea3acb2SJouni Malinen 
5884ea3acb2SJouni Malinen 	return val;
5894ea3acb2SJouni Malinen }
5904ea3acb2SJouni Malinen 
5914ea3acb2SJouni Malinen 
get_user_field(struct sigma_dut * dut,sqlite3 * db,const char * identity,const char * field)592de664c35SJouni Malinen static char * get_user_field(struct sigma_dut *dut, sqlite3 *db,
593de664c35SJouni Malinen 			     const char *identity, const char *field)
594de664c35SJouni Malinen {
595de664c35SJouni Malinen 	return get_user_field_helper(dut, db, "identity", identity, field);
596de664c35SJouni Malinen }
597de664c35SJouni Malinen 
598de664c35SJouni Malinen 
get_user_dmacc_field(struct sigma_dut * dut,sqlite3 * db,const char * identity,const char * field)599de664c35SJouni Malinen static char * get_user_dmacc_field(struct sigma_dut *dut, sqlite3 *db,
600de664c35SJouni Malinen 				   const char *identity, const char *field)
601de664c35SJouni Malinen {
602de664c35SJouni Malinen 	return get_user_field_helper(dut, db, "osu_user", identity, field);
603de664c35SJouni Malinen }
604de664c35SJouni Malinen 
605de664c35SJouni Malinen 
get_eventlog_new_serialno_cb(void * ctx,int argc,char * argv[],char * col[])60633f2acfcSJouni Malinen static int get_eventlog_new_serialno_cb(void *ctx, int argc, char *argv[],
60733f2acfcSJouni Malinen 					char *col[])
60833f2acfcSJouni Malinen {
60933f2acfcSJouni Malinen 	char **serialno = ctx;
61033f2acfcSJouni Malinen 	char *val;
61133f2acfcSJouni Malinen 
61233f2acfcSJouni Malinen 	if (argc < 1 || !argv[0])
61333f2acfcSJouni Malinen 		return 0;
61433f2acfcSJouni Malinen 
61533f2acfcSJouni Malinen 	val = argv[0];
61633f2acfcSJouni Malinen 	if (strncmp(val, "renamed user to: cert-", 22) != 0)
61733f2acfcSJouni Malinen 		return 0;
61833f2acfcSJouni Malinen 	val += 22;
61933f2acfcSJouni Malinen 	free(*serialno);
62033f2acfcSJouni Malinen 	*serialno = strdup(val);
62133f2acfcSJouni Malinen 
62233f2acfcSJouni Malinen 	return 0;
62333f2acfcSJouni Malinen }
62433f2acfcSJouni Malinen 
62533f2acfcSJouni Malinen 
get_eventlog_new_serialno(struct sigma_dut * dut,sqlite3 * db,const char * username)62633f2acfcSJouni Malinen static char * get_eventlog_new_serialno(struct sigma_dut *dut, sqlite3 *db,
62733f2acfcSJouni Malinen 					const char *username)
62833f2acfcSJouni Malinen {
62933f2acfcSJouni Malinen 	char *sql, *serial = NULL;
63033f2acfcSJouni Malinen 
63133f2acfcSJouni Malinen 	sql = sqlite3_mprintf("SELECT notes FROM eventlog WHERE user=%Q AND notes LIKE %Q",
63233f2acfcSJouni Malinen 			      username, "renamed user to:%");
63333f2acfcSJouni Malinen 	if (!sql)
63433f2acfcSJouni Malinen 		return NULL;
63533f2acfcSJouni Malinen 
63633f2acfcSJouni Malinen 	if (sqlite3_exec(db, sql, get_eventlog_new_serialno_cb, &serial,
63733f2acfcSJouni Malinen 			 NULL) != SQLITE_OK) {
63833f2acfcSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
63933f2acfcSJouni Malinen 				"SQL operation to fetch new serialno failed: %s",
64033f2acfcSJouni Malinen 				sqlite3_errmsg(db));
64133f2acfcSJouni Malinen 		sqlite3_free(sql);
64233f2acfcSJouni Malinen 		return NULL;
64333f2acfcSJouni Malinen 	}
64433f2acfcSJouni Malinen 
64533f2acfcSJouni Malinen 	sqlite3_free(sql);
64633f2acfcSJouni Malinen 
64733f2acfcSJouni Malinen 	return serial;
64833f2acfcSJouni Malinen }
64933f2acfcSJouni Malinen 
65033f2acfcSJouni Malinen 
651*fcaeee18SJouni Malinen static enum sigma_cmd_result
osu_remediation_status(struct sigma_dut * dut,struct sigma_conn * conn,int timeout,const char * username,const char * serialno)652*fcaeee18SJouni Malinen osu_remediation_status(struct sigma_dut *dut, struct sigma_conn *conn,
653*fcaeee18SJouni Malinen 		       int timeout, const char *username, const char *serialno)
6544ea3acb2SJouni Malinen {
6554ea3acb2SJouni Malinen 	sqlite3 *db;
6564ea3acb2SJouni Malinen 	int i;
6574ea3acb2SJouni Malinen 	char resp[500];
6584ea3acb2SJouni Malinen 	char name[100];
6594ea3acb2SJouni Malinen 	char *remediation = NULL;
660de664c35SJouni Malinen 	int dmacc = 0;
6614ea3acb2SJouni Malinen 
6624ea3acb2SJouni Malinen 	if (!username && !serialno)
663*fcaeee18SJouni Malinen 		return INVALID_SEND_STATUS;
6644ea3acb2SJouni Malinen 	if (!username) {
6654ea3acb2SJouni Malinen 		snprintf(name, sizeof(name), "cert-%s", serialno);
6664ea3acb2SJouni Malinen 		username = name;
6674ea3acb2SJouni Malinen 	}
6684ea3acb2SJouni Malinen 
6694ea3acb2SJouni Malinen 	if (sqlite3_open(SERVER_DB, &db)) {
6704ea3acb2SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
6714ea3acb2SJouni Malinen 				"Failed to open SQLite database %s",
6724ea3acb2SJouni Malinen 				SERVER_DB);
673*fcaeee18SJouni Malinen 		return ERROR_SEND_STATUS;
6744ea3acb2SJouni Malinen 	}
6754ea3acb2SJouni Malinen 
6764ea3acb2SJouni Malinen 	remediation = get_user_field(dut, db, username, "remediation");
6774ea3acb2SJouni Malinen 	if (!remediation) {
678de664c35SJouni Malinen 		remediation = get_user_dmacc_field(dut, db, username,
679de664c35SJouni Malinen 						   "remediation");
680de664c35SJouni Malinen 		dmacc = 1;
681de664c35SJouni Malinen 	}
682de664c35SJouni Malinen 	if (!remediation) {
6834ea3acb2SJouni Malinen 		snprintf(resp, sizeof(resp),
6844ea3acb2SJouni Malinen 			 "RemediationStatus,User entry not found");
6854ea3acb2SJouni Malinen 		goto done;
6864ea3acb2SJouni Malinen 	}
6874ea3acb2SJouni Malinen 	if (remediation[0] == '\0') {
6884ea3acb2SJouni Malinen 		snprintf(resp, sizeof(resp),
6894ea3acb2SJouni Malinen 			 "RemediationStatus,User was not configured to need remediation");
6904ea3acb2SJouni Malinen 		goto done;
6914ea3acb2SJouni Malinen 	}
6924ea3acb2SJouni Malinen 
6934ea3acb2SJouni Malinen 	snprintf(resp, sizeof(resp), "RemediationStatus,TIMEOUT");
6944ea3acb2SJouni Malinen 
6954ea3acb2SJouni Malinen 	for (i = 0; i < timeout; i++) {
6964ea3acb2SJouni Malinen 		sleep(1);
6974ea3acb2SJouni Malinen 		free(remediation);
698de664c35SJouni Malinen 		if (dmacc)
699de664c35SJouni Malinen 			remediation = get_user_dmacc_field(dut, db, username,
700de664c35SJouni Malinen 							   "remediation");
701de664c35SJouni Malinen 		else
702de664c35SJouni Malinen 			remediation = get_user_field(dut, db, username,
703de664c35SJouni Malinen 						     "remediation");
70433f2acfcSJouni Malinen 		if (!remediation && serialno) {
70533f2acfcSJouni Malinen 			char *new_serial;
70633f2acfcSJouni Malinen 
70733f2acfcSJouni Malinen 			/* Certificate reenrollment through subscription
70833f2acfcSJouni Malinen 			 * remediation - fetch the new serial number */
70933f2acfcSJouni Malinen 			new_serial = get_eventlog_new_serialno(dut, db,
71033f2acfcSJouni Malinen 							       username);
71133f2acfcSJouni Malinen 			if (!new_serial) {
71233f2acfcSJouni Malinen 				/* New SerialNo not known?! */
71333f2acfcSJouni Malinen 				snprintf(resp, sizeof(resp),
71433f2acfcSJouni Malinen 					 "RemediationStatus,Remediation Complete,SerialNo,Unknown");
71533f2acfcSJouni Malinen 				break;
71633f2acfcSJouni Malinen 			}
71733f2acfcSJouni Malinen 			snprintf(resp, sizeof(resp),
71833f2acfcSJouni Malinen 				 "RemediationStatus,Remediation Complete,SerialNo,%s",
71933f2acfcSJouni Malinen 				new_serial);
72033f2acfcSJouni Malinen 			free(new_serial);
72133f2acfcSJouni Malinen 			break;
72233f2acfcSJouni Malinen 		} else if (remediation && remediation[0] == '\0') {
7234ea3acb2SJouni Malinen 			snprintf(resp, sizeof(resp),
7244ea3acb2SJouni Malinen 				 "RemediationStatus,Remediation Complete");
7254ea3acb2SJouni Malinen 			break;
7264ea3acb2SJouni Malinen 		}
7274ea3acb2SJouni Malinen 	}
7284ea3acb2SJouni Malinen 
7294ea3acb2SJouni Malinen done:
7304ea3acb2SJouni Malinen 	free(remediation);
7314ea3acb2SJouni Malinen 	sqlite3_close(db);
7324ea3acb2SJouni Malinen 
7334ea3acb2SJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, resp);
734*fcaeee18SJouni Malinen 	return STATUS_SENT;
7354ea3acb2SJouni Malinen }
7364ea3acb2SJouni Malinen 
7374ea3acb2SJouni Malinen 
738*fcaeee18SJouni Malinen static enum sigma_cmd_result
osu_polupd_status(struct sigma_dut * dut,struct sigma_conn * conn,int timeout,const char * username,const char * serialno)739*fcaeee18SJouni Malinen osu_polupd_status(struct sigma_dut *dut, struct sigma_conn *conn, int timeout,
740e926583bSJouni Malinen 		  const char *username, const char *serialno)
741e926583bSJouni Malinen {
742e926583bSJouni Malinen 	sqlite3 *db;
743e926583bSJouni Malinen 	char *sql;
744e926583bSJouni Malinen 	int i;
745e926583bSJouni Malinen 	char resp[500];
746e926583bSJouni Malinen 	char name[100];
747e926583bSJouni Malinen 	char *policy = NULL;
748e926583bSJouni Malinen 	int dmacc = 0;
749e926583bSJouni Malinen 
750e926583bSJouni Malinen 	if (!username && !serialno)
751*fcaeee18SJouni Malinen 		return INVALID_SEND_STATUS;
752e926583bSJouni Malinen 	if (!username) {
753e926583bSJouni Malinen 		snprintf(name, sizeof(name), "cert-%s", serialno);
754e926583bSJouni Malinen 		username = name;
755e926583bSJouni Malinen 	}
756e926583bSJouni Malinen 
757e926583bSJouni Malinen 	if (sqlite3_open(SERVER_DB, &db)) {
758e926583bSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
759e926583bSJouni Malinen 				"Failed to open SQLite database %s",
760e926583bSJouni Malinen 				SERVER_DB);
761*fcaeee18SJouni Malinen 		return ERROR_SEND_STATUS;
762e926583bSJouni Malinen 	}
763e926583bSJouni Malinen 
764e926583bSJouni Malinen 	policy = get_user_field(dut, db, username, "policy");
765e926583bSJouni Malinen 	if (!policy) {
766e926583bSJouni Malinen 		policy = get_user_dmacc_field(dut, db, username, "policy");
767e926583bSJouni Malinen 		dmacc = 1;
768e926583bSJouni Malinen 	}
769e926583bSJouni Malinen 	if (!policy) {
770e926583bSJouni Malinen 		snprintf(resp, sizeof(resp),
771e926583bSJouni Malinen 			 "PolicyUpdateStatus,User entry not found");
772e926583bSJouni Malinen 		goto done;
773e926583bSJouni Malinen 	}
774e926583bSJouni Malinen 	if (policy[0] == '\0') {
775e926583bSJouni Malinen 		snprintf(resp, sizeof(resp),
776e926583bSJouni Malinen 			 "PolicyUpdateStatus,User was not configured to need policy update");
777e926583bSJouni Malinen 		goto done;
778e926583bSJouni Malinen 	}
779e926583bSJouni Malinen 
780e926583bSJouni Malinen 	sql = sqlite3_mprintf("UPDATE users SET polupd_done=0 WHERE %s=%Q",
781e926583bSJouni Malinen 			      (dmacc ? "osu_user" : "identity"),
782e926583bSJouni Malinen 			      username);
783e926583bSJouni Malinen 	if (!sql) {
784e926583bSJouni Malinen 		snprintf(resp, sizeof(resp),
785e926583bSJouni Malinen 			 "PolicyUpdateStatus,Internal error");
786e926583bSJouni Malinen 		goto done;
787e926583bSJouni Malinen 	}
788e926583bSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "SQL: %s", sql);
789e926583bSJouni Malinen 	if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) {
790e926583bSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
791e926583bSJouni Malinen 				"SQL operation to fetch user field failed: %s",
792e926583bSJouni Malinen 				sqlite3_errmsg(db));
793e926583bSJouni Malinen 		sqlite3_free(sql);
794e926583bSJouni Malinen 		goto done;
795e926583bSJouni Malinen 	}
796e926583bSJouni Malinen 	sqlite3_free(sql);
797e926583bSJouni Malinen 
798e926583bSJouni Malinen 	snprintf(resp, sizeof(resp), "PolicyUpdateStatus,TIMEOUT");
799e926583bSJouni Malinen 
800e926583bSJouni Malinen 	for (i = 0; i < timeout; i++) {
801e926583bSJouni Malinen 		sleep(1);
802e926583bSJouni Malinen 		free(policy);
803e926583bSJouni Malinen 		if (dmacc)
804e926583bSJouni Malinen 			policy = get_user_dmacc_field(dut, db, username,
805e926583bSJouni Malinen 						      "polupd_done");
806e926583bSJouni Malinen 		else
807e926583bSJouni Malinen 			policy = get_user_field(dut, db, username,
808e926583bSJouni Malinen 						"polupd_done");
809e926583bSJouni Malinen 		if (policy && atoi(policy)) {
810e926583bSJouni Malinen 			snprintf(resp, sizeof(resp),
811e926583bSJouni Malinen 				 "PolicyUpdateStatus,UpdateComplete");
812e926583bSJouni Malinen 			break;
813e926583bSJouni Malinen 		}
814e926583bSJouni Malinen 	}
815e926583bSJouni Malinen 
816e926583bSJouni Malinen done:
817e926583bSJouni Malinen 	free(policy);
818e926583bSJouni Malinen 	sqlite3_close(db);
819e926583bSJouni Malinen 
820e926583bSJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, resp);
821*fcaeee18SJouni Malinen 	return STATUS_SENT;
822e926583bSJouni Malinen }
823e926583bSJouni Malinen 
824e926583bSJouni Malinen 
825*fcaeee18SJouni Malinen static enum sigma_cmd_result
osu_sim_policy_provisioning_status(struct sigma_dut * dut,struct sigma_conn * conn,const char * imsi,int timeout)826*fcaeee18SJouni Malinen osu_sim_policy_provisioning_status(struct sigma_dut *dut,
8277116cd42SJouni Malinen 				   struct sigma_conn *conn,
8287116cd42SJouni Malinen 				   const char *imsi, int timeout)
8297116cd42SJouni Malinen {
8307116cd42SJouni Malinen 	sqlite3 *db;
8317116cd42SJouni Malinen 	int i;
8327116cd42SJouni Malinen 	char resp[500];
8337116cd42SJouni Malinen 	char *id = NULL;
8347116cd42SJouni Malinen 
8357116cd42SJouni Malinen 	if (sqlite3_open(SERVER_DB, &db)) {
8367116cd42SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
8377116cd42SJouni Malinen 				"Failed to open SQLite database %s",
8387116cd42SJouni Malinen 				SERVER_DB);
839*fcaeee18SJouni Malinen 		return INVALID_SEND_STATUS;
8407116cd42SJouni Malinen 	}
8417116cd42SJouni Malinen 
8427116cd42SJouni Malinen 	snprintf(resp, sizeof(resp), "PolicyProvisioning,TIMEOUT");
8437116cd42SJouni Malinen 
8447116cd42SJouni Malinen 	for (i = 0; i < timeout; i++) {
8457116cd42SJouni Malinen 		free(id);
8467116cd42SJouni Malinen 		id = get_user_field(dut, db, imsi, "identity");
8477116cd42SJouni Malinen 		if (id) {
8487116cd42SJouni Malinen 			snprintf(resp, sizeof(resp),
8497116cd42SJouni Malinen 				 "PolicyProvisioning,Provisioning Complete");
8507116cd42SJouni Malinen 			break;
8517116cd42SJouni Malinen 		}
8527116cd42SJouni Malinen 		sleep(1);
8537116cd42SJouni Malinen 	}
8547116cd42SJouni Malinen 
8557116cd42SJouni Malinen 	free(id);
8567116cd42SJouni Malinen 	sqlite3_close(db);
8577116cd42SJouni Malinen 
8587116cd42SJouni Malinen 	send_resp(dut, conn, SIGMA_COMPLETE, resp);
859*fcaeee18SJouni Malinen 	return STATUS_SENT;
8607116cd42SJouni Malinen }
8617116cd42SJouni Malinen 
8627116cd42SJouni Malinen 
cmd_server_request_status(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)863*fcaeee18SJouni Malinen static enum sigma_cmd_result cmd_server_request_status(struct sigma_dut *dut,
864cd4e3c3eSJouni Malinen 						       struct sigma_conn *conn,
865cd4e3c3eSJouni Malinen 						       struct sigma_cmd *cmd)
866cd4e3c3eSJouni Malinen {
867cd4e3c3eSJouni Malinen 	const char *var, *username, *serialno, *imsi, *addr, *status;
868cd4e3c3eSJouni Malinen 	int osu, timeout;
869cd4e3c3eSJouni Malinen 	char resp[500];
8700f1614baSJouni Malinen 	enum sigma_program prog;
871cd4e3c3eSJouni Malinen 
872cd4e3c3eSJouni Malinen 	var = get_param(cmd, "Program");
8730f1614baSJouni Malinen 	if (!var) {
8740f1614baSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
8750f1614baSJouni Malinen 			  "errorCode,Missing program parameter");
876*fcaeee18SJouni Malinen 		return STATUS_SENT;
8770f1614baSJouni Malinen 	}
8780f1614baSJouni Malinen 
8790f1614baSJouni Malinen 	prog = sigma_program_to_enum(var);
8800f1614baSJouni Malinen 	if (prog != PROGRAM_HS2_R2 && prog != PROGRAM_HS2_R3) {
881cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
882cd4e3c3eSJouni Malinen 			  "errorCode,Unsupported program");
883*fcaeee18SJouni Malinen 		return STATUS_SENT;
884cd4e3c3eSJouni Malinen 	}
885cd4e3c3eSJouni Malinen 
886cd4e3c3eSJouni Malinen 	var = get_param(cmd, "Device");
887cd4e3c3eSJouni Malinen 	if (!var ||
888cd4e3c3eSJouni Malinen 	    (strcasecmp(var, "AAAServer") != 0 &&
889cd4e3c3eSJouni Malinen 	     strcasecmp(var, "OSUServer") != 0)) {
890cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
891cd4e3c3eSJouni Malinen 			  "errorCode,Unsupported device type");
892*fcaeee18SJouni Malinen 		return STATUS_SENT;
893cd4e3c3eSJouni Malinen 	}
894cd4e3c3eSJouni Malinen 	osu = strcasecmp(var, "OSUServer") == 0;
895cd4e3c3eSJouni Malinen 
896cd4e3c3eSJouni Malinen 	var = get_param(cmd, "Timeout");
897cd4e3c3eSJouni Malinen 	if (!var) {
898cd4e3c3eSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
899cd4e3c3eSJouni Malinen 			  "errorCode,Missing timeout");
900*fcaeee18SJouni Malinen 		return STATUS_SENT;
901cd4e3c3eSJouni Malinen 	}
902cd4e3c3eSJouni Malinen 	timeout = atoi(var);
903cd4e3c3eSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "timeout: %d", timeout);
904cd4e3c3eSJouni Malinen 
905cd4e3c3eSJouni Malinen 	username = get_param(cmd, "UserName");
906cd4e3c3eSJouni Malinen 	if (username)
907cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG, "UserName: %s", username);
908cd4e3c3eSJouni Malinen 	serialno = get_param(cmd, "SerialNo");
909cd4e3c3eSJouni Malinen 	if (serialno)
910cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG, "SerialNo: %s", serialno);
911cd4e3c3eSJouni Malinen 	imsi = get_param(cmd, "imsi_val");
912cd4e3c3eSJouni Malinen 	if (imsi)
913cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG, "imsi_val: %s", imsi);
914cd4e3c3eSJouni Malinen 	addr = get_param(cmd, "ClientMACAddr");
915cd4e3c3eSJouni Malinen 	if (addr)
916cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG, "ClientMACAddr: %s", addr);
917cd4e3c3eSJouni Malinen 	status = get_param(cmd, "Status");
918cd4e3c3eSJouni Malinen 	if (status)
919cd4e3c3eSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG, "Status: %s", status);
920cd4e3c3eSJouni Malinen 
9214ea3acb2SJouni Malinen 	if (osu && status && strcasecmp(status, "Remediation") == 0)
9224ea3acb2SJouni Malinen 		return osu_remediation_status(dut, conn, timeout, username,
9234ea3acb2SJouni Malinen 					      serialno);
924cd4e3c3eSJouni Malinen 
925e926583bSJouni Malinen 	if (osu && status && strcasecmp(status, "PolicyUpdate") == 0)
926e926583bSJouni Malinen 		return osu_polupd_status(dut, conn, timeout, username,
927e926583bSJouni Malinen 					 serialno);
928e926583bSJouni Malinen 
9290f1614baSJouni Malinen 	if (!osu && status && strcasecmp(status, "Authentication") == 0 &&
9300f1614baSJouni Malinen 	    username)
9310f1614baSJouni Malinen 		return aaa_auth_status(dut, conn, cmd, username, timeout);
9320f1614baSJouni Malinen 
93389dfb22eSJouni Malinen 	if (!osu && status && strcasecmp(status, "Authentication") == 0 &&
93489dfb22eSJouni Malinen 	    serialno) {
93589dfb22eSJouni Malinen 		snprintf(resp, sizeof(resp), "cert-%s", serialno);
93689dfb22eSJouni Malinen 		return aaa_auth_status(dut, conn, cmd, resp, timeout);
93789dfb22eSJouni Malinen 	}
93889dfb22eSJouni Malinen 
93905630abeSJouni Malinen 	if (osu && status && strcasecmp(status, "OSU") == 0 && addr)
94005630abeSJouni Malinen 		return osu_cert_enroll_status(dut, conn, cmd, addr, timeout);
94105630abeSJouni Malinen 
9427116cd42SJouni Malinen 	if (osu && status && strcasecmp(status, "PolicyProvisioning") == 0 &&
9437116cd42SJouni Malinen 	    imsi)
9447116cd42SJouni Malinen 		return osu_sim_policy_provisioning_status(dut, conn, imsi,
9457116cd42SJouni Malinen 							  timeout);
9467116cd42SJouni Malinen 
947*fcaeee18SJouni Malinen 	return SUCCESS_SEND_STATUS;
948cd4e3c3eSJouni Malinen }
949cd4e3c3eSJouni Malinen 
950cd4e3c3eSJouni Malinen 
osu_set_cert_reenroll(struct sigma_dut * dut,const char * serial,int enable)951b8b7e7beSJouni Malinen static int osu_set_cert_reenroll(struct sigma_dut *dut, const char *serial,
952b8b7e7beSJouni Malinen 				 int enable)
953b8b7e7beSJouni Malinen {
954b8b7e7beSJouni Malinen 	sqlite3 *db;
955b8b7e7beSJouni Malinen 	char *sql;
956b8b7e7beSJouni Malinen 	char id[100];
957b8b7e7beSJouni Malinen 	int ret = -1;
958b8b7e7beSJouni Malinen 
959b8b7e7beSJouni Malinen 	if (sqlite3_open(SERVER_DB, &db)) {
960b8b7e7beSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR,
961b8b7e7beSJouni Malinen 				"Failed to open SQLite database %s",
962b8b7e7beSJouni Malinen 				SERVER_DB);
963b8b7e7beSJouni Malinen 		return -1;
964b8b7e7beSJouni Malinen 	}
965b8b7e7beSJouni Malinen 
966b8b7e7beSJouni Malinen 	snprintf(id, sizeof(id), "cert-%s", serial);
967b8b7e7beSJouni Malinen 	sql = sqlite3_mprintf("UPDATE users SET remediation=%Q WHERE lower(identity)=lower(%Q)",
968959372f8SJouni Malinen 			      enable ? "reenroll" : "", id);
969b8b7e7beSJouni Malinen 	if (!sql)
970b8b7e7beSJouni Malinen 		goto fail;
971b8b7e7beSJouni Malinen 	sigma_dut_print(dut, DUT_MSG_DEBUG, "SQL: %s", sql);
972b8b7e7beSJouni Malinen 	if (sqlite3_exec(db, sql, NULL, NULL, NULL) != SQLITE_OK) {
973b8b7e7beSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR, "SQL operation failed: %s",
974b8b7e7beSJouni Malinen 				sqlite3_errmsg(db));
975b8b7e7beSJouni Malinen 		goto fail;
976b8b7e7beSJouni Malinen 	}
977b8b7e7beSJouni Malinen 
978b8b7e7beSJouni Malinen 	if (sqlite3_changes(db) < 1) {
979b8b7e7beSJouni Malinen 		sigma_dut_print(dut, DUT_MSG_ERROR, "No DB rows modified (specified serial number not found)");
980b8b7e7beSJouni Malinen 		goto fail;
981b8b7e7beSJouni Malinen 	}
982b8b7e7beSJouni Malinen 
983b8b7e7beSJouni Malinen 	ret = 0;
984b8b7e7beSJouni Malinen fail:
985b8b7e7beSJouni Malinen 	sqlite3_close(db);
986b8b7e7beSJouni Malinen 
987b8b7e7beSJouni Malinen 	return ret;
988b8b7e7beSJouni Malinen }
989b8b7e7beSJouni Malinen 
990b8b7e7beSJouni Malinen 
cmd_server_set_parameter(struct sigma_dut * dut,struct sigma_conn * conn,struct sigma_cmd * cmd)991*fcaeee18SJouni Malinen static enum sigma_cmd_result cmd_server_set_parameter(struct sigma_dut *dut,
992ab8c718fSJouni Malinen 						      struct sigma_conn *conn,
993ab8c718fSJouni Malinen 						      struct sigma_cmd *cmd)
994ab8c718fSJouni Malinen {
99593b170b6SJouni Malinen 	const char *var, *root_ca, *inter_ca, *osu_cert, *issuing_arch, *name;
996b8b7e7beSJouni Malinen 	const char *reenroll, *serial;
997ab8c718fSJouni Malinen 	int osu, timeout = -1;
998ab8c718fSJouni Malinen 	enum sigma_program prog;
999ab8c718fSJouni Malinen 
1000ab8c718fSJouni Malinen 	var = get_param(cmd, "Program");
1001ab8c718fSJouni Malinen 	if (!var) {
1002ab8c718fSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1003ab8c718fSJouni Malinen 			  "errorCode,Missing program parameter");
1004*fcaeee18SJouni Malinen 		return STATUS_SENT;
1005ab8c718fSJouni Malinen 	}
1006ab8c718fSJouni Malinen 
1007ab8c718fSJouni Malinen 	prog = sigma_program_to_enum(var);
1008ab8c718fSJouni Malinen 	if (prog != PROGRAM_HS2_R2 && prog != PROGRAM_HS2_R3) {
1009ab8c718fSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1010ab8c718fSJouni Malinen 			  "errorCode,Unsupported program");
1011*fcaeee18SJouni Malinen 		return STATUS_SENT;
1012ab8c718fSJouni Malinen 	}
1013ab8c718fSJouni Malinen 
1014ab8c718fSJouni Malinen 	var = get_param(cmd, "Device");
1015ab8c718fSJouni Malinen 	if (!var ||
1016ab8c718fSJouni Malinen 	    (strcasecmp(var, "AAAServer") != 0 &&
1017ab8c718fSJouni Malinen 	     strcasecmp(var, "OSUServer") != 0)) {
1018ab8c718fSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1019ab8c718fSJouni Malinen 			  "errorCode,Unsupported device type");
1020*fcaeee18SJouni Malinen 		return STATUS_SENT;
1021ab8c718fSJouni Malinen 	}
1022ab8c718fSJouni Malinen 	osu = strcasecmp(var, "OSUServer") == 0;
1023ab8c718fSJouni Malinen 
1024ab8c718fSJouni Malinen 	var = get_param(cmd, "Timeout");
1025ab8c718fSJouni Malinen 	if (var)
1026ab8c718fSJouni Malinen 		timeout = atoi(var);
1027ab8c718fSJouni Malinen 
1028ab8c718fSJouni Malinen 	var = get_param(cmd, "ProvisioningProto");
1029ab8c718fSJouni Malinen 	if (var && strcasecmp(var, "SOAP") != 0) {
1030ab8c718fSJouni Malinen 		send_resp(dut, conn, SIGMA_ERROR,
1031ab8c718fSJouni Malinen 			  "errorCode,Unsupported ProvisioningProto");
1032*fcaeee18SJouni Malinen 		return STATUS_SENT;
1033ab8c718fSJouni Malinen 	}
1034ab8c718fSJouni Malinen 
1035b8b7e7beSJouni Malinen 	reenroll = get_param(cmd, "CertReEnroll");
1036b8b7e7beSJouni Malinen 	serial = get_param(cmd, "SerialNo");
1037b8b7e7beSJouni Malinen 	if (reenroll && serial) {
1038b8b7e7beSJouni Malinen 		int enable;
1039b8b7e7beSJouni Malinen 
1040b8b7e7beSJouni Malinen 		if (strcasecmp(reenroll, "Enable") == 0) {
1041b8b7e7beSJouni Malinen 			enable = 1;
1042b8b7e7beSJouni Malinen 		} else if (strcasecmp(reenroll, "Disable") == 0) {
1043b8b7e7beSJouni Malinen 			enable = 0;
1044b8b7e7beSJouni Malinen 		} else {
1045b8b7e7beSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1046b8b7e7beSJouni Malinen 				  "errorCode,Invalid CertReEnroll value");
1047*fcaeee18SJouni Malinen 			return STATUS_SENT;
1048b8b7e7beSJouni Malinen 		}
1049b8b7e7beSJouni Malinen 
1050b8b7e7beSJouni Malinen 		if (osu_set_cert_reenroll(dut, serial, enable) < 0) {
1051b8b7e7beSJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
1052b8b7e7beSJouni Malinen 				  "errorCode,Failed to update certificate reenrollment state");
1053*fcaeee18SJouni Malinen 			return STATUS_SENT;
1054b8b7e7beSJouni Malinen 		}
1055b8b7e7beSJouni Malinen 	}
1056b8b7e7beSJouni Malinen 
105793b170b6SJouni Malinen 	name = get_param(cmd, "Name");
105893b170b6SJouni Malinen 	root_ca = get_param(cmd, "TrustRootCACert");
105993b170b6SJouni Malinen 	inter_ca = get_param(cmd, "InterCACert");
106093b170b6SJouni Malinen 	osu_cert = get_param(cmd, "OSUServerCert");
106193b170b6SJouni Malinen 	issuing_arch = get_param(cmd, "Issuing_Arch");
106293b170b6SJouni Malinen 
1063ab8c718fSJouni Malinen 	if (timeout > -1) {
1064ab8c718fSJouni Malinen 		/* TODO */
1065ab8c718fSJouni Malinen 	}
1066ab8c718fSJouni Malinen 
106793b170b6SJouni Malinen 	if (osu && name && root_ca && inter_ca && osu_cert && issuing_arch) {
106893b170b6SJouni Malinen 		const char *srv;
106993b170b6SJouni Malinen 		char buf[500];
107093b170b6SJouni Malinen 		char buf2[500];
107193b170b6SJouni Malinen 		int col;
107293b170b6SJouni Malinen 
107393b170b6SJouni Malinen 		sigma_dut_print(dut, DUT_MSG_DEBUG,
107493b170b6SJouni Malinen 				"Update server certificate setup");
107593b170b6SJouni Malinen 
107693b170b6SJouni Malinen 		if (strcasecmp(name, "ruckus") == 0) {
107793b170b6SJouni Malinen 			srv = "RKS";
107893b170b6SJouni Malinen 		} else if (strcasecmp(name, "aruba") == 0) {
107993b170b6SJouni Malinen 			srv = "ARU";
108093b170b6SJouni Malinen 		} else {
108193b170b6SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
108293b170b6SJouni Malinen 				  "errorCode,Unsupported Name value");
1083*fcaeee18SJouni Malinen 			return STATUS_SENT;
108493b170b6SJouni Malinen 		}
108593b170b6SJouni Malinen 
108693b170b6SJouni Malinen 		if (strcasecmp(issuing_arch, "col2") == 0) {
108793b170b6SJouni Malinen 			col = 2;
108893b170b6SJouni Malinen 		} else if (strcasecmp(issuing_arch, "col4") == 0) {
108993b170b6SJouni Malinen 			col = 4;
109093b170b6SJouni Malinen 		} else {
109193b170b6SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
109293b170b6SJouni Malinen 				  "errorCode,Unsupported Issuing_Arch value");
1093*fcaeee18SJouni Malinen 			return STATUS_SENT;
109493b170b6SJouni Malinen 		}
109593b170b6SJouni Malinen 
109693b170b6SJouni Malinen 		if (strcasecmp(root_ca, "ID-T") == 0) {
109793b170b6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
109893b170b6SJouni Malinen 					"OSU trust root: NetworkFX");
109993b170b6SJouni Malinen 			if (system("cp " CERT_DIR "/IDT-cert-RootCA.pem "
110093b170b6SJouni Malinen 				   CERT_DIR "/cacert.pem") < 0)
1101*fcaeee18SJouni Malinen 				return ERROR_SEND_STATUS;
110293b170b6SJouni Malinen 		} else if (strcasecmp(root_ca, "ID-Y") == 0) {
110393b170b6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
110493b170b6SJouni Malinen 					"OSU trust root: NetworkFX");
110593b170b6SJouni Malinen 			if (system("cp " CERT_DIR "/IDY-cert-RootCA.pem "
110693b170b6SJouni Malinen 				   CERT_DIR "/cacert.pem") < 0)
1107*fcaeee18SJouni Malinen 				return ERROR_SEND_STATUS;
110893b170b6SJouni Malinen 		} else {
110993b170b6SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
111093b170b6SJouni Malinen 				  "errorCode,Unsupported TrustRootCACert value");
1111*fcaeee18SJouni Malinen 			return STATUS_SENT;
111293b170b6SJouni Malinen 		}
111393b170b6SJouni Malinen 
111493b170b6SJouni Malinen 		if (strcasecmp(inter_ca, "ID-Z.2") == 0) {
111593b170b6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
111693b170b6SJouni Malinen 					"OSU intermediate CA: NetworkFX (col2)");
111793b170b6SJouni Malinen 			if (system("cat " CERT_DIR "/IDZ2-cert-InterCA.pem >> "
111893b170b6SJouni Malinen 				   CERT_DIR "/cacert.pem") < 0)
1119*fcaeee18SJouni Malinen 				return ERROR_SEND_STATUS;
112093b170b6SJouni Malinen 		} else if (strcasecmp(inter_ca, "ID-Z.4") == 0) {
112193b170b6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
112293b170b6SJouni Malinen 					"OSU intermediate CA: DigiCert (col2)");
112393b170b6SJouni Malinen 			if (system("cat " CERT_DIR "/IDZ4-cert-InterCA.pem >> "
112493b170b6SJouni Malinen 				   CERT_DIR "/cacert.pem") < 0)
1125*fcaeee18SJouni Malinen 				return ERROR_SEND_STATUS;
112693b170b6SJouni Malinen 		} else if (strcasecmp(inter_ca, "ID-Z.6") == 0) {
112793b170b6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
112893b170b6SJouni Malinen 					"OSU intermediate CA: NetworkFX (col4)");
112993b170b6SJouni Malinen 			if (system("cat " CERT_DIR "/IDZ6-cert-InterCA.pem >> "
113093b170b6SJouni Malinen 				   CERT_DIR "/cacert.pem") < 0)
1131*fcaeee18SJouni Malinen 				return ERROR_SEND_STATUS;
113293b170b6SJouni Malinen 		} else if (strcasecmp(inter_ca, "ID-Z.8") == 0) {
113393b170b6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
113493b170b6SJouni Malinen 					"OSU intermediate CA: DigiCert (col4)");
113593b170b6SJouni Malinen 			if (system("cat " CERT_DIR "/IDZ8-cert-InterCA.pem >> "
113693b170b6SJouni Malinen 				   CERT_DIR "/cacert.pem") < 0)
1137*fcaeee18SJouni Malinen 				return ERROR_SEND_STATUS;
113893b170b6SJouni Malinen 		} else {
113993b170b6SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
114093b170b6SJouni Malinen 				  "errorCode,Unsupported InterCACert value");
1141*fcaeee18SJouni Malinen 			return STATUS_SENT;
114293b170b6SJouni Malinen 		}
114393b170b6SJouni Malinen 
114493b170b6SJouni Malinen 		if (strcasecmp(osu_cert, "ID-Q") == 0) {
114593b170b6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
114693b170b6SJouni Malinen 					"OSU server cert: NetworkFX col%d",
114793b170b6SJouni Malinen 					col);
114893b170b6SJouni Malinen 			snprintf(buf, sizeof(buf),
114993b170b6SJouni Malinen 				 "cp " CERT_DIR "/IDQ-cert-c%d-%s.pem "
115093b170b6SJouni Malinen 				 CERT_DIR "/server.pem",
115193b170b6SJouni Malinen 				 col, srv);
115293b170b6SJouni Malinen 			snprintf(buf2, sizeof(buf2),
115393b170b6SJouni Malinen 				 "cp " CERT_DIR "/IDQ-key-%s.pem "
115493b170b6SJouni Malinen 				 CERT_DIR "/server.key", srv);
115593b170b6SJouni Malinen 		} else if (strcasecmp(osu_cert, "ID-W") == 0) {
115693b170b6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
115793b170b6SJouni Malinen 					"OSU server cert: DigiCert col%d",
115893b170b6SJouni Malinen 					col);
115993b170b6SJouni Malinen 			snprintf(buf, sizeof(buf),
116093b170b6SJouni Malinen 				 "cp " CERT_DIR "/IDW-cert-c%d-%s.pem "
116193b170b6SJouni Malinen 				 CERT_DIR "/server.pem",
116293b170b6SJouni Malinen 				 col, srv);
116393b170b6SJouni Malinen 			snprintf(buf2, sizeof(buf2),
116493b170b6SJouni Malinen 				 "cp " CERT_DIR "/IDW-key-%s.pem "
116593b170b6SJouni Malinen 				 CERT_DIR "/server.key", srv);
116693b170b6SJouni Malinen 		} else if (strcasecmp(osu_cert, "ID-R.2") == 0) {
116793b170b6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
116893b170b6SJouni Malinen 					"OSU server cert: NetworkFX revoked col%d",
116993b170b6SJouni Malinen 					col);
117093b170b6SJouni Malinen 			snprintf(buf, sizeof(buf),
117193b170b6SJouni Malinen 				 "cp " CERT_DIR "/IDR2-cert-c%d-%s.pem "
117293b170b6SJouni Malinen 				 CERT_DIR "/server.pem",
117393b170b6SJouni Malinen 				 col, srv);
117493b170b6SJouni Malinen 			snprintf(buf2, sizeof(buf2),
117593b170b6SJouni Malinen 				 "cp " CERT_DIR "/IDR2-key-%s.pem "
117693b170b6SJouni Malinen 				 CERT_DIR "/server.key", srv);
117793b170b6SJouni Malinen 		} else if (strcasecmp(osu_cert, "ID-R.4") == 0) {
117893b170b6SJouni Malinen 			sigma_dut_print(dut, DUT_MSG_DEBUG,
117993b170b6SJouni Malinen 					"OSU server cert: DigiCert revoked col%d",
118093b170b6SJouni Malinen 					col);
118193b170b6SJouni Malinen 			snprintf(buf, sizeof(buf),
118293b170b6SJouni Malinen 				 "cp " CERT_DIR "/IDR4-cert-c%d-%s.pem "
118393b170b6SJouni Malinen 				 CERT_DIR "/server.pem",
118493b170b6SJouni Malinen 				 col, srv);
118593b170b6SJouni Malinen 			snprintf(buf2, sizeof(buf2),
118693b170b6SJouni Malinen 				 "cp " CERT_DIR "/IDR4-key-%s.pem "
118793b170b6SJouni Malinen 				 CERT_DIR "/server.key", srv);
118893b170b6SJouni Malinen 		} else {
118993b170b6SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
119093b170b6SJouni Malinen 				  "errorCode,Unsupported OSUServerCert value");
1191*fcaeee18SJouni Malinen 			return STATUS_SENT;
119293b170b6SJouni Malinen 		}
119393b170b6SJouni Malinen 
119493b170b6SJouni Malinen 		if (system(buf) < 0 || system(buf2) < 0)
1195*fcaeee18SJouni Malinen 			return ERROR_SEND_STATUS;
119693b170b6SJouni Malinen 
119793b170b6SJouni Malinen 		if (system("service apache2 reload") < 0) {
119893b170b6SJouni Malinen 			send_resp(dut, conn, SIGMA_ERROR,
119993b170b6SJouni Malinen 				  "errorCode,Failed to restart Apache");
1200*fcaeee18SJouni Malinen 			return STATUS_SENT;
120193b170b6SJouni Malinen 		}
1202ab8c718fSJouni Malinen 	}
1203ab8c718fSJouni Malinen 
1204ab8c718fSJouni Malinen 	/* TODO */
1205*fcaeee18SJouni Malinen 	return SUCCESS_SEND_STATUS;
1206ab8c718fSJouni Malinen }
1207ab8c718fSJouni Malinen 
1208ab8c718fSJouni Malinen 
server_register_cmds(void)1209cd4e3c3eSJouni Malinen void server_register_cmds(void)
1210cd4e3c3eSJouni Malinen {
121172ac93ccSJouni Malinen 	sigma_dut_reg_cmd("server_ca_get_version", NULL,
121272ac93ccSJouni Malinen 			  cmd_server_ca_get_version);
121372ac93ccSJouni Malinen 	sigma_dut_reg_cmd("server_get_info", NULL,
121472ac93ccSJouni Malinen 			  cmd_server_get_info);
1215cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("server_reset_default", NULL,
1216cd4e3c3eSJouni Malinen 			  cmd_server_reset_default);
1217cd4e3c3eSJouni Malinen 	sigma_dut_reg_cmd("server_request_status", NULL,
1218cd4e3c3eSJouni Malinen 			  cmd_server_request_status);
1219ab8c718fSJouni Malinen 	sigma_dut_reg_cmd("server_set_parameter", NULL,
1220ab8c718fSJouni Malinen 			  cmd_server_set_parameter);
1221cd4e3c3eSJouni Malinen }
1222