|
|
|
|
@ -1361,6 +1361,7 @@ enum _AS_FORM { |
|
|
|
|
AS_FORM_UPDATE, |
|
|
|
|
AS_FORM_PS, |
|
|
|
|
AS_FORM_USERS, |
|
|
|
|
AS_FORM_SS, |
|
|
|
|
AS_FORM_UNKNOWN |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
@ -1371,13 +1372,15 @@ typedef enum _AS_FORM AS_FORM; |
|
|
|
|
#define HR_PASSWORD1 "pwd1" |
|
|
|
|
#define HR_REALM "realm" |
|
|
|
|
#define HR_ADD_USER "add_user" |
|
|
|
|
#define HR_ADD_USER_REALM "add_user_realm" |
|
|
|
|
#define HR_ADD_REALM "add_user_realm" |
|
|
|
|
#define HR_ADD_SECRET "add_secret" |
|
|
|
|
#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" |
|
|
|
|
#define HR_DELETE_SECRET "ds" |
|
|
|
|
|
|
|
|
|
struct form_name { |
|
|
|
|
AS_FORM form; |
|
|
|
|
@ -1393,6 +1396,7 @@ static struct form_name form_names[] = { |
|
|
|
|
{AS_FORM_UPDATE,"/update"}, |
|
|
|
|
{AS_FORM_PS,"/ps"}, |
|
|
|
|
{AS_FORM_USERS,"/us"}, |
|
|
|
|
{AS_FORM_SS,"/ss"}, |
|
|
|
|
{AS_FORM_UNKNOWN,NULL} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
@ -1531,6 +1535,10 @@ static void write_https_home_page(ioa_socket_handle s) |
|
|
|
|
str_buffer_append(sb,form_names[AS_FORM_USERS].name); |
|
|
|
|
str_buffer_append(sb,"\">"); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb,"<br><input type=\"submit\" value=\"Shared Secrets (for TURN REST API)\" formaction=\""); |
|
|
|
|
str_buffer_append(sb,form_names[AS_FORM_SS].name); |
|
|
|
|
str_buffer_append(sb,"\">"); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb,"</fieldset>\r\n"); |
|
|
|
|
str_buffer_append(sb,"</form>\r\n"); |
|
|
|
|
|
|
|
|
|
@ -2325,7 +2333,7 @@ static void write_users_page(ioa_socket_handle s, const u08bits *add_user, const |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb," <br>Realm name: <input type=\"text\" name=\""); |
|
|
|
|
str_buffer_append(sb,HR_ADD_USER_REALM); |
|
|
|
|
str_buffer_append(sb,HR_ADD_REALM); |
|
|
|
|
str_buffer_append(sb,"\" value=\""); |
|
|
|
|
str_buffer_append(sb,(const char*)add_realm); |
|
|
|
|
str_buffer_append(sb,"\""); |
|
|
|
|
@ -2393,6 +2401,157 @@ static void write_users_page(ioa_socket_handle s, const u08bits *add_user, const |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static size_t https_print_secrets(struct str_buffer* sb) |
|
|
|
|
{ |
|
|
|
|
size_t ret = 0; |
|
|
|
|
const turn_dbdriver_t * dbd = get_dbdriver(); |
|
|
|
|
if (dbd && dbd->list_secrets) { |
|
|
|
|
secrets_list_t secrets,realms; |
|
|
|
|
init_secrets_list(&secrets); |
|
|
|
|
init_secrets_list(&realms); |
|
|
|
|
dbd->list_secrets((u08bits*)current_socket->as_eff_realm,&secrets,&realms); |
|
|
|
|
|
|
|
|
|
size_t sz = get_secrets_list_size(&secrets); |
|
|
|
|
size_t i; |
|
|
|
|
for(i=0;i<sz;++i) { |
|
|
|
|
str_buffer_append(sb,"<tr><td>"); |
|
|
|
|
str_buffer_append_sz(sb,i); |
|
|
|
|
str_buffer_append(sb,"</td>"); |
|
|
|
|
str_buffer_append(sb,"<td>"); |
|
|
|
|
str_buffer_append(sb,get_secrets_list_elem(&secrets,i)); |
|
|
|
|
str_buffer_append(sb,"</td>"); |
|
|
|
|
if(!current_socket->as_eff_realm[0]) { |
|
|
|
|
str_buffer_append(sb,"<td>"); |
|
|
|
|
str_buffer_append(sb,get_secrets_list_elem(&realms,i)); |
|
|
|
|
str_buffer_append(sb,"</td>"); |
|
|
|
|
} |
|
|
|
|
str_buffer_append(sb,"<td> <a href=\""); |
|
|
|
|
str_buffer_append(sb,form_names[AS_FORM_SS].name); |
|
|
|
|
str_buffer_append(sb,"?"); |
|
|
|
|
str_buffer_append(sb,HR_DELETE_SECRET); |
|
|
|
|
str_buffer_append(sb,"="); |
|
|
|
|
str_buffer_append(sb,get_secrets_list_elem(&secrets,i)); |
|
|
|
|
str_buffer_append(sb,"&"); |
|
|
|
|
str_buffer_append(sb,HR_DELETE_REALM); |
|
|
|
|
str_buffer_append(sb,"="); |
|
|
|
|
str_buffer_append(sb,get_secrets_list_elem(&realms,i)); |
|
|
|
|
str_buffer_append(sb,"\">delete</a>"); |
|
|
|
|
str_buffer_append(sb,"</td>"); |
|
|
|
|
str_buffer_append(sb,"</tr>"); |
|
|
|
|
++ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
clean_secrets_list(&secrets); |
|
|
|
|
clean_secrets_list(&realms); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void write_shared_secrets_page(ioa_socket_handle s, const char* add_secret, const char* 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,"<!DOCTYPE html>\r\n<html>\r\n <head>\r\n <title>"); |
|
|
|
|
str_buffer_append(sb,admin_title); |
|
|
|
|
str_buffer_append(sb,"</title>\r\n <style> table, th, td { border: 1px solid black; } table#msg th { color: red; background-color: white; } </style> </head>\r\n <body>\r\n "); |
|
|
|
|
str_buffer_append(sb,bold_admin_title); |
|
|
|
|
str_buffer_append(sb,"<br>\r\n"); |
|
|
|
|
str_buffer_append(sb,home_link); |
|
|
|
|
str_buffer_append(sb,"<br>\r\n"); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb,"<form action=\""); |
|
|
|
|
str_buffer_append(sb,form_names[AS_FORM_SS].name); |
|
|
|
|
str_buffer_append(sb,"\" method=\"POST\">\r\n"); |
|
|
|
|
str_buffer_append(sb," <fieldset><legend>Filter:</legend>\r\n"); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb," <br>Realm name: <input type=\"text\" name=\""); |
|
|
|
|
str_buffer_append(sb,HR_REALM); |
|
|
|
|
str_buffer_append(sb,"\" value=\""); |
|
|
|
|
str_buffer_append(sb,get_eff_realm()); |
|
|
|
|
str_buffer_append(sb,"\""); |
|
|
|
|
if(!is_superuser()) { |
|
|
|
|
str_buffer_append(sb," disabled "); |
|
|
|
|
} |
|
|
|
|
str_buffer_append(sb,">"); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb,"<br><input type=\"submit\" value=\"Filter\">"); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb,"</fieldset>\r\n"); |
|
|
|
|
str_buffer_append(sb,"</form>\r\n"); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb,"<form action=\""); |
|
|
|
|
str_buffer_append(sb,form_names[AS_FORM_SS].name); |
|
|
|
|
str_buffer_append(sb,"\" method=\"POST\">\r\n"); |
|
|
|
|
str_buffer_append(sb," <fieldset><legend>Secret:</legend>\r\n"); |
|
|
|
|
|
|
|
|
|
if(msg && msg[0]) { |
|
|
|
|
str_buffer_append(sb,"<br><table id=\"msg\"><th>"); |
|
|
|
|
str_buffer_append(sb,msg); |
|
|
|
|
str_buffer_append(sb,"</th></table><br>"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb," <br>Realm name: <input type=\"text\" name=\""); |
|
|
|
|
str_buffer_append(sb,HR_ADD_REALM); |
|
|
|
|
str_buffer_append(sb,"\" value=\""); |
|
|
|
|
str_buffer_append(sb,(const char*)add_realm); |
|
|
|
|
str_buffer_append(sb,"\""); |
|
|
|
|
if(!is_superuser()) { |
|
|
|
|
str_buffer_append(sb," disabled "); |
|
|
|
|
} |
|
|
|
|
str_buffer_append(sb,"><br>\r\n"); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb," <br>Secret: <input type=\"text\" name=\""); |
|
|
|
|
str_buffer_append(sb,HR_ADD_SECRET); |
|
|
|
|
str_buffer_append(sb,"\" value=\""); |
|
|
|
|
str_buffer_append(sb,(const char*)add_secret); |
|
|
|
|
str_buffer_append(sb,"\""); |
|
|
|
|
str_buffer_append(sb,"><br>\r\n"); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb,"<br><input type=\"submit\" value=\"Add secret\">"); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb,"</fieldset>\r\n"); |
|
|
|
|
str_buffer_append(sb,"</form>\r\n"); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb,"Secrets:<br>\r\n"); |
|
|
|
|
str_buffer_append(sb,"<table>\r\n"); |
|
|
|
|
str_buffer_append(sb,"<tr><th>N</th><th>Value</th>"); |
|
|
|
|
if(!current_socket->as_eff_realm[0]) { |
|
|
|
|
str_buffer_append(sb,"<th>Realm</th>"); |
|
|
|
|
} |
|
|
|
|
str_buffer_append(sb,"<th> </th>"); |
|
|
|
|
str_buffer_append(sb,"</tr>\r\n"); |
|
|
|
|
|
|
|
|
|
size_t total_sz = https_print_secrets(sb); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb,"\r\n</table>\r\n"); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb,"<br>Total secrets = "); |
|
|
|
|
str_buffer_append_sz(sb,total_sz); |
|
|
|
|
str_buffer_append(sb,"<br>\r\n"); |
|
|
|
|
|
|
|
|
|
str_buffer_append(sb,"</body>\r\n</html>\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) { |
|
|
|
|
@ -2563,7 +2722,7 @@ static void handle_https(ioa_socket_handle s, ioa_network_buffer_handle nbh) |
|
|
|
|
add_user = (const u08bits*)""; |
|
|
|
|
} |
|
|
|
|
if(add_user[0]) { |
|
|
|
|
add_realm = (const u08bits*)get_http_header_value(hr, HR_ADD_USER_REALM); |
|
|
|
|
add_realm = (const u08bits*)get_http_header_value(hr, HR_ADD_REALM); |
|
|
|
|
if(!add_realm) { |
|
|
|
|
add_realm=(const u08bits*)""; |
|
|
|
|
} |
|
|
|
|
@ -2626,6 +2785,82 @@ static void handle_https(ioa_socket_handle s, ioa_network_buffer_handle nbh) |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
case AS_FORM_SS: { |
|
|
|
|
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 *secret = (const u08bits*)get_http_header_value(hr, HR_DELETE_SECRET); |
|
|
|
|
if(secret && secret[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_secret) { |
|
|
|
|
u08bits ss[AUTH_SECRET_SIZE+1]; |
|
|
|
|
u08bits r[STUN_MAX_REALM_SIZE+1]; |
|
|
|
|
STRCPY(ss,secret); |
|
|
|
|
STRCPY(r,realm); |
|
|
|
|
dbd->del_secret(ss,r); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const u08bits *add_realm = (const u08bits*)current_socket->as_eff_realm; |
|
|
|
|
const u08bits *add_secret = (const u08bits*)get_http_header_value(hr, HR_ADD_SECRET); |
|
|
|
|
const char* msg = ""; |
|
|
|
|
if(!add_secret) add_secret = (const u08bits*)""; |
|
|
|
|
if(wrong_html_name((const char*)add_secret)) { |
|
|
|
|
msg = "Error: wrong secret value"; |
|
|
|
|
add_secret = (const u08bits*)""; |
|
|
|
|
} |
|
|
|
|
if(add_secret[0]) { |
|
|
|
|
add_realm = (const u08bits*)get_http_header_value(hr, HR_ADD_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(wrong_html_name((const char*)add_realm)) { |
|
|
|
|
msg = "Error: wrong realm name"; |
|
|
|
|
add_realm = (const u08bits*)""; |
|
|
|
|
} |
|
|
|
|
if(add_realm[0]) { |
|
|
|
|
const turn_dbdriver_t * dbd = get_dbdriver(); |
|
|
|
|
if (dbd && dbd->set_secret) { |
|
|
|
|
u08bits ss[AUTH_SECRET_SIZE+1]; |
|
|
|
|
u08bits r[STUN_MAX_REALM_SIZE+1]; |
|
|
|
|
STRCPY(ss,add_secret); |
|
|
|
|
STRCPY(r,add_realm); |
|
|
|
|
(*dbd->set_secret)(ss, r); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
add_secret=(const u08bits*)""; |
|
|
|
|
add_realm=(const u08bits*)""; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
write_shared_secrets_page(s,(const char*)add_secret,(const char*)add_realm,msg); |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
write_https_logon_page(s); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
case AS_FORM_TOGGLE: |
|
|
|
|
if(s->as_ok) { |
|
|
|
|
handle_toggle_request(s,hr); |
|
|
|
|
|