mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-05-07 05:53:06 +00:00
update sal op contact with contact generated by the sip stack for the request
This commit is contained in:
parent
730d2cac7d
commit
e9df763949
6 changed files with 43 additions and 20 deletions
|
|
@ -37,6 +37,8 @@ static void sal_add_pending_auth(Sal *sal, SalOp *op){
|
|||
void sal_process_authentication(SalOp *op, belle_sip_response_t *response) {
|
||||
belle_sip_request_t* request;
|
||||
bool_t is_within_dialog=FALSE;
|
||||
belle_sip_list_t* auth_list=NULL;
|
||||
belle_sip_auth_event_t* auth_event;
|
||||
if (op->dialog && belle_sip_dialog_get_state(op->dialog)==BELLE_SIP_DIALOG_CONFIRMED) {
|
||||
request = belle_sip_dialog_create_request_from(op->dialog,(const belle_sip_request_t *)op->request);
|
||||
is_within_dialog=TRUE;
|
||||
|
|
@ -46,7 +48,7 @@ void sal_process_authentication(SalOp *op, belle_sip_response_t *response) {
|
|||
belle_sip_message_remove_header(BELLE_SIP_MESSAGE(request),BELLE_SIP_PROXY_AUTHORIZATION);
|
||||
|
||||
}
|
||||
if (belle_sip_provider_add_authorization(op->base.root->prov,request,response)) {
|
||||
if (belle_sip_provider_add_authorization(op->base.root->prov,request,response,&auth_list)) {
|
||||
if (is_within_dialog) {
|
||||
sal_op_resend_request(op,request);
|
||||
} else {
|
||||
|
|
@ -57,6 +59,12 @@ void sal_process_authentication(SalOp *op, belle_sip_response_t *response) {
|
|||
if (is_within_dialog) {
|
||||
belle_sip_object_unref(request);
|
||||
}
|
||||
if (op->auth_info) sal_auth_info_delete(op->auth_info);
|
||||
auth_event=(belle_sip_auth_event_t*)(auth_list->data);
|
||||
op->auth_info=sal_auth_info_new();
|
||||
op->auth_info->realm = ms_strdup(belle_sip_auth_event_get_realm(auth_event)) ;
|
||||
op->auth_info->username = ms_strdup(belle_sip_auth_event_get_username(auth_event)) ;
|
||||
belle_sip_list_free_with_data(auth_list,(void (*)(void*))belle_sip_auth_event_destroy);
|
||||
sal_add_pending_auth(op->base.root,op);
|
||||
}
|
||||
|
||||
|
|
@ -172,6 +180,8 @@ static void process_response_event(void *user_ctx, const belle_sip_response_even
|
|||
belle_sip_client_transaction_t* client_transaction = belle_sip_response_event_get_client_transaction(event);
|
||||
SalOp* op = (SalOp*)belle_sip_transaction_get_application_data(BELLE_SIP_TRANSACTION(client_transaction));
|
||||
belle_sip_response_t* response = belle_sip_response_event_get_response(event);
|
||||
belle_sip_request_t* request=belle_sip_transaction_get_request(BELLE_SIP_TRANSACTION(client_transaction));
|
||||
belle_sip_header_contact_t* original_contact;
|
||||
belle_sip_header_address_t* contact_address=NULL;
|
||||
belle_sip_header_via_t* via_header;
|
||||
belle_sip_uri_t* contact_uri;
|
||||
|
|
@ -198,19 +208,29 @@ static void process_response_event(void *user_ctx, const belle_sip_response_even
|
|||
received = belle_sip_header_via_get_received(via_header);
|
||||
rport = belle_sip_header_via_get_rport(via_header);
|
||||
if (!sal_op_get_contact(op)) {
|
||||
/*hmm update contact from via*/
|
||||
contact_address=belle_sip_header_address_new();
|
||||
contact_uri=belle_sip_uri_create(NULL,belle_sip_header_via_get_host(via_header));
|
||||
belle_sip_header_address_set_uri(contact_address,contact_uri);
|
||||
/*check if contqct set in reauest*/
|
||||
|
||||
if (strcasecmp(belle_sip_header_via_get_transport(via_header),"UDP")!=0) {
|
||||
belle_sip_uri_set_transport_param(contact_uri,belle_sip_header_via_get_transport_lowercase(via_header));
|
||||
if ((original_contact=belle_sip_message_get_header_by_type(request,belle_sip_header_contact_t))) {
|
||||
/*no contact set yet, try to see if sip tack has an updated one*/
|
||||
contact_address=belle_sip_header_address_create(NULL,belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(original_contact)));
|
||||
sal_op_set_contact_address(op,(const SalAddress *)contact_address);
|
||||
belle_sip_object_unref(contact_address);
|
||||
} else {
|
||||
|
||||
/*hmm update contact from via, maybe useless, some op may not need any contact at all*/
|
||||
contact_address=belle_sip_header_address_new();
|
||||
contact_uri=belle_sip_uri_create(NULL,belle_sip_header_via_get_host(via_header));
|
||||
belle_sip_header_address_set_uri(contact_address,contact_uri);
|
||||
|
||||
if (strcasecmp(belle_sip_header_via_get_transport(via_header),"UDP")!=0) {
|
||||
belle_sip_uri_set_transport_param(contact_uri,belle_sip_header_via_get_transport_lowercase(via_header));
|
||||
}
|
||||
if (belle_sip_header_via_get_listening_port(via_header)
|
||||
!= belle_sip_listening_point_get_well_known_port(belle_sip_header_via_get_transport(via_header))) {
|
||||
belle_sip_uri_set_port(contact_uri,belle_sip_header_via_get_listening_port(via_header) );
|
||||
}
|
||||
contact_updated=TRUE;
|
||||
}
|
||||
if (belle_sip_header_via_get_listening_port(via_header)
|
||||
!= belle_sip_listening_point_get_well_known_port(belle_sip_header_via_get_transport(via_header))) {
|
||||
belle_sip_uri_set_port(contact_uri,belle_sip_header_via_get_listening_port(via_header) );
|
||||
}
|
||||
contact_updated=TRUE;
|
||||
}
|
||||
|
||||
if (received!=NULL || rport>0) {
|
||||
|
|
|
|||
|
|
@ -54,7 +54,7 @@ struct SalOp{
|
|||
belle_sip_response_t* response;
|
||||
belle_sip_server_transaction_t* pending_server_trans;
|
||||
belle_sip_client_transaction_t* pending_inv_client_trans;
|
||||
SalAuthInfo auth_info;
|
||||
SalAuthInfo* auth_info;
|
||||
unsigned long int registration_refresh_timer;
|
||||
bool_t sdp_offering;
|
||||
belle_sip_dialog_t* dialog;
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ void sal_op_release(SalOp *op){
|
|||
if (op->registration_refresh_timer>0) {
|
||||
belle_sip_main_loop_cancel_source(belle_sip_stack_get_main_loop(op->base.root->stack),op->registration_refresh_timer);
|
||||
}
|
||||
if (op->auth_info) sal_auth_info_delete(op->auth_info);
|
||||
__sal_op_free(op);
|
||||
return ;
|
||||
}
|
||||
|
|
@ -46,8 +47,8 @@ void sal_op_cancel_authentication(SalOp *h){
|
|||
}
|
||||
|
||||
int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **username){
|
||||
*realm=op->auth_info.realm;
|
||||
*username=op->auth_info.username;
|
||||
*realm=op->auth_info?op->auth_info->realm:NULL;
|
||||
*username=op->auth_info?op->auth_info->username:NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -130,7 +131,7 @@ int sal_op_send_request(SalOp* op, belle_sip_request_t* request) {
|
|||
if (!belle_sip_message_get_header(BELLE_SIP_MESSAGE(request),BELLE_SIP_AUTHORIZATION)
|
||||
&& !belle_sip_message_get_header(BELLE_SIP_MESSAGE(request),BELLE_SIP_PROXY_AUTHORIZATION)) {
|
||||
/*hmm just in case we already have authentication param in cache*/
|
||||
belle_sip_provider_add_authorization(op->base.root->prov,request,NULL);
|
||||
belle_sip_provider_add_authorization(op->base.root->prov,request,NULL,NULL);
|
||||
}
|
||||
return belle_sip_client_transaction_send_request(client_transaction);
|
||||
|
||||
|
|
|
|||
|
|
@ -50,9 +50,11 @@ static void register_response_event(void *user_ctx, const belle_sip_response_eve
|
|||
|
||||
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, (const void*)original_contact);
|
||||
contact_header_list = belle_sip_list_find_custom((belle_sip_list_t*)contact_header_list,(belle_sip_compare_func)belle_sip_header_contact_not_equals, (const void*)original_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, (const void*)sal_op_get_contact_address(op));
|
||||
/*reset header list*/
|
||||
contact_header_list = belle_sip_message_get_headers(BELLE_SIP_MESSAGE(response),BELLE_SIP_CONTACT);
|
||||
contact_header_list = belle_sip_list_find_custom((belle_sip_list_t*)contact_header_list,(belle_sip_compare_func)belle_sip_header_contact_not_equals, (const void*)sal_op_get_contact_address(op));
|
||||
}
|
||||
if (!contact_header_list) {
|
||||
tmp_string=belle_sip_object_to_string(BELLE_SIP_OBJECT(original_contact));
|
||||
|
|
@ -119,7 +121,6 @@ static void send_register_request_with_expires(SalOp* op, belle_sip_request_t* r
|
|||
|
||||
int sal_register(SalOp *op, const char *proxy, const char *from, int expires){
|
||||
belle_sip_request_t *req;
|
||||
|
||||
sal_op_set_from(op,from);
|
||||
sal_op_set_to(op,from);
|
||||
sal_op_set_route(op,proxy);
|
||||
|
|
|
|||
|
|
@ -4749,7 +4749,7 @@ void sip_config_uninit(LinphoneCore *lc)
|
|||
ms_list_free(config->proxies);
|
||||
config->proxies=NULL;
|
||||
|
||||
linphone_proxy_config_write_to_config_file(lc->config,NULL,i); /*mark the end */
|
||||
/*no longuer need to write proxy config if not changedlinphone_proxy_config_write_to_config_file(lc->config,NULL,i);*/ /*mark the end */
|
||||
|
||||
ms_list_for_each(lc->auth_info,(void (*)(void*))linphone_auth_info_destroy);
|
||||
ms_list_free(lc->auth_info);
|
||||
|
|
|
|||
|
|
@ -186,6 +186,7 @@ int linphone_core_abort_call(LinphoneCore *lc, LinphoneCall *call, const char *e
|
|||
|
||||
int linphone_proxy_config_send_publish(LinphoneProxyConfig *cfg, LinphoneOnlineStatus os);
|
||||
void linphone_proxy_config_set_state(LinphoneProxyConfig *cfg, LinphoneRegistrationState rstate, const char *message);
|
||||
void linphone_proxy_config_write_all_to_config_file(LinphoneCore *lc);
|
||||
|
||||
int linphone_online_status_to_eXosip(LinphoneOnlineStatus os);
|
||||
void linphone_friend_close_subscriptions(LinphoneFriend *lf);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue