From e65037591756940f634b7c0691ea9c5525c7d21b Mon Sep 17 00:00:00 2001 From: mom040267 Date: Sun, 18 Jan 2015 08:31:57 +0000 Subject: [PATCH] users admin --- examples/var/db/turndb | Bin 22528 -> 22528 bytes src/apps/relay/turn_admin_server.c | 271 +++++++++++++++++++++++++++++ src/apps/relay/userdb.c | 18 +- 3 files changed, 280 insertions(+), 9 deletions(-) diff --git a/examples/var/db/turndb b/examples/var/db/turndb index a2b26f8de08ceb079f7883b8e80974c99cebbc92..9884d3f4822d13a406f0342b5d4cbf8824019922 100644 GIT binary patch delta 61 zcmZqJz}T>Xae_3X<3t%}M#qf_8!o+UG00KG_8#N}2vj1jc?%LQ`%FHeV M7UkL8$6e$D06Lry>;M1& delta 37 tcmZqJz}T>Xae_3X^+XwGM(d3U8<;mXvNBH=W&gdIk*AG$^EB=(9{}x`3~>Me diff --git a/src/apps/relay/turn_admin_server.c b/src/apps/relay/turn_admin_server.c index b77208e..d66d00c 100644 --- a/src/apps/relay/turn_admin_server.c +++ b/src/apps/relay/turn_admin_server.c @@ -1359,6 +1359,7 @@ enum _AS_FORM { AS_FORM_TOGGLE, AS_FORM_UPDATE, AS_FORM_PS, + AS_FORM_USERS, AS_FORM_UNKNOWN }; @@ -1366,11 +1367,16 @@ typedef enum _AS_FORM AS_FORM; #define HR_USERNAME "uname" #define HR_PASSWORD "pwd" +#define HR_PASSWORD1 "pwd1" #define HR_REALM "realm" +#define HR_ADD_USER "add_user" +#define HR_ADD_USER_REALM "add_user_realm" #define HR_CLIENT_PROTOCOL "cprotocol" #define HR_USER_PATTERN "puser" #define HR_MAX_SESSIONS "maxsess" #define HR_CANCEL_SESSION "cs" +#define HR_DELETE_USER "du" +#define HR_DELETE_REALM "dr" struct form_name { AS_FORM form; @@ -1385,6 +1391,7 @@ static struct form_name form_names[] = { {AS_FORM_TOGGLE,"/toggle"}, {AS_FORM_UPDATE,"/update"}, {AS_FORM_PS,"/ps"}, + {AS_FORM_USERS,"/us"}, {AS_FORM_UNKNOWN,NULL} }; @@ -1510,6 +1517,10 @@ static void write_https_home_page(ioa_socket_handle s) str_buffer_append_sz(sb,cli_max_output_sessions); str_buffer_append(sb,"\">"); + str_buffer_append(sb,"
"); + str_buffer_append(sb,"\r\n"); str_buffer_append(sb,"\r\n"); @@ -2200,6 +2211,171 @@ static void write_ps_page(ioa_socket_handle s, const char* client_protocol, cons } } +static size_t https_print_users(struct str_buffer* sb) +{ + size_t ret = 0; + const turn_dbdriver_t * dbd = get_dbdriver(); + if (dbd && dbd->list_users) { + secrets_list_t users,realms; + init_secrets_list(&users); + init_secrets_list(&realms); + dbd->list_users((u08bits*)current_socket->as_eff_realm,&users,&realms); + + size_t sz = get_secrets_list_size(&users); + size_t i; + for(i=0;i"); + str_buffer_append_sz(sb,i); + str_buffer_append(sb,""); + str_buffer_append(sb,""); + str_buffer_append(sb,get_secrets_list_elem(&users,i)); + str_buffer_append(sb,""); + if(!current_socket->as_eff_realm[0]) { + str_buffer_append(sb,""); + str_buffer_append(sb,get_secrets_list_elem(&realms,i)); + str_buffer_append(sb,""); + } + str_buffer_append(sb," delete"); + str_buffer_append(sb,""); + str_buffer_append(sb,""); + ++ret; + } + + clean_secrets_list(&users); + clean_secrets_list(&realms); + } + + return ret; +} + +static void write_users_page(ioa_socket_handle s, const u08bits *add_user, const u08bits *add_realm, const char* msg) +{ + if(s && !ioa_socket_tobeclosed(s)) { + + if(!(s->as_ok)) { + write_https_logon_page(s); + } else { + + struct str_buffer* sb = str_buffer_new(); + + str_buffer_append(sb,"\r\n\r\n \r\n "); + str_buffer_append(sb,admin_title); + str_buffer_append(sb,"\r\n \r\n \r\n "); + str_buffer_append(sb,bold_admin_title); + str_buffer_append(sb,"
\r\n"); + str_buffer_append(sb,home_link); + str_buffer_append(sb,"
\r\n"); + + str_buffer_append(sb,"
\r\n"); + str_buffer_append(sb,"
Filter:\r\n"); + + str_buffer_append(sb,"
Realm name: "); + + str_buffer_append(sb,"
"); + + str_buffer_append(sb,"
\r\n"); + str_buffer_append(sb,"
\r\n"); + + str_buffer_append(sb,"
\r\n"); + str_buffer_append(sb,"
User:\r\n"); + + if(msg && msg[0]) { + str_buffer_append(sb,"
"); + str_buffer_append(sb,msg); + str_buffer_append(sb,"

"); + } + + str_buffer_append(sb,"
Realm name:
\r\n"); + + str_buffer_append(sb,"
User name:
\r\n"); + + str_buffer_append(sb,"
Password:
\r\n"); + + str_buffer_append(sb,"
Confirm password:
\r\n"); + + str_buffer_append(sb,"
"); + + str_buffer_append(sb,"
\r\n"); + str_buffer_append(sb,"
\r\n"); + + str_buffer_append(sb,"Users:
\r\n"); + str_buffer_append(sb,"\r\n"); + str_buffer_append(sb,""); + if(!current_socket->as_eff_realm[0]) { + str_buffer_append(sb,""); + } + str_buffer_append(sb,""); + str_buffer_append(sb,"\r\n"); + + size_t total_sz = https_print_users(sb); + + str_buffer_append(sb,"\r\n
NNameRealm
\r\n"); + + str_buffer_append(sb,"
Total users = "); + str_buffer_append_sz(sb,total_sz); + str_buffer_append(sb,"
\r\n"); + + str_buffer_append(sb,"\r\n\r\n"); + + send_str_from_ioa_socket_tcp(s,"HTTP/1.1 200 OK\r\nServer: "); + send_str_from_ioa_socket_tcp(s,TURN_SOFTWARE); + send_str_from_ioa_socket_tcp(s,"\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Length: "); + + send_ulong_from_ioa_socket_tcp(s,str_buffer_get_str_len(sb)); + + send_str_from_ioa_socket_tcp(s,"\r\n\r\n"); + send_str_from_ioa_socket_tcp(s,str_buffer_get_str(sb)); + + str_buffer_free(sb); + } + } +} + static void handle_toggle_request(ioa_socket_handle s, struct http_request* hr) { if(s && hr) { @@ -2330,6 +2506,101 @@ static void handle_https(ioa_socket_handle s, ioa_network_buffer_handle nbh) } break; } + case AS_FORM_USERS: { + if(s->as_ok) { + { + const char *realm0 = get_http_header_value(hr, HR_REALM); + if(!realm0) + realm0=""; + if(!is_superuser()) + realm0 = current_socket->as_realm; + STRCPY(current_socket->as_eff_realm,realm0); + } + + { + const u08bits *user = (const u08bits*)get_http_header_value(hr, HR_DELETE_USER); + if(user && user[0]) { + const u08bits *realm = (const u08bits*)get_http_header_value(hr, HR_DELETE_REALM); + if(!is_superuser()) { + realm = (const u08bits*)current_socket->as_realm; + } + if(realm && realm[0]) { + const turn_dbdriver_t * dbd = get_dbdriver(); + if (dbd && dbd->del_user) { + u08bits u[STUN_MAX_USERNAME_SIZE+1]; + u08bits r[STUN_MAX_REALM_SIZE+1]; + STRCPY(u,user); + STRCPY(r,realm); + dbd->del_user(u,r); + } + } + } + } + + const u08bits *add_realm = (const u08bits*)current_socket->as_eff_realm; + const u08bits *add_user = (const u08bits*)get_http_header_value(hr, HR_ADD_USER); + const char* msg = ""; + if(!add_user) add_user = (const u08bits*)""; + if(add_user[0]) { + add_realm = (const u08bits*)get_http_header_value(hr, HR_ADD_USER_REALM); + if(!add_realm) { + add_realm=(const u08bits*)""; + } + if(!is_superuser()) { + add_realm = (const u08bits*)current_socket->as_realm; + } + if(!add_realm[0]) { + add_realm=(const u08bits*)current_socket->as_eff_realm; + } + if(add_realm[0]) { + const u08bits *pwd = (const u08bits*)get_http_header_value(hr, HR_PASSWORD); + const u08bits *pwd1 = (const u08bits*)get_http_header_value(hr, HR_PASSWORD1); + if(pwd && pwd1 && pwd[0] && pwd1[0] && !strcmp((const char*)pwd,(const char*)pwd1)) { + + const turn_dbdriver_t * dbd = get_dbdriver(); + if (dbd && dbd->set_user_key) { + + hmackey_t key; + char skey[sizeof(hmackey_t) * 2 + 1]; + + { + u08bits u[STUN_MAX_USERNAME_SIZE+1]; + u08bits r[STUN_MAX_REALM_SIZE+1]; + u08bits p[STUN_MAX_PWD_SIZE+1]; + STRCPY(u,add_user); + STRCPY(r,add_realm); + STRCPY(p,pwd); + stun_produce_integrity_key_str(u, r, p, key, SHATYPE_DEFAULT); + size_t i = 0; + size_t sz = get_hmackey_size(SHATYPE_DEFAULT); + int maxsz = (int) (sz * 2) + 1; + char *s = skey; + for (i = 0; (i < sz) && (maxsz > 2); i++) { + snprintf(s, (size_t) (sz * 2), "%02x", (unsigned int) key[i]); + maxsz -= 2; + s += 2; + } + skey[sz * 2] = 0; + + (*dbd->set_user_key)(u, r, skey); + } + + add_realm=(const u08bits*)""; + add_user=(const u08bits*)""; + } + } else { + msg = "Error: wrong password"; + } + } + } + + write_users_page(s,add_user,add_realm,msg); + + } else { + write_https_logon_page(s); + } + break; + } case AS_FORM_TOGGLE: if(s->as_ok) { handle_toggle_request(s,hr); diff --git a/src/apps/relay/userdb.c b/src/apps/relay/userdb.c index b53172b..3796de9 100644 --- a/src/apps/relay/userdb.c +++ b/src/apps/relay/userdb.c @@ -790,21 +790,21 @@ static int show_secret(u08bits *realm) const turn_dbdriver_t * dbd = get_dbdriver(); if (dbd && dbd->show_secret) { (*dbd->show_secret)(realm); - } + } - return 0; + return 0; } static int del_secret(u08bits *secret, u08bits *realm) { must_set_admin_realm(realm); - const turn_dbdriver_t * dbd = get_dbdriver(); - if (dbd && dbd->del_secret) { - (*dbd->del_secret)(secret, realm); + const turn_dbdriver_t * dbd = get_dbdriver(); + if (dbd && dbd->del_secret) { + (*dbd->del_secret)(secret, realm); } - return 0; + return 0; } static int set_secret(u08bits *secret, u08bits *realm) { @@ -816,9 +816,9 @@ static int set_secret(u08bits *secret, u08bits *realm) { del_secret(secret, realm); - const turn_dbdriver_t * dbd = get_dbdriver(); - if (dbd && dbd->set_secret) { - (*dbd->set_secret)(secret, realm); + const turn_dbdriver_t * dbd = get_dbdriver(); + if (dbd && dbd->set_secret) { + (*dbd->set_secret)(secret, realm); } return 0;