1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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
640
641 public void reload() {
642
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
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
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
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
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
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
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
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
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
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
958
959 setLocationRelativeTo(null);
960 urlField.requestFocus();
961 }
962 }