1 17 package org.columba.mail.gui.config.account; 18 19 import java.awt.Font ; 20 import java.awt.GridBagConstraints ; 21 import java.awt.GridBagLayout ; 22 import java.awt.Insets ; 23 import java.awt.event.ActionEvent ; 24 import java.awt.event.ActionListener ; 25 import java.io.File ; 26 import java.util.Iterator ; 27 import java.util.LinkedList ; 28 import java.util.List ; 29 import java.util.logging.Logger ; 30 import java.util.regex.Matcher ; 31 import java.util.regex.Pattern ; 32 33 import javax.swing.BorderFactory ; 34 import javax.swing.JButton ; 35 import javax.swing.JCheckBox ; 36 import javax.swing.JComboBox ; 37 import javax.swing.JDialog ; 38 import javax.swing.JLabel ; 39 import javax.swing.JOptionPane ; 40 import javax.swing.JPanel ; 41 import javax.swing.JSpinner ; 42 import javax.swing.JTextField ; 43 import javax.swing.SpinnerNumberModel ; 44 45 import org.columba.core.config.DefaultConfigDirectory; 46 import org.columba.core.gui.base.ButtonWithMnemonic; 47 import org.columba.core.gui.base.CheckBoxWithMnemonic; 48 import org.columba.core.gui.base.LabelWithMnemonic; 49 import org.columba.core.gui.exception.ExceptionHandler; 50 import org.columba.mail.config.AccountItem; 51 import org.columba.mail.config.MailConfig; 52 import org.columba.mail.config.OutgoingItem; 53 import org.columba.mail.smtp.SMTPServer; 54 import org.columba.mail.util.AuthenticationManager; 55 import org.columba.mail.util.MailResourceLoader; 56 import org.columba.ristretto.smtp.SMTPException; 57 58 import com.jgoodies.forms.builder.DefaultFormBuilder; 59 import com.jgoodies.forms.layout.FormLayout; 60 61 64 public class OutgoingServerPanel extends DefaultPanel implements ActionListener { 65 66 67 private static final Logger LOG = Logger 68 .getLogger("org.columba.mail.gui.config.account"); 69 70 private static final Pattern AUTH_MODE_TOKENIZE_PATTERN = Pattern 71 .compile("(\\d+);?"); 72 73 private JLabel hostLabel; 74 75 private JTextField hostTextField; 76 77 private JLabel portLabel; 78 79 private JSpinner portSpinner; 80 81 private JLabel loginLabel; 82 83 private JTextField loginTextField; 84 85 private JCheckBox secureCheckBox; 86 87 private JCheckBox needAuthCheckBox; 88 89 private JCheckBox storePasswordCheckBox; 90 91 private JLabel authenticationLabel; 92 93 private JComboBox authenticationComboBox; 94 95 private JCheckBox defaultAccountCheckBox; 96 97 private OutgoingItem item; 98 99 private AccountItem accountItem; 100 101 private JButton checkAuthMethods; 102 103 private JDialog dialog; 104 105 public OutgoingServerPanel(JDialog parent, AccountItem accountItem) { 106 super(); 107 this.accountItem = accountItem; 108 item = accountItem.getSmtpItem(); 109 dialog = parent; 110 111 initComponents(); 112 updateComponents(true); 113 } 114 115 public String getHost() { 116 return hostTextField.getText(); 117 } 118 119 public String getLogin() { 120 return loginTextField.getText(); 121 } 122 123 public boolean isESmtp() { 124 return needAuthCheckBox.isSelected(); 125 } 126 127 protected void updateComponents(boolean b) { 128 if (b) { 129 hostTextField.setText(item.get(OutgoingItem.HOST)); 130 String port = item.get(OutgoingItem.PORT); 131 portSpinner.setValue(new Integer (port)); 132 loginTextField.setText(item.get(OutgoingItem.USER)); 133 storePasswordCheckBox.setSelected(item 134 .getBoolean(OutgoingItem.SAVE_PASSWORD)); 135 secureCheckBox.setSelected(item.getBooleanWithDefault( 136 OutgoingItem.ENABLE_SSL, false)); 137 138 if (!(item.get(OutgoingItem.LOGIN_METHOD).equals( 139 Integer.toString(AuthenticationManager.NONE)) || item.get( 140 OutgoingItem.LOGIN_METHOD).equals(OutgoingItem.NONE))) { 141 needAuthCheckBox.setSelected(true); 142 143 storePasswordCheckBox.setEnabled(true); 144 loginLabel.setEnabled(true); 145 loginTextField.setEnabled(true); 146 147 String loginMethod = item.get(OutgoingItem.LOGIN_METHOD); 148 try { 149 authenticationComboBox.setSelectedItem(new Integer ( 150 loginMethod)); 151 } catch (NumberFormatException e) { 152 } 153 } else { 154 needAuthCheckBox.setSelected(false); 155 156 storePasswordCheckBox.setEnabled(false); 157 loginLabel.setEnabled(false); 158 loginTextField.setEnabled(false); 159 authenticationLabel.setEnabled(false); 160 authenticationComboBox.setEnabled(false); 161 } 162 163 defaultAccountCheckBox.setEnabled(MailConfig.getInstance() 164 .getAccountList().getDefaultAccountUid() != accountItem 165 .getInteger(OutgoingItem.UID)); 166 167 if (defaultAccountCheckBox.isEnabled() 168 && defaultAccountCheckBox.isSelected()) { 169 showDefaultAccountWarning(); 170 } else { 171 layoutComponents(); 172 } 173 } else { 174 item.setString(OutgoingItem.USER, loginTextField.getText()); 175 item.setBoolean(OutgoingItem.SAVE_PASSWORD, storePasswordCheckBox 176 .isSelected()); 177 item.setString(OutgoingItem.PORT, 178 ((Integer ) portSpinner.getValue()).toString()); 179 item.setString(OutgoingItem.HOST, hostTextField.getText()); 180 181 item.setBoolean(OutgoingItem.ENABLE_SSL, secureCheckBox 182 .isSelected()); 183 184 if (needAuthCheckBox.isSelected()) { 185 item.setString(OutgoingItem.LOGIN_METHOD, 186 authenticationComboBox.getSelectedItem().toString()); 187 } else { 188 item.setString(OutgoingItem.LOGIN_METHOD, Integer 189 .toString(AuthenticationManager.NONE)); 190 } 191 192 item.setBoolean(OutgoingItem.USE_DEFAULT_ACCOUNT, 193 defaultAccountCheckBox.isSelected()); 194 195 item.getRoot().notifyObservers(); 196 } 197 } 198 199 protected void layoutComponents() { 200 FormLayout layout = new FormLayout( 202 "10dlu, 10dlu, max(60dlu;default), 3dlu, fill:max(150dlu;default):grow, 3dlu, default, 3dlu, default ", 203 204 ""); 208 DefaultFormBuilder builder = new DefaultFormBuilder(layout, this); 209 210 builder.setDefaultDialogBorder(); 212 213 builder.setLeadingColumnOffset(1); 215 216 220 builder.appendSeparator(MailResourceLoader.getString("dialog", 221 "account", "configuration")); 222 builder.nextLine(); 223 224 226 builder.append(loginLabel, 2); 227 builder.append(loginTextField, 5); 228 builder.nextLine(); 229 230 builder.append(hostLabel, 2); 231 builder.append(hostTextField); 232 234 builder.append(portLabel); 235 builder.append(portSpinner); 236 builder.nextLine(); 237 238 builder.setLeadingColumnOffset(1); 239 240 builder.appendSeparator(MailResourceLoader.getString("dialog", 241 "account", "security")); 242 builder.nextLine(); 243 244 builder.append(needAuthCheckBox, 8); 245 builder.nextLine(); 246 247 builder.setLeadingColumnOffset(2); 248 249 JPanel panel = new JPanel (); 250 FormLayout l = new FormLayout( 251 "default, 3dlu, left:pref:grow, 3dlu, left:pref:grow", 252 253 "fill:default:grow"); 258 DefaultFormBuilder b = new DefaultFormBuilder(l, panel); 260 b.append(authenticationLabel, authenticationComboBox, checkAuthMethods); 261 builder.append(panel, 5); 264 builder.nextLine(); 265 266 builder.append(secureCheckBox, 6); 268 builder.nextLine(); 269 270 JPanel panel2 = new JPanel (); 271 FormLayout l2 = new FormLayout("default, 3dlu, left:pref", 272 273 "fill:default:grow"); 278 DefaultFormBuilder b2 = new DefaultFormBuilder(l2, panel2); 280 b2.setRowGroupingEnabled(true); 281 builder.append(panel2, 3); 282 builder.nextLine(); 283 284 builder.append(storePasswordCheckBox, 5); 285 builder.nextLine(); 286 287 } 289 290 protected void showDefaultAccountWarning() { 291 setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 292 293 GridBagLayout mainLayout = new GridBagLayout (); 294 GridBagConstraints mainConstraints = new GridBagConstraints (); 295 296 setLayout(mainLayout); 297 298 mainConstraints.gridwidth = GridBagConstraints.REMAINDER; 299 mainConstraints.anchor = GridBagConstraints.NORTHWEST; 300 mainConstraints.weightx = 1.0; 301 mainConstraints.insets = new Insets (0, 10, 5, 0); 302 mainLayout.setConstraints(defaultAccountCheckBox, mainConstraints); 303 add(defaultAccountCheckBox); 304 305 mainConstraints = new GridBagConstraints (); 306 mainConstraints.weighty = 1.0; 307 mainConstraints.gridwidth = GridBagConstraints.REMAINDER; 308 309 JLabel label = new JLabel (MailResourceLoader.getString("dialog", 310 "account", "using_default_account_settings")); 311 Font newFont = label.getFont().deriveFont(Font.BOLD); 312 label.setFont(newFont); 313 mainLayout.setConstraints(label, mainConstraints); 314 add(label); 315 } 316 317 protected void initComponents() { 318 defaultAccountCheckBox = new CheckBoxWithMnemonic(MailResourceLoader 319 .getString("dialog", "account", "use_default_account_settings")); 320 321 defaultAccountCheckBox.setActionCommand("DEFAULT_ACCOUNT"); 323 defaultAccountCheckBox.addActionListener(this); 324 325 hostLabel = new LabelWithMnemonic(MailResourceLoader.getString( 326 "dialog", "account", OutgoingItem.HOST)); 328 hostTextField = new JTextField (); 329 hostLabel.setLabelFor(hostTextField); 330 portLabel = new LabelWithMnemonic(MailResourceLoader.getString( 331 "dialog", "account", OutgoingItem.PORT)); 333 portSpinner = new JSpinner (new SpinnerNumberModel (100, 1, 65535, 1)); 334 portLabel.setLabelFor(portSpinner); 335 336 needAuthCheckBox = new CheckBoxWithMnemonic( 337 MailResourceLoader.getString( 338 "dialog", "account", "server_needs_authentification")); 340 needAuthCheckBox.setActionCommand("AUTH"); needAuthCheckBox.addActionListener(this); 342 343 storePasswordCheckBox = new CheckBoxWithMnemonic(MailResourceLoader 344 .getString("dialog", "account", 345 "store_password_in_configuration_file")); 346 347 storePasswordCheckBox.setActionCommand("SAVE"); 348 storePasswordCheckBox.addActionListener(this); 349 350 secureCheckBox = new CheckBoxWithMnemonic(MailResourceLoader.getString( 351 "dialog", "account", "use_SSL_for_secure_connection")); 352 353 authenticationLabel = new LabelWithMnemonic(MailResourceLoader 354 .getString("dialog", "account", "authentication_type")); 355 356 authenticationComboBox = new JComboBox (); 357 authenticationComboBox 358 .setRenderer(new AuthenticationListCellRenderer()); 359 authenticationLabel.setLabelFor(authenticationComboBox); 360 361 updateAuthenticationComboBox(); 362 363 checkAuthMethods = new ButtonWithMnemonic(MailResourceLoader.getString( 364 "dialog", "account", "authentication_checkout_methods")); 365 checkAuthMethods.setActionCommand("CHECK_AUTHMETHODS"); 366 checkAuthMethods.addActionListener(this); 367 368 authenticationLabel.setLabelFor(authenticationComboBox); 370 371 loginLabel = new LabelWithMnemonic(MailResourceLoader.getString( 372 "dialog", "account", "login")); 373 374 loginTextField = new JTextField (); 375 loginLabel.setLabelFor(loginTextField); 376 } 377 378 381 private void updateAuthenticationComboBox() { 382 authenticationComboBox.removeAllItems(); 383 authenticationComboBox.addItem(new Integer (0)); 384 385 if (accountItem.isPopAccount()) { 386 authenticationComboBox.addItem(new Integer ( 387 AuthenticationManager.POP_BEFORE_SMTP)); 388 } 389 390 String authMethods = accountItem.getString("smtpserver", 391 "authentication_methods"); 392 393 if (authMethods != null) { 395 Matcher matcher = AUTH_MODE_TOKENIZE_PATTERN.matcher(authMethods); 396 while (matcher.find()) { 397 authenticationComboBox.addItem(new Integer (matcher.group(1))); 398 } 399 } 400 } 401 402 public void actionPerformed(ActionEvent e) { 403 String action = e.getActionCommand(); 404 405 if (e.getSource() == authenticationComboBox) { 406 loginLabel.setEnabled(true); 407 loginTextField.setEnabled(true); 408 storePasswordCheckBox.setEnabled(true); 409 } else if (action.equals("DEFAULT_ACCOUNT")) { 410 removeAll(); 411 412 if (defaultAccountCheckBox.isSelected()) { 413 showDefaultAccountWarning(); 414 } else { 415 layoutComponents(); 416 } 417 418 revalidate(); 419 } else if (action.equals("AUTH")) { 420 boolean enabled = needAuthCheckBox.isSelected(); 421 loginLabel.setEnabled(enabled); 422 loginTextField.setEnabled(enabled); 423 storePasswordCheckBox.setEnabled(enabled); 424 authenticationLabel.setEnabled(enabled); 425 authenticationComboBox.setEnabled(enabled); 426 checkAuthMethods.setEnabled(enabled); 427 } else if (action.equals("CHECK_AUTHMETHODS")) { 428 fetchSupportedAuthenticationMechanisms(); 429 } else if (action.equals("SAVE")) { 430 if (!storePasswordCheckBox.isSelected()) { 431 return; 432 } else { 433 File configPath = DefaultConfigDirectory.getInstance().getCurrentPath(); 434 File defaultConfigPath = DefaultConfigDirectory.getDefaultPath(); 435 while (!configPath.equals(defaultConfigPath)) { 436 configPath = configPath.getParentFile(); 437 if (configPath == null) { 438 JOptionPane.showMessageDialog(dialog, 439 MailResourceLoader.getString("dialog", 440 "password", "warn_save_msg"), 441 MailResourceLoader.getString("dialog", 442 "password", "warn_save_title"), 443 JOptionPane.WARNING_MESSAGE); 444 return; 445 } 446 } 447 } 448 } 449 } 450 451 private AccountItem getCurrentDialogSettings() { 452 AccountItem account = (AccountItem) accountItem.clone(); 453 OutgoingItem item = account.getSmtpItem(); 454 item.setString(OutgoingItem.USER, loginTextField.getText()); 455 item.setBoolean(OutgoingItem.SAVE_PASSWORD, storePasswordCheckBox 456 .isSelected()); 457 item.setString(OutgoingItem.PORT, ((Integer ) portSpinner.getValue()) 458 .toString()); 459 item.setString(OutgoingItem.HOST, hostTextField.getText()); 460 item.setBoolean(OutgoingItem.ENABLE_SSL, secureCheckBox.isSelected()); 461 462 return account; 463 } 464 465 private void fetchSupportedAuthenticationMechanisms() { 466 List list = new LinkedList (); 467 468 try { 469 SMTPServer server = new SMTPServer(getCurrentDialogSettings()); 470 list = server.checkSupportedAuthenticationMethods(); 471 } catch (SMTPException e1) { 472 LOG.severe("Server does not support the CAPA command"); 473 } catch (Exception e) { 474 new ExceptionHandler().processException(e); 476 } 477 478 if (list.size() > 0) { 480 StringBuffer authMethods = new StringBuffer (); 481 Iterator it = list.iterator(); 482 authMethods.append(it.next()); 483 484 while (it.hasNext()) { 485 authMethods.append(';'); 486 authMethods.append(it.next()); 487 } 488 489 accountItem.setString("smtpserver", "authentication_methods", 490 authMethods.toString()); 491 } else { 492 accountItem.setString("smtpserver", "authentication_methods", ""); 493 } 494 495 updateAuthenticationComboBox(); 496 } 497 498 public boolean isFinished() { 499 String host = getHost(); 500 boolean esmtp = isESmtp(); 501 502 if (host.length() == 0) { 503 JOptionPane.showMessageDialog(this, MailResourceLoader.getString( 504 "dialog", "account", "You_have_to_enter_a_host_name")); 505 506 return false; 507 } else if (esmtp) { 508 String login = getLogin(); 509 510 if (login.length() == 0) { 511 JOptionPane.showMessageDialog(this, MailResourceLoader 512 .getString("dialog", "account", 513 "You_have_to_enter_a_login_name")); 514 515 return false; 516 } 517 } 518 519 return true; 520 } 521 } | Popular Tags |