| Jouni Malinen | cd4e3c3 | 2015-10-29 12:39:56 +0200 | [diff] [blame] | 1 | /* |
| 2 | * Sigma Control API DUT (server) |
| 3 | * Copyright (c) 2014, Qualcomm Atheros, Inc. |
| Jouni Malinen | 72ac93c | 2018-09-04 13:12:59 +0300 | [diff] [blame] | 4 | * Copyright (c) 2018, The Linux Foundation |
| Jouni Malinen | cd4e3c3 | 2015-10-29 12:39:56 +0200 | [diff] [blame] | 5 | * All Rights Reserved. |
| 6 | * Licensed under the Clear BSD license. See README for more details. |
| 7 | */ |
| 8 | |
| 9 | #include "sigma_dut.h" |
| Jouni Malinen | 3b17d53 | 2018-09-04 19:10:58 +0300 | [diff] [blame] | 10 | #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 Malinen | cd4e3c3 | 2015-10-29 12:39:56 +0200 | [diff] [blame] | 15 | |
| 16 | |
| Jouni Malinen | 72ac93c | 2018-09-04 13:12:59 +0300 | [diff] [blame] | 17 | static 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 | |
| 26 | static 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 Malinen | 3b17d53 | 2018-09-04 19:10:58 +0300 | [diff] [blame] | 35 | static 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 | |
| 129 | fail: |
| 130 | sqlite3_close(db); |
| 131 | |
| 132 | return res; |
| 133 | } |
| 134 | |
| 135 | |
| Jouni Malinen | cd4e3c3 | 2015-10-29 12:39:56 +0200 | [diff] [blame] | 136 | static 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 Malinen | 94d7b12 | 2018-09-04 13:16:41 +0300 | [diff] [blame] | 141 | enum sigma_program prog; |
| Jouni Malinen | cd4e3c3 | 2015-10-29 12:39:56 +0200 | [diff] [blame] | 142 | |
| 143 | var = get_param(cmd, "Program"); |
| Jouni Malinen | 94d7b12 | 2018-09-04 13:16:41 +0300 | [diff] [blame] | 144 | 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 Malinen | cd4e3c3 | 2015-10-29 12:39:56 +0200 | [diff] [blame] | 152 | send_resp(dut, conn, SIGMA_ERROR, |
| 153 | "errorCode,Unsupported program"); |
| 154 | return 0; |
| 155 | } |
| 156 | |
| 157 | var = get_param(cmd, "UserName"); |
| Jouni Malinen | 3b17d53 | 2018-09-04 19:10:58 +0300 | [diff] [blame] | 158 | 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 Malinen | cd4e3c3 | 2015-10-29 12:39:56 +0200 | [diff] [blame] | 162 | } |
| 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 | |
| 175 | static 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 | |
| 238 | void server_register_cmds(void) |
| 239 | { |
| Jouni Malinen | 72ac93c | 2018-09-04 13:12:59 +0300 | [diff] [blame] | 240 | 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 Malinen | cd4e3c3 | 2015-10-29 12:39:56 +0200 | [diff] [blame] | 244 | 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 | } |