LinphoneManager: ask user for password if login fails due to bad credentials

This commit is contained in:
Gautier Pelloux-Prayer 2015-10-06 10:20:35 +02:00
parent 3759f08516
commit 31c9c5fd0e
2 changed files with 58 additions and 7 deletions

View file

@ -485,12 +485,23 @@ extern void linphone_iphone_log_handler(int lev, const char *fmt, va_list args);
linphone_proxy_config_set_expires(proxyCfg, expire);
// setup auth info
LinphoneAddress *from = linphone_address_new(identity);
if (from != 0) {
const char *userid_str = (userID != nil) ? [userID UTF8String] : NULL;
info = linphone_auth_info_new(linphone_address_get_username(from), userid_str, password ? password : NULL,
password ? NULL : ha1, NULL, linphone_proxy_config_get_domain(proxyCfg));
linphone_address_destroy(from);
if (linphone_core_get_auth_info_list(lc)) {
info = linphone_auth_info_clone(linphone_core_get_auth_info_list(lc)->data);
linphone_auth_info_set_username(info, username.UTF8String);
if (password) {
linphone_auth_info_set_passwd(info, password);
linphone_auth_info_set_ha1(info, NULL);
}
linphone_auth_info_set_domain(info, linphone_proxy_config_get_domain(proxyCfg));
} else {
LinphoneAddress *from = linphone_address_new(identity);
if (from) {
const char *userid_str = (userID != nil) ? [userID UTF8String] : NULL;
info = linphone_auth_info_new(
linphone_address_get_username(from), userid_str, password ? password : NULL, password ? NULL : ha1,
linphone_proxy_config_get_realm(proxyCfg), linphone_proxy_config_get_domain(proxyCfg));
linphone_address_destroy(from);
}
}
// We reached here without hitting the goto: the new settings are correct, so replace the previous ones.

View file

@ -41,6 +41,8 @@
#import "LinphoneIOSVersion.h"
#import <AVFoundation/AVAudioPlayer.h>
#import "Utils/DTFoundation/DTAlertView.h"
#import "PhoneMainView.h"
#define LINPHONE_LOGS_MAX_ENTRY 5000
@ -884,6 +886,44 @@ static void linphone_iphone_registration_state(LinphoneCore *lc, LinphoneProxyCo
[(__bridge LinphoneManager *)linphone_core_get_user_data(lc) onRegister:lc cfg:cfg state:state message:message];
}
#pragma mark - Auth info Function
static void linphone_iphone_popup_password_request(LinphoneCore *lc, const char *realm, const char *username,
const char *domain) {
// let the wizard handle its own errors
if ([PhoneMainView.instance currentView] != WizardViewController.compositeViewDescription) {
DTAlertView *alertView = [[DTAlertView alloc]
initWithTitle:NSLocalizedString(@"Authentication needed.", nil)
message:[NSString stringWithFormat:NSLocalizedString(@"Registration failed because authentication is "
@"missing or invalid for %s@%s.\nYou can "
@"provide password again, or check your "
@"account configuration in the settings.",
nil),
username, realm]];
alertView.alertViewStyle = UIAlertViewStyleSecureTextInput;
[alertView addCancelButtonWithTitle:NSLocalizedString(@"Cancel", nil) block:nil];
__weak UITextField *passwordField = [alertView textFieldAtIndex:0];
[alertView addButtonWithTitle:NSLocalizedString(@"Continue", nil)
block:^{
LinphoneAuthInfo *info = (LinphoneAuthInfo *)linphone_core_find_auth_info(
[LinphoneManager getLc], realm, username, domain);
if (info) {
linphone_auth_info_set_passwd(info, passwordField.text.UTF8String);
linphone_auth_info_set_ha1(info, NULL);
linphone_proxy_config_refresh_register(
linphone_core_get_default_proxy_config([LinphoneManager getLc]));
} else {
LOGE(@"Could not find auth info associated with %s@%s, going to settings!",
username, domain);
[[PhoneMainView instance]
changeCurrentView:[SettingsViewController compositeViewDescription]];
}
}];
[alertView show];
}
}
#pragma mark - Text Received Functions
- (void)onMessageReceived:(LinphoneCore *)lc room:(LinphoneChatRoom *)room message:(LinphoneChatMessage *)msg {
@ -1254,7 +1294,7 @@ static LinphoneCoreVTable linphonec_vtable = {.show = NULL,
.registration_state_changed = linphone_iphone_registration_state,
.notify_presence_received = NULL,
.new_subscription_requested = NULL,
.auth_info_requested = NULL,
.auth_info_requested = linphone_iphone_popup_password_request,
.display_status = linphone_iphone_display_status,
.display_message = linphone_iphone_log_user_info,
.display_warning = linphone_iphone_log_user_warning,