View Javadoc
1   /*
2    * DavMail POP/IMAP/SMTP/CalDav/LDAP Exchange Gateway
3    * Copyright (C) 2009  Mickael Guessant
4    *
5    * This program is free software; you can redistribute it and/or
6    * modify it under the terms of the GNU General Public License
7    * as published by the Free Software Foundation; either version 2
8    * of the License, or (at your option) any later version.
9    *
10   * This program is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   * GNU General Public License for more details.
14   *
15   * You should have received a copy of the GNU General Public License
16   * along with this program; if not, write to the Free Software
17   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
18   */
19  package davmail.ui;
20  
21  import davmail.BundleMessage;
22  import davmail.DavGateway;
23  import davmail.Settings;
24  import davmail.ui.browser.DesktopBrowser;
25  import davmail.ui.tray.DavGatewayTray;
26  import org.apache.log4j.Level;
27  
28  import javax.swing.*;
29  import java.awt.*;
30  import java.awt.event.ActionEvent;
31  import java.awt.event.ActionListener;
32  
33  /**
34   * DavMail settings frame
35   */
36  public class SettingsFrame extends JFrame {
37      static final Level[] LOG_LEVELS = {Level.OFF, Level.FATAL, Level.ERROR, Level.WARN, Level.INFO, Level.DEBUG, Level.ALL};
38  
39      protected JTextField urlField;
40      protected JTextField popPortField;
41      protected JCheckBox popPortCheckBox;
42      protected JCheckBox popNoSSLCheckBox;
43      protected JTextField imapPortField;
44      protected JCheckBox imapPortCheckBox;
45      protected JCheckBox imapNoSSLCheckBox;
46      protected JTextField smtpPortField;
47      protected JCheckBox smtpPortCheckBox;
48      protected JCheckBox smtpNoSSLCheckBox;
49      protected JTextField caldavPortField;
50      protected JCheckBox caldavPortCheckBox;
51      protected JCheckBox caldavNoSSLCheckBox;
52      protected JTextField ldapPortField;
53      protected JCheckBox ldapPortCheckBox;
54      protected JCheckBox ldapNoSSLCheckBox;
55      protected JTextField keepDelayField;
56      protected JTextField sentKeepDelayField;
57      protected JTextField caldavPastDelayField;
58      protected JCheckBox caldavAutoScheduleCheckBox;
59      protected JTextField imapIdleDelayField;
60  
61      protected JCheckBox useSystemProxiesField;
62      protected JCheckBox enableProxyField;
63      protected JTextField httpProxyField;
64      protected JTextField httpProxyPortField;
65      protected JTextField httpProxyUserField;
66      protected JTextField httpProxyPasswordField;
67      protected JTextField noProxyForField;
68  
69      protected JCheckBox allowRemoteField;
70      protected JTextField bindAddressField;
71      protected JTextField clientSoTimeoutField;
72      protected JTextField certHashField;
73      protected JCheckBox disableUpdateCheck;
74  
75      protected JComboBox<String> keystoreTypeCombo;
76      protected JTextField keystoreFileField;
77      protected JPasswordField keystorePassField;
78      protected JPasswordField keyPassField;
79  
80      protected JComboBox<String> clientKeystoreTypeCombo;
81      protected JTextField clientKeystoreFileField;
82      protected JPasswordField clientKeystorePassField;
83      protected JTextField pkcs11LibraryField;
84      protected JTextArea pkcs11ConfigField;
85  
86      protected JComboBox<Level> rootLoggingLevelField;
87      protected JComboBox<Level> davmailLoggingLevelField;
88      protected JComboBox<Level> httpclientLoggingLevelField;
89      protected JComboBox<Level> wireLoggingLevelField;
90      protected JTextField logFilePathField;
91      protected JTextField logFileSizeField;
92  
93      protected JCheckBox caldavEditNotificationsField;
94      protected JTextField caldavAlarmSoundField;
95      protected JCheckBox forceActiveSyncUpdateCheckBox;
96      protected JTextField defaultDomainField;
97  
98      protected JCheckBox enableTrayCheckBox;
99      protected JCheckBox showStartupBannerCheckBox;
100     protected JCheckBox disableGuiNotificationsCheckBox;
101     protected JCheckBox disableTrayActivitySwitchCheckBox;
102 
103     protected JCheckBox imapAutoExpungeCheckBox;
104     protected JCheckBox enableKeepAliveCheckBox;
105     protected JCheckBox popMarkReadOnRetrCheckBox;
106     protected JComboBox<String> modeComboBox;
107     protected JComboBox<String> authenticationComboBox;
108     protected JCheckBox enableKerberosCheckBox;
109     protected JTextField folderSizeLimitField;
110     protected JCheckBox smtpSaveInSentCheckBox;
111     protected JCheckBox imapAlwaysApproxMsgSizeCheckBox;
112 
113     protected JTextField oauthTenantIdField;
114     protected JTextField oauthClientIdField;
115     protected JTextField oauthRedirectUriField;
116     protected JTextField oauthTldField;
117 
118     JCheckBox osxHideFromDockCheckBox;
119 
120     protected void addSettingComponent(JPanel panel, String label, JComponent component) {
121         addSettingComponent(panel, label, component, null);
122     }
123 
124     protected JLabel buildFieldLabel(String label, String toolTipText) {
125         JLabel fieldLabel = new JLabel(label);
126         fieldLabel.setHorizontalAlignment(SwingConstants.RIGHT);
127         fieldLabel.setVerticalAlignment(SwingConstants.CENTER);
128         if (toolTipText != null) {
129             fieldLabel.setToolTipText(toolTipText);
130         }
131         return fieldLabel;
132     }
133 
134     protected void addSettingComponent(JPanel panel, String label, JComponent component, String toolTipText) {
135         panel.add(buildFieldLabel(label, toolTipText));
136 
137         component.setMaximumSize(component.getPreferredSize());
138         JPanel innerPanel = new JPanel();
139         innerPanel.setBorder(BorderFactory.createEmptyBorder(1,0,0,0));
140         innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS));
141         innerPanel.add(component);
142         panel.add(innerPanel);
143         if (toolTipText != null) {
144             component.setToolTipText(toolTipText);
145         }
146     }
147 
148     protected void addPortSettingComponent(JPanel panel, String label, JComponent component, JComponent checkboxComponent, JComponent checkboxSSLComponent, String toolTipText) {
149         panel.add(buildFieldLabel(label, toolTipText));
150         component.setMaximumSize(component.getPreferredSize());
151         JPanel innerPanel = new JPanel();
152         innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS));
153         innerPanel.add(checkboxComponent);
154         innerPanel.add(component);
155         innerPanel.add(checkboxSSLComponent);
156         panel.add(innerPanel);
157         if (toolTipText != null) {
158             component.setToolTipText(toolTipText);
159         }
160     }
161 
162     protected JPanel getSettingsPanel() {
163         JPanel settingsPanel = new JPanel(new GridLayout(8, 2));
164         settingsPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_GATEWAY")));
165 
166         modeComboBox = new JComboBox<>();
167         modeComboBox.addItem(Settings.O365_EWS);
168         modeComboBox.addItem(Settings.O365_GRAPH);
169         modeComboBox.addItem(Settings.EXCHANGE_EWS);
170         modeComboBox.addItem(Settings.EXCHANGE_WEBDAV);
171         String modeComboBoxSelectedItem = Settings.getProperty("davmail.mode", Settings.O365_EWS);
172         modeComboBox.setSelectedItem(modeComboBoxSelectedItem);
173         modeComboBox.addActionListener(evt -> {
174             String selectedItem = (String)modeComboBox.getSelectedItem();
175             modeComboBox.setToolTipText(BundleMessage.format("UI_"+selectedItem+"_HELP"));
176             if (selectedItem != null && selectedItem.startsWith("O365")) {
177                 urlField.setEnabled(false);
178                 urlField.setText(Settings.getO365Url());
179                 authenticationComboBox.setEnabled(true);
180             } else {
181                 urlField.setEnabled(true);
182                 authenticationComboBox.setEnabled(false);
183             }
184         });
185 
186         authenticationComboBox = new JComboBox<>();
187         authenticationComboBox.addItem(Settings.O365_INTERACTIVE);
188         authenticationComboBox.addItem(Settings.O365_MANUAL);
189         authenticationComboBox.addItem(Settings.O365_DEVICECODE);
190         authenticationComboBox.addItem(Settings.O365_TRANSPARENT);
191 
192         urlField = new JTextField(Settings.getProperty("davmail.url", Settings.getO365Url()), 20);
193         if (modeComboBoxSelectedItem.startsWith("O365")) {
194             urlField.setEnabled(false);
195         }
196         popPortField = new JTextField(Settings.getProperty("davmail.popPort"), 4);
197         popPortCheckBox = new JCheckBox();
198         popNoSSLCheckBox = new JCheckBox(BundleMessage.format("UI_NO_SSL"), Settings.getBooleanProperty("davmail.ssl.nosecurepop"));
199         popPortCheckBox.setSelected(Settings.getProperty("davmail.popPort") != null && !Settings.getProperty("davmail.popPort").isEmpty());
200         popPortField.setEnabled(popPortCheckBox.isSelected());
201         popNoSSLCheckBox.setEnabled(popPortCheckBox.isSelected() && isSslEnabled());
202         popPortCheckBox.addActionListener(evt -> {
203             popPortField.setEnabled(popPortCheckBox.isSelected());
204             popNoSSLCheckBox.setEnabled(popPortCheckBox.isSelected() && isSslEnabled());
205         });
206 
207         imapPortField = new JTextField(Settings.getProperty("davmail.imapPort"), 4);
208         imapPortCheckBox = new JCheckBox();
209         imapNoSSLCheckBox = new JCheckBox(BundleMessage.format("UI_NO_SSL"), Settings.getBooleanProperty("davmail.ssl.nosecureimap"));
210         imapPortCheckBox.setSelected(Settings.getProperty("davmail.imapPort") != null && !Settings.getProperty("davmail.imapPort").isEmpty());
211         imapPortField.setEnabled(imapPortCheckBox.isSelected());
212         imapNoSSLCheckBox.setEnabled(imapPortCheckBox.isSelected() && isSslEnabled());
213         imapPortCheckBox.addActionListener(evt -> {
214             imapPortField.setEnabled(imapPortCheckBox.isSelected());
215             imapNoSSLCheckBox.setEnabled(imapPortCheckBox.isSelected() && isSslEnabled());
216         });
217 
218         smtpPortField = new JTextField(Settings.getProperty("davmail.smtpPort"), 4);
219         smtpPortCheckBox = new JCheckBox();
220         smtpNoSSLCheckBox = new JCheckBox(BundleMessage.format("UI_NO_SSL"), Settings.getBooleanProperty("davmail.ssl.nosecuresmtp"));
221         smtpPortCheckBox.setSelected(Settings.getProperty("davmail.smtpPort") != null && !Settings.getProperty("davmail.smtpPort").isEmpty());
222         smtpPortField.setEnabled(smtpPortCheckBox.isSelected());
223         smtpNoSSLCheckBox.setEnabled(smtpPortCheckBox.isSelected() && isSslEnabled());
224         smtpPortCheckBox.addActionListener(evt -> {
225             smtpPortField.setEnabled(smtpPortCheckBox.isSelected());
226             smtpNoSSLCheckBox.setEnabled(smtpPortCheckBox.isSelected() && isSslEnabled());
227         });
228 
229         caldavPortField = new JTextField(Settings.getProperty("davmail.caldavPort"), 4);
230         caldavPortCheckBox = new JCheckBox();
231         caldavNoSSLCheckBox = new JCheckBox(BundleMessage.format("UI_NO_SSL"), Settings.getBooleanProperty("davmail.ssl.nosecurecaldav"));
232         caldavPortCheckBox.setSelected(Settings.getProperty("davmail.caldavPort") != null && !Settings.getProperty("davmail.caldavPort").isEmpty());
233         caldavPortField.setEnabled(caldavPortCheckBox.isSelected());
234         caldavNoSSLCheckBox.setEnabled(caldavPortCheckBox.isSelected() && isSslEnabled());
235         caldavPortCheckBox.addActionListener(evt -> {
236             caldavPortField.setEnabled(caldavPortCheckBox.isSelected());
237             caldavNoSSLCheckBox.setEnabled(caldavPortCheckBox.isSelected() && isSslEnabled());
238         });
239 
240         ldapPortField = new JTextField(Settings.getProperty("davmail.ldapPort"), 4);
241         ldapPortCheckBox = new JCheckBox();
242         ldapNoSSLCheckBox = new JCheckBox(BundleMessage.format("UI_NO_SSL"), Settings.getBooleanProperty("davmail.ssl.nosecureldap"));
243         ldapPortCheckBox.setSelected(Settings.getProperty("davmail.ldapPort") != null && !Settings.getProperty("davmail.ldapPort").isEmpty());
244         ldapPortField.setEnabled(ldapPortCheckBox.isSelected());
245         ldapNoSSLCheckBox.setEnabled(ldapPortCheckBox.isSelected() && isSslEnabled());
246         ldapPortCheckBox.addActionListener(evt -> {
247             ldapPortField.setEnabled(ldapPortCheckBox.isSelected());
248             ldapNoSSLCheckBox.setEnabled(ldapPortCheckBox.isSelected() && isSslEnabled());
249         });
250 
251         addSettingComponent(settingsPanel, BundleMessage.format("UI_MODE"), modeComboBox,
252                 BundleMessage.format("UI_MODE_HELP"));
253         addSettingComponent(settingsPanel, BundleMessage.format("UI_AUTHENTICATION"), authenticationComboBox,
254                 BundleMessage.format("UI_AUTHENTICATION_HELP"));
255         addSettingComponent(settingsPanel, BundleMessage.format("UI_OWA_URL"), urlField, BundleMessage.format("UI_OWA_URL_HELP"));
256         addPortSettingComponent(settingsPanel, BundleMessage.format("UI_POP_PORT"), popPortField, popPortCheckBox,
257                 popNoSSLCheckBox, BundleMessage.format("UI_POP_PORT_HELP"));
258         addPortSettingComponent(settingsPanel, BundleMessage.format("UI_IMAP_PORT"), imapPortField, imapPortCheckBox,
259                 imapNoSSLCheckBox, BundleMessage.format("UI_IMAP_PORT_HELP"));
260         addPortSettingComponent(settingsPanel, BundleMessage.format("UI_SMTP_PORT"), smtpPortField, smtpPortCheckBox,
261                 smtpNoSSLCheckBox, BundleMessage.format("UI_SMTP_PORT_HELP"));
262         addPortSettingComponent(settingsPanel, BundleMessage.format("UI_CALDAV_PORT"), caldavPortField, caldavPortCheckBox,
263                 caldavNoSSLCheckBox, BundleMessage.format("UI_CALDAV_PORT_HELP"));
264         addPortSettingComponent(settingsPanel, BundleMessage.format("UI_LDAP_PORT"), ldapPortField, ldapPortCheckBox,
265                 ldapNoSSLCheckBox, BundleMessage.format("UI_LDAP_PORT_HELP"));
266         return settingsPanel;
267     }
268 
269     protected JPanel getDelaysPanel() {
270         JPanel delaysPanel = new JPanel(new GridLayout(4, 2));
271         delaysPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_DELAYS")));
272 
273         keepDelayField = new JTextField(Settings.getProperty("davmail.keepDelay"), 4);
274         sentKeepDelayField = new JTextField(Settings.getProperty("davmail.sentKeepDelay"), 4);
275         caldavPastDelayField = new JTextField(Settings.getProperty("davmail.caldavPastDelay"), 4);
276         imapIdleDelayField = new JTextField(Settings.getProperty("davmail.imapIdleDelay"), 4);
277 
278         addSettingComponent(delaysPanel, BundleMessage.format("UI_KEEP_DELAY"), keepDelayField,
279                 BundleMessage.format("UI_KEEP_DELAY_HELP"));
280         addSettingComponent(delaysPanel, BundleMessage.format("UI_SENT_KEEP_DELAY"), sentKeepDelayField,
281                 BundleMessage.format("UI_SENT_KEEP_DELAY_HELP"));
282         addSettingComponent(delaysPanel, BundleMessage.format("UI_CALENDAR_PAST_EVENTS"), caldavPastDelayField,
283                 BundleMessage.format("UI_CALENDAR_PAST_EVENTS_HELP"));
284         addSettingComponent(delaysPanel, BundleMessage.format("UI_IMAP_IDLE_DELAY"), imapIdleDelayField,
285                 BundleMessage.format("UI_IMAP_IDLE_DELAY_HELP"));
286         return delaysPanel;
287     }
288 
289     protected JPanel getProxyPanel() {
290         JPanel proxyPanel = new JPanel(new GridLayout(7, 2));
291         proxyPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_PROXY")));
292 
293         boolean useSystemProxies = Settings.getBooleanProperty("davmail.useSystemProxies", Boolean.FALSE);
294         boolean enableProxy = Settings.getBooleanProperty("davmail.enableProxy");
295         useSystemProxiesField = new JCheckBox();
296         useSystemProxiesField.setSelected(useSystemProxies);
297         enableProxyField = new JCheckBox();
298         enableProxyField.setSelected(enableProxy);
299         httpProxyField = new JTextField(Settings.getProperty("davmail.proxyHost"), 15);
300         httpProxyPortField = new JTextField(Settings.getProperty("davmail.proxyPort"), 4);
301         httpProxyUserField = new JTextField(Settings.getProperty("davmail.proxyUser"), 10);
302         httpProxyPasswordField = new JPasswordField(Settings.getProperty("davmail.proxyPassword"), 10);
303         noProxyForField = new JTextField(Settings.getProperty("davmail.noProxyFor"), 15);
304 
305         enableProxyField.setEnabled(!useSystemProxies);
306         httpProxyField.setEnabled(enableProxy);
307         httpProxyPortField.setEnabled(enableProxy);
308         httpProxyUserField.setEnabled(enableProxy || useSystemProxies);
309         httpProxyPasswordField.setEnabled(enableProxy || useSystemProxies);
310         noProxyForField.setEnabled(enableProxy);
311 
312         useSystemProxiesField.addActionListener(evt -> {
313             boolean newUseSystemProxies = useSystemProxiesField.isSelected();
314             if (newUseSystemProxies) {
315                 enableProxyField.setSelected(false);
316                 enableProxyField.setEnabled(false);
317                 httpProxyField.setEnabled(false);
318                 httpProxyPortField.setEnabled(false);
319                 httpProxyUserField.setEnabled(true);
320                 httpProxyPasswordField.setEnabled(true);
321                 noProxyForField.setEnabled(false);
322             } else {
323                 enableProxyField.setEnabled(true);
324                 httpProxyUserField.setEnabled(false);
325                 httpProxyPasswordField.setEnabled(false);
326             }
327         });
328         enableProxyField.addActionListener(evt -> {
329             boolean newEnableProxy = enableProxyField.isSelected();
330             httpProxyField.setEnabled(newEnableProxy);
331             httpProxyPortField.setEnabled(newEnableProxy);
332             httpProxyUserField.setEnabled(newEnableProxy);
333             httpProxyPasswordField.setEnabled(newEnableProxy);
334             noProxyForField.setEnabled(newEnableProxy);
335         });
336 
337         addSettingComponent(proxyPanel, BundleMessage.format("UI_USE_SYSTEM_PROXIES"), useSystemProxiesField);
338         addSettingComponent(proxyPanel, BundleMessage.format("UI_ENABLE_PROXY"), enableProxyField);
339         addSettingComponent(proxyPanel, BundleMessage.format("UI_PROXY_SERVER"), httpProxyField);
340         addSettingComponent(proxyPanel, BundleMessage.format("UI_PROXY_PORT"), httpProxyPortField);
341         addSettingComponent(proxyPanel, BundleMessage.format("UI_PROXY_USER"), httpProxyUserField);
342         addSettingComponent(proxyPanel, BundleMessage.format("UI_PROXY_PASSWORD"), httpProxyPasswordField);
343         addSettingComponent(proxyPanel, BundleMessage.format("UI_NO_PROXY"), noProxyForField);
344         updateMaximumSize(proxyPanel);
345         return proxyPanel;
346     }
347 
348     protected JPanel getKeystorePanel() {
349         JPanel keyStorePanel = new JPanel(new GridLayout(5, 2));
350         keyStorePanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_DAVMAIL_SERVER_CERTIFICATE")));
351 
352         keystoreTypeCombo = new JComboBox<>(new String[]{"JKS", "PKCS12"});
353         keystoreTypeCombo.setSelectedItem(Settings.getProperty("davmail.ssl.keystoreType"));
354         keystoreFileField = new JTextField(Settings.getProperty("davmail.ssl.keystoreFile"), 20);
355         keystorePassField = new JPasswordField(Settings.getProperty("davmail.ssl.keystorePass"), 20);
356         keyPassField = new JPasswordField(Settings.getProperty("davmail.ssl.keyPass"), 20);
357 
358         addSettingComponent(keyStorePanel, BundleMessage.format("UI_KEY_STORE_TYPE"), keystoreTypeCombo,
359                 BundleMessage.format("UI_KEY_STORE_TYPE_HELP"));
360         addSettingComponent(keyStorePanel, BundleMessage.format("UI_KEY_STORE"), keystoreFileField,
361                 BundleMessage.format("UI_KEY_STORE_HELP"));
362         addSettingComponent(keyStorePanel, BundleMessage.format("UI_KEY_STORE_PASSWORD"), keystorePassField,
363                 BundleMessage.format("UI_KEY_STORE_PASSWORD_HELP"));
364         addSettingComponent(keyStorePanel, BundleMessage.format("UI_KEY_PASSWORD"), keyPassField,
365                 BundleMessage.format("UI_KEY_PASSWORD_HELP"));
366 
367         JButton generateCertButton = new JButton(BundleMessage.format("UI_GENERATE_CERTIFICATE"));
368         generateCertButton.setToolTipText(BundleMessage.format("UI_GENERATE_CERTIFICATE_HELP"));
369         generateCertButton.addActionListener(evt -> generateSelfSignedCertificate());
370         keyStorePanel.add(new JLabel());
371         JPanel generateButtonPanel = new JPanel();
372         generateButtonPanel.setBorder(BorderFactory.createEmptyBorder(1, 0, 0, 0));
373         generateButtonPanel.setLayout(new BoxLayout(generateButtonPanel, BoxLayout.X_AXIS));
374         generateButtonPanel.add(generateCertButton);
375         keyStorePanel.add(generateButtonPanel);
376 
377         updateMaximumSize(keyStorePanel);
378         return keyStorePanel;
379     }
380 
381     protected JPanel getSmartCardPanel() {
382         JPanel clientKeystorePanel = new JPanel(new GridLayout(2, 1));
383         clientKeystorePanel.setLayout(new BoxLayout(clientKeystorePanel, BoxLayout.Y_AXIS));
384         clientKeystorePanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_CLIENT_CERTIFICATE")));
385 
386         if (System.getProperty("os.name").toLowerCase().startsWith("windows")) {
387             clientKeystoreTypeCombo = new JComboBox<>(new String[]{"MSCAPI", "PKCS11", "JKS", "PKCS12"});
388         } else {
389             clientKeystoreTypeCombo = new JComboBox<>(new String[]{"PKCS11", "JKS", "PKCS12"});
390         }
391         clientKeystoreTypeCombo.setSelectedItem(Settings.getProperty("davmail.ssl.clientKeystoreType"));
392         clientKeystoreFileField = new JTextField(Settings.getProperty("davmail.ssl.clientKeystoreFile"), 20);
393         clientKeystorePassField = new JPasswordField(Settings.getProperty("davmail.ssl.clientKeystorePass"), 20);
394 
395         pkcs11LibraryField = new JTextField(Settings.getProperty("davmail.ssl.pkcs11Library"), 20);
396         pkcs11ConfigField = new JTextArea(2, 20);
397         pkcs11ConfigField.setText(Settings.getProperty("davmail.ssl.pkcs11Config"));
398         pkcs11ConfigField.setBorder(pkcs11LibraryField.getBorder());
399         pkcs11ConfigField.setFont(pkcs11LibraryField.getFont());
400 
401         JPanel clientKeystoreTypePanel = new JPanel(new GridLayout(1, 2));
402         addSettingComponent(clientKeystoreTypePanel, BundleMessage.format("UI_CLIENT_KEY_STORE_TYPE"), clientKeystoreTypeCombo,
403                 BundleMessage.format("UI_CLIENT_KEY_STORE_TYPE_HELP"));
404         clientKeystorePanel.add(clientKeystoreTypePanel);
405 
406         final JPanel cardPanel = new JPanel(new CardLayout());
407         clientKeystorePanel.add(cardPanel);
408 
409         JPanel clientKeystoreFilePanel = new JPanel(new GridLayout(2, 2));
410         addSettingComponent(clientKeystoreFilePanel, BundleMessage.format("UI_CLIENT_KEY_STORE"), clientKeystoreFileField,
411                 BundleMessage.format("UI_CLIENT_KEY_STORE_HELP"));
412         addSettingComponent(clientKeystoreFilePanel, BundleMessage.format("UI_CLIENT_KEY_STORE_PASSWORD"), clientKeystorePassField,
413                 BundleMessage.format("UI_CLIENT_KEY_STORE_PASSWORD_HELP"));
414         JPanel wrapperPanel = new JPanel();
415         wrapperPanel.add(clientKeystoreFilePanel);
416         cardPanel.add(wrapperPanel, "FILE");
417 
418         JPanel pkcs11Panel = new JPanel(new GridLayout(2, 2));
419         addSettingComponent(pkcs11Panel, BundleMessage.format("UI_PKCS11_LIBRARY"), pkcs11LibraryField,
420                 BundleMessage.format("UI_PKCS11_LIBRARY_HELP"));
421         addSettingComponent(pkcs11Panel, BundleMessage.format("UI_PKCS11_CONFIG"), pkcs11ConfigField,
422                 BundleMessage.format("UI_PKCS11_CONFIG_HELP"));
423         cardPanel.add(pkcs11Panel, "PKCS11");
424 
425         ((CardLayout) cardPanel.getLayout()).show(cardPanel, (String) clientKeystoreTypeCombo.getSelectedItem());
426 
427         clientKeystoreTypeCombo.addItemListener(event -> {
428             CardLayout cardLayout = (CardLayout) (cardPanel.getLayout());
429             if ("PKCS11".equals(event.getItem())) {
430                 cardLayout.show(cardPanel, "PKCS11");
431             } else {
432                 cardLayout.show(cardPanel, "FILE");
433             }
434         });
435         updateMaximumSize(clientKeystorePanel);
436         return clientKeystorePanel;
437     }
438 
439     protected JPanel getOauthPanel() {
440         JPanel oAuthPanel = new JPanel(new GridLayout(4, 2));
441         oAuthPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_OAUTH")));
442 
443         oauthTenantIdField = new JTextField(Settings.getProperty("davmail.oauth.tenantId"), 20);
444         oauthClientIdField = new JTextField(Settings.getProperty("davmail.oauth.clientId"), 20);
445         oauthRedirectUriField = new JTextField(Settings.getProperty("davmail.oauth.redirectUri"), 20);
446         oauthTldField = new JTextField(Settings.getProperty("davmail.tld"), 20);
447 
448         addSettingComponent(oAuthPanel, BundleMessage.format("UI_OAUTH_TENANTID"), oauthTenantIdField,
449                 BundleMessage.format("UI_OAUTH_TENANTID_HELP"));
450         addSettingComponent(oAuthPanel, BundleMessage.format("UI_OAUTH_CLIENTID"), oauthClientIdField,
451                 BundleMessage.format("UI_OAUTH_CLIENTID_HELP"));
452         addSettingComponent(oAuthPanel, BundleMessage.format("UI_OAUTH_REDIRECTURI"), oauthRedirectUriField,
453                 BundleMessage.format("UI_OAUTH_REDIRECTURI_HELP"));
454         addSettingComponent(oAuthPanel, BundleMessage.format("UI_OAUTH_TLD"), oauthTldField,
455                 BundleMessage.format("UI_OAUTH_TLD_HELP"));
456         updateMaximumSize(oAuthPanel);
457         return oAuthPanel;
458     }
459 
460     protected JPanel getNetworkSettingsPanel() {
461         JPanel networkSettingsPanel = new JPanel(new GridLayout(4, 2));
462         networkSettingsPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_NETWORK")));
463 
464         allowRemoteField = new JCheckBox();
465         allowRemoteField.setSelected(Settings.getBooleanProperty("davmail.allowRemote"));
466 
467         bindAddressField = new JTextField(Settings.getProperty("davmail.bindAddress"), 15);
468         clientSoTimeoutField = new JTextField(Settings.getProperty("davmail.clientSoTimeout"), 15);
469 
470         certHashField = new JTextField(Settings.getProperty("davmail.server.certificate.hash"), 15);
471 
472         addSettingComponent(networkSettingsPanel, BundleMessage.format("UI_BIND_ADDRESS"), bindAddressField,
473                 BundleMessage.format("UI_BIND_ADDRESS_HELP"));
474         addSettingComponent(networkSettingsPanel, BundleMessage.format("UI_CLIENT_SO_TIMEOUT"), clientSoTimeoutField,
475                 BundleMessage.format("UI_CLIENT_SO_TIMEOUT_HELP"));
476         addSettingComponent(networkSettingsPanel, BundleMessage.format("UI_ALLOW_REMOTE_CONNECTION"), allowRemoteField,
477                 BundleMessage.format("UI_ALLOW_REMOTE_CONNECTION_HELP"));
478         addSettingComponent(networkSettingsPanel, BundleMessage.format("UI_SERVER_CERTIFICATE_HASH"), certHashField,
479                 BundleMessage.format("UI_SERVER_CERTIFICATE_HASH_HELP"));
480         updateMaximumSize(networkSettingsPanel);
481         return networkSettingsPanel;
482     }
483 
484     protected JPanel getUISettingsPanel() {
485         JPanel uiSettingsPanel = new JPanel(new GridLayout(4, 2));
486         uiSettingsPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_OTHER")));
487 
488         enableTrayCheckBox = new JCheckBox();
489         enableTrayCheckBox.setSelected(Settings.getBooleanProperty("davmail.enableTray", false));
490         showStartupBannerCheckBox = new JCheckBox();
491         showStartupBannerCheckBox.setSelected(Settings.getBooleanProperty("davmail.showStartupBanner", !Settings.isLinux()));
492         disableGuiNotificationsCheckBox = new JCheckBox();
493         disableGuiNotificationsCheckBox.setSelected(Settings.getBooleanProperty("davmail.disableGuiNotifications", false));
494         disableTrayActivitySwitchCheckBox =  new JCheckBox();
495         disableTrayActivitySwitchCheckBox.setSelected(Settings.getBooleanProperty("davmail.disableTrayActivitySwitch", false));
496 
497         addSettingComponent(uiSettingsPanel, BundleMessage.format("UI_ENABLE_TRAY"), enableTrayCheckBox,
498                 BundleMessage.format("UI_ENABLE_TRAY_HELP"));
499         addSettingComponent(uiSettingsPanel, BundleMessage.format("UI_SHOW_STARTUP_BANNER"), showStartupBannerCheckBox,
500                 BundleMessage.format("UI_SHOW_STARTUP_BANNER_HELP"));
501         addSettingComponent(uiSettingsPanel, BundleMessage.format("UI_DISABLE_GUI_NOTIFICATIONS"), disableGuiNotificationsCheckBox,
502                 BundleMessage.format("UI_DISABLE_GUI_NOTIFICATIONS_HELP"));
503         addSettingComponent(uiSettingsPanel, BundleMessage.format("UI_DISABLE_TRAY_ACTIVITY_SWITCH"), disableTrayActivitySwitchCheckBox,
504                 BundleMessage.format("UI_DISABLE_TRAY_ACTIVITY_SWITCH_HELP"));
505 
506         updateMaximumSize(uiSettingsPanel);
507         return uiSettingsPanel;
508     }
509 
510     protected JPanel getOtherSettingsPanel() {
511         JPanel otherSettingsPanel = new JPanel(new GridLayout(13, 2));
512         otherSettingsPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_OTHER")));
513 
514         folderSizeLimitField = new JTextField(Settings.getProperty("davmail.folderSizeLimit"), 6);
515         enableKerberosCheckBox = new JCheckBox();
516         enableKerberosCheckBox.setSelected(Settings.getBooleanProperty("davmail.enableKerberos"));
517         caldavEditNotificationsField = new JCheckBox();
518         caldavEditNotificationsField.setSelected(Settings.getBooleanProperty("davmail.caldavEditNotifications"));
519         caldavAlarmSoundField = new JTextField(Settings.getProperty("davmail.caldavAlarmSound"), 15);
520         forceActiveSyncUpdateCheckBox = new JCheckBox();
521         forceActiveSyncUpdateCheckBox.setSelected(Settings.getBooleanProperty("davmail.forceActiveSyncUpdate"));
522         defaultDomainField = new JTextField(Settings.getProperty("davmail.defaultDomain"), 15);
523         imapAutoExpungeCheckBox = new JCheckBox();
524         imapAutoExpungeCheckBox.setSelected(Settings.getBooleanProperty("davmail.imapAutoExpunge", true));
525         imapAlwaysApproxMsgSizeCheckBox = new JCheckBox();
526         imapAlwaysApproxMsgSizeCheckBox.setSelected(Settings.getBooleanProperty("davmail.imapAlwaysApproxMsgSize", false));
527         enableKeepAliveCheckBox = new JCheckBox();
528         enableKeepAliveCheckBox.setSelected(Settings.getBooleanProperty("davmail.enableKeepAlive", false));
529         popMarkReadOnRetrCheckBox = new JCheckBox();
530         popMarkReadOnRetrCheckBox.setSelected(Settings.getBooleanProperty("davmail.popMarkReadOnRetr", false));
531         smtpSaveInSentCheckBox = new JCheckBox();
532         smtpSaveInSentCheckBox.setSelected(Settings.getBooleanProperty("davmail.smtpSaveInSent", true));
533         disableUpdateCheck = new JCheckBox();
534         disableUpdateCheck.setSelected(Settings.getBooleanProperty("davmail.disableUpdateCheck"));
535         caldavAutoScheduleCheckBox = new JCheckBox();
536         caldavAutoScheduleCheckBox.setSelected(Settings.getBooleanProperty("davmail.caldavAutoSchedule"));
537 
538         addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_FOLDER_SIZE_LIMIT"), folderSizeLimitField,
539                 BundleMessage.format("UI_FOLDER_SIZE_LIMIT_HELP"));
540         addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_ENABLE_KERBEROS"), enableKerberosCheckBox,
541                 BundleMessage.format("UI_ENABLE_KERBEROS_HELP"));
542         addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_CALDAV_EDIT_NOTIFICATIONS"), caldavEditNotificationsField,
543                 BundleMessage.format("UI_CALDAV_EDIT_NOTIFICATIONS_HELP"));
544         addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_CALDAV_ALARM_SOUND"), caldavAlarmSoundField,
545                 BundleMessage.format("UI_CALDAV_ALARM_SOUND_HELP"));
546         addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_FORCE_ACTIVESYNC_UPDATE"), forceActiveSyncUpdateCheckBox,
547                 BundleMessage.format("UI_FORCE_ACTIVESYNC_UPDATE_HELP"));
548         addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_DEFAULT_DOMAIN"), defaultDomainField,
549                 BundleMessage.format("UI_DEFAULT_DOMAIN_HELP"));
550         addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_IMAP_AUTO_EXPUNGE"), imapAutoExpungeCheckBox,
551                 BundleMessage.format("UI_IMAP_AUTO_EXPUNGE_HELP"));
552         addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_ALWAYS_APPROXIMATE_MSG_SIZE"), imapAlwaysApproxMsgSizeCheckBox,
553                 BundleMessage.format("UI_ALWAYS_APPROXIMATE_MSG_SIZE_HELP"));
554         addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_ENABLE_KEEPALIVE"), enableKeepAliveCheckBox,
555                 BundleMessage.format("UI_ENABLE_KEEPALIVE_HELP"));
556         addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_POP_MARK_READ"), popMarkReadOnRetrCheckBox,
557                 BundleMessage.format("UI_POP_MARK_READ_HELP"));
558         addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_SAVE_IN_SENT"), smtpSaveInSentCheckBox,
559                 BundleMessage.format("UI_SAVE_IN_SENT_HELP"));
560         addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_DISABLE_UPDATE_CHECK"), disableUpdateCheck,
561                 BundleMessage.format("UI_DISABLE_UPDATE_CHECK_HELP"));
562 
563         addSettingComponent(otherSettingsPanel, BundleMessage.format("UI_CALDAV_AUTO_SCHEDULE"), caldavAutoScheduleCheckBox,
564                 BundleMessage.format("UI_CALDAV_AUTO_SCHEDULE_HELP"));
565 
566         updateMaximumSize(otherSettingsPanel);
567         return otherSettingsPanel;
568     }
569 
570     protected JPanel getOSXPanel() {
571         JPanel osxSettingsPanel = new JPanel(new GridLayout(1, 2));
572         osxSettingsPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_OSX")));
573 
574         osxHideFromDockCheckBox = new JCheckBox();
575         osxHideFromDockCheckBox.setSelected(OSXInfoPlist.isHideFromDock());
576 
577         addSettingComponent(osxSettingsPanel, BundleMessage.format("UI_OSX_HIDE_FROM_DOCK"), osxHideFromDockCheckBox,
578                 BundleMessage.format("UI_OSX_HIDE_FROM_DOCK_HELP"));
579 
580         updateMaximumSize(osxSettingsPanel);
581         return osxSettingsPanel;
582     }
583 
584     protected JPanel getLoggingSettingsPanel() {
585         JPanel loggingLevelPanel = new JPanel();
586         JPanel leftLoggingPanel = new JPanel(new GridLayout(2, 2));
587         JPanel rightLoggingPanel = new JPanel(new GridLayout(2, 2));
588         loggingLevelPanel.add(leftLoggingPanel);
589         loggingLevelPanel.add(rightLoggingPanel);
590 
591         rootLoggingLevelField = new JComboBox<>(LOG_LEVELS);
592         davmailLoggingLevelField = new JComboBox<>(LOG_LEVELS);
593         httpclientLoggingLevelField = new JComboBox<>(LOG_LEVELS);
594         wireLoggingLevelField = new JComboBox<>(LOG_LEVELS);
595         logFilePathField = new JTextField(Settings.getProperty("davmail.logFilePath"), 15);
596         logFileSizeField = new JTextField(Settings.getProperty("davmail.logFileSize"), 15);
597 
598         rootLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("rootLogger"));
599         davmailLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("davmail"));
600         httpclientLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("httpclient"));
601         wireLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("httpclient.wire"));
602 
603         addSettingComponent(leftLoggingPanel, BundleMessage.format("UI_LOG_DEFAULT"), rootLoggingLevelField);
604         addSettingComponent(leftLoggingPanel, BundleMessage.format("UI_LOG_DAVMAIL"), davmailLoggingLevelField);
605         addSettingComponent(rightLoggingPanel, BundleMessage.format("UI_LOG_HTTPCLIENT"), httpclientLoggingLevelField);
606         addSettingComponent(rightLoggingPanel, BundleMessage.format("UI_LOG_WIRE"), wireLoggingLevelField);
607 
608         JPanel logFilePathPanel = new JPanel(new GridLayout(2, 2));
609         addSettingComponent(logFilePathPanel, BundleMessage.format("UI_LOG_FILE_PATH"), logFilePathField);
610         addSettingComponent(logFilePathPanel, BundleMessage.format("UI_LOG_FILE_SIZE"), logFileSizeField, BundleMessage.format("UI_LOG_FILE_SIZE_HELP"));
611 
612         JButton defaultButton = new JButton(BundleMessage.format("UI_BUTTON_DEFAULT"));
613         defaultButton.setToolTipText(BundleMessage.format("UI_BUTTON_DEFAULT_HELP"));
614         defaultButton.addActionListener(e -> {
615             rootLoggingLevelField.setSelectedItem(Level.WARN);
616             davmailLoggingLevelField.setSelectedItem(Level.DEBUG);
617             httpclientLoggingLevelField.setSelectedItem(Level.WARN);
618             wireLoggingLevelField.setSelectedItem(Level.WARN);
619         });
620 
621         JPanel loggingPanel = new JPanel();
622         loggingPanel.setLayout(new BoxLayout(loggingPanel, BoxLayout.Y_AXIS));
623         loggingPanel.setBorder(BorderFactory.createTitledBorder(BundleMessage.format("UI_LOGGING_LEVELS")));
624         loggingPanel.add(logFilePathPanel);
625         loggingPanel.add(loggingLevelPanel);
626         loggingPanel.add(defaultButton);
627 
628         updateMaximumSize(loggingPanel);
629         return loggingPanel;
630     }
631 
632     protected void updateMaximumSize(JPanel panel) {
633         Dimension preferredSize = panel.getPreferredSize();
634         preferredSize.width = Integer.MAX_VALUE;
635         panel.setMaximumSize(preferredSize);
636     }
637 
638     /**
639      * Reload settings from properties.
640      */
641     public void reload() {
642         // reload settings in form
643         urlField.setText(Settings.getProperty("davmail.url", Settings.getO365Url()));
644         popPortField.setText(Settings.getProperty("davmail.popPort"));
645         popPortCheckBox.setSelected(Settings.getProperty("davmail.popPort") != null && !Settings.getProperty("davmail.popPort").isEmpty());
646         popNoSSLCheckBox.setSelected(Settings.getBooleanProperty("davmail.ssl.nosecurepop"));
647         imapPortField.setText(Settings.getProperty("davmail.imapPort"));
648         imapPortCheckBox.setSelected(Settings.getProperty("davmail.imapPort") != null && !Settings.getProperty("davmail.imapPort").isEmpty());
649         imapNoSSLCheckBox.setSelected(Settings.getBooleanProperty("davmail.ssl.nosecureimap"));
650         smtpPortField.setText(Settings.getProperty("davmail.smtpPort"));
651         smtpPortCheckBox.setSelected(Settings.getProperty("davmail.smtpPort") != null && !Settings.getProperty("davmail.smtpPort").isEmpty());
652         smtpNoSSLCheckBox.setSelected(Settings.getBooleanProperty("davmail.ssl.nosecuresmtp"));
653         caldavPortField.setText(Settings.getProperty("davmail.caldavPort"));
654         caldavPortCheckBox.setSelected(Settings.getProperty("davmail.caldavPort") != null && !Settings.getProperty("davmail.caldavPort").isEmpty());
655         caldavNoSSLCheckBox.setSelected(Settings.getBooleanProperty("davmail.ssl.nosecurecaldav"));
656         ldapPortField.setText(Settings.getProperty("davmail.ldapPort"));
657         ldapPortCheckBox.setSelected(Settings.getProperty("davmail.ldapPort") != null && !Settings.getProperty("davmail.ldapPort").isEmpty());
658         ldapNoSSLCheckBox.setSelected(Settings.getBooleanProperty("davmail.ssl.nosecureldap"));
659         keepDelayField.setText(Settings.getProperty("davmail.keepDelay"));
660         sentKeepDelayField.setText(Settings.getProperty("davmail.sentKeepDelay"));
661         caldavPastDelayField.setText(Settings.getProperty("davmail.caldavPastDelay"));
662         imapIdleDelayField.setText(Settings.getProperty("davmail.imapIdleDelay"));
663         boolean useSystemProxies = Settings.getBooleanProperty("davmail.useSystemProxies", Boolean.FALSE);
664         useSystemProxiesField.setSelected(useSystemProxies);
665         boolean enableProxy = Settings.getBooleanProperty("davmail.enableProxy");
666         enableProxyField.setSelected(enableProxy);
667         enableProxyField.setEnabled(!useSystemProxies);
668         httpProxyField.setEnabled(enableProxy);
669         httpProxyPortField.setEnabled(enableProxy);
670         httpProxyUserField.setEnabled(useSystemProxies || enableProxy);
671         httpProxyPasswordField.setEnabled(useSystemProxies || enableProxy);
672         noProxyForField.setEnabled(enableProxy);
673         httpProxyField.setText(Settings.getProperty("davmail.proxyHost"));
674         httpProxyPortField.setText(Settings.getProperty("davmail.proxyPort"));
675         httpProxyUserField.setText(Settings.getProperty("davmail.proxyUser"));
676         httpProxyPasswordField.setText(Settings.getProperty("davmail.proxyPassword"));
677         noProxyForField.setText(Settings.getProperty("davmail.noProxyFor"));
678 
679         bindAddressField.setText(Settings.getProperty("davmail.bindAddress"));
680         allowRemoteField.setSelected(Settings.getBooleanProperty(("davmail.allowRemote")));
681         certHashField.setText(Settings.getProperty("davmail.server.certificate.hash"));
682         disableUpdateCheck.setSelected(Settings.getBooleanProperty(("davmail.disableUpdateCheck")));
683 
684         caldavEditNotificationsField.setSelected(Settings.getBooleanProperty("davmail.caldavEditNotifications"));
685         clientSoTimeoutField.setText(Settings.getProperty("davmail.clientSoTimeout"));
686         caldavAlarmSoundField.setText(Settings.getProperty("davmail.caldavAlarmSound"));
687         forceActiveSyncUpdateCheckBox.setSelected(Settings.getBooleanProperty("davmail.forceActiveSyncUpdate"));
688         defaultDomainField.setText(Settings.getProperty("davmail.defaultDomain"));
689         enableTrayCheckBox.setSelected(Settings.getBooleanProperty("davmail.enableTray", !Settings.isLinux()));
690         showStartupBannerCheckBox.setSelected(Settings.getBooleanProperty("davmail.showStartupBanner", true));
691         disableGuiNotificationsCheckBox.setSelected(Settings.getBooleanProperty("davmail.disableGuiNotifications", false));
692         disableTrayActivitySwitchCheckBox.setSelected(Settings.getBooleanProperty("davmail.disableTrayActivitySwitch", false));
693         imapAutoExpungeCheckBox.setSelected(Settings.getBooleanProperty("davmail.imapAutoExpunge", true));
694         imapAlwaysApproxMsgSizeCheckBox.setSelected(Settings.getBooleanProperty("davmail.imapAlwaysApproxMsgSize", false));
695         enableKeepAliveCheckBox.setSelected(Settings.getBooleanProperty("davmail.enableKeepAlive", false));
696         popMarkReadOnRetrCheckBox.setSelected(Settings.getBooleanProperty("davmail.popMarkReadOnRetr", false));
697         modeComboBox.setSelectedItem(Settings.getProperty("davmail.mode", Settings.O365_EWS));
698         authenticationComboBox.setSelectedItem(Settings.getProperty("davmail.authentication", Settings.O365_INTERACTIVE));
699         smtpSaveInSentCheckBox.setSelected(Settings.getBooleanProperty("davmail.smtpSaveInSent", true));
700         enableKerberosCheckBox.setSelected(Settings.getBooleanProperty("davmail.enableKerberos", false));
701         folderSizeLimitField.setText(Settings.getProperty("davmail.folderSizeLimit"));
702 
703         keystoreTypeCombo.setSelectedItem(Settings.getProperty("davmail.ssl.keystoreType"));
704         keystoreFileField.setText(Settings.getProperty("davmail.ssl.keystoreFile"));
705         keystorePassField.setText(Settings.getProperty("davmail.ssl.keystorePass"));
706         keyPassField.setText(Settings.getProperty("davmail.ssl.keyPass"));
707 
708         clientKeystoreTypeCombo.setSelectedItem(Settings.getProperty("davmail.ssl.clientKeystoreType"));
709         pkcs11LibraryField.setText(Settings.getProperty("davmail.ssl.pkcs11Library"));
710         pkcs11ConfigField.setText(Settings.getProperty("davmail.ssl.pkcs11Config"));
711 
712         oauthTenantIdField.setText(Settings.getProperty("davmail.oauth.tenantId"));
713         oauthClientIdField.setText(Settings.getProperty("davmail.oauth.clientId"));
714         oauthRedirectUriField.setText(Settings.getProperty("davmail.oauth.redirectUri"));
715         oauthTldField.setText(Settings.getProperty("davmail.tld"));
716 
717         rootLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("rootLogger"));
718         davmailLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("davmail"));
719         httpclientLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("httpclient"));
720         wireLoggingLevelField.setSelectedItem(Settings.getLoggingLevel("httpclient.wire"));
721         logFilePathField.setText(Settings.getProperty("davmail.logFilePath"));
722         logFileSizeField.setText(Settings.getProperty("davmail.logFileSize"));
723 
724         if (osxHideFromDockCheckBox != null) {
725             osxHideFromDockCheckBox.setSelected(OSXInfoPlist.isHideFromDock());
726         }
727     }
728 
729     protected boolean isSslEnabled() {
730         if (keystoreFileField != null) {
731             return !keystoreFileField.getText().isEmpty();
732         } else {
733             return Settings.getProperty("davmail.ssl.keystoreFile") != null &&
734                     (!Settings.getProperty("davmail.ssl.keystoreFile").isEmpty());
735         }
736     }
737 
738     protected void generateSelfSignedCertificate() {
739         String configFilePath = Settings.getConfigFilePath();
740         String keystorePath = davmail.http.SelfSignedCertificateGenerator.resolveKeystorePath(configFilePath);
741         String keystorePassword = davmail.http.SelfSignedCertificateGenerator.DEFAULT_KEYSTORE_PASSWORD;
742 
743         try {
744             davmail.http.SelfSignedCertificateGenerator.generateAndSave(keystorePath, keystorePassword);
745             keystoreTypeCombo.setSelectedItem("PKCS12");
746             keystoreFileField.setText(keystorePath);
747             keystorePassField.setText(keystorePassword);
748             keyPassField.setText(keystorePassword);
749             JOptionPane.showMessageDialog(this,
750                     BundleMessage.format("UI_GENERATE_CERTIFICATE_SUCCESS", keystorePath),
751                     BundleMessage.format("UI_GENERATE_CERTIFICATE"),
752                     JOptionPane.INFORMATION_MESSAGE);
753         } catch (Exception e) {
754             DavGatewayTray.error(new BundleMessage("UI_GENERATE_CERTIFICATE_ERROR", e.getMessage()));
755             JOptionPane.showMessageDialog(this,
756                     e.getMessage(),
757                     BundleMessage.format("UI_GENERATE_CERTIFICATE"),
758                     JOptionPane.ERROR_MESSAGE);
759         }
760     }
761 
762     /**
763      * DavMail settings frame.
764      */
765     public SettingsFrame() {
766         setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
767         setTitle(BundleMessage.format("UI_DAVMAIL_SETTINGS"));
768         try {
769             setIconImages(DavGatewayTray.getFrameIcons());
770         } catch (NoSuchMethodError error) {
771             DavGatewayTray.debug(new BundleMessage("LOG_UNABLE_TO_SET_ICON_IMAGE"));
772         }
773 
774         JTabbedPane tabbedPane = new JTabbedPane();
775         // add help (F1 handler)
776         tabbedPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke("F1"),
777                 "help");
778         tabbedPane.getActionMap().put("help", new AbstractAction() {
779             public void actionPerformed(ActionEvent e) {
780                 DesktopBrowser.browse("https://davmail.sourceforge.net");
781             }
782         });
783         tabbedPane.addChangeListener(e -> {
784             boolean isSslEnabled = isSslEnabled();
785             popNoSSLCheckBox.setEnabled(Settings.getProperty("davmail.popPort") != null && isSslEnabled);
786             imapNoSSLCheckBox.setEnabled(imapPortCheckBox.isSelected() && isSslEnabled);
787             smtpNoSSLCheckBox.setEnabled(smtpPortCheckBox.isSelected() && isSslEnabled);
788             caldavNoSSLCheckBox.setEnabled(caldavPortCheckBox.isSelected() && isSslEnabled);
789             ldapNoSSLCheckBox.setEnabled(ldapPortCheckBox.isSelected() && isSslEnabled);
790         });
791 
792         JPanel mainPanel = new JPanel();
793         mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
794         mainPanel.add(getSettingsPanel());
795         mainPanel.add(getDelaysPanel());
796         mainPanel.add(Box.createVerticalGlue());
797 
798         tabbedPane.add(BundleMessage.format("UI_TAB_MAIN"), mainPanel);
799 
800         JPanel proxyPanel = new JPanel();
801         proxyPanel.setLayout(new BoxLayout(proxyPanel, BoxLayout.Y_AXIS));
802         proxyPanel.add(getProxyPanel());
803         proxyPanel.add(getNetworkSettingsPanel());
804         tabbedPane.add(BundleMessage.format("UI_TAB_NETWORK"), proxyPanel);
805 
806         JPanel encryptionPanel = new JPanel();
807         encryptionPanel.setLayout(new BoxLayout(encryptionPanel, BoxLayout.Y_AXIS));
808         encryptionPanel.add(getKeystorePanel());
809         encryptionPanel.add(getSmartCardPanel());
810         encryptionPanel.add(getOauthPanel());
811         // empty panel
812         encryptionPanel.add(new JPanel());
813         tabbedPane.add(BundleMessage.format("UI_TAB_ENCRYPTION"), encryptionPanel);
814 
815         JPanel loggingPanel = new JPanel();
816         loggingPanel.setLayout(new BoxLayout(loggingPanel, BoxLayout.Y_AXIS));
817         loggingPanel.add(getLoggingSettingsPanel());
818         // empty panel
819         loggingPanel.add(new JPanel());
820 
821         tabbedPane.add(BundleMessage.format("UI_TAB_LOGGING"), loggingPanel);
822 
823         JPanel uiPanel = new JPanel();
824         uiPanel.setLayout(new BoxLayout(uiPanel, BoxLayout.Y_AXIS));
825 
826         uiPanel.add(getUISettingsPanel());
827         // empty panel
828         uiPanel.add(new JPanel());
829 
830         tabbedPane.add(BundleMessage.format("UI_TAB_UI"), uiPanel);
831 
832         JPanel advancedPanel = new JPanel();
833         advancedPanel.setLayout(new BoxLayout(advancedPanel, BoxLayout.Y_AXIS));
834 
835         advancedPanel.add(getOtherSettingsPanel());
836         // empty panel
837         advancedPanel.add(new JPanel());
838 
839         tabbedPane.add(BundleMessage.format("UI_TAB_ADVANCED"), advancedPanel);
840 
841         if (OSXInfoPlist.isOSX()) {
842             JPanel osxPanel = new JPanel();
843             osxPanel.setLayout(new BoxLayout(osxPanel, BoxLayout.Y_AXIS));
844             osxPanel.add(getOSXPanel());
845             // empty panel
846             osxPanel.add(new JPanel());
847 
848             tabbedPane.add(BundleMessage.format("UI_TAB_OSX"), osxPanel);
849         }
850 
851         add(BorderLayout.CENTER, tabbedPane);
852 
853         JPanel buttonPanel = new JPanel();
854         JButton cancel = new JButton(BundleMessage.format("UI_BUTTON_CANCEL"));
855         JButton ok = new JButton(BundleMessage.format("UI_BUTTON_SAVE"));
856         JButton help = new JButton(BundleMessage.format("UI_BUTTON_HELP"));
857         ActionListener save = evt -> {
858             // save options
859             Settings.setProperty("davmail.url", urlField.getText().trim());
860             Settings.setProperty("davmail.popPort", popPortCheckBox.isSelected() ? popPortField.getText() : "");
861             Settings.setProperty("davmail.ssl.nosecurepop", String.valueOf(popNoSSLCheckBox.isSelected()));
862             Settings.setProperty("davmail.imapPort", imapPortCheckBox.isSelected() ? imapPortField.getText() : "");
863             Settings.setProperty("davmail.ssl.nosecureimap", String.valueOf(imapNoSSLCheckBox.isSelected()));
864             Settings.setProperty("davmail.smtpPort", smtpPortCheckBox.isSelected() ? smtpPortField.getText() : "");
865             Settings.setProperty("davmail.ssl.nosecuresmtp", String.valueOf(smtpNoSSLCheckBox.isSelected()));
866             Settings.setProperty("davmail.caldavPort", caldavPortCheckBox.isSelected() ? caldavPortField.getText() : "");
867             Settings.setProperty("davmail.ssl.nosecurecaldav", String.valueOf(caldavNoSSLCheckBox.isSelected()));
868             Settings.setProperty("davmail.ldapPort", ldapPortCheckBox.isSelected() ? ldapPortField.getText() : "");
869             Settings.setProperty("davmail.ssl.nosecureldap", String.valueOf(ldapNoSSLCheckBox.isSelected()));
870             Settings.setProperty("davmail.keepDelay", keepDelayField.getText());
871             Settings.setProperty("davmail.sentKeepDelay", sentKeepDelayField.getText());
872             Settings.setProperty("davmail.caldavPastDelay", caldavPastDelayField.getText());
873             Settings.setProperty("davmail.imapIdleDelay", imapIdleDelayField.getText());
874             Settings.setProperty("davmail.useSystemProxies", String.valueOf(useSystemProxiesField.isSelected()));
875             Settings.setProperty("davmail.enableProxy", String.valueOf(enableProxyField.isSelected()));
876             Settings.setProperty("davmail.proxyHost", httpProxyField.getText());
877             Settings.setProperty("davmail.proxyPort", httpProxyPortField.getText());
878             Settings.setProperty("davmail.proxyUser", httpProxyUserField.getText());
879             Settings.setProperty("davmail.proxyPassword", httpProxyPasswordField.getText());
880             Settings.setProperty("davmail.noProxyFor", noProxyForField.getText());
881 
882             Settings.setProperty("davmail.bindAddress", bindAddressField.getText());
883             Settings.setProperty("davmail.clientSoTimeout", String.valueOf(clientSoTimeoutField.getText()));
884             Settings.setProperty("davmail.allowRemote", String.valueOf(allowRemoteField.isSelected()));
885             Settings.setProperty("davmail.server.certificate.hash", certHashField.getText());
886             Settings.setProperty("davmail.disableUpdateCheck", String.valueOf(disableUpdateCheck.isSelected()));
887             Settings.setProperty("davmail.caldavAutoSchedule", String.valueOf(caldavAutoScheduleCheckBox.isSelected()));
888 
889             Settings.setProperty("davmail.caldavEditNotifications", String.valueOf(caldavEditNotificationsField.isSelected()));
890             Settings.setProperty("davmail.caldavAlarmSound", String.valueOf(caldavAlarmSoundField.getText()));
891             Settings.setProperty("davmail.forceActiveSyncUpdate", String.valueOf(forceActiveSyncUpdateCheckBox.isSelected()));
892             Settings.setProperty("davmail.defaultDomain", String.valueOf(defaultDomainField.getText()));
893             Settings.setProperty("davmail.enableTray", String.valueOf(enableTrayCheckBox.isSelected()));
894             Settings.setProperty("davmail.showStartupBanner", String.valueOf(showStartupBannerCheckBox.isSelected()));
895             Settings.setProperty("davmail.disableGuiNotifications", String.valueOf(disableGuiNotificationsCheckBox.isSelected()));
896             Settings.setProperty("davmail.disableTrayActivitySwitch", String.valueOf(disableTrayActivitySwitchCheckBox.isSelected()));
897             Settings.setProperty("davmail.imapAutoExpunge", String.valueOf(imapAutoExpungeCheckBox.isSelected()));
898             Settings.setProperty("davmail.imapAlwaysApproxMsgSize", String.valueOf(imapAlwaysApproxMsgSizeCheckBox.isSelected()));
899             Settings.setProperty("davmail.enableKeepAlive", String.valueOf(enableKeepAliveCheckBox.isSelected()));
900             Settings.setProperty("davmail.popMarkReadOnRetr", String.valueOf(popMarkReadOnRetrCheckBox.isSelected()));
901 
902             Settings.setProperty("davmail.mode", (String) modeComboBox.getSelectedItem());
903             Settings.setProperty("davmail.authentication", (String) authenticationComboBox.getSelectedItem());
904             Settings.setProperty("davmail.enableKerberos", String.valueOf(enableKerberosCheckBox.isSelected()));
905             Settings.setProperty("davmail.folderSizeLimit", folderSizeLimitField.getText());
906             Settings.setProperty("davmail.smtpSaveInSent", String.valueOf(smtpSaveInSentCheckBox.isSelected()));
907 
908             Settings.setProperty("davmail.ssl.keystoreType", (String) keystoreTypeCombo.getSelectedItem());
909             Settings.setProperty("davmail.ssl.keystoreFile", keystoreFileField.getText());
910             Settings.setProperty("davmail.ssl.keystorePass", String.valueOf(keystorePassField.getPassword()));
911             Settings.setProperty("davmail.ssl.keyPass", String.valueOf(keyPassField.getPassword()));
912 
913             Settings.setProperty("davmail.ssl.clientKeystoreType", (String) clientKeystoreTypeCombo.getSelectedItem());
914             Settings.setProperty("davmail.ssl.clientKeystoreFile", clientKeystoreFileField.getText());
915             Settings.setProperty("davmail.ssl.clientKeystorePass", String.valueOf(clientKeystorePassField.getPassword()));
916             Settings.setProperty("davmail.ssl.pkcs11Library", pkcs11LibraryField.getText());
917             Settings.setProperty("davmail.ssl.pkcs11Config", pkcs11ConfigField.getText());
918 
919             Settings.setProperty("davmail.oauth.tenantId", oauthTenantIdField.getText());
920             Settings.setProperty("davmail.oauth.clientId", oauthClientIdField.getText());
921             Settings.setProperty("davmail.oauth.redirectUri", oauthRedirectUriField.getText());
922             Settings.setProperty("davmail.tld", oauthTldField.getText());
923 
924             Settings.setLoggingLevel("rootLogger", (Level) rootLoggingLevelField.getSelectedItem());
925             Settings.setLoggingLevel("davmail", (Level) davmailLoggingLevelField.getSelectedItem());
926             Settings.setLoggingLevel("httpclient", (Level) httpclientLoggingLevelField.getSelectedItem());
927             Settings.setLoggingLevel("httpclient.wire", (Level) wireLoggingLevelField.getSelectedItem());
928             Settings.setProperty("davmail.logFilePath", logFilePathField.getText());
929             Settings.setProperty("davmail.logFileSize", logFileSizeField.getText());
930 
931             setVisible(false);
932             Settings.save();
933 
934             if (osxHideFromDockCheckBox != null) {
935                 OSXInfoPlist.setOSXHideFromDock(osxHideFromDockCheckBox.isSelected());
936             }
937 
938             // restart listeners with new config
939             DavGateway.restart();
940         };
941         ok.addActionListener(save);
942 
943         cancel.addActionListener(evt -> {
944             reload();
945             setVisible(false);
946         });
947 
948         help.addActionListener(e -> DesktopBrowser.browse("https://davmail.sourceforge.net"));
949 
950         buttonPanel.add(ok);
951         buttonPanel.add(cancel);
952         buttonPanel.add(help);
953 
954         add(BorderLayout.SOUTH, buttonPanel);
955 
956         pack();
957         //setResizable(false);
958         // center frame
959         setLocationRelativeTo(null);
960         urlField.requestFocus();
961     }
962 }