com.amalto.workbench.preferences.SSLPreferences.java Source code

Java tutorial

Introduction

Here is the source code for com.amalto.workbench.preferences.SSLPreferences.java

Source

// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package com.amalto.workbench.preferences;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;

import com.amalto.workbench.MDMWorbenchPlugin;
import com.amalto.workbench.i18n.Messages;
import com.amalto.workbench.preferences.JSSEConstants.KEYSTORE_TYPE;
import com.amalto.workbench.preferences.JSSEConstants.SSL_Algorithm;
import com.amalto.workbench.utils.PasswordUtil;
import com.amalto.workbench.utils.SSLContextProvider;

/**
 * created by changguopiao on 2013-7-10 Detailled comment
 * 
 */
public class SSLPreferences extends PreferencePage implements IWorkbenchPreferencePage {

    private static final String[] SSL_ALGORITHMS;

    private static final String[] KEYSTORE_TYPES;

    private static Log log = LogFactory.getLog(SSLPreferences.class);

    static {
        SSL_Algorithm[] algorithms = SSL_Algorithm.values();
        SSL_ALGORITHMS = new String[algorithms.length];
        for (int i = 0; i < algorithms.length; i++) {
            SSL_ALGORITHMS[i] = algorithms[i].name();
        }
        KEYSTORE_TYPE[] kt = KEYSTORE_TYPE.values();
        KEYSTORE_TYPES = new String[kt.length];
        for (int i = 0; i < kt.length; i++) {
            KEYSTORE_TYPES[i] = kt[i].name();
        }
    }

    public static String getDefaultKeystoreType() {
        return KEYSTORE_TYPES[0];
    }

    public static String getDefaultAlgorithmType() {
        return SSL_ALGORITHMS[0];
    }

    public synchronized void init(IWorkbench workbench) {
        IPreferenceStore store = MDMWorbenchPlugin.getDefault().getPreferenceStore();
        super.setPreferenceStore(store);
    }

    private Combo sslAlgorithmCombo;

    private Button[] verificationType;

    private Text keyPath;

    private Text keyPassword;

    private Combo keyType;

    private Text trustPath;

    private Text trustPassword;

    private Combo trustType;

    private CLabel createLabel(Composite parent, String text) {
        CLabel label = new CLabel(parent, SWT.LEFT);
        label.setText(text);
        GridDataFactory.fillDefaults().applyTo(label);
        return label;
    }

    private Text createText(Composite parent, String content, int hsize) {
        return createText(parent, content, hsize, false);
    }

    private Text createText(Composite parent, String content, int hsize, boolean pw) {
        Text text = null;
        if (pw) {
            text = new Text(parent, SWT.BORDER | SWT.PASSWORD);
        } else {
            text = new Text(parent, SWT.SINGLE | SWT.BORDER);
        }
        if (null != content) {
            text.setText(content);
        }
        if (hsize == 1) {
            GridDataFactory.swtDefaults().span(hsize, 1).hint(200, -1).applyTo(text);
        } else {
            GridDataFactory.fillDefaults().span(hsize, 1).applyTo(text);
        }
        return text;
    }

    private Combo createCombo(Composite parent, String[] items, int index, int hsize) {
        Combo combo = new Combo(parent, SWT.READ_ONLY | SWT.BORDER);
        combo.setItems(items);
        combo.select(index);
        GridDataFactory.defaultsFor(combo).span(hsize, 1).indent(hsize, 1).minSize(100, SWT.DEFAULT).applyTo(combo);
        return combo;
    }

    private Combo createCombo(Composite parent, String[] items, String dItem, int hsize) {
        int index = 0;
        if (null != dItem) {
            for (int i = 0; i < items.length; i++) {
                if (dItem.equals(items[i])) {
                    index = i;
                }
            }
        }
        return createCombo(parent, items, index, hsize);
    }

    private void createFilePicker(Composite parent, final Text text, final Shell shell) {
        Button button = new Button(parent, SWT.PUSH);
        button.setText(Messages.fileBrowse);
        button.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                FileDialog dialog = new FileDialog(shell);
                dialog.setText(Messages.keystoreFileTile);
                String str = dialog.open();
                if (null != str) {
                    text.setText(str);
                }
            }
        });
        GridDataFactory.fillDefaults().applyTo(button);
    }

    private Group createGroup(String title, Composite parent, int column) {
        Group group = new Group(parent, SWT.NONE);
        group.setText(title);
        GridDataFactory.fillDefaults().grab(true, true).applyTo(group);
        group.setLayout(new GridLayout(column, false));
        return group;
    }

    private Button[] createRadioBox(Composite parent, int hsize) {
        Composite com = new Composite(parent, SWT.NONE);
        GridDataFactory.fillDefaults().span(hsize, 1).applyTo(com);
        com.setLayout(new FillLayout());
        Button[] buttons = new Button[2];
        buttons[0] = new Button(com, SWT.RADIO);
        buttons[0].setText(Messages.verify_ALLOW_ALL);
        buttons[1] = new Button(com, SWT.RADIO);
        buttons[1].setText(Messages.verify_STRICT);
        return buttons;
    }

    private void setRadioValue(boolean value) {
        verificationType[0].setSelection(!value);
        verificationType[1].setSelection(value);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createContents(Composite parent) {
        IPreferenceStore store = getPreferenceStore();
        Composite composite = new Composite(parent, SWT.NONE);
        GridDataFactory.fillDefaults().applyTo(composite);
        composite.setLayout(new GridLayout(1, false));
        {
            Group group = createGroup(Messages.securityTitle, composite, 3);
            createLabel(group, Messages.sslAlgorithm);
            sslAlgorithmCombo = createCombo(group, SSL_ALGORITHMS,
                    store.getString(PreferenceConstants.SSL_Algorithm), 2);
            createLabel(group, Messages.hostnameVerificationMode);
            verificationType = createRadioBox(group, 2);
            setRadioValue(store.getBoolean(PreferenceConstants.VERIFY_HOSTNAME));

        }
        {
            Group group = createGroup(Messages.keystoreConfiguration, composite, 3);
            createLabel(group, Messages.keystorePath);
            keyPath = createText(group, store.getString(PreferenceConstants.KEYSTORE_FILE), 1);
            createFilePicker(group, keyPath, parent.getShell());
            createLabel(group, Messages.keystorePassword);
            String keystorePassword = store.getString(PreferenceConstants.KEYSTORE_PASSWORD);
            keystorePassword = decryptPasswd(keystorePassword);
            keyPassword = createText(group, keystorePassword, 2, true);
            createLabel(group, Messages.keyststoreType);
            keyType = createCombo(group, SSLPreferences.KEYSTORE_TYPES,
                    store.getString(PreferenceConstants.KEYSTORE_TYPE), 2);
        }
        {
            Group group = createGroup(Messages.truststoreConfiguration, composite, 3);
            createLabel(group, Messages.keystorePath);
            trustPath = createText(group, store.getString(PreferenceConstants.TRUSTSTORE_FILE), 1);
            createFilePicker(group, trustPath, parent.getShell());
            createLabel(group, Messages.keystorePassword);
            String truststorePassword = store.getString(PreferenceConstants.TRUSTSTORE_PASSWORD);
            truststorePassword = decryptPasswd(truststorePassword);
            trustPassword = createText(group, truststorePassword, 2, true);
            createLabel(group, Messages.keyststoreType);
            trustType = createCombo(group, SSLPreferences.KEYSTORE_TYPES,
                    store.getString(PreferenceConstants.KEYSTORE_TYPE), 2);
        }
        return composite;
    }

    private String encryptPasswd(String passwd) {
        return PasswordUtil.encryptPassword(passwd);
    }

    private String decryptPasswd(String passwd) {
        return PasswordUtil.decryptPassword(passwd);
    }

    private void comboSelect(Combo combo, String str) {
        if (null == str) {
            return;
        }
        String[] items = combo.getItems();
        for (int i = 0; i < items.length; i++) {
            if (str.equals(items[i])) {
                combo.select(i);
                return;
            }
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
     */
    @Override
    protected void performDefaults() {
        IPreferenceStore store = getPreferenceStore();

        comboSelect(sslAlgorithmCombo, store.getDefaultString(PreferenceConstants.SSL_Algorithm));
        setRadioValue(store.getDefaultBoolean(PreferenceConstants.VERIFY_HOSTNAME));

        keyPath.setText(store.getDefaultString(PreferenceConstants.KEYSTORE_FILE));
        keyPassword.setText(store.getDefaultString(PreferenceConstants.KEYSTORE_PASSWORD));
        comboSelect(keyType, store.getDefaultString(PreferenceConstants.KEYSTORE_TYPE));

        trustPath.setText(store.getDefaultString(PreferenceConstants.TRUSTSTORE_PASSWORD));
        trustPassword.setText(store.getDefaultString(PreferenceConstants.TRUSTSTORE_PASSWORD));
        comboSelect(trustType, store.getDefaultString(PreferenceConstants.TRUSTSTORE_TYPE));

        super.performDefaults();
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.preference.PreferencePage#performOk()
     */
    @Override
    public boolean performOk() {
        IPreferenceStore store = getPreferenceStore();
        String algorithm = sslAlgorithmCombo.getText();
        String keypath = keyPath.getText();
        String keypass = keyPassword.getText();
        String keytype = keyType.getText();
        String trustpath = trustPath.getText();
        String trustpass = trustPassword.getText();
        String trusttype = trustType.getText();
        try {
            SSLContextProvider.buildContext(algorithm, keypath, keypass, keytype, trustpath, trustpass, trusttype);
            store.setValue(PreferenceConstants.SSL_Algorithm, algorithm);
            store.setValue(PreferenceConstants.VERIFY_HOSTNAME, verificationType[1].getSelection());
            store.setValue(PreferenceConstants.KEYSTORE_FILE, keypath);
            store.setValue(PreferenceConstants.KEYSTORE_PASSWORD, encryptPasswd(keypass));
            store.setValue(PreferenceConstants.KEYSTORE_TYPE, keytype);
            store.setValue(PreferenceConstants.TRUSTSTORE_FILE, trustpath);
            store.setValue(PreferenceConstants.TRUSTSTORE_PASSWORD, encryptPasswd(trustpass));
            store.setValue(PreferenceConstants.TRUSTSTORE_TYPE, trusttype);
            setErrorMessage(null);
            return super.performOk();
        } catch (Exception e) {
            setErrorMessage(e.getMessage());
            log.error(e.getMessage(), e);
            return false;
        }

    }
}