diff --git a/coreapi/authentication.c b/coreapi/authentication.c index e55ab495a..fc27142db 100644 --- a/coreapi/authentication.c +++ b/coreapi/authentication.c @@ -24,12 +24,8 @@ #include "linphonecore.h" #include "private.h" -#include -#include #include "lpconfig.h" -extern LinphoneProxyConfig *linphone_core_get_proxy_config_from_rid(LinphoneCore *lc, int rid); - /** * @addtogroup authentication * @{ @@ -211,21 +207,6 @@ LinphoneAuthInfo *linphone_core_find_auth_info(LinphoneCore *lc, const char *rea return ret; } -static void refresh_exosip_auth_info(LinphoneCore *lc){ - MSList *elem; - eXosip_lock(); - eXosip_clear_authentication_info(); - for (elem=lc->auth_info;elem!=NULL;elem=ms_list_next(elem)){ - LinphoneAuthInfo *info=(LinphoneAuthInfo*)elem->data; - char *userid; - if (info->userid==NULL || info->userid[0]=='\0') userid=info->username; - else userid=info->userid; - eXosip_add_authentication_info(info->username,userid, - info->passwd,info->ha1,info->realm); - } - eXosip_unlock(); -} - /** * Adds authentication information to the LinphoneCore. * @@ -249,8 +230,23 @@ void linphone_core_add_auth_info(LinphoneCore *lc, LinphoneAuthInfo *info) }else { lc->auth_info=ms_list_append(lc->auth_info,(void *)info); } - refresh_exosip_auth_info(lc); - /* if the user was prompted, re-allow automatic_action */ + /* retry pending authentication operations */ + for(elem=sal_get_pending_auths(lc->sal);elem!=NULL;elem=elem->next){ + const char *username,*realm; + SalOp *op=(SalOp*)elem->data; + LinphoneAuthInfo *ai; + sal_op_get_auth_requested(op,&realm,&username); + ai=linphone_core_find_auth_info(lc,realm,username); + if (ai){ + SalAuthInfo sai; + sai.username=ai->username; + sai.userid=ai->userid; + sai.realm=ai->realm; + sai.password=ai->passwd; + sal_op_authenticate(op,&sai); + ai->usecount++; + } + } } @@ -259,7 +255,6 @@ void linphone_core_add_auth_info(LinphoneCore *lc, LinphoneAuthInfo *info) * from the auth_info_requested callback of LinphoneCoreVTable. **/ void linphone_core_abort_authentication(LinphoneCore *lc, LinphoneAuthInfo *info){ - if (lc->automatic_action>0) lc->automatic_action--; } /** @@ -280,8 +275,6 @@ void linphone_core_remove_auth_info(LinphoneCore *lc, LinphoneAuthInfo *info){ for (elem=lc->auth_info,i=0;elem!=NULL;elem=ms_list_next(elem),i++){ linphone_auth_info_write_config(lc->config,(LinphoneAuthInfo*)elem->data,i); } - refresh_exosip_auth_info(lc); - } /** @@ -297,9 +290,6 @@ const MSList *linphone_core_get_auth_info_list(const LinphoneCore *lc){ void linphone_core_clear_all_auth_info(LinphoneCore *lc){ MSList *elem; int i; - eXosip_lock(); - eXosip_clear_authentication_info(); - eXosip_unlock(); for(i=0,elem=lc->auth_info;elem!=NULL;elem=ms_list_next(elem),i++){ LinphoneAuthInfo *info=(LinphoneAuthInfo*)elem->data; linphone_auth_info_destroy(info); @@ -309,84 +299,6 @@ void linphone_core_clear_all_auth_info(LinphoneCore *lc){ lc->auth_info=NULL; } -void linphone_authentication_ok(LinphoneCore *lc, eXosip_event_t *ev){ - char *prx_realm=NULL,*www_realm=NULL; - osip_proxy_authorization_t *prx_auth; - osip_authorization_t *www_auth; - osip_message_t *msg=ev->request; - char *username; - LinphoneAuthInfo *as=NULL; - - username=osip_uri_get_username(msg->from->url); - osip_message_get_proxy_authorization(msg,0,&prx_auth); - osip_message_get_authorization(msg,0,&www_auth); - if (prx_auth!=NULL) - prx_realm=osip_proxy_authorization_get_realm(prx_auth); - if (www_auth!=NULL) - www_realm=osip_authorization_get_realm(www_auth); - - if (prx_realm==NULL && www_realm==NULL){ - ms_message("No authentication info in the request, ignoring"); - return; - } - /* see if we already have this auth information , not to ask it everytime to the user */ - if (prx_realm!=NULL) - as=linphone_core_find_auth_info(lc,prx_realm,username); - if (www_realm!=NULL) - as=linphone_core_find_auth_info(lc,www_realm,username); - if (as){ - ms_message("Authentication for user=%s realm=%s is working.",username,prx_realm ? prx_realm : www_realm); - as->works=TRUE; - } -} - - -void linphone_core_find_or_ask_for_auth_info(LinphoneCore *lc,const char *username,const char* realm, int tid) -{ - LinphoneAuthInfo *as=linphone_core_find_auth_info(lc,realm,username); - if ( as==NULL || (as!=NULL && as->works==FALSE && as->first_time==FALSE)){ - if (lc->vtable.auth_info_requested!=NULL){ - lc->vtable.auth_info_requested(lc,realm,username); - lc->automatic_action++;/*suspends eXosip_automatic_action until the user supplies a password */ - } - } - if (as) as->first_time=FALSE; -} - -void linphone_process_authentication(LinphoneCore *lc, eXosip_event_t *ev) -{ - char *prx_realm=NULL,*www_realm=NULL; - osip_proxy_authenticate_t *prx_auth; - osip_www_authenticate_t *www_auth; - osip_message_t *resp=ev->response; - char *username; - - /* - if (strcmp(ev->request->sip_method,"REGISTER")==0) { - gstate_new_state(lc, GSTATE_REG_FAILED, "Authentication required"); - } - */ - - username=osip_uri_get_username(resp->from->url); - prx_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->proxy_authenticates,0); - www_auth=(osip_proxy_authenticate_t*)osip_list_get(&resp->www_authenticates,0); - if (prx_auth!=NULL) - prx_realm=osip_proxy_authenticate_get_realm(prx_auth); - if (www_auth!=NULL) - www_realm=osip_www_authenticate_get_realm(www_auth); - - if (prx_realm==NULL && www_realm==NULL){ - ms_warning("No realm in the server response."); - return; - } - /* see if we already have this auth information , not to ask it everytime to the user */ - if (prx_realm!=NULL) - linphone_core_find_or_ask_for_auth_info(lc,username,prx_realm,ev->tid); - if (www_realm!=NULL) - linphone_core_find_or_ask_for_auth_info(lc,username,www_realm,ev->tid); -} - - /** * @} **/ diff --git a/coreapi/general_state.c b/coreapi/general_state.c index 7cf713773..210037887 100644 --- a/coreapi/general_state.c +++ b/coreapi/general_state.c @@ -24,7 +24,7 @@ #include "linphonecore.h" - +#include "private.h" #if 0 static const char *_gstates_text[] = { "GSTATE_POWER_OFF", /* 0 */ diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index 88e502751..e76f2c248 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -465,11 +465,12 @@ void sal_op_authenticate(SalOp *h, const SalAuthInfo *info){ const char *userid; if (info->userid==NULL || info->userid[0]=='\0') userid=info->username; else userid=info->userid; - eXosip_lock(); eXosip_add_authentication_info (info->username,userid, info->password, NULL,info->realm); + eXosip_lock(); eXosip_default_action(h->pending_auth); eXosip_unlock(); + eXosip_clear_authentication_info(); eXosip_event_free(h->pending_auth); h->pending_auth=NULL; } diff --git a/coreapi/siplogin.c b/coreapi/siplogin.c index 528e3f328..0037fa1d6 100644 --- a/coreapi/siplogin.c +++ b/coreapi/siplogin.c @@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #endif #include "linphonecore.h" +#include "private.h" #include static void sip_login_init_instance(SipSetupContext *ctx){