/* * 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.sipaccregwizz; import java.awt.*; import java.util.*; import java.util.List; import javax.swing.*; import net.java.sip.communicator.plugin.desktoputil.*; import net.java.sip.communicator.plugin.desktoputil.wizard.*; import net.java.sip.communicator.service.protocol.*; import net.java.sip.communicator.service.protocol.sip.*; import org.jitsi.util.*; /** * The <tt>SIPAccountRegistrationForm</tt>. * * @author Yana Stamcheva * @author Grogorii Balutsel * @author Pawel Domas */ public class SIPAccountRegistrationForm 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 PresencePanel presencePanel; /** * The panel for encoding settings */ private final EncodingsPanel encodingsPanel; private boolean isModification; private final SIPAccountRegistrationWizard wizard; private final JTabbedPane tabbedPane = new SIPCommTabbedPane(); /** * The panels which value needs validation before we continue. */ private List<ValidatingPanel> validatingPanels = new ArrayList<ValidatingPanel>(); /** * Creates an instance of <tt>SIPAccountRegistrationForm</tt>. * @param wizard the parent wizard */ public SIPAccountRegistrationForm(SIPAccountRegistrationWizard wizard) { super(new BorderLayout()); this.wizard = wizard; accountPanel = new AccountPanel(this); connectionPanel = new ConnectionPanel(this); securityPanel = new SecurityPanel( this.getRegistration().getSecurityRegistration(), true); presencePanel = new PresencePanel(this); encodingsPanel = new EncodingsPanel(); } /** * Initializes all panels, buttons, etc. */ void init() { this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); accountPanel.initAdvancedForm(); SIPAccountCreationFormService createService = getCreateAccountService(); if (createService != null) createService.clear(); if (!SIPAccRegWizzActivator.isAdvancedAccountConfigDisabled()) { 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 (presencePanel.getParent() != tabbedPane) tabbedPane.addTab(Resources.getString("service.gui.PRESENCE"), presencePanel); 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 sip id and set it to server as default * value. If Advanced option is enabled Do nothing. * @param userName the account user name * @return the server address */ String setServerFieldAccordingToUIN(String userName) { String serverAddress = SipAccountID.getServerFromUserName(userName); connectionPanel.setServerFieldAccordingToUIN(serverAddress); return serverAddress; } /** * Enables/disables the next/finish button of the parent wizard. * @param isEnabled <tt>true</tt> to enable the next button, <tt>false</tt> * otherwise */ private void setNextFinishButtonEnabled(boolean isEnabled) { SIPAccRegWizzActivator.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 sip user name. * * @param userName the username. * @return the server part of the sip user name. */ static String getServerFromUserName(String userName) { int delimIndex = userName.indexOf("@"); if (delimIndex != -1) { return userName.substring(delimIndex + 1); } return null; } /** * Indicates if this wizard is modifying an existing account or is creating * a new one. * * @return <code>true</code> to indicate that this wizard is currently in * modification mode, <code>false</code> - otherwise. */ public boolean isModification() { return isModification; } /** * Saves the user input when the "Next" wizard buttons is clicked. * * @param registration the SIPAccountRegistration * @return */ public boolean commitPage(SIPAccountRegistration registration) { String userID = null; char[] password = null; String serverAddress = null; String proxyAddress = null; String xcapRoot = null; if (accountPanel.isCreateAccount()) { NewAccount newAccount = getCreateAccountService().createAccount(); if (newAccount != null) { userID = newAccount.getUserName(); password = newAccount.getPassword(); serverAddress = newAccount.getServerAddress(); proxyAddress = newAccount.getProxyAddress(); xcapRoot = newAccount.getXcapRoot(); if (serverAddress == null) serverAddress = setServerFieldAccordingToUIN(userID); if (proxyAddress == null) proxyAddress = serverAddress; } else { // If we didn't succeed to create our new account, we have // nothing more to do here. return false; } } else { userID = accountPanel.getUserID(); if(SipAccountID.getServerFromUserName(userID) == null && registration.getDefaultDomain() != null) { // we have only a username and we want to add // a defautl domain userID = userID + "@" + registration.getDefaultDomain(); setServerFieldAccordingToUIN(userID); } password = accountPanel.getPassword(); serverAddress = connectionPanel.getServerAddress(); proxyAddress = connectionPanel.getProxy(); } if(userID == null || userID.trim().length() == 0) throw new IllegalStateException("No user ID provided."); registration.setUserID(userID); registration.setRememberPassword(accountPanel.isRememberPassword()); registration.setPassword(new String(password)); registration.setServerAddress(serverAddress); registration.setProxy(proxyAddress); String displayName = accountPanel.getDisplayName(); registration.setDisplayName(displayName); String authName = connectionPanel.getAuthenticationName(); if(authName != null && authName.length() > 0) registration.setAuthorizationName(authName); registration.setServerPort(connectionPanel.getServerPort()); registration.setProxyPort(connectionPanel.getProxyPort()); registration.setPreferredTransport( connectionPanel.getSelectedTransport()); registration.setProxyAutoConfigure( connectionPanel.isProxyAutoConfigureEnabled()); registration.setProxyForceBypassConfigure( connectionPanel.isProxyForceBypassConfigureEnabled()); registration.setEnablePresence( presencePanel.isPresenceEnabled()); registration.setForceP2PMode( presencePanel.isForcePeerToPeerMode()); registration.setTlsClientCertificate( connectionPanel.getCertificateId()); registration.setPollingPeriod( presencePanel.getPollPeriod()); registration.setSubscriptionExpiration( presencePanel.getSubscriptionExpiration()); registration.setKeepAliveMethod( connectionPanel.getKeepAliveMethod()); registration.setKeepAliveInterval( connectionPanel.getKeepAliveInterval()); registration.setDTMFMethod( connectionPanel.getDTMFMethod()); registration.setDtmfMinimalToneDuration( connectionPanel.getDtmfMinimalToneDuration()); SIPAccRegWizzActivator.getUIService().getAccountRegWizardContainer() .setBackButtonEnabled(true); securityPanel.commitPanel(registration.getSecurityRegistration()); if(xcapRoot != null) { registration.setXCapEnable(true); registration.setClistOptionServerUri(xcapRoot); } else { registration.setXCapEnable(presencePanel.isXCapEnable()); registration.setXiVOEnable(presencePanel.isXiVOEnable()); registration.setClistOptionServerUri( presencePanel.getClistOptionServerUri()); } registration.setClistOptionUseSipCredentials( presencePanel.isClistOptionUseSipCredentials()); registration.setClistOptionUser(presencePanel.getClistOptionUser()); registration.setClistOptionPassword( new String(presencePanel.getClistOptionPassword())); registration.setMessageWaitingIndications( connectionPanel.isMessageWaitingEnabled()); registration.setVoicemailURI(connectionPanel.getVoicemailURI()); registration.setVoicemailCheckURI(connectionPanel.getVoicemailCheckURI()); encodingsPanel.commitPanel(registration.getEncodingsRegistration()); return true; } /** * Loads given account registration object. * @param sipAccReg the account registration object to load. */ public void loadAccount(SIPAccountRegistration sipAccReg) { String password = sipAccReg.getPassword(); String serverAddress = sipAccReg.getServerAddress(); String displayName = sipAccReg.getAccountPropertyString( ProtocolProviderFactory.DISPLAY_NAME); String authName = sipAccReg.getAuthorizationName(); String serverPort = sipAccReg.getServerPort(); String proxyAddress = sipAccReg.getProxy(); String proxyPort = sipAccReg.getProxyPort(); String preferredTransport = sipAccReg.getPreferredTransport(); boolean enablePresence = sipAccReg.isEnablePresence(); boolean forceP2P = sipAccReg.isForceP2PMode(); String clientTlsCertificateId = sipAccReg.getTlsClientCertificate(); boolean proxyAutoConfigureEnabled = sipAccReg.isProxyAutoConfigure(); boolean proxyForceBypassConfigureEnabled = sipAccReg.isProxyForceBypassConfigure(); String pollingPeriod = sipAccReg.getPollingPeriod(); String subscriptionPeriod = sipAccReg.getSubscriptionExpiration(); String keepAliveMethod = sipAccReg.getKeepAliveMethod(); String keepAliveInterval = sipAccReg.getKeepAliveInterval(); String dtmfMethod = sipAccReg.getDTMFMethod(); String dtmfMinimalToneDuration = sipAccReg.getDtmfMinimalToneDuration(); String voicemailURI = sipAccReg.getVoicemailURI(); String voicemailCheckURI = sipAccReg.getVoicemailCheckURI(); boolean xCapEnable = sipAccReg.isXCapEnable(); boolean xivoEnable = sipAccReg.isXiVOEnable(); boolean isServerOverridden = sipAccReg.isServerOverridden(); connectionPanel.setServerOverridden(isServerOverridden); accountPanel.setUserIDEnabled(false); accountPanel.setUserID(sipAccReg.getId()); if (password != null) { accountPanel.setPassword(password); accountPanel.setRememberPassword(true); } else { accountPanel.setPassword(""); accountPanel.setRememberPassword(false); } connectionPanel.setServerAddress(serverAddress); connectionPanel.setServerEnabled(isServerOverridden); accountPanel.setDisplayName(displayName); if(authName != null && authName.length() > 0) connectionPanel.setAuthenticationName(authName); connectionPanel.setCertificateId(clientTlsCertificateId); connectionPanel.enablesProxyAutoConfigure( proxyAutoConfigureEnabled); connectionPanel.enablesProxyForceBypassConfigure( proxyForceBypassConfigureEnabled); connectionPanel.setServerPort(serverPort); connectionPanel.setProxy(proxyAddress); // The order of the next two fields is important, as a change listener // of the transportCombo sets the proxyPortField to its default connectionPanel.setSelectedTransport(preferredTransport); connectionPanel.setProxyPort(proxyPort); securityPanel.loadAccount(sipAccReg.getSecurityRegistration()); presencePanel.reinit(); presencePanel.setPresenceEnabled(enablePresence); presencePanel.setForcePeerToPeerMode(forceP2P); presencePanel.setPollPeriod(pollingPeriod); presencePanel.setSubscriptionExpiration(subscriptionPeriod); if (!enablePresence) { presencePanel.setPresenceOptionsEnabled(enablePresence); } connectionPanel.setKeepAliveMethod(keepAliveMethod); connectionPanel.setKeepAliveInterval(keepAliveInterval); connectionPanel.setDTMFMethod(dtmfMethod); connectionPanel.setDtmfMinimalToneDuration(dtmfMinimalToneDuration); boolean mwiEnabled = sipAccReg.isMessageWaitingIndicationsEnabled(); connectionPanel.setMessageWaitingIndications(mwiEnabled); if(!StringUtils.isNullOrEmpty(voicemailURI)) connectionPanel.setVoicemailURI(voicemailURI); if(!StringUtils.isNullOrEmpty(voicemailCheckURI)) connectionPanel.setVoicemailCheckURI(voicemailCheckURI); if(xCapEnable) { presencePanel.setXCapEnable(xCapEnable); presencePanel.setClistOptionEnableEnabled(xCapEnable); } else if(xivoEnable) { presencePanel.setXiVOEnable(xivoEnable); presencePanel.setClistOptionEnableEnabled(xivoEnable); } boolean clistUseSipCredentials = sipAccReg.isClistOptionUseSipCredentials(); presencePanel.setClistOptionUseSipCredentials( clistUseSipCredentials); presencePanel.setClistOptionUseSipCredentialsEnabled( clistUseSipCredentials); presencePanel.setClistOptionServerUri( sipAccReg.getClistOptionServerUri()); presencePanel.setClistOptionUser( sipAccReg.getClistOptionUser()); presencePanel.setClistOptionPassword( sipAccReg.getClistOptionPassword()); encodingsPanel.loadAccount(sipAccReg.getEncodingsRegistration()); } /** * Returns a simple version of this registration form. * @return the simple form component */ public Component getSimpleForm() { SIPAccountCreationFormService 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 the sign up link name. * @return the sign up link name */ public String getWebSignupLinkName() { return wizard.getWebSignupLinkName(); } /** * Returns the forgot password link name. * * @return the forgot password link name */ public String getForgotPasswordLinkName() { return wizard.getForgotPasswordLinkName(); } /** * Returns the forgot password link. * * @return the forgot password link */ public String getForgotPasswordLink() { return wizard.getForgotPasswordLink(); } /** * Returns an instance of <tt>CreateAccountService</tt> through which the * user could create an account. This method is meant to be implemented by * specific protocol provider wizards. * @return an instance of <tt>CreateAccountService</tt> */ public SIPAccountCreationFormService getCreateAccountService() { return wizard.getCreateAccountService(); } /** * Returns the display label used for the sip id field. * @return the sip id display label string. */ protected String getUsernameLabel() { return wizard.getUsernameLabel(); } /** * Returns the current sip registration holding all values. * @return sip registration. */ public SIPAccountRegistration getRegistration() { return wizard.getRegistration(); } /** * 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 create new account button. * @return the string for create new account button. */ protected String getCreateAccountLabel() { return wizard.getCreateAccountLabel(); } /** * Selects the create account button. */ void setCreateButtonSelected() { accountPanel.setCreateButtonSelected(); } }