From b2b05e4e07983d4dafad20062efea68ac6e20894 Mon Sep 17 00:00:00 2001 From: Ingo Bauersachs Date: Thu, 17 Nov 2011 13:43:31 +0000 Subject: [PATCH] Extract Jabber authentication retry to a separate method --- .../ProtocolProviderServiceJabberImpl.java | 310 +++++++++--------- 1 file changed, 159 insertions(+), 151 deletions(-) diff --git a/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java b/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java index 09ed9dbd4..9b8d1035f 100644 --- a/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java +++ b/src/net/java/sip/communicator/impl/protocol/jabber/ProtocolProviderServiceJabberImpl.java @@ -480,186 +480,122 @@ private void connectAndLogin(SecurityAuthority authority, return; //init the necessary objects - try - { - String userID = null; - - /* with a google account (either gmail or google apps - * related ones), the userID MUST be the full e-mail address - * not just the ID - */ - if(getAccountID().getProtocolDisplayName(). - equals("Google Talk")) - { - userID = getAccountID().getUserID(); - } - else - { - userID = StringUtils.parseName(getAccountID().getUserID()); - } - String serviceName - = StringUtils.parseServer(getAccountID().getUserID()); + String serviceName + = StringUtils.parseServer(getAccountID().getUserID()); - List serverAddresses = new ArrayList(); + List serverAddresses = new ArrayList(); - String serverAddressUserSetting - = getAccountID().getAccountPropertyString( - ProtocolProviderFactory.SERVER_ADDRESS); + String serverAddressUserSetting + = getAccountID().getAccountPropertyString( + ProtocolProviderFactory.SERVER_ADDRESS); - int serverPort = getAccountID().getAccountPropertyInt( - ProtocolProviderFactory.SERVER_PORT, 5222); + int serverPort = getAccountID().getAccountPropertyInt( + ProtocolProviderFactory.SERVER_PORT, 5222); - loadResource(); + loadResource(); - boolean isServerOverriden = - getAccountID().getAccountPropertyBoolean( - ProtocolProviderFactory.IS_SERVER_OVERRIDDEN, false); + boolean isServerOverriden = + getAccountID().getAccountPropertyBoolean( + ProtocolProviderFactory.IS_SERVER_OVERRIDDEN, false); - try + try + { + if(!isServerOverriden) { - if(!isServerOverriden) - { - // check to see is there SRV records for - // this server domain - SRVRecord srvRecords[] = NetworkUtils - .getSRVRecords("xmpp-client", "tcp", serviceName); + // check to see is there SRV records for + // this server domain + SRVRecord srvRecords[] = NetworkUtils + .getSRVRecords("xmpp-client", "tcp", serviceName); - if(srvRecords != null) + if(srvRecords != null) + { + for(int i = 0 ; i < srvRecords.length ; i++) { - for(int i = 0 ; i < srvRecords.length ; i++) - { - serverAddresses.add(srvRecords[i].getTarget()); - } + serverAddresses.add(srvRecords[i].getTarget()); } } + } - // after SRV records, check A/AAAA records - InetSocketAddress addressObj4 = null; - InetSocketAddress addressObj6 = null; - try - { - addressObj4 = NetworkUtils.getARecord( - serverAddressUserSetting, serverPort); - } catch (ParseException ex) + // after SRV records, check A/AAAA records + InetSocketAddress addressObj4 = null; + InetSocketAddress addressObj6 = null; + try + { + addressObj4 = NetworkUtils.getARecord( + serverAddressUserSetting, serverPort); + } catch (ParseException ex) + { + logger.error("Cannot obtain A record for " + + serverAddressUserSetting, ex); + } + try + { + addressObj6 = NetworkUtils.getAAAARecord( + serverAddressUserSetting, serverPort); + } catch (ParseException ex) + { + logger.error("Cannot obtain AAAA record for " + + serverAddressUserSetting, ex); + } + + // add address according their priorities setting + if(Boolean.getBoolean("java.net.preferIPv6Addresses")) + { + if(addressObj6 != null) { - logger.error("Cannot obtain A record for " - + serverAddressUserSetting, ex); + serverAddresses + .add(addressObj6.getAddress().getHostAddress()); } - try + if(addressObj4 != null) { - addressObj6 = NetworkUtils.getAAAARecord( - serverAddressUserSetting, serverPort); - } catch (ParseException ex) - { - logger.error("Cannot obtain AAAA record for " - + serverAddressUserSetting, ex); + serverAddresses + .add(addressObj4.getAddress().getHostAddress()); } - - // add address according their priorities setting - if(Boolean.getBoolean("java.net.preferIPv6Addresses")) + } + else + { + if(addressObj4 != null) { - if(addressObj6 != null) - { - serverAddresses - .add(addressObj6.getAddress().getHostAddress()); - } - if(addressObj4 != null) - { - serverAddresses - .add(addressObj4.getAddress().getHostAddress()); - } + serverAddresses + .add(addressObj4.getAddress().getHostAddress()); } - else + if(addressObj6 != null) { - if(addressObj4 != null) - { - serverAddresses - .add(addressObj4.getAddress().getHostAddress()); - } - if(addressObj6 != null) - { - serverAddresses - .add(addressObj6.getAddress().getHostAddress()); - } + serverAddresses + .add(addressObj6.getAddress().getHostAddress()); } - - serverAddresses.add(serverAddressUserSetting); - } - catch (ParseException ex1) - { - logger.error("Domain not resolved " + ex1.getMessage()); } - Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual); + serverAddresses.add(serverAddressUserSetting); + } + catch (ParseException ex1) + { + logger.error("Domain not resolved " + ex1.getMessage()); + } - loadProxy(); + Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual); - // try connecting to all serverAddresses - // as if connecting with username fails - // try with username@serviceName - for (int i = 0; i < serverAddresses.size(); i++) - { - String currentAddress = serverAddresses.get(i); + loadProxy(); - try - { - ConnectState state = connectAndLogin( - currentAddress, serverPort, serviceName, - userID, password, resource); - - if(state == ConnectState.ABORT_CONNECTING) - return; - else if(state == ConnectState.CONTINUE_TRYING) - continue; - else if(state == ConnectState.STOP_TRYING) - break; - - }catch(XMPPException ex) - { - // server disconnect us after such an error - // cleanup - disconnectAndCleanConnection(); + // try connecting to all serverAddresses + // as if connecting with username fails + // try with username@serviceName + for (int i = 0; i < serverAddresses.size(); i++) + { + String currentAddress = serverAddresses.get(i); - try - { - // after updating to new smack lib - // login mechanisum changed - // this is a way to avoid the problem - - // logging in to google need and service name - ConnectState state = connectAndLogin( - currentAddress, serverPort, serviceName, - userID + "@" + serviceName, - password, resource); - - if(state == ConnectState.ABORT_CONNECTING) - return; - else if(state == ConnectState.CONTINUE_TRYING) - continue; - else if(state == ConnectState.STOP_TRYING) - break; - } catch (XMPPException e) - { - if(isAuthenticationFailed(ex)) - throw ex; + ConnectState state = + connectAndLogin(currentAddress, password, + serviceName, serverPort); - disconnectAndCleanConnection(); + if(state == ConnectState.ABORT_CONNECTING) + return; + else if(state == ConnectState.CONTINUE_TRYING) + return; + else if(state == ConnectState.STOP_TRYING) + break; - // if it happens once again throw - // the original exception - if(i == serverAddresses.size() - 1) - { - throw ex; - } - } - } - } - } - catch (NumberFormatException ex) - { - throw new OperationFailedException("Wrong port", - OperationFailedException.INVALID_ACCOUNT_PROPERTIES, ex); } } @@ -694,6 +630,78 @@ else if(state == ConnectState.STOP_TRYING) } } + /** + * Tries to login to the XMPP server with the supplied user ID. If the + * protocol is Google Talk, the user ID including the service name is used. + * For other protocols, if the login with the user ID without the service + * name fails, a second attempt including the service name is made. + * + * @param currentAddress the IP address to connect to + * @param password the password of the user + * @param serviceName the domain name of the user's login + * @param serverPort the port to connect to + * @throws XMPPException when a failure occurs + */ + private ConnectState connectAndLogin(String currentAddress, + String password, String serviceName, int serverPort) + throws XMPPException + { + String userID = null; + boolean qualifiedUserID; + + /* with a google account (either gmail or google apps + * related ones), the userID MUST be the full e-mail address + * not just the ID + */ + if(getAccountID().getProtocolDisplayName().equals("Google Talk")) + { + userID = getAccountID().getUserID(); + qualifiedUserID = true; + } + else + { + userID = StringUtils.parseName(getAccountID().getUserID()); + qualifiedUserID = false; + } + + try + { + return connectAndLogin( + currentAddress, serverPort, serviceName, + userID, password, resource); + } + catch(XMPPException ex) + { + // server disconnect us after such an error, do cleanup + disconnectAndCleanConnection(); + + //no need to check with a different username if the + //socket could not be opened + if (ex.getWrappedThrowable() instanceof ConnectException) + throw ex; + + // don't attempt to append the service name if it's already there + if (!qualifiedUserID) + { + try + { + // logging in might need the service name + return connectAndLogin( + currentAddress, serverPort, serviceName, + userID + "@" + serviceName, + password, resource); + } + catch(XMPPException ex2) + { + disconnectAndCleanConnection(); + throw ex; //throw the original exception + } + } + else + throw ex; + } + } + /** * Initializes the Jabber Resource identifier. */