| ");
+ str_buffer_append_sz(sb,i+1);
+ str_buffer_append(sb," | ");
+ str_buffer_append(sb,"");
+ str_buffer_append(sb,get_secrets_list_elem(&kids,i));
+ str_buffer_append(sb," | ");
+ str_buffer_append(sb,"");
+ str_buffer_append(sb,get_secrets_list_elem(&hkdfs,i));
+ str_buffer_append(sb," | ");
+ str_buffer_append(sb,"");
+ str_buffer_append(sb,get_secrets_list_elem(&teas,i));
+ str_buffer_append(sb," | ");
+ str_buffer_append(sb,"");
+ str_buffer_append(sb,get_secrets_list_elem(&aas,i));
+ str_buffer_append(sb," | ");
+
+ {
+ str_buffer_append(sb," delete");
+ str_buffer_append(sb," | ");
+ }
+ str_buffer_append(sb,"");
+ ++ret;
+ }
+
+ clean_secrets_list(&kids);
+ clean_secrets_list(&hkdfs);
+ clean_secrets_list(&teas);
+ clean_secrets_list(&aas);
+ }
+
+ return ret;
+}
+
+static void write_https_oauth_page(ioa_socket_handle s, const char* add_kid, const char* add_ikm,
+ const char* add_hkdf_hash_func, const char* add_tea, const char* add_aa,
+ const char* msg)
+{
+ if(s && !ioa_socket_tobeclosed(s)) {
+
+ if(!(s->as_ok)) {
+ write_https_logon_page(s);
+ } else if(!is_superuser()) {
+ write_https_home_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,"
OAuth keys:
\r\n");
+ str_buffer_append(sb,"\r\n");
+ str_buffer_append(sb,"| N | KID | ");
+ str_buffer_append(sb,"Hash key derivation function | ");
+ str_buffer_append(sb,"Token encryption algorithm | ");
+ str_buffer_append(sb,"Token authentication algorithm | ");
+ str_buffer_append(sb," | ");
+ str_buffer_append(sb,"
\r\n");
+
+ size_t total_sz = https_print_oauth_keys(sb);
+
+ str_buffer_append(sb,"\r\n
\r\n");
+
+ str_buffer_append(sb,"
Total oAuth keys = ");
+ 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\n");
+ send_str_from_ioa_socket_tcp(s,get_http_date_header());
+ send_str_from_ioa_socket_tcp(s,"Content-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) {
@@ -3197,11 +3445,63 @@ static void handle_https(ioa_socket_handle s, ioa_network_buffer_handle nbh)
break;
}
case AS_FORM_OAUTH: {
- if(s->as_ok) {
- //TODO
+ if(!s->as_ok) {
+ write_https_logon_page(s);
+ } else if(!is_superuser()) {
write_https_home_page(s);
} else {
- write_https_logon_page(s);
+
+ {
+ const char* del_kid = get_http_header_value(hr,HR_DELETE_OAUTH_KID,"");
+ if(del_kid[0]) {
+ const turn_dbdriver_t * dbd = get_dbdriver();
+ if (dbd && dbd->del_oauth_key) {
+ (*dbd->del_oauth_key)((const u08bits*)del_kid);
+ }
+ }
+ }
+
+ const char* add_kid = "";
+ const char* add_ikm = "";
+ const char* add_hkdf_hash_func = "";
+ const char* add_tea = "";
+ const char* add_aa = "";
+ const char* msg = "";
+
+ add_kid = get_http_header_value(hr,HR_ADD_OAUTH_KID,"");
+ if(add_kid[0]) {
+ add_ikm = get_http_header_value(hr,HR_ADD_OAUTH_IKM,"");
+ if(add_ikm[0]) {
+ add_hkdf_hash_func = get_http_header_value(hr,HR_ADD_OAUTH_HKDF,"");
+ add_tea = get_http_header_value(hr,HR_ADD_OAUTH_TEA,"");
+ add_aa = get_http_header_value(hr,HR_ADD_OAUTH_AA,"");
+
+ oauth_key_data_raw key;
+ ns_bzero(&key,sizeof(key));
+ STRCPY(key.kid,add_kid);
+ STRCPY(key.ikm_key,add_ikm);
+ STRCPY(key.hkdf_hash_func,add_hkdf_hash_func);
+ STRCPY(key.as_rs_alg,add_tea);
+ STRCPY(key.auth_alg,add_aa);
+
+ if(strstr(key.as_rs_alg,"AEAD")) key.auth_alg[0]=0;
+
+ const turn_dbdriver_t * dbd = get_dbdriver();
+ if (dbd && dbd->set_oauth_key) {
+ if((*dbd->set_oauth_key)(&key)<0) {
+ msg = "Cannot insert oAuth key into the database";
+ } else {
+ add_kid = "";
+ add_ikm = "";
+ add_hkdf_hash_func = "";
+ add_tea = "";
+ add_aa = "";
+ }
+ }
+ }
+ }
+
+ write_https_oauth_page(s,add_kid,add_ikm,add_hkdf_hash_func,add_tea,add_aa,msg);
}
break;
}
diff --git a/src/apps/relay/userdb.c b/src/apps/relay/userdb.c
index 57ac529..5ab3d6c 100644
--- a/src/apps/relay/userdb.c
+++ b/src/apps/relay/userdb.c
@@ -405,7 +405,7 @@ int get_user_key(int in_oauth, int *out_oauth, int *max_session_time, u08bits *u
if(max_session_time)
*max_session_time = 0;
- if(in_oauth && out_oauth && usname && usname[0] && realm && realm[0]) {
+ if(in_oauth && out_oauth && usname && usname[0]) {
stun_attr_ref sar = stun_attr_get_first_by_type_str(ioa_network_buffer_data(nbh),
ioa_network_buffer_get_size(nbh),
@@ -471,6 +471,10 @@ int get_user_key(int in_oauth, int *out_oauth, int *max_session_time, u08bits *u
const char* server_name = (char*)turn_params.oauth_server_name;
if(!(server_name && server_name[0])) {
server_name = (char*)realm;
+ if(!(server_name && server_name[0])) {
+ TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "Cannot determine oAuth server name");
+ return -1;
+ }
}
if (decode_oauth_token((const u08bits *) server_name, &etoken,&okey, &dot) < 0) {