int main() { printf("Testing subscriber database code.\n"); osmo_init_logging(&log_info); if (db_init("hlr.sqlite3")) { printf("DB: Failed to init database. Please check the option settings.\n"); return 1; } printf("DB: Database initialized.\n"); if (db_prepare()) { printf("DB: Failed to prepare database.\n"); return 1; } printf("DB: Database prepared.\n"); struct gsm_subscriber *alice = NULL; struct gsm_subscriber *alice_db; char *alice_imsi = "3243245432345"; alice = db_create_subscriber(NULL, alice_imsi); db_sync_subscriber(alice); alice_db = db_get_subscriber(NULL, GSM_SUBSCRIBER_IMSI, alice->imsi); COMPARE(alice, alice_db); SUBSCR_PUT(alice_db); SUBSCR_PUT(alice); alice_imsi = "3693245423445"; alice = db_create_subscriber(NULL, alice_imsi); db_subscriber_assoc_imei(alice, "1234567890"); db_subscriber_alloc_tmsi(alice); alice->lac=42; db_sync_subscriber(alice); alice_db = db_get_subscriber(NULL, GSM_SUBSCRIBER_IMSI, alice_imsi); COMPARE(alice, alice_db); SUBSCR_PUT(alice); SUBSCR_PUT(alice_db); alice_imsi = "9993245423445"; alice = db_create_subscriber(NULL, alice_imsi); db_subscriber_alloc_tmsi(alice); alice->lac=42; db_sync_subscriber(alice); db_subscriber_assoc_imei(alice, "1234567890"); db_subscriber_assoc_imei(alice, "6543560920"); alice_db = db_get_subscriber(NULL, GSM_SUBSCRIBER_IMSI, alice_imsi); COMPARE(alice, alice_db); SUBSCR_PUT(alice); SUBSCR_PUT(alice_db); db_fini(); printf("Done\n"); return 0; }
int main() { printf("Testing subscriber database code.\n"); osmo_init_logging(&log_info); log_set_print_filename(osmo_stderr_target, 0); dummy_net.subscr_group = &dummy_sgrp; dummy_sgrp.net = &dummy_net; if (db_init("hlr.sqlite3")) { printf("DB: Failed to init database. Please check the option settings.\n"); return 1; } printf("DB: Database initialized.\n"); if (db_prepare()) { printf("DB: Failed to prepare database.\n"); return 1; } printf("DB: Database prepared.\n"); struct gsm_subscriber *alice = NULL; struct gsm_subscriber *alice_db; char *alice_imsi = "3243245432345"; alice = db_create_subscriber(alice_imsi, GSM_MIN_EXTEN, GSM_MAX_EXTEN, true); db_sync_subscriber(alice); alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice->imsi); COMPARE(alice, alice_db); SUBSCR_PUT(alice_db); SUBSCR_PUT(alice); test_subs("3693245423445", "1234567890", NULL, true); test_subs("9993245423445", "1234567890", "6543560920", true); test_subs("3123122223445", "1234567890", NULL, false); test_subs("9123121223445", "1234567890", "6543560920", false); /* create it again and see it fails */ alice = db_create_subscriber(alice_imsi, GSM_MIN_EXTEN, GSM_MAX_EXTEN, true); OSMO_ASSERT(!alice); test_sms(); test_sms_migrate(); db_fini(); printf("Done\n"); return 0; }
static void test_subs(const char *imsi, char *imei1, char *imei2, bool make_ext) { struct gsm_subscriber *alice = NULL, *alice_db; char scratch_str[256]; alice = db_create_subscriber(imsi, GSM_MIN_EXTEN, GSM_MAX_EXTEN, make_ext); db_subscriber_assoc_imei(alice, imei1); if (imei2) db_subscriber_assoc_imei(alice, imei2); db_subscriber_alloc_tmsi(alice); alice->lac=42; db_sync_subscriber(alice); /* Get by TMSI */ snprintf(scratch_str, sizeof(scratch_str), "%"PRIu32, alice->tmsi); alice_db = db_get_subscriber(GSM_SUBSCRIBER_TMSI, scratch_str); COMPARE(alice, alice_db); SUBSCR_PUT(alice_db); /* Get by IMSI */ alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, imsi); COMPARE(alice, alice_db); SUBSCR_PUT(alice_db); /* Get by id */ snprintf(scratch_str, sizeof(scratch_str), "%llu", alice->id); alice_db = db_get_subscriber(GSM_SUBSCRIBER_ID, scratch_str); COMPARE(alice, alice_db); SUBSCR_PUT(alice_db); /* Get by extension */ alice_db = db_get_subscriber(GSM_SUBSCRIBER_EXTENSION, alice->extension); if (alice_db) { if (!make_ext) printf("FAIL: bogus extension created for IMSI %s\n", imsi); COMPARE(alice, alice_db); SUBSCR_PUT(alice_db); } else if (make_ext) printf("FAIL: no subscriber extension for IMSI %s\n", imsi); SUBSCR_PUT(alice); }
static int set_subscriber_modify(struct ctrl_cmd *cmd, void *data) { struct gsm_network *net = cmd->node; char *tmp, *imsi, *msisdn, *alg, *ki, *saveptr = NULL; struct gsm_subscriber* subscr; int rc; tmp = talloc_strdup(cmd, cmd->value); if (!tmp) return 1; imsi = strtok_r(tmp, ",", &saveptr); msisdn = strtok_r(NULL, ",", &saveptr); alg = strtok_r(NULL, ",", &saveptr); ki = strtok_r(NULL, ",", &saveptr); subscr = subscr_get_by_imsi(net->subscr_group, imsi); if (!subscr) subscr = subscr_create_subscriber(net->subscr_group, imsi); if (!subscr) goto fail; subscr->authorized = 1; strncpy(subscr->extension, msisdn, GSM_EXTENSION_LENGTH - 1); subscr->extension[GSM_EXTENSION_LENGTH-1] = '\0'; /* put it back to the db */ rc = db_sync_subscriber(subscr); db_subscriber_update(subscr); /* handle optional ciphering */ if (alg) { if (strcasecmp(alg, "none") == 0) db_sync_authinfo_for_subscr(NULL, subscr); else { struct gsm_auth_info ainfo = { 0, }; /* the verify should make sure that this is okay */ OSMO_ASSERT(alg); OSMO_ASSERT(ki); if (strcasecmp(alg, "xor") == 0) ainfo.auth_algo = AUTH_ALGO_XOR; else if (strcasecmp(alg, "comp128v1") == 0) ainfo.auth_algo = AUTH_ALGO_COMP128v1; rc = osmo_hexparse(ki, ainfo.a3a8_ki, sizeof(ainfo.a3a8_ki)); if (rc < 0) { subscr_put(subscr); talloc_free(tmp); cmd->reply = "Failed to parse KI"; return CTRL_CMD_ERROR; } ainfo.a3a8_ki_len = rc; db_sync_authinfo_for_subscr(&ainfo, subscr); rc = 0; } db_sync_lastauthtuple_for_subscr(NULL, subscr); } subscr_put(subscr); talloc_free(tmp); if (rc != 0) { cmd->reply = "Failed to store the record in the DB"; return CTRL_CMD_ERROR; } cmd->reply = "OK"; return CTRL_CMD_REPLY; fail: talloc_free(tmp); cmd->reply = "Failed to create subscriber"; return CTRL_CMD_ERROR; }