mom040267 пре 11 година
родитељ
комит
2fbd4138de

+ 2 - 0
README.turnserver

@@ -190,6 +190,8 @@ Flags:
 			This option can be used with long-term credentials mechanisms only -
 			This option can be used with long-term credentials mechanisms only -
 			it does not make much sense with the short-term mechanism.
 			it does not make much sense with the short-term mechanism.
 			
 			
+--oauth			Support oAuth authentication.
+			
 --dh566			Use 566 bits predefined DH TLS key. Default size of the key is 1066.
 --dh566			Use 566 bits predefined DH TLS key. Default size of the key is 1066.
 
 
 --dh2066		Use 2066 bits predefined DH TLS key. Default size of the key is 1066.
 --dh2066		Use 2066 bits predefined DH TLS key. Default size of the key is 1066.

+ 4 - 0
examples/etc/turnserver.conf

@@ -216,6 +216,10 @@
 #
 #
 #server-name=blackdow.carleon.gov
 #server-name=blackdow.carleon.gov
 
 
+# Flag to support oAuth authentication.
+#
+#oauth
+
 # 'Static' user accounts for long term credentials mechanism, only.
 # 'Static' user accounts for long term credentials mechanism, only.
 # This option cannot be used with TURN REST API or with short-term credentials
 # This option cannot be used with TURN REST API or with short-term credentials
 # mechanism.
 # mechanism.

+ 1 - 1
man/man1/turnadmin.1

@@ -1,5 +1,5 @@
 .\" Text automatically generated by txt2man
 .\" Text automatically generated by txt2man
-.TH TURN 1 "16 September 2014" "" ""
+.TH TURN 1 "18 September 2014" "" ""
 .SH GENERAL INFORMATION
 .SH GENERAL INFORMATION
 
 
 \fIturnadmin\fP is a TURN administration tool. This tool can be used to manage 
 \fIturnadmin\fP is a TURN administration tool. This tool can be used to manage 

+ 5 - 1
man/man1/turnserver.1

@@ -1,5 +1,5 @@
 .\" Text automatically generated by txt2man
 .\" Text automatically generated by txt2man
-.TH TURN 1 "16 September 2014" "" ""
+.TH TURN 1 "18 September 2014" "" ""
 .SH GENERAL INFORMATION
 .SH GENERAL INFORMATION
 
 
 The \fBTURN Server\fP project contains the source code of a TURN server and TURN client 
 The \fBTURN Server\fP project contains the source code of a TURN server and TURN client 
@@ -276,6 +276,10 @@ This option can be used with long\-term credentials mechanisms only \-
 it does not make much sense with the short\-term mechanism.
 it does not make much sense with the short\-term mechanism.
 .TP
 .TP
 .B
 .B
+\fB\-\-oauth\fP
+Support oAuth authentication.
+.TP
+.B
 \fB\-\-dh566\fP
 \fB\-\-dh566\fP
 Use 566 bits predefined DH TLS key. Default size of the key is 1066.
 Use 566 bits predefined DH TLS key. Default size of the key is 1066.
 .TP
 .TP

+ 1 - 1
man/man1/turnutils.1

@@ -1,5 +1,5 @@
 .\" Text automatically generated by txt2man
 .\" Text automatically generated by txt2man
-.TH TURN 1 "16 September 2014" "" ""
+.TH TURN 1 "18 September 2014" "" ""
 .SH GENERAL INFORMATION
 .SH GENERAL INFORMATION
 
 
 A set of turnutils_* programs provides some utility functionality to be used
 A set of turnutils_* programs provides some utility functionality to be used

+ 11 - 3
src/apps/relay/mainrelay.c

@@ -85,7 +85,7 @@ LOW_DEFAULT_PORTS_BOUNDARY,HIGH_DEFAULT_PORTS_BOUNDARY,0,0,0,"",
 0,NULL,0,NULL,DEFAULT_GENERAL_RELAY_SERVERS_NUMBER,0,
 0,NULL,0,NULL,DEFAULT_GENERAL_RELAY_SERVERS_NUMBER,0,
 ////////////// Auth server /////////////////////////////////////
 ////////////// Auth server /////////////////////////////////////
 {NULL,NULL,NULL,0,NULL},
 {NULL,NULL,NULL,0,NULL},
-"","",
+"","",0,
 /////////////// AUX SERVERS ////////////////
 /////////////// AUX SERVERS ////////////////
 {NULL,0,{0,NULL}},0,
 {NULL,0,{0,NULL}},0,
 /////////////// ALTERNATE SERVERS ////////////////
 /////////////// ALTERNATE SERVERS ////////////////
@@ -467,6 +467,7 @@ static char Usage[] = "Usage: turnserver [options]\n"
 " --server-name					Server name used (when necessary) for\n"
 " --server-name					Server name used (when necessary) for\n"
 "						the authentication purposes (oauth).\n"
 "						the authentication purposes (oauth).\n"
 "						The default value is the FQDN of the host.\n"
 "						The default value is the FQDN of the host.\n"
+" --oauth					Support oAuth authentication.\n"
 " -n						Do not use configuration file, take all parameters from the command line only.\n"
 " -n						Do not use configuration file, take all parameters from the command line only.\n"
 " --cert			<filename>		Certificate file, PEM format. Same file search rules\n"
 " --cert			<filename>		Certificate file, PEM format. Same file search rules\n"
 "						applied as for the configuration file.\n"
 "						applied as for the configuration file.\n"
@@ -682,7 +683,8 @@ enum EXTRA_OPTS {
 	ADMIN_MAX_BPS_OPT,
 	ADMIN_MAX_BPS_OPT,
 	ADMIN_TOTAL_QUOTA_OPT,
 	ADMIN_TOTAL_QUOTA_OPT,
 	ADMIN_USER_QUOTA_OPT,
 	ADMIN_USER_QUOTA_OPT,
-	SERVER_NAME_OPT
+	SERVER_NAME_OPT,
+	OAUTH_OPT
 };
 };
 
 
 struct myoption {
 struct myoption {
@@ -737,6 +739,7 @@ static const struct myoption long_options[] = {
 /* deprecated: */		{ "secret-ts-exp-time", optional_argument, NULL, AUTH_SECRET_TS_EXP },
 /* deprecated: */		{ "secret-ts-exp-time", optional_argument, NULL, AUTH_SECRET_TS_EXP },
 				{ "realm", required_argument, NULL, 'r' },
 				{ "realm", required_argument, NULL, 'r' },
 				{ "server-name", required_argument, NULL, SERVER_NAME_OPT },
 				{ "server-name", required_argument, NULL, SERVER_NAME_OPT },
+				{ "oauth", optional_argument, NULL, OAUTH_OPT },
 				{ "user-quota", required_argument, NULL, 'q' },
 				{ "user-quota", required_argument, NULL, 'q' },
 				{ "total-quota", required_argument, NULL, 'Q' },
 				{ "total-quota", required_argument, NULL, 'Q' },
 				{ "max-bps", required_argument, NULL, 's' },
 				{ "max-bps", required_argument, NULL, 's' },
@@ -868,6 +871,9 @@ static void set_option(int c, char *value)
   case SERVER_NAME_OPT:
   case SERVER_NAME_OPT:
 	  STRCPY(turn_params.oauth_server_name,value);
 	  STRCPY(turn_params.oauth_server_name,value);
 	  break;
 	  break;
+  case OAUTH_OPT:
+	  turn_params.oauth = get_bool_value(value);
+	  break;
   case NO_SSLV2_OPT:
   case NO_SSLV2_OPT:
 	  turn_params.no_sslv2 = get_bool_value(value);
 	  turn_params.no_sslv2 = get_bool_value(value);
 	  break;
 	  break;
@@ -1834,7 +1840,9 @@ int main(int argc, char **argv)
 	init_oauth_server_name();
 	init_oauth_server_name();
 	TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Domain name: %s\n",turn_params.domain);
 	TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Domain name: %s\n",turn_params.domain);
 	TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Default realm: %s\n",get_realm(NULL)->options.name);
 	TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Default realm: %s\n",get_realm(NULL)->options.name);
-	TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "Server name: %s\n",turn_params.oauth_server_name);
+	if(turn_params.oauth) {
+		TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "oAuth server name: %s\n",turn_params.oauth_server_name);
+	}
 
 
 	optind = 0;
 	optind = 0;
 
 

+ 1 - 0
src/apps/relay/mainrelay.h

@@ -273,6 +273,7 @@ typedef struct _turn_params_ {
   struct auth_server authserver;
   struct auth_server authserver;
   char oauth_server_name[1025];
   char oauth_server_name[1025];
   char domain[1025];
   char domain[1025];
+  int oauth;
 
 
 /////////////// AUX SERVERS ////////////////
 /////////////// AUX SERVERS ////////////////
 
 

+ 2 - 1
src/apps/relay/netengine.c

@@ -1594,7 +1594,8 @@ static void setup_relay_server(struct relay_server *rs, ioa_engine_handle e, int
 			 &turn_params.secure_stun, turn_params.shatype, &turn_params.mobility,
 			 &turn_params.secure_stun, turn_params.shatype, &turn_params.mobility,
 			 turn_params.server_relay,
 			 turn_params.server_relay,
 			 send_turn_session_info,
 			 send_turn_session_info,
-			 allocate_bps);
+			 allocate_bps,
+			 turn_params.oauth, turn_params.oauth_server_name);
 	
 	
 	if(to_set_rfc5780) {
 	if(to_set_rfc5780) {
 		set_rfc5780(&(rs->server), get_alt_addr, send_message_from_listener_to_client);
 		set_rfc5780(&(rs->server), get_alt_addr, send_message_from_listener_to_client);

+ 2 - 0
src/client/ns_turn_msg_defs_new.h

@@ -103,6 +103,8 @@ typedef enum _AUTH_ALG AUTH_ALG;
  * oAuth struct
  * oAuth struct
  */
  */
 
 
+#define STUN_ATTRIBUTE_THIRD_PARTY_AUTHORIZATION (0x8030)
+
 #define OAUTH_KID_SIZE (128)
 #define OAUTH_KID_SIZE (128)
 #define OAUTH_HASH_FUNC_SIZE (64)
 #define OAUTH_HASH_FUNC_SIZE (64)
 #define OAUTH_ALG_SIZE (64)
 #define OAUTH_ALG_SIZE (64)

+ 16 - 1
src/server/ns_turn_server.c

@@ -3075,6 +3075,17 @@ static int create_challenge_response(ts_ur_super_session *ss, stun_tid *tid, int
 	char *realm = ss->realm_options.name;
 	char *realm = ss->realm_options.name;
 	stun_attr_add_str(ioa_network_buffer_data(nbh), &len, STUN_ATTRIBUTE_REALM,
 	stun_attr_add_str(ioa_network_buffer_data(nbh), &len, STUN_ATTRIBUTE_REALM,
 					(u08bits*)realm, (int)(strlen((s08bits*)(realm))));
 					(u08bits*)realm, (int)(strlen((s08bits*)(realm))));
+
+	if(ss->server) {
+		turn_turnserver* server = (turn_turnserver*)ss->server;
+		if(server->oauth && (server->oauth_server_name)&&(server->oauth_server_name[0])) {
+    	stun_attr_add_str(ioa_network_buffer_data(nbh), &len,
+    			STUN_ATTRIBUTE_THIRD_PARTY_AUTHORIZATION,
+    			(const u08bits*)(server->oauth_server_name),
+    			strlen(server->oauth_server_name));
+		}
+    }
+
 	ioa_network_buffer_set_size(nbh,len);
 	ioa_network_buffer_set_size(nbh,len);
 	return 0;
 	return 0;
 }
 }
@@ -4702,7 +4713,8 @@ void init_turn_server(turn_turnserver* server,
 		send_socket_to_relay_cb send_socket_to_relay,
 		send_socket_to_relay_cb send_socket_to_relay,
 		vintp secure_stun, SHATYPE shatype, vintp mobility, int server_relay,
 		vintp secure_stun, SHATYPE shatype, vintp mobility, int server_relay,
 		send_turn_session_info_cb send_turn_session_info,
 		send_turn_session_info_cb send_turn_session_info,
-		allocate_bps_cb allocate_bps_func) {
+		allocate_bps_cb allocate_bps_func,
+		int oauth, const char* oauth_server_name) {
 
 
 	if (!server)
 	if (!server)
 		return;
 		return;
@@ -4726,6 +4738,9 @@ void init_turn_server(turn_turnserver* server,
 	server->mobility = mobility;
 	server->mobility = mobility;
 	server->server_relay = server_relay;
 	server->server_relay = server_relay;
 	server->send_turn_session_info = send_turn_session_info;
 	server->send_turn_session_info = send_turn_session_info;
+	server->oauth = oauth;
+	if(oauth)
+		server->oauth_server_name = oauth_server_name;
 	if(mobility)
 	if(mobility)
 		server->mobile_connections_map = ur_map_create();
 		server->mobile_connections_map = ur_map_create();
 
 

+ 7 - 1
src/server/ns_turn_server.h

@@ -160,6 +160,10 @@ struct _turn_turnserver {
 
 
 	/* Bandwidth draft: */
 	/* Bandwidth draft: */
 	allocate_bps_cb allocate_bps_func;
 	allocate_bps_cb allocate_bps_func;
+
+	/* oAuth: */
+	int oauth;
+	const char* oauth_server_name;
 };
 };
 
 
 ///////////////////////////////////////////
 ///////////////////////////////////////////
@@ -195,7 +199,9 @@ void init_turn_server(turn_turnserver* server,
 				    vintp mobility,
 				    vintp mobility,
 				    int server_relay,
 				    int server_relay,
 				    send_turn_session_info_cb send_turn_session_info,
 				    send_turn_session_info_cb send_turn_session_info,
-				    allocate_bps_cb allocate_bps_func);
+				    allocate_bps_cb allocate_bps_func,
+				    int oauth,
+				    const char* oauth_server_name);
 
 
 ioa_engine_handle turn_server_get_engine(turn_turnserver *s);
 ioa_engine_handle turn_server_get_engine(turn_turnserver *s);