mom040267 10 anos atrás
pai
commit
da0f380b18

+ 9 - 6
src/apps/relay/dbdrivers/dbd_mongo.c

@@ -1318,7 +1318,7 @@ static int mongo_del_admin_user(const u08bits *usname)
 	return ret;
 }
 
-static int mongo_list_admin_users(void)
+static int mongo_list_admin_users(int no_print)
 {
 	const char * collection_name = "admin_user";
 	mongoc_collection_t * collection = mongo_get_collection(collection_name);
@@ -1352,6 +1352,7 @@ static int mongo_list_admin_users(void)
 		bson_iter_t iter;
 		bson_iter_t iter_realm;
 		const char * value;
+		ret = 0;
 		while (mongoc_cursor_next(cursor, &item)) {
 			if (bson_iter_init(&iter, item) && bson_iter_find(&iter, "name") && BSON_ITER_HOLDS_UTF8(&iter)) {
 				value = bson_iter_utf8(&iter, &length);
@@ -1360,16 +1361,18 @@ static int mongo_list_admin_users(void)
 					if (bson_iter_init(&iter_realm, item) && bson_iter_find(&iter_realm, "realm") && BSON_ITER_HOLDS_UTF8(&iter_realm)) {
 						realm = bson_iter_utf8(&iter_realm, &length);
 					}
-					if(realm && *realm) {
-						printf("%s[%s]\n", value, realm);
-					} else {
-						printf("%s\n", value);
+					++ret;
+					if(!no_print) {
+						if(realm && *realm) {
+							printf("%s[%s]\n", value, realm);
+						} else {
+							printf("%s\n", value);
+						}
 					}
 				}
 			}
 		}
 		mongoc_cursor_destroy(cursor);
-		ret = 0;
 	}
 	mongoc_collection_destroy(collection);
 	bson_destroy(&query);

+ 4 - 3
src/apps/relay/dbdrivers/dbd_mysql.c

@@ -1189,7 +1189,7 @@ static int mysql_del_admin_user(const u08bits *usname)
 	return ret;
 }
 
-static int mysql_list_admin_users(void)
+static int mysql_list_admin_users(int no_print)
 {
 	int ret = -1;
 	char statement[TURN_LONG_STRING_SIZE];
@@ -1207,12 +1207,14 @@ static int mysql_list_admin_users(void)
 			} else if(mysql_field_count(myc)!=2) {
 				TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "Unknown error retrieving MySQL DB information: %s\n",statement);
 			} else {
+				ret = 0;
 				for(;;) {
 					MYSQL_ROW row = mysql_fetch_row(mres);
 					if(!row) {
 						break;
 					} else {
-						if(row[0]) {
+						++ret;
+						if(row[0] && !no_print) {
 							if(row[1] && row[1][0]) {
 								printf("%s[%s]\n",row[0],row[1]);
 							} else {
@@ -1221,7 +1223,6 @@ static int mysql_list_admin_users(void)
 						}
 					}
 				}
-				ret = 0;
 			}
 
 			if(mres)

+ 4 - 3
src/apps/relay/dbdrivers/dbd_pgsql.c

@@ -920,7 +920,7 @@ static int pgsql_del_admin_user(const u08bits *usname)
 	return ret;
 }
 
-static int pgsql_list_admin_users(void)
+static int pgsql_list_admin_users(int no_print)
 {
 	int ret = -1;
 	char statement[TURN_LONG_STRING_SIZE];
@@ -934,9 +934,11 @@ static int pgsql_list_admin_users(void)
 		TURN_LOG_FUNC(TURN_LOG_LEVEL_ERROR, "Error retrieving PostgreSQL DB information: %s\n",PQerrorMessage(pqc));
 	} else {
 		int i = 0;
+		ret = 0;
 		for(i=0;i<PQntuples(res);i++) {
 			char *kval = PQgetvalue(res,i,0);
-			if(kval) {
+			++ret;
+			if(kval && !no_print) {
 				char *rval = PQgetvalue(res,i,1);
 				if(rval && *rval) {
 					printf("%s[%s]\n",kval,rval);
@@ -945,7 +947,6 @@ static int pgsql_list_admin_users(void)
 				}
 			}
 		}
-		ret = 0;
 	}
 	if(res) {
 		PQclear(res);

+ 9 - 6
src/apps/relay/dbdrivers/dbd_redis.c

@@ -1288,7 +1288,7 @@ static int redis_del_admin_user(const u08bits *usname) {
   return ret;
 }
 
-static int redis_list_admin_users(void)
+static int redis_list_admin_users(int no_print)
 {
   int ret = -1;
   donot_print_connection_success = 1;
@@ -1320,22 +1320,25 @@ static int redis_list_admin_users(void)
 	}
   }
 
+  ret = 0;
   for(isz=0;isz<keys.sz;++isz) {
 	char *s = keys.secrets[isz];
 	s += strlen("turn/admin_user/");
 	u08bits realm[STUN_MAX_REALM_SIZE];
 	password_t pwd;
 	if(redis_get_admin_user((const u08bits*)s,realm,pwd) == 0) {
-		if(realm[0]) {
-			printf("%s[%s]\n",s,realm);
-		} else {
-			printf("%s\n",s);
+		++ret;
+		if(!no_print) {
+			if(realm[0]) {
+				printf("%s[%s]\n",s,realm);
+			} else {
+				printf("%s\n",s);
+			}
 		}
 	}
   }
 
   clean_secrets_list(&keys);
-  ret = 0;
 
   return ret;
 }

+ 9 - 5
src/apps/relay/dbdrivers/dbd_sqlite.c

@@ -1241,7 +1241,7 @@ static int sqlite_del_admin_user(const u08bits *usname)
 	return ret;
 }
 
-static int sqlite_list_admin_users(void)
+static int sqlite_list_admin_users(int no_print)
 {
 	int ret = -1;
 	char statement[TURN_LONG_STRING_SIZE];
@@ -1266,12 +1266,16 @@ static int sqlite_list_admin_users(void)
 					const char* kval = (const char*) sqlite3_column_text(st, 0);
 					const char* rval = (const char*) sqlite3_column_text(st, 1);
 
-					if (rval && *rval) {
-						printf("%s[%s]\n", kval, rval);
-					} else {
-						printf("%s\n", kval);
+					if(!no_print) {
+						if (rval && *rval) {
+							printf("%s[%s]\n", kval, rval);
+						} else {
+							printf("%s\n", kval);
+						}
 					}
 
+					++ret;
+
 				} else if (res == SQLITE_DONE) {
 					break;
 				} else {

+ 1 - 1
src/apps/relay/dbdrivers/dbdriver.h

@@ -72,7 +72,7 @@ typedef struct _turn_dbdriver_t {
   int (*get_admin_user)(const u08bits *usname, u08bits *realm, password_t pwd);
   int (*set_admin_user)(const u08bits *usname, const u08bits *realm, const password_t pwd);
   int (*del_admin_user)(const u08bits *usname);
-  int (*list_admin_users)(void);
+  int (*list_admin_users)(int no_print);
 } turn_dbdriver_t;
 
 /////////// USER DB CHECK //////////////////

+ 36 - 20
src/apps/relay/turn_admin_server.c

@@ -1536,7 +1536,7 @@ static void https_print_page_header(struct str_buffer *sb)
 	str_buffer_append(sb,"<br>\r\n");
 }
 
-static void https_finish_page(struct str_buffer *sb, ioa_socket_handle s)
+static void https_finish_page(struct str_buffer *sb, ioa_socket_handle s, int cclose)
 {
 	str_buffer_append(sb,"</body>\r\n</html>\r\n");
 
@@ -1544,6 +1544,9 @@ static void https_finish_page(struct str_buffer *sb, ioa_socket_handle s)
 	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());
+	if(cclose) {
+		send_str_from_ioa_socket_tcp(s,"Connection: close");
+	}
 	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));
@@ -1574,18 +1577,31 @@ static void write_https_logon_page(ioa_socket_handle s)
 
 		https_print_top_page_header(sb);
 
-		str_buffer_append(sb,"<br><br>\r\n");
-		str_buffer_append(sb,"<form action=\"");
-		str_buffer_append(sb,form_names[AS_FORM_LOGON].name);
-		str_buffer_append(sb,"\" method=\"POST\">\r\n");
-		str_buffer_append(sb,"  <fieldset><legend>Admin user information:</legend>  user name:<br><input required type=\"text\" name=\"");
-		str_buffer_append(sb,HR_USERNAME);
-		str_buffer_append(sb,"\" value=\"\"><br>password:<br><input required type=\"password\" name=\"");
-		str_buffer_append(sb,HR_PASSWORD);
-		str_buffer_append(sb,"\" value=\"\"><br><br><input type=\"submit\" value=\"Login\"></fieldset>\r\n");
-		str_buffer_append(sb,"</form>\r\n");
+		int we_have_admin_users = 0;
+		const turn_dbdriver_t * dbd = get_dbdriver();
+		if (dbd && dbd->list_admin_users) {
+			int ausers = dbd->list_admin_users(1);
+			if(ausers>0) {
+				we_have_admin_users = 1;
+			}
+		}
+
+		if(!we_have_admin_users) {
+			str_buffer_append(sb,"<br>To use the HTTPS admin connection, you have to set the database table <b><i>admin_user</i></b> with the admin user accounts.<br>\r\n");
+		} else {
+			str_buffer_append(sb,"<br><br>\r\n");
+			str_buffer_append(sb,"<form action=\"");
+			str_buffer_append(sb,form_names[AS_FORM_LOGON].name);
+			str_buffer_append(sb,"\" method=\"POST\">\r\n");
+			str_buffer_append(sb,"  <fieldset><legend>Admin user information:</legend>  user name:<br><input required type=\"text\" name=\"");
+			str_buffer_append(sb,HR_USERNAME);
+			str_buffer_append(sb,"\" value=\"\"><br>password:<br><input required type=\"password\" name=\"");
+			str_buffer_append(sb,HR_PASSWORD);
+			str_buffer_append(sb,"\" value=\"\"><br><br><input type=\"submit\" value=\"Login\"></fieldset>\r\n");
+			str_buffer_append(sb,"</form>\r\n");
+		}
 
-		https_finish_page(sb,s);
+		https_finish_page(sb,s,!we_have_admin_users);
 	}
 }
 
@@ -1676,7 +1692,7 @@ static void write_https_home_page(ioa_socket_handle s)
 			str_buffer_append(sb,"</fieldset>\r\n");
 			str_buffer_append(sb,"</form>\r\n");
 
-			https_finish_page(sb,s);
+			https_finish_page(sb,s,0);
 		}
 	}
 }
@@ -2132,7 +2148,7 @@ static void write_pc_page(ioa_socket_handle s)
 
 			str_buffer_append(sb,"\r\n</table>\r\n");
 
-			https_finish_page(sb,s);
+			https_finish_page(sb,s,0);
 		}
 	}
 }
@@ -2364,7 +2380,7 @@ static void write_ps_page(ioa_socket_handle s, const char* client_protocol, cons
 			str_buffer_append_sz(sb,total_sz);
 			str_buffer_append(sb,"<br>\r\n");
 
-			https_finish_page(sb,s);
+			https_finish_page(sb,s,0);
 		}
 	}
 }
@@ -2517,7 +2533,7 @@ static void write_users_page(ioa_socket_handle s, const u08bits *add_user, const
 			str_buffer_append_sz(sb,total_sz);
 			str_buffer_append(sb,"<br>\r\n");
 
-			https_finish_page(sb,s);
+			https_finish_page(sb,s,0);
 		}
 	}
 }
@@ -2651,7 +2667,7 @@ static void write_shared_secrets_page(ioa_socket_handle s, const char* add_secre
 			str_buffer_append_sz(sb,total_sz);
 			str_buffer_append(sb,"<br>\r\n");
 
-			https_finish_page(sb,s);
+			https_finish_page(sb,s,0);
 		}
 	}
 }
@@ -2784,7 +2800,7 @@ static void write_origins_page(ioa_socket_handle s, const char* add_origin, cons
 			str_buffer_append_sz(sb,total_sz);
 			str_buffer_append(sb,"<br>\r\n");
 
-			https_finish_page(sb,s);
+			https_finish_page(sb,s,0);
 		}
 	}
 }
@@ -2937,7 +2953,7 @@ static void write_https_oauth_show_keys(ioa_socket_handle s, const char* kid)
 				}
 			}
 
-			https_finish_page(sb,s);
+			https_finish_page(sb,s,0);
 		}
 	}
 }
@@ -3173,7 +3189,7 @@ static void write_https_oauth_page(ioa_socket_handle s, const char* add_kid, con
 			str_buffer_append_sz(sb,total_sz);
 			str_buffer_append(sb,"<br>\r\n");
 
-			https_finish_page(sb,s);
+			https_finish_page(sb,s,0);
 		}
 	}
 }

+ 1 - 1
src/apps/relay/userdb.c

@@ -775,7 +775,7 @@ static int list_users(u08bits *realm, int is_admin)
   if (dbd) {
 	  if(is_admin) {
 		  if(dbd->list_admin_users) {
-		  	(*dbd->list_admin_users)();
+		  	(*dbd->list_admin_users)(0);
 		  }
 	  } else {
 		  if(dbd->list_users) {