diff --git a/console/linphonec.c b/console/linphonec.c
index 6564bcb5b..1677760dd 100644
--- a/console/linphonec.c
+++ b/console/linphonec.c
@@ -117,8 +117,7 @@ static char **linephonec_readline_completion(const char *text,
#endif
/* These are callback for linphone core */
-static void linphonec_prompt_for_auth(LinphoneCore *lc, const char *realm,
- const char *username);
+static void linphonec_prompt_for_auth(LinphoneCore *lc, const char *realm, const char *username, const char *domain);
static void linphonec_display_refer (LinphoneCore * lc, const char *refer_to);
static void linphonec_display_something (LinphoneCore * lc, const char *something);
static void linphonec_display_url (LinphoneCore * lc, const char *something, const char *url);
@@ -256,7 +255,7 @@ linphonec_display_url (LinphoneCore * lc, const char *something, const char *url
* Linphone core callback
*/
static void
-linphonec_prompt_for_auth(LinphoneCore *lc, const char *realm, const char *username)
+linphonec_prompt_for_auth(LinphoneCore *lc, const char *realm, const char *username, const char *domain)
{
/* no prompt possible when using pipes or tcp mode*/
if (unix_socket){
diff --git a/coreapi/authentication.c b/coreapi/authentication.c
index 6095b1bc6..fd4e30c1c 100644
--- a/coreapi/authentication.c
+++ b/coreapi/authentication.c
@@ -37,9 +37,7 @@
* The object can be created empty, that is with all arguments set to NULL.
* Username, userid, password and realm can be set later using specific methods.
**/
-LinphoneAuthInfo *linphone_auth_info_new(const char *username, const char *userid,
- const char *passwd, const char *ha1,const char *realm)
-{
+LinphoneAuthInfo *linphone_auth_info_new(const char *username, const char *userid, const char *passwd, const char *ha1,const char *realm){
LinphoneAuthInfo *obj=ms_new0(LinphoneAuthInfo,1);
if (username!=NULL && (strlen(username)>0) ) obj->username=ms_strdup(username);
if (userid!=NULL && (strlen(userid)>0)) obj->userid=ms_strdup(userid);
@@ -57,6 +55,7 @@ static LinphoneAuthInfo *linphone_auth_info_clone(const LinphoneAuthInfo *ai){
if (ai->passwd) obj->passwd=ms_strdup(ai->passwd);
if (ai->ha1) obj->ha1=ms_strdup(ai->ha1);
if (ai->realm) obj->realm=ms_strdup(ai->realm);
+ if (ai->domain) obj->domain=ms_strdup(ai->domain);
obj->works=FALSE;
obj->usecount=0;
return obj;
@@ -83,6 +82,11 @@ const char *linphone_auth_info_get_userid(const LinphoneAuthInfo *i){
const char *linphone_auth_info_get_realm(const LinphoneAuthInfo *i){
return i->realm;
}
+
+const char *linphone_auth_info_get_domain(const LinphoneAuthInfo *i){
+ return i->domain;
+}
+
const char *linphone_auth_info_get_ha1(const LinphoneAuthInfo *i){
return i->ha1;
}
@@ -121,7 +125,7 @@ void linphone_auth_info_set_userid(LinphoneAuthInfo *info, const char *userid){
}
/**
- * Sets realm.
+ * Set realm.
**/
void linphone_auth_info_set_realm(LinphoneAuthInfo *info, const char *realm){
if (info->realm){
@@ -130,6 +134,19 @@ void linphone_auth_info_set_realm(LinphoneAuthInfo *info, const char *realm){
}
if (realm && strlen(realm)>0) info->realm=ms_strdup(realm);
}
+
+/**
+ * Set domain for which this authentication is valid. This should not be necessary because realm is supposed to be unique and sufficient.
+ * However, many SIP servers don't set realm correctly, then domain has to be used to distinguish between several SIP account bearing the same username.
+**/
+void linphone_auth_info_set_domain(LinphoneAuthInfo *info, const char *domain){
+ if (info->domain){
+ ms_free(info->domain);
+ info->domain=NULL;
+ }
+ if (domain && strlen(domain)>0) info->domain=ms_strdup(domain);
+}
+
/**
* Sets ha1.
**/
@@ -150,6 +167,7 @@ void linphone_auth_info_destroy(LinphoneAuthInfo *obj){
if (obj->passwd!=NULL) ms_free(obj->passwd);
if (obj->ha1!=NULL) ms_free(obj->ha1);
if (obj->realm!=NULL) ms_free(obj->realm);
+ if (obj->domain!=NULL) ms_free(obj->domain);
ms_free(obj);
}
@@ -181,12 +199,16 @@ void linphone_auth_info_write_config(LpConfig *config, LinphoneAuthInfo *obj, in
if (obj->realm!=NULL){
lp_config_set_string(config,key,"realm",obj->realm);
}
+ if (obj->domain!=NULL){
+ lp_config_set_string(config,key,"domain",obj->domain);
+ }
}
LinphoneAuthInfo *linphone_auth_info_new_from_config_file(LpConfig * config, int pos)
{
char key[50];
- const char *username,*userid,*passwd,*ha1,*realm;
+ const char *username,*userid,*passwd,*ha1,*realm,*domain;
+ LinphoneAuthInfo *ret;
sprintf(key,"auth_info_%i",pos);
if (!lp_config_has_section(config,key)){
@@ -198,14 +220,10 @@ LinphoneAuthInfo *linphone_auth_info_new_from_config_file(LpConfig * config, int
passwd=lp_config_get_string(config,key,"passwd",NULL);
ha1=lp_config_get_string(config,key,"ha1",NULL);
realm=lp_config_get_string(config,key,"realm",NULL);
- return linphone_auth_info_new(username,userid,passwd,ha1,realm);
-}
-
-static bool_t key_match(const char *tmp1, const char *tmp2){
- if (tmp1==NULL && tmp2==NULL) return TRUE;
- if (tmp1!=NULL && tmp2!=NULL && strcmp(tmp1,tmp2)==0) return TRUE;
- return FALSE;
-
+ domain=lp_config_get_string(config,key,"domain",NULL);
+ ret=linphone_auth_info_new(username,userid,passwd,ha1,realm);
+ linphone_auth_info_set_domain(ret,domain);
+ return ret;
}
static char * remove_quotes(char * input){
@@ -234,41 +252,56 @@ static int realm_match(const char *realm1, const char *realm2){
return FALSE;
}
-/**
- * Retrieves a LinphoneAuthInfo previously entered into the LinphoneCore.
-**/
-const LinphoneAuthInfo *linphone_core_find_auth_info(LinphoneCore *lc, const char *realm, const char *username)
-{
+static const LinphoneAuthInfo *find_auth_info(LinphoneCore *lc, const char *username, const char *realm, const char *domain){
MSList *elem;
- LinphoneAuthInfo *ret=NULL,*candidate=NULL;
+ const LinphoneAuthInfo *ret=NULL;
+
for (elem=lc->auth_info;elem!=NULL;elem=elem->next){
LinphoneAuthInfo *pinfo=(LinphoneAuthInfo*)elem->data;
- if (realm==NULL){
- /*return the authinfo for any realm provided that there is only one for that username*/
- if (key_match(pinfo->username,username)){
- if (ret!=NULL){
- ms_warning("There are several auth info for username '%s'",username);
- return NULL;
+ if (username && pinfo->username && strcmp(username,pinfo->username)==0){
+ if (realm && domain){
+ if (pinfo->realm && strcmp(realm,pinfo->realm)==0
+ && pinfo->domain && strcmp(domain,pinfo->domain)==0){
+ return pinfo;
}
- ret=pinfo;
- }
- }else{
- /*return the exact authinfo, or an authinfo for which realm was not supplied yet*/
- if (pinfo->realm!=NULL){
- if (realm_match(pinfo->realm,realm)
- && key_match(pinfo->username,username))
+ }else if (realm){
+ if (pinfo->realm && realm_match(realm,pinfo->realm)){
+ if (ret!=NULL){
+ ms_warning("Non unique realm found for %s",username);
+ return NULL;
+ }
ret=pinfo;
- }else{
- if (key_match(pinfo->username,username))
- candidate=pinfo;
- }
+ }
+ }else return pinfo;
}
}
- if (ret==NULL && candidate!=NULL)
- ret=candidate;
return ret;
}
+/**
+ * Find authentication info matching realm, username, domain criterias.
+ * First of all, (realm,username) pair are searched. If multiple results (which should not happen because realm are supposed to be unique), then domain is added to the search.
+ * @param lc the LinphoneCore
+ * @param realm the authentication 'realm' (optional)
+ * @param username the SIP username to be authenticated (mandatory)
+ * @param domain the SIP domain name (optional)
+ * @return a #LinphoneAuthInfo
+**/
+const LinphoneAuthInfo *linphone_core_find_auth_info(LinphoneCore *lc, const char *realm, const char *username, const char *domain){
+ const LinphoneAuthInfo *ai=NULL;
+ if (realm){
+ ai=find_auth_info(lc,username,realm,NULL);
+ if (ai==NULL && domain){
+ ai=find_auth_info(lc,username,realm,domain);
+
+ }
+ }
+ if (ai==NULL){
+ ai=find_auth_info(lc,username,NULL,NULL);
+ }
+ return ai;
+}
+
static void write_auth_infos(LinphoneCore *lc){
MSList *elem;
int i;
@@ -297,7 +330,7 @@ void linphone_core_add_auth_info(LinphoneCore *lc, const LinphoneAuthInfo *info)
MSList *l;
/* find if we are attempting to modify an existing auth info */
- ai=(LinphoneAuthInfo*)linphone_core_find_auth_info(lc,info->realm,info->username);
+ ai=(LinphoneAuthInfo*)linphone_core_find_auth_info(lc,info->realm,info->username,info->domain);
if (ai!=NULL){
lc->auth_info=ms_list_remove(lc->auth_info,ai);
linphone_auth_info_destroy(ai);
@@ -309,7 +342,7 @@ void linphone_core_add_auth_info(LinphoneCore *lc, const LinphoneAuthInfo *info)
SalOp *op=(SalOp*)elem->data;
LinphoneAuthInfo *ai;
sal_op_get_auth_requested(op,&realm,&username);
- ai=(LinphoneAuthInfo*)linphone_core_find_auth_info(lc,realm,username);
+ ai=(LinphoneAuthInfo*)linphone_core_find_auth_info(lc,realm,username,info->domain);
if (ai){
SalAuthInfo sai;
MSList* proxy;
@@ -346,7 +379,7 @@ void linphone_core_abort_authentication(LinphoneCore *lc, LinphoneAuthInfo *inf
**/
void linphone_core_remove_auth_info(LinphoneCore *lc, const LinphoneAuthInfo *info){
LinphoneAuthInfo *r;
- r=(LinphoneAuthInfo*)linphone_core_find_auth_info(lc,info->realm,info->username);
+ r=(LinphoneAuthInfo*)linphone_core_find_auth_info(lc,info->realm,info->username,info->domain);
if (r){
lc->auth_info=ms_list_remove(lc->auth_info,r);
/*printf("len=%i newlen=%i\n",len,newlen);*/
diff --git a/coreapi/bellesip_sal/sal_impl.c b/coreapi/bellesip_sal/sal_impl.c
index 617af211e..d43bc4878 100644
--- a/coreapi/bellesip_sal/sal_impl.c
+++ b/coreapi/bellesip_sal/sal_impl.c
@@ -433,15 +433,8 @@ void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs){
ctx->callbacks.call_released=(SalOnCallReleased)unimplemented_stub;
if (ctx->callbacks.call_updating==NULL)
ctx->callbacks.call_updating=(SalOnCallUpdating)unimplemented_stub;
- if (ctx->callbacks.auth_requested_legacy==NULL)
- ctx->callbacks.auth_requested_legacy=(SalOnAuthRequestedLegacy)unimplemented_stub;
-#ifdef USE_BELLESIP
if (ctx->callbacks.auth_failure==NULL)
ctx->callbacks.auth_failure=(SalOnAuthFailure)unimplemented_stub;
-#else
- if (ctx->callbacks.auth_success==NULL)
- ctx->callbacks.auth_success=(SalOnAuthSuccess)unimplemented_stub;
-#endif
if (ctx->callbacks.register_success==NULL)
ctx->callbacks.register_success=(SalOnRegisterSuccess)unimplemented_stub;
if (ctx->callbacks.register_failure==NULL)
@@ -702,8 +695,9 @@ const char * sal_get_dns_user_hosts_file(const Sal *sal) {
SalAuthInfo* sal_auth_info_create(belle_sip_auth_event_t* event) {
SalAuthInfo* auth_info = sal_auth_info_new();
- auth_info->realm = ms_strdup(belle_sip_auth_event_get_realm(event)) ;
- auth_info->username = ms_strdup(belle_sip_auth_event_get_username(event)) ;
+ auth_info->realm = ms_strdup(belle_sip_auth_event_get_realm(event));
+ auth_info->username = ms_strdup(belle_sip_auth_event_get_username(event));
+ auth_info->domain = ms_strdup(belle_sip_auth_event_get_domain(event));
return auth_info;
}
diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c
index fe57a5dfd..ecd9f18a0 100644
--- a/coreapi/callbacks.c
+++ b/coreapi/callbacks.c
@@ -718,68 +718,17 @@ static void call_released(SalOp *op){
}else ms_error("call_released() for already destroyed call ?");
}
-static void auth_requested_legacy(SalOp *h, const char *realm, const char *username){
- LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(h));
- LinphoneAuthInfo *ai=(LinphoneAuthInfo*)linphone_core_find_auth_info(lc,realm,username);
- LinphoneCall *call=is_a_linphone_call(sal_op_get_user_pointer(h));
-
- if (call && call->ping_op==h){
- /*don't request authentication for ping requests. Their purpose is just to get any
- * answer to get the Via's received and rport parameters.
- */
- ms_message("auth_requested(): ignored for ping request.");
- return;
- }
-
- ms_message("auth_requested() for realm=%s, username=%s",realm,username);
-
- if (ai && ai->works==FALSE && ai->usecount>=3){
- /*case we tried 3 times to authenticate, without success */
- /*Better is to stop (implemeted below in else statement), and retry later*/
- if (ms_time(NULL)-ai->last_use_time>30){
- ai->usecount=0; /*so that we can allow to retry */
- }
- }
-
- if (ai && (ai->works || ai->usecount<3)){
- SalAuthInfo sai;
- sai.username=ai->username;
- sai.userid=ai->userid;
- sai.realm=ai->realm;
- sai.password=ai->passwd;
- ms_message("auth_requested(): authenticating realm=%s, username=%s",realm,username);
- sal_op_authenticate(h,&sai);
- ai->usecount++;
- ai->last_use_time=ms_time(NULL);
- }else{
- if (ai && ai->works==FALSE) {
- sal_op_cancel_authentication(h);
- }
- if (lc->vtable.auth_info_requested)
- lc->vtable.auth_info_requested(lc,realm,username);
- }
-}
-#ifdef USE_BELLESIP
static void auth_failure(SalOp *op, SalAuthInfo* info) {
LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(op));
- LinphoneAuthInfo *ai=(LinphoneAuthInfo*)linphone_core_find_auth_info(lc,info->realm,info->username);
+ LinphoneAuthInfo *ai=(LinphoneAuthInfo*)linphone_core_find_auth_info(lc,info->realm,info->username,info->domain);
if (ai){
- ms_message("%s/%s authentication fails.",info->realm,info->username);
+ ms_message("%s/%s/%s authentication fails.",info->realm,info->username,info->domain);
}
if (lc->vtable.auth_info_requested) {
- lc->vtable.auth_info_requested(lc,info->realm,info->username);
+ lc->vtable.auth_info_requested(lc,info->realm,info->username,info->domain);
}
}
-#else
-static void auth_success(SalOp *h, const char *realm, const char *username){
- LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(h));
- LinphoneAuthInfo *ai=(LinphoneAuthInfo*)linphone_core_find_auth_info(lc,realm,username);
- if (ai){
- ms_message("%s/%s authentication works.",realm,username);
- ai->works=TRUE;
- }
-}
-#endif
+
static void register_success(SalOp *op, bool_t registered){
LinphoneCore *lc=(LinphoneCore *)sal_get_user_pointer(sal_op_get_sal(op));
LinphoneProxyConfig *cfg=(LinphoneProxyConfig*)sal_op_get_user_pointer(op);
@@ -837,13 +786,6 @@ static void register_failure(SalOp *op, SalError error, SalReason reason, const
cfg->publish_op=NULL;
cfg->send_publish=cfg->publish;
}
- if (error== SalErrorFailure && reason == SalReasonForbidden) {
- const char *realm=NULL,*username=NULL;
- if (sal_op_get_auth_requested(op,&realm,&username)==0){
- if (lc->vtable.auth_info_requested)
- lc->vtable.auth_info_requested(lc,realm,username);
- }
- }
}
static void vfu_request(SalOp *op){
@@ -961,7 +903,7 @@ static void ping_reply(SalOp *op){
}
static bool_t fill_auth_info(LinphoneCore *lc, SalAuthInfo* sai) {
- LinphoneAuthInfo *ai=(LinphoneAuthInfo*)linphone_core_find_auth_info(lc,sai->realm,sai->username);
+ LinphoneAuthInfo *ai=(LinphoneAuthInfo*)linphone_core_find_auth_info(lc,sai->realm,sai->username,sai->domain);
if (ai) {
sai->userid=ms_strdup(ai->userid?ai->userid:ai->username);
sai->password=ai->passwd?ms_strdup(ai->passwd):NULL;
@@ -979,7 +921,7 @@ static bool_t auth_requested(Sal* sal, SalAuthInfo* sai) {
return TRUE;
} else {
if (lc->vtable.auth_info_requested) {
- lc->vtable.auth_info_requested(lc,sai->realm,sai->username);
+ lc->vtable.auth_info_requested(lc,sai->realm,sai->username,sai->domain);
if (fill_auth_info(lc,sai)) {
return TRUE;
}
@@ -1145,12 +1087,7 @@ SalCallbacks linphone_sal_callbacks={
call_terminated,
call_failure,
call_released,
- auth_requested_legacy,
-#ifdef USE_BELLESIP
auth_failure,
-#else
- auth_success,
-#endif
register_success,
register_failure,
vfu_request,
diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h
index dbf3779ec..94a4297ec 100644
--- a/coreapi/linphonecore.h
+++ b/coreapi/linphonecore.h
@@ -856,12 +856,14 @@ LINPHONE_PUBLIC void linphone_auth_info_set_passwd(LinphoneAuthInfo *info, const
LINPHONE_PUBLIC void linphone_auth_info_set_username(LinphoneAuthInfo *info, const char *username);
LINPHONE_PUBLIC void linphone_auth_info_set_userid(LinphoneAuthInfo *info, const char *userid);
LINPHONE_PUBLIC void linphone_auth_info_set_realm(LinphoneAuthInfo *info, const char *realm);
+LINPHONE_PUBLIC void linphone_auth_info_set_domain(LinphoneAuthInfo *info, const char *domain);
LINPHONE_PUBLIC void linphone_auth_info_set_ha1(LinphoneAuthInfo *info, const char *ha1);
LINPHONE_PUBLIC const char *linphone_auth_info_get_username(const LinphoneAuthInfo *i);
LINPHONE_PUBLIC const char *linphone_auth_info_get_passwd(const LinphoneAuthInfo *i);
LINPHONE_PUBLIC const char *linphone_auth_info_get_userid(const LinphoneAuthInfo *i);
LINPHONE_PUBLIC const char *linphone_auth_info_get_realm(const LinphoneAuthInfo *i);
+LINPHONE_PUBLIC const char *linphone_auth_info_get_domain(const LinphoneAuthInfo *i);
LINPHONE_PUBLIC const char *linphone_auth_info_get_ha1(const LinphoneAuthInfo *i);
/* you don't need those function*/
@@ -1043,7 +1045,7 @@ typedef void (*LinphoneCoreNewSubscriptionRequestedCb)(LinphoneCore *lc, Linphon
* @param username the username that needs to be authenticated.
* Application shall reply to this callback using linphone_core_add_auth_info().
*/
-typedef void (*LinphoneCoreAuthInfoRequestedCb)(LinphoneCore *lc, const char *realm, const char *username);
+typedef void (*LinphoneCoreAuthInfoRequestedCb)(LinphoneCore *lc, const char *realm, const char *username, const char *domain);
/**
* Callback to notify a new call-log entry has been added.
@@ -1427,10 +1429,10 @@ LINPHONE_PUBLIC int linphone_core_get_default_proxy(LinphoneCore *lc, LinphonePr
* Create an authentication information with default values from Linphone core.
* @param[in] lc #LinphoneCore object
* @param[in] username String containing the username part of the authentication credentials
- * @param[in] userid String containing the username to use to calculate the authentication digest
- * @param[in] passwd String containing the password part of the authentication credentials
- * @param[in] ha1 String containing a hash of the password
- * @param[in] realm String used to discriminate different SIP domains
+ * @param[in] userid String containing the username to use to calculate the authentication digest (optional)
+ * @param[in] passwd String containing the password of the authentication credentials (optional, either passwd or ha1 must be set)
+ * @param[in] ha1 String containing a ha1 hash of the password (optional, either passwd or ha1 must be set)
+ * @param[in] realm String used to discriminate different SIP authentication domains (optional)
* @return #LinphoneAuthInfo with default values set
* @ingroup authentication
*/
@@ -1438,13 +1440,13 @@ LINPHONE_PUBLIC LinphoneAuthInfo * linphone_core_create_auth_info(LinphoneCore *
LINPHONE_PUBLIC void linphone_core_add_auth_info(LinphoneCore *lc, const LinphoneAuthInfo *info);
-void linphone_core_remove_auth_info(LinphoneCore *lc, const LinphoneAuthInfo *info);
+LINPHONE_PUBLIC void linphone_core_remove_auth_info(LinphoneCore *lc, const LinphoneAuthInfo *info);
LINPHONE_PUBLIC const MSList *linphone_core_get_auth_info_list(const LinphoneCore *lc);
-const LinphoneAuthInfo *linphone_core_find_auth_info(LinphoneCore *lc, const char *realm, const char *username);
+LINPHONE_PUBLIC const LinphoneAuthInfo *linphone_core_find_auth_info(LinphoneCore *lc, const char *realm, const char *username, const char *sip_domain);
-void linphone_core_abort_authentication(LinphoneCore *lc, LinphoneAuthInfo *info);
+LINPHONE_PUBLIC void linphone_core_abort_authentication(LinphoneCore *lc, LinphoneAuthInfo *info);
LINPHONE_PUBLIC void linphone_core_clear_all_auth_info(LinphoneCore *lc);
diff --git a/coreapi/private.h b/coreapi/private.h
index bcdc2a565..20397cefc 100644
--- a/coreapi/private.h
+++ b/coreapi/private.h
@@ -417,6 +417,7 @@ struct _LinphoneAuthInfo
char *userid;
char *passwd;
char *ha1;
+ char *domain;
int usecount;
time_t last_use_time;
bool_t works;
diff --git a/coreapi/sal.c b/coreapi/sal.c
index f0d036fe7..49e70b3c6 100644
--- a/coreapi/sal.c
+++ b/coreapi/sal.c
@@ -472,16 +472,18 @@ SalAuthInfo* sal_auth_info_clone(const SalAuthInfo* auth_info) {
new_auth_info->username=auth_info->username?ms_strdup(auth_info->username):NULL;
new_auth_info->userid=auth_info->userid?ms_strdup(auth_info->userid):NULL;
new_auth_info->realm=auth_info->realm?ms_strdup(auth_info->realm):NULL;
+ new_auth_info->domain=auth_info->realm?ms_strdup(auth_info->domain):NULL;
new_auth_info->password=auth_info->password?ms_strdup(auth_info->password):NULL;
return new_auth_info;
}
-void sal_auth_info_delete(const SalAuthInfo* auth_info) {
+void sal_auth_info_delete(SalAuthInfo* auth_info) {
if (auth_info->username) ms_free(auth_info->username);
if (auth_info->userid) ms_free(auth_info->userid);
if (auth_info->realm) ms_free(auth_info->realm);
+ if (auth_info->domain) ms_free(auth_info->domain);
if (auth_info->password) ms_free(auth_info->password);
- ms_free((void*)auth_info);
+ ms_free(auth_info);
}
diff --git a/gtk/loginframe.c b/gtk/loginframe.c
index 08b90fe45..45da5480f 100644
--- a/gtk/loginframe.c
+++ b/gtk/loginframe.c
@@ -102,7 +102,7 @@ void linphone_gtk_show_login_frame(LinphoneProxyConfig *cfg){
linphone_address_set_username(from,username);
}
- ai=linphone_core_find_auth_info(lc,linphone_proxy_config_get_domain(cfg),linphone_address_get_username(from));
+ ai=linphone_core_find_auth_info(lc,linphone_proxy_config_get_domain(cfg),linphone_address_get_username(from),NULL);
/*display the last entered username, if not '?????'*/
if (linphone_address_get_username(from)[0]!='?')
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(mw,"login_username")),
diff --git a/gtk/main.c b/gtk/main.c
index 1de976c9e..fbe8dd698 100644
--- a/gtk/main.c
+++ b/gtk/main.c
@@ -55,7 +55,7 @@ static GtkWidget *the_ui=NULL;
static void linphone_gtk_registration_state_changed(LinphoneCore *lc, LinphoneProxyConfig *cfg, LinphoneRegistrationState rs, const char *msg);
static void linphone_gtk_notify_recv(LinphoneCore *lc, LinphoneFriend * fid);
static void linphone_gtk_new_unknown_subscriber(LinphoneCore *lc, LinphoneFriend *lf, const char *url);
-static void linphone_gtk_auth_info_requested(LinphoneCore *lc, const char *realm, const char *username);
+static void linphone_gtk_auth_info_requested(LinphoneCore *lc, const char *realm, const char *username, const char *domain);
static void linphone_gtk_display_status(LinphoneCore *lc, const char *status);
static void linphone_gtk_display_message(LinphoneCore *lc, const char *msg);
static void linphone_gtk_display_warning(LinphoneCore *lc, const char *warning);
@@ -1021,7 +1021,7 @@ void linphone_gtk_password_ok(GtkWidget *w){
gtk_widget_destroy(window);
}
-static void linphone_gtk_auth_info_requested(LinphoneCore *lc, const char *realm, const char *username){
+static void linphone_gtk_auth_info_requested(LinphoneCore *lc, const char *realm, const char *username, const char *domain){
GtkWidget *w=linphone_gtk_create_window("password");
GtkWidget *label=linphone_gtk_get_widget(w,"message");
LinphoneAuthInfo *info;
@@ -1034,12 +1034,13 @@ static void linphone_gtk_auth_info_requested(LinphoneCore *lc, const char *realm
return;
}
- msg=g_strdup_printf(_("Please enter your password for username %s\n at domain %s:"),
+ msg=g_strdup_printf(_("Please enter your password for username %s\n at realm %s:"),
username,realm);
gtk_label_set_markup(GTK_LABEL(label),msg);
g_free(msg);
gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"userid_entry")),username);
info=linphone_auth_info_new(username, NULL, NULL, NULL,realm);
+ linphone_auth_info_set_domain(info,domain);
g_object_set_data(G_OBJECT(w),"auth_info",info);
g_object_weak_ref(G_OBJECT(w),(GWeakNotify)linphone_auth_info_destroy,info);
gtk_widget_show(w);
diff --git a/include/sal/sal.h b/include/sal/sal.h
index 5871cfdb9..51bb2dcac 100644
--- a/include/sal/sal.h
+++ b/include/sal/sal.h
@@ -336,6 +336,7 @@ typedef struct SalAuthInfo{
char *userid;
char *password;
char *realm;
+ char *domain;
char *ha1;
}SalAuthInfo;
@@ -356,11 +357,7 @@ typedef void (*SalOnCallFailure)(SalOp *op, SalError error, SalReason reason, co
typedef void (*SalOnCallReleased)(SalOp *salop);
typedef void (*SalOnAuthRequestedLegacy)(SalOp *op, const char *realm, const char *username);
typedef bool_t (*SalOnAuthRequested)(Sal *sal,SalAuthInfo* info);
-#ifndef USE_BELLESIP
-typedef void (*SalOnAuthSuccess)(SalOp *op, const char *realm, const char *username);
-#else
typedef void (*SalOnAuthFailure)(SalOp *op, SalAuthInfo* info);
-#endif
typedef void (*SalOnRegisterSuccess)(SalOp *op, bool_t registered);
typedef void (*SalOnRegisterFailure)(SalOp *op, SalError error, SalReason reason, const char *details);
typedef void (*SalOnVfuRequest)(SalOp *op);
@@ -395,12 +392,7 @@ typedef struct SalCallbacks{
SalOnCallTerminated call_terminated;
SalOnCallFailure call_failure;
SalOnCallReleased call_released;
- SalOnAuthRequestedLegacy auth_requested_legacy;
-#ifdef USE_BELLESIP
SalOnAuthFailure auth_failure;
-#else
- SalOnAuthSuccess auth_success;
-#endif
SalOnRegisterSuccess register_success;
SalOnRegisterFailure register_failure;
SalOnVfuRequest vfu_request;
@@ -429,7 +421,7 @@ typedef struct SalCallbacks{
SalAuthInfo* sal_auth_info_new();
SalAuthInfo* sal_auth_info_clone(const SalAuthInfo* auth_info);
-void sal_auth_info_delete(const SalAuthInfo* auth_info);
+void sal_auth_info_delete(SalAuthInfo* auth_info);
LINPHONE_PUBLIC int sal_auth_compute_ha1(const char* userid,const char* realm,const char* password, char ha1[33]);
void sal_set_callbacks(Sal *ctx, const SalCallbacks *cbs);
diff --git a/tester/liblinphone_tester.c b/tester/liblinphone_tester.c
index e795ab254..740d02f4a 100644
--- a/tester/liblinphone_tester.c
+++ b/tester/liblinphone_tester.c
@@ -70,7 +70,7 @@ LinphoneAddress * create_linphone_address(const char * domain) {
return addr;
}
-void auth_info_requested(LinphoneCore *lc, const char *realm, const char *username) {
+void auth_info_requested(LinphoneCore *lc, const char *realm, const char *username, const char *domain) {
stats* counters;
LinphoneAuthInfo *info;
ms_message("Auth info requested for user id [%s] at realm [%s]\n"
diff --git a/tester/liblinphone_tester.h b/tester/liblinphone_tester.h
index 8d80eb2b6..ae1fe453d 100644
--- a/tester/liblinphone_tester.h
+++ b/tester/liblinphone_tester.h
@@ -195,7 +195,7 @@ void text_message_received(LinphoneCore *lc, LinphoneChatRoom *room, const Linph
void message_received(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage* message);
void info_message_received(LinphoneCore *lc, LinphoneCall *call, const LinphoneInfoMessage *msg);
void new_subscription_requested(LinphoneCore *lc, LinphoneFriend *lf, const char *url);
-void auth_info_requested(LinphoneCore *lc, const char *realm, const char *username);
+void auth_info_requested(LinphoneCore *lc, const char *realm, const char *username, const char *domain);
void linphone_subscription_state_change(LinphoneCore *lc, LinphoneEvent *ev, LinphoneSubscriptionState state);
void linphone_publish_state_changed(LinphoneCore *lc, LinphoneEvent *ev, LinphonePublishState state);
void linphone_notify_received(LinphoneCore *lc, LinphoneEvent *lev, const char *eventname, const LinphoneContent *content);
diff --git a/tester/register_tester.c b/tester/register_tester.c
index 043b15c3c..1ee2dc453 100644
--- a/tester/register_tester.c
+++ b/tester/register_tester.c
@@ -268,7 +268,7 @@ static void authenticated_register_with_no_initial_credentials(){
linphone_core_manager_destroy(mgr);
}
-static void auth_info_requested2(LinphoneCore *lc, const char *realm, const char *username) {
+static void auth_info_requested2(LinphoneCore *lc, const char *realm, const char *username, const char *domain) {
stats* counters;
ms_message("Auth info requested for user id [%s] at realm [%s]\n"
,username