| ");
+ 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,"\r\n");
+
+ str_buffer_append(sb,"Users:
\r\n");
+ str_buffer_append(sb,"\r\n");
+ str_buffer_append(sb,"| N | Name | ");
+ if(!current_socket->as_eff_realm[0]) {
+ str_buffer_append(sb,"Realm | ");
+ }
+ str_buffer_append(sb," | ");
+ str_buffer_append(sb,"
\r\n");
+
+ size_t total_sz = https_print_users(sb);
+
+ str_buffer_append(sb,"\r\n
\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;