/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.java.sip.communicator.plugin.jabberaccregwizz; import java.awt.*; import java.util.*; import java.util.List; import javax.swing.*; import org.jitsi.util.StringUtils; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.plugin.desktoputil.wizard.*; import net.java.sip.communicator.service.credentialsstorage.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.jabber.*; /** * The JabberAccountRegistrationForm. * * @author Yana Stamcheva */ public class JabberAccountRegistrationForm extends TransparentPanel { /** * Serial version UID. */ private static final long serialVersionUID = 0L; private final AccountPanel accountPanel; private final ConnectionPanel connectionPanel; private final SecurityPanel securityPanel; private final IceConfigPanel iceConfigPanel; private final TelephonyConfigPanel telephonyConfigPanel; /** * The panel for encoding settings */ private final EncodingsPanel encodingsPanel; private boolean isModification; private final JabberAccountRegistrationWizard wizard; private final JTabbedPane tabbedPane = new SIPCommTabbedPane(); /** * The panels which value needs validation before we continue. */ private List validatingPanels = new ArrayList(); /** * Creates an instance of JabberAccountRegistrationForm. * @param wizard the parent wizard */ public JabberAccountRegistrationForm(JabberAccountRegistrationWizard wizard) { super(new BorderLayout()); this.wizard = wizard; accountPanel = new AccountPanel(this); connectionPanel = new ConnectionPanel(this); securityPanel = new SecurityPanel( this.getRegistration().getSecurityRegistration(), false); iceConfigPanel = new IceConfigPanel(); telephonyConfigPanel = new TelephonyConfigPanel(); encodingsPanel = new EncodingsPanel(); } /** * Initializes all panels, buttons, etc. */ void init() { this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); JabberAccountCreationFormService createService = getCreateAccountService(); if (createService != null) createService.clear(); if (!JabberAccRegWizzActivator.isAdvancedAccountConfigDisabled()) { // Indicate that this panel is opened in a simple form. accountPanel.setSimpleForm(false); if (accountPanel.getParent() != tabbedPane) tabbedPane.addTab( Resources.getString("service.gui.ACCOUNT"), accountPanel); if (connectionPanel.getParent() != tabbedPane) tabbedPane.addTab(Resources.getString("service.gui.CONNECTION"), connectionPanel); if (securityPanel.getParent() != tabbedPane) tabbedPane.addTab(Resources.getString("service.gui.SECURITY"), securityPanel); if (iceConfigPanel.getParent() != tabbedPane) tabbedPane.addTab(Resources.getString("service.gui.ICE"), iceConfigPanel); if (telephonyConfigPanel.getParent() != tabbedPane) tabbedPane.addTab(Resources.getString("service.gui.TELEPHONY"), telephonyConfigPanel); if (encodingsPanel.getParent() != tabbedPane) tabbedPane.addTab(Resources.getString("" + "plugin.jabberaccregwizz.ENCODINGS"), encodingsPanel); if (tabbedPane.getParent() != this) this.add(tabbedPane, BorderLayout.NORTH); tabbedPane.setSelectedIndex(0); } else add(accountPanel, BorderLayout.NORTH); } /** * Parse the server part from the jabber id and set it to server as default * value. If Advanced option is enabled Do nothing. * @param userName the account user name */ void setServerFieldAccordingToUIN(String userName) { if (!wizard.isModification() && !wizard.getRegistration().isServerOverridden()) { connectionPanel.setServerAddress(getServerFromUserName(userName)); } } /** * Enables/disables the next/finish button of the parent wizard. * @param isEnabled true to enable the next button, false * otherwise */ private void setNextFinishButtonEnabled(boolean isEnabled) { JabberAccRegWizzActivator.getUIService().getAccountRegWizardContainer() .setNextFinishButtonEnabled(isEnabled); } /** * Call this to trigger revalidation of all the input values * and change the state of next/finish button. */ void reValidateInput() { for(ValidatingPanel panel : validatingPanels) { if(!panel.isValidated()) { setNextFinishButtonEnabled(false); return; } } setNextFinishButtonEnabled(true); } /** * Adds panel to the list of panels with values which need validation. * @param panel ValidatingPanel. */ public void addValidatingPanel(ValidatingPanel panel) { validatingPanels.add(panel); } /** * Return the server part of the jabber user name. * * @param userName the username. * @return the server part of the jabber user name. */ static String getServerFromUserName(String userName) { int delimIndex = userName.indexOf("@"); if (delimIndex != -1) { return userName.substring(delimIndex + 1); } return null; } /** * Return the user part of the user name (i.e. the string before the @ * sign). * * @param userName the username. * @return the user part of the jabber user name. */ public static String getUserFromUserName(String userName) { int delimIndex = userName.indexOf("@"); return (delimIndex == -1) ? userName : userName.substring(0, delimIndex); } /** * Returns the server address. * * @return the server address */ String getServerAddress() { return wizard.getRegistration().getServerAddress(); } /** * Indicates if this wizard is modifying an existing account or is creating * a new one. * * @return true to indicate that this wizard is currently in * modification mode, false - otherwise. */ public boolean isModification() { return isModification; } /** * Saves the user input when the "Next" wizard buttons is clicked. * * @param registration the JabberAccountRegistration * @return true if the page is correctly committed */ public boolean commitPage(JabberAccountRegistration registration) { String userID = null; char[] password = null; String serverAddress = null; String serverPort = null; if (accountPanel.isCreateAccount()) { NewAccount newAccount = getCreateAccountService().createAccount(); if (newAccount != null) { userID = newAccount.getUserName(); password = newAccount.getPassword(); serverAddress = newAccount.getServerAddress(); serverPort = newAccount.getServerPort(); if (serverAddress == null) setServerFieldAccordingToUIN(userID); } else { // If we didn't succeed to create our new account, we have // nothing more to do here. return false; } } else { userID = accountPanel.getUsername(); if(userID == null || userID.trim().length() == 0) throw new IllegalStateException("No user ID provided."); if(userID.indexOf('@') < 0 && registration.getDefaultUserSufix() != null) userID = userID + '@' + registration.getDefaultUserSufix(); password = accountPanel.getPassword(); serverAddress = connectionPanel.getServerAddress(); serverPort = connectionPanel.getServerPort(); } registration.setUserID(userID); registration.setRememberPassword(accountPanel.isRememberPassword()); registration.setPassword(new String(password)); registration.setTlsClientCertificate( connectionPanel.getClientTlsCertificateId()); registration.setServerAddress(serverAddress); registration.setServerOverridden(connectionPanel.isServerOverridden()); registration.setSendKeepAlive(connectionPanel.isSendKeepAlive()); registration.setGmailNotificationEnabled( connectionPanel.isGmailNotificationsEnabled()); registration.setGoogleContactsEnabled( connectionPanel.isGoogleContactsEnabled()); registration.setResourceAutogenerated( connectionPanel.isAutogenerateResourceEnabled()); registration.setResource(connectionPanel.getResource()); if (serverPort != null) registration.setServerPort(serverPort); String priority = connectionPanel.getPriority(); if (!StringUtils.isNullOrEmpty(priority)) registration.setPriority(Integer.parseInt(priority)); registration.setDTMFMethod(connectionPanel.getDTMFMethod()); registration.setDtmfMinimalToneDuration( connectionPanel.getDtmfMinimalToneDuration()); securityPanel.commitPanel(registration.getSecurityRegistration()); registration.setUseIce(iceConfigPanel.isUseIce()); registration.setAutoDiscoverStun(iceConfigPanel.isAutoDiscoverStun()); registration.setUseDefaultStunServer( iceConfigPanel.isUseDefaultStunServer()); //we will be reentering all stun servers so let's make sure we clear //the servers vector in case we already did that with a "Next". registration.getAdditionalStunServers().clear(); List stunServers = iceConfigPanel.getAdditionalStunServers(); for (StunServerDescriptor descriptor : stunServers) registration.addStunServer(descriptor); registration.setUseJingleNodes(iceConfigPanel.isUseJingleNodes()); registration.setAutoDiscoverJingleNodes( iceConfigPanel.isAutoDiscoverJingleNodes()); //we will be reentering all Jingle nodes so let's make sure we clear //the servers vector in case we already did that with a "Next". registration.getAdditionalJingleNodes().clear(); List jingleNodes = iceConfigPanel.getAdditionalJingleNodes(); for (JingleNodeDescriptor descriptor : jingleNodes) registration.addJingleNodes(descriptor); registration.setUseUPNP(iceConfigPanel.isUseUPNP()); registration.setAllowNonSecure(connectionPanel.isAllowNonSecure()); registration.setDisableCarbon(connectionPanel.isCarbonDisabled()); registration.setDisableJingle( telephonyConfigPanel.isJingleDisabled()); registration.setTelephonyDomainBypassCaps( telephonyConfigPanel.getTelephonyDomainBypassCaps()); registration.setOverridePhoneSufix( telephonyConfigPanel.getTelephonyDomain()); encodingsPanel.commitPanel(registration.getEncodingsRegistration()); return true; } /** * Loads given registration object. * @param accountReg the account registration object that will be loaded. */ public void loadAccount(JabberAccountRegistration accountReg) { accountPanel.setUsername(accountReg.getUserID()); accountPanel.userIDField.setEnabled(false); String password = accountReg.getPassword(); accountPanel.setPassword(password); accountPanel.setRememberPassword(password != null); String serverAddress = accountReg.getServerAddress(); accountPanel.showChangePasswordPanel(true); connectionPanel.setServerAddress(serverAddress); connectionPanel.setClientTlsCertificateId( accountReg.getTlsClientCertificate()); String serverPort = String.valueOf(accountReg.getServerPort()); connectionPanel.setServerPort(serverPort); connectionPanel.setSendKeepAlive(accountReg.isSendKeepAlive()); connectionPanel.setGmailNotificationsEnabled( accountReg.isGmailNotificationEnabled()); connectionPanel.setGoogleContactsEnabled( accountReg.isGoogleContactsEnabled()); connectionPanel.setResource(accountReg.getResource()); connectionPanel.setAutogenerateResource( accountReg.isResourceAutogenerated()); connectionPanel.setPriority(String.valueOf(accountReg.getPriority())); connectionPanel.setDTMFMethod(accountReg.getDTMFMethod()); connectionPanel.setDtmfMinimalToneDuration( accountReg.getDtmfMinimalToneDuration()); securityPanel.loadAccount(accountReg.getSecurityRegistration()); iceConfigPanel.setUseIce(accountReg.isUseIce()); iceConfigPanel.setAutoDiscoverStun(accountReg.isAutoDiscoverStun()); iceConfigPanel.setUseDefaultStunServer( accountReg.isUseDefaultStunServer()); List stunServers = accountReg.getAdditionalStunServers(); iceConfigPanel.removeAllStunServer(); for(StunServerDescriptor stunServer : stunServers) { iceConfigPanel.addStunServer(stunServer); } iceConfigPanel.setUseJingleNodes(accountReg.isUseJingleNodes()); iceConfigPanel.setAutoDiscoverJingleNodes( accountReg.isAutoDiscoverJingleNodes()); iceConfigPanel.removeAllJingleNodes(); List jingleNodes = accountReg.getAdditionalJingleNodes(); for(JingleNodeDescriptor jingleNode : jingleNodes) { iceConfigPanel.addJingleNodes(jingleNode); } iceConfigPanel.setUseUPNP(accountReg.isUseUPNP()); connectionPanel.setAllowNonSecure(accountReg.isAllowNonSecure()); connectionPanel.setDisableCarbon(accountReg.isCarbonDisabled()); connectionPanel.setServerOverridden(accountReg.isServerOverridden()); telephonyConfigPanel.setDisableJingle(accountReg.isJingleDisabled()); telephonyConfigPanel.setTelephonyDomain( accountReg.getOverridePhoneSuffix()); telephonyConfigPanel.setTelephonyDomainBypassCaps( accountReg.getTelephonyDomainBypassCaps()); encodingsPanel.loadAccount(accountReg.getEncodingsRegistration()); } /** * Returns a simple version of this registration form. * @return the simple form component */ public Component getSimpleForm() { JabberAccountCreationFormService createAccountService = getCreateAccountService(); if (createAccountService != null) createAccountService.clear(); // Indicate that this panel is opened in a simple form. accountPanel.setSimpleForm(true); return accountPanel; } /** * Sets the isModification property. * @param isModification indicates if this form is created for modification */ public void setModification(boolean isModification) { this.isModification = isModification; } /** * Returns the username example. * @return the username example string */ public String getUsernameExample() { return wizard.getUserNameExample(); } /** * Sign ups through the web. */ public void webSignup() { wizard.webSignup(); } /** * Returns true if the web sign up is supported by the current * implementation, false - otherwise. * @return true if the web sign up is supported by the current * implementation, false - otherwise */ public boolean isWebSignupSupported() { return wizard.isWebSignupSupported(); } /** * Returns an instance of CreateAccountService through which the * user could create an account. This method is meant to be implemented by * specific protocol provider wizards. * @return an instance of CreateAccountService */ public JabberAccountCreationFormService getCreateAccountService() { return null; //wizard.getCreateAccountService(); } /** * Returns the display label used for the jabber id field. * @return the jabber id display label string. */ protected String getUsernameLabel() { return wizard.getUsernameLabel(); } /** * Returns the current jabber registration holding all values. * @return jabber registration. */ public JabberAccountRegistration getRegistration() { return wizard.getRegistration(); } /** * Return the string for add existing account button. * @return the string for add existing account button. */ protected String getCreateAccountButtonLabel() { return wizard.getCreateAccountButtonLabel(); } /** * Return the string for create new account button. * @return the string for create new account button. */ protected String getCreateAccountLabel() { return wizard.getCreateAccountLabel(); } /** * Return the string for add existing account button. * @return the string for add existing account button. */ protected String getExistingAccountLabel() { return wizard.getExistingAccountLabel(); } /** * Return the string for home page link label. * @return the string for home page link label */ protected String getHomeLinkLabel() { return wizard.getHomeLinkLabel(); } /** * Load password for this STUN descriptor. * * @param accountID account ID * @param namePrefix name prefix * @return password or null if empty */ private static String loadStunPassword(AccountID accountID, String namePrefix) { ProtocolProviderFactory providerFactory = JabberAccRegWizzActivator.getJabberProtocolProviderFactory(); String password = null; String className = providerFactory.getClass().getName(); String packageSourceName = className.substring(0, className.lastIndexOf('.')); String accountPrefix = ProtocolProviderFactory.findAccountPrefix( JabberAccRegWizzActivator.bundleContext, accountID, packageSourceName); CredentialsStorageService credentialsService = JabberAccRegWizzActivator.getCredentialsService(); try { password = credentialsService. loadPassword(accountPrefix + "." + namePrefix); } catch(Exception e) { return null; } return password; } /** * Returns the wizard that created the form * @return The form wizard */ public JabberAccountRegistrationWizard getWizard() { return wizard; } }