From 240fa9cd6f0ede43211b799f4706df92c62a5be9 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Tue, 15 May 2007 10:42:56 +0000 Subject: Fixed several STUN bugs: USERNAME, REALM etc are not allowed in the response, retransmission timer calculation bug, etc. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1275 74dad513-b988-da41-8d7b-12977e46ad98 --- pjnath/src/pjstun-srv-test/bind_usage.c | 2 +- pjnath/src/pjstun-srv-test/main.c | 17 +++++++++++++-- pjnath/src/pjstun-srv-test/server.h | 2 ++ pjnath/src/pjstun-srv-test/turn_usage.c | 37 ++++++++++++++++++++++++--------- 4 files changed, 45 insertions(+), 13 deletions(-) (limited to 'pjnath/src/pjstun-srv-test') diff --git a/pjnath/src/pjstun-srv-test/bind_usage.c b/pjnath/src/pjstun-srv-test/bind_usage.c index 680dd5c0..09112bdd 100644 --- a/pjnath/src/pjstun-srv-test/bind_usage.c +++ b/pjnath/src/pjstun-srv-test/bind_usage.c @@ -157,7 +157,7 @@ static pj_status_t sess_on_rx_request(pj_stun_session *sess, PJ_UNUSED_ARG(pkt_len); /* Create response */ - status = pj_stun_session_create_response(sess, msg, 0, NULL, &tdata); + status = pj_stun_session_create_res(sess, msg, 0, NULL, &tdata); if (status != PJ_SUCCESS) return status; diff --git a/pjnath/src/pjstun-srv-test/main.c b/pjnath/src/pjstun-srv-test/main.c index c462d47e..aad1c0f2 100644 --- a/pjnath/src/pjstun-srv-test/main.c +++ b/pjnath/src/pjstun-srv-test/main.c @@ -78,9 +78,10 @@ int main(int argc, char *argv[]) int c, opt_id; pj_caching_pool cp; pj_stun_server *srv; + pj_stun_usage *turn; pj_status_t status; - while((c=pj_getopt_long(argc,argv, "r:u:p:hF", long_options, &opt_id))!=-1) { + while((c=pj_getopt_long(argc,argv, "r:u:p:N:hF", long_options, &opt_id))!=-1) { switch (c) { case 'r': o.realm = pj_optarg; @@ -131,12 +132,24 @@ int main(int argc, char *argv[]) */ status = pj_stun_turn_usage_create(srv, PJ_SOCK_DGRAM, NULL, - 3478, NULL); + 3478, &turn); if (status != PJ_SUCCESS) { pj_stun_perror(THIS_FILE, "Unable to create bind usage", status); return 1; } + if (o.user_name && o.password) { + pj_stun_auth_cred cred; + pj_bzero(&cred, sizeof(cred)); + cred.type = PJ_STUN_AUTH_CRED_STATIC; + cred.data.static_cred.realm = pj_str(o.realm); + cred.data.static_cred.username = pj_str(o.user_name); + cred.data.static_cred.data_type = 0; + cred.data.static_cred.data = pj_str(o.password); + cred.data.static_cred.nonce = pj_str(o.nonce); + pj_stun_turn_usage_set_credential(turn, &cred); + } + server_main(srv); pj_stun_server_destroy(srv); diff --git a/pjnath/src/pjstun-srv-test/server.h b/pjnath/src/pjstun-srv-test/server.h index 633131c6..f06d7f85 100644 --- a/pjnath/src/pjstun-srv-test/server.h +++ b/pjnath/src/pjstun-srv-test/server.h @@ -124,6 +124,8 @@ PJ_DECL(pj_status_t) pj_stun_turn_usage_create(pj_stun_server *srv, unsigned port, pj_stun_usage **p_bu); +PJ_DECL(pj_status_t) pj_stun_turn_usage_set_credential(pj_stun_usage *turn, + const pj_stun_auth_cred *cred); pj_status_t pj_stun_server_register_usage(pj_stun_server *srv, pj_stun_usage *usage); diff --git a/pjnath/src/pjstun-srv-test/turn_usage.c b/pjnath/src/pjstun-srv-test/turn_usage.c index 145d8020..c3e53577 100644 --- a/pjnath/src/pjstun-srv-test/turn_usage.c +++ b/pjnath/src/pjstun-srv-test/turn_usage.c @@ -78,6 +78,7 @@ struct turn_usage int type; pj_stun_session *default_session; pj_hash_table_t *client_htable; + pj_stun_auth_cred *cred; unsigned max_bw_kbps; unsigned max_lifetime; @@ -225,6 +226,19 @@ PJ_DEF(pj_status_t) pj_stun_turn_usage_create(pj_stun_server *srv, } +PJ_DEF(pj_status_t) pj_stun_turn_usage_set_credential(pj_stun_usage *turn, + const pj_stun_auth_cred *c) +{ + struct turn_usage *tu; + tu = (struct turn_usage*) pj_stun_usage_get_user_data(turn); + + tu->cred = PJ_POOL_ZALLOC_T(tu->pool, pj_stun_auth_cred); + pj_stun_auth_cred_dup(tu->pool, tu->cred, c); + pj_stun_session_set_credential(tu->default_session, tu->cred); + return PJ_SUCCESS; +} + + /* * This is a callback called by usage.c when the particular STUN usage * is to be destroyed. @@ -441,9 +455,9 @@ static pj_status_t tu_sess_on_rx_request(pj_stun_session *sess, } else if (msg->hdr.type != PJ_STUN_ALLOCATE_REQUEST) { if (PJ_STUN_IS_REQUEST(msg->hdr.type)) { - status = pj_stun_session_create_response(sess, msg, - PJ_STUN_SC_NO_BINDING, - NULL, &tdata); + status = pj_stun_session_create_res(sess, msg, + PJ_STUN_SC_NO_BINDING, + NULL, &tdata); if (status==PJ_SUCCESS) { status = pj_stun_session_send_msg(sess, PJ_FALSE, src_addr, src_addr_len, @@ -630,6 +644,9 @@ static pj_status_t client_create(struct turn_usage *tu, return status; } + if (tu->cred) + pj_stun_session_set_credential(client->session, tu->cred); + sd = PJ_POOL_ZALLOC_T(pool, struct session_data); sd->tu = tu; sd->client = client; @@ -863,9 +880,9 @@ static pj_status_t client_respond(struct turn_client *client, if (custom_msg) pj_cstr(&err_msg, custom_msg), p_err_msg = &err_msg; - status = pj_stun_session_create_response(client->session, msg, - err_code, p_err_msg, - &response); + status = pj_stun_session_create_res(client->session, msg, + err_code, p_err_msg, + &response); if (status == PJ_SUCCESS) status = pj_stun_session_send_msg(client->session, PJ_TRUE, dst_addr, dst_addr_len, response); @@ -1014,8 +1031,8 @@ static pj_status_t client_handle_allocate_req(struct turn_client *client, client->expiry_timer.id = PJ_TRUE; /* Done successfully, create and send success response */ - status = pj_stun_session_create_response(client->session, msg, - 0, NULL, &response); + status = pj_stun_session_create_res(client->session, msg, + 0, NULL, &response); if (status != PJ_SUCCESS) { return status; } @@ -1062,8 +1079,8 @@ static pj_status_t handle_binding_req(pj_stun_session *session, pj_status_t status; /* Create response */ - status = pj_stun_session_create_response(session, msg, 0, NULL, - &tdata); + status = pj_stun_session_create_res(session, msg, 0, NULL, + &tdata); if (status != PJ_SUCCESS) return status; -- cgit v1.2.3