Commit c7b75331 authored by jehan's avatar jehan

add a parameter to retrieve auth info for pending authetication

parent e17f7cb6
......@@ -142,6 +142,13 @@ belle_sip_header_contact_t* belle_sip_header_contact_create (const belle_sip_hea
* */
unsigned int belle_sip_header_contact_equals(const belle_sip_header_contact_t* a,const belle_sip_header_contact_t* b);
/** Contact heaader equality function, same as #belle_sip_header_contact_equals but return 0 if equals, very useful with #belle_sip_list
* @return 0 if equals
*
* */
unsigned int belle_sip_header_contact_not_equals(const belle_sip_header_contact_t* a,const belle_sip_header_contact_t* b);
#define BELLE_SIP_RANDOM_TAG ((const char*)-1)
#define BELLE_SIP_HEADER_CONTACT(t) BELLE_SIP_CAST(t,belle_sip_header_contact_t)
#define BELLE_SIP_CONTACT "Contact"
......
......@@ -55,6 +55,7 @@ belle_sip_dialog_t *belle_sip_request_event_get_dialog(const belle_sip_request_e
belle_sip_dialog_t* belle_sip_dialog_terminated_get_dialog(const belle_sip_dialog_terminated_event_t *event);
/*auth event*/
void belle_sip_auth_event_destroy(belle_sip_auth_event_t* event);
const char* belle_sip_auth_event_get_username(const belle_sip_auth_event_t* event);
void belle_sip_auth_event_set_username(belle_sip_auth_event_t* event, const char* value);
......
......@@ -55,10 +55,12 @@ void belle_sip_provider_send_response(belle_sip_provider_t *p, belle_sip_respons
* @param p object
* @param request to be updated
* @param resp response to take authentication values from, might be NULL
* @param auth_infos if auth infos cannot be added for an authenticate header, (I.E case where this method return TRUE),
* a newly allocated belle_sip_auth_info_t object is added to this list. These object contains useful information like realm and username.
* @returns 0 in case of success,
*
* */
int belle_sip_provider_add_authorization(belle_sip_provider_t *p, belle_sip_request_t* request,belle_sip_response_t *resp);
int belle_sip_provider_add_authorization(belle_sip_provider_t *p, belle_sip_request_t* request,belle_sip_response_t *resp,belle_sip_list_t** auth_infos);
BELLE_SIP_END_DECLS
......
......@@ -240,9 +240,12 @@ float belle_sip_header_contact_get_qvalue(const belle_sip_header_contact_t* cont
}
unsigned int belle_sip_header_contact_equals(const belle_sip_header_contact_t* a,const belle_sip_header_contact_t* b) {
if (!a | !b) return 0;
return !belle_sip_uri_equals(belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(a))
return belle_sip_uri_equals(belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(a))
,belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(b)));
}
unsigned int belle_sip_header_contact_not_equals(const belle_sip_header_contact_t* a,const belle_sip_header_contact_t* b) {
return !belle_sip_header_contact_equals(a,b);
}
/**************************
* From header object inherent from header_address
****************************
......
......@@ -598,7 +598,7 @@ static void belle_sip_provider_update_or_create_auth_context(belle_sip_provider
if (auth_context_lst) belle_sip_free(auth_context_lst);
return;
}
int belle_sip_provider_add_authorization(belle_sip_provider_t *p, belle_sip_request_t* request,belle_sip_response_t *resp) {
int belle_sip_provider_add_authorization(belle_sip_provider_t *p, belle_sip_request_t* request,belle_sip_response_t *resp,belle_sip_list_t** auth_infos) {
belle_sip_header_call_id_t* call_id;
belle_sip_list_t* auth_context_lst;
belle_sip_list_t* authenticate_lst;
......@@ -688,10 +688,17 @@ int belle_sip_provider_add_authorization(belle_sip_provider_t *p, belle_sip_requ
} else
belle_sip_message_add_header(BELLE_SIP_MESSAGE(request),BELLE_SIP_HEADER(authorization));
result=1;
belle_sip_auth_event_destroy(auth_event);
} else {
belle_sip_message("No auth info found for call id [%s]",belle_sip_header_call_id_get_call_id(call_id));
if (auth_infos) {
/*stored to give user information on realm/username which requires authentications*/
*auth_infos=belle_sip_list_append(*auth_infos,auth_event);
} else {
belle_sip_auth_event_destroy(auth_event);
}
}
belle_sip_auth_event_destroy(auth_event);
}
belle_sip_list_free(head);
} else {
......
......@@ -129,7 +129,7 @@ static int refresh(belle_sip_refresher_t* refresher) {
belle_sip_header_expires_set_expires(expires_header,refresher->expires);
}
belle_sip_provider_add_authorization(prov,request,NULL);
belle_sip_provider_add_authorization(prov,request,NULL,NULL);
} else {
belle_sip_error("Unexpected dialog state [%s] for dialog [%p], cannot refresh [%s]"
,belle_sip_dialog_state_to_string(belle_sip_dialog_get_state(dialog))
......@@ -175,7 +175,7 @@ static belle_sip_header_contact_t* get_matching_contact(const belle_sip_transact
contact_header_list = belle_sip_message_get_headers(BELLE_SIP_MESSAGE(response),BELLE_SIP_CONTACT);
if (contact_header_list) {
contact_header_list = belle_sip_list_find_custom((belle_sip_list_t*)contact_header_list
,(belle_sip_compare_func)belle_sip_header_contact_equals
,(belle_sip_compare_func)belle_sip_header_contact_not_equals
, (const void*)local_contact);
if (!contact_header_list) {
char* contact_string=belle_sip_object_to_string(BELLE_SIP_OBJECT(local_contact));
......
......@@ -398,7 +398,7 @@ belle_sip_request_t* belle_sip_client_transaction_create_authenticated_request(b
belle_sip_message_add_header(BELLE_SIP_MESSAGE(req),BELLE_SIP_HEADER(t->preset_route));
}
/*put auth header*/
belle_sip_provider_add_authorization(t->base.provider,req,t->base.last_response);
belle_sip_provider_add_authorization(t->base.provider,req,t->base.last_response,NULL);
return req;
}
......@@ -55,7 +55,7 @@ static void process_response_event(belle_sip_listener_t *obj, const belle_sip_re
request=belle_sip_transaction_get_request(BELLE_SIP_TRANSACTION(belle_sip_response_event_get_client_transaction(event)));
belle_sip_header_cseq_t* cseq=(belle_sip_header_cseq_t*)belle_sip_message_get_header(BELLE_SIP_MESSAGE(request),BELLE_SIP_CSEQ);
belle_sip_header_cseq_set_seq_number(cseq,belle_sip_header_cseq_get_seq_number(cseq)+1);
CU_ASSERT_TRUE_FATAL(belle_sip_provider_add_authorization(prov,request,belle_sip_response_event_get_response(event)));
CU_ASSERT_TRUE_FATAL(belle_sip_provider_add_authorization(prov,request,belle_sip_response_event_get_response(event),NULL));
belle_sip_client_transaction_t *t=belle_sip_provider_create_client_transaction(prov,request);
belle_sip_client_transaction_send_request(t);
number_of_challange++;
......@@ -151,7 +151,7 @@ void unregister_user(belle_sip_stack_t * stack
if (use_transaction){
belle_sip_message_remove_header(BELLE_SIP_MESSAGE(req),BELLE_SIP_AUTHORIZATION);
belle_sip_message_remove_header(BELLE_SIP_MESSAGE(req),BELLE_SIP_PROXY_AUTHORIZATION);
belle_sip_provider_add_authorization(prov,req,NULL); /*just in case*/
belle_sip_provider_add_authorization(prov,req,NULL,NULL); /*just in case*/
belle_sip_client_transaction_t *t=belle_sip_provider_create_client_transaction(prov,req);
belle_sip_client_transaction_send_request(t);
}else belle_sip_provider_send_request(prov,req);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment