org.coronastreet.gpxconverter.AccountManager.java Source code

Java tutorial

Introduction

Here is the source code for org.coronastreet.gpxconverter.AccountManager.java

Source

/* 
*  Copyright 2012-2014 Coronastreet Networks 
*  Licensed under the Apache License, Version 2.0 (the "License"); 
*  you may not use this file except in compliance with the License. 
*  You may obtain a copy of the License at
*
*  http://www.apache.org/licenses/LICENSE-2.0 
*
*  Unless required by applicable law or agreed to in writing, software 
*  distributed under the License is distributed on an "AS IS" BASIS, 
*  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
*  implied. See the License for the specific language governing 
*  permissions and limitations under the License 
*/
package org.coronastreet.gpxconverter;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.border.EmptyBorder;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;

import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;

public class AccountManager extends JFrame {

    static Logger log = Logger.getLogger(AccountManager.class);
    private static final long serialVersionUID = -3082970655365067290L;
    private JPanel frmAccounts;
    public JTextField strava_username;
    public JPasswordField strava_password;
    public JTextField rwgps_username;
    public JPasswordField rwgps_password;
    public JTextField garmin_username;
    public JPasswordField garmin_password;

    private static final char[] PASSWORD = "enfldsgbnlsngdlksdsgm".toCharArray();
    private static final byte[] SALT = { (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12, (byte) 0xde,
            (byte) 0x33, (byte) 0x10, (byte) 0x12, };

    public AccountManager(MainWindow window) {
        setTitle("Account Settings");
        setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        setBounds(100, 100, 450, 199);
        frmAccounts = new JPanel();
        frmAccounts.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(frmAccounts);
        frmAccounts.setLayout(null);

        JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
        tabbedPane.setBounds(5, 5, 424, 118);
        frmAccounts.add(tabbedPane);

        JPanel stravaPanel = new JPanel();
        stravaPanel.setLayout(null);

        tabbedPane.addTab("Strava", stravaPanel);

        strava_username = new JTextField();
        strava_username.setBounds(79, 11, 235, 20);
        stravaPanel.add(strava_username);
        strava_username.setColumns(10);

        JLabel lblUsername = new JLabel("Username:");
        lblUsername.setBounds(10, 14, 69, 14);
        stravaPanel.add(lblUsername);

        JLabel lblPassword = new JLabel("Password:");
        lblPassword.setBounds(10, 45, 69, 14);
        stravaPanel.add(lblPassword);

        strava_password = new JPasswordField();
        strava_password.setColumns(10);
        strava_password.setBounds(79, 42, 235, 20);
        stravaPanel.add(strava_password);

        JPanel rwgpsPanel = new JPanel();
        rwgpsPanel.setLayout(null);
        tabbedPane.addTab("RideWithGPS", rwgpsPanel);

        JLabel label = new JLabel("Username:");
        label.setBounds(10, 14, 69, 14);
        rwgpsPanel.add(label);

        rwgps_username = new JTextField();
        rwgps_username.setColumns(10);
        rwgps_username.setBounds(79, 11, 235, 20);
        rwgpsPanel.add(rwgps_username);

        rwgps_password = new JPasswordField();
        rwgps_password.setColumns(10);
        rwgps_password.setBounds(79, 42, 235, 20);
        rwgpsPanel.add(rwgps_password);

        JLabel label_1 = new JLabel("Password:");
        label_1.setBounds(10, 45, 69, 14);
        rwgpsPanel.add(label_1);

        JPanel garminPanel = new JPanel();
        garminPanel.setLayout(null);
        tabbedPane.addTab("Garmin Connect", garminPanel);

        JLabel label_2 = new JLabel("Username:");
        label_2.setBounds(10, 14, 69, 14);
        garminPanel.add(label_2);

        garmin_username = new JTextField();
        garmin_username.setColumns(10);
        garmin_username.setBounds(79, 11, 235, 20);
        garminPanel.add(garmin_username);

        garmin_password = new JPasswordField();
        garmin_password.setColumns(10);
        garmin_password.setBounds(79, 42, 235, 20);
        garminPanel.add(garmin_password);

        JLabel label_3 = new JLabel("Password:");
        label_3.setBounds(10, 45, 69, 14);
        garminPanel.add(label_3);

        loadAccountPrefs();

        JButton btnSave = new JButton("SAVE");
        btnSave.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                saveAccountInfo();
            }
        });
        btnSave.setBounds(106, 127, 89, 23);
        frmAccounts.add(btnSave);

        JButton btnCancel = new JButton("CANCEL");
        btnCancel.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                cancel();
            }
        });
        btnCancel.setBounds(242, 127, 89, 23);
        frmAccounts.add(btnCancel);

    }

    private void saveAccountInfo() {

        GPXConverter.setPref("strava_username", strava_username.getText());
        GPXConverter.setPref("rwgps_username", rwgps_username.getText());
        GPXConverter.setPref("garmin_username", garmin_username.getText());

        try {
            GPXConverter.setPref("strava_password", encrypt(String.valueOf(strava_password.getPassword())));
        } catch (Exception e) {
            // Error with saving the password, let's wipe it and throw an error.
            GPXConverter.delPref("strava_password");
            JOptionPane.showMessageDialog(this,
                    "Strava Password Encryption failed Please try again or restart the program.",
                    "Password Encryption Failed.", JOptionPane.WARNING_MESSAGE);
        }
        try {
            GPXConverter.setPref("rwgps_password", encrypt(String.valueOf(rwgps_password.getPassword())));
        } catch (Exception e) {
            // Error with saving the password, let's wipe it and throw an error.
            GPXConverter.delPref("rwgps_password");
            JOptionPane.showMessageDialog(this,
                    "RideWithGPS Password Encryption failed Please try again or restart the program.",
                    "Password Encryption Failed.", JOptionPane.WARNING_MESSAGE);
        }
        try {
            GPXConverter.setPref("garmin_password", encrypt(String.valueOf(garmin_password.getPassword())));
        } catch (Exception e) {
            // Error with saving the password, let's wipe it and throw an error.
            GPXConverter.delPref("garmin_password");
            JOptionPane.showMessageDialog(this,
                    "Garmin Password Encryption failed Please try again or restart the program.",
                    "Password Encryption Failed.", JOptionPane.WARNING_MESSAGE);
        }

        this.setVisible(false);
    }

    private void cancel() {
        // Populate stuff with old values...
        loadAccountPrefs();
        this.setVisible(false);
    }

    private void loadAccountPrefs() {
        strava_username.setText(GPXConverter.getPref("strava_username"));
        rwgps_username.setText(GPXConverter.getPref("rwgps_username"));
        garmin_username.setText(GPXConverter.getPref("garmin_username"));

        try {
            strava_password.setText(decrypt(GPXConverter.getPref("strava_password")));
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this,
                    "Loading Strava Encrypted Password failed. Please check the Strava password and try saving it again.",
                    "Password Decryption Failed.", JOptionPane.WARNING_MESSAGE);
        }
        try {
            rwgps_password.setText(decrypt(GPXConverter.getPref("rwgps_password")));
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this,
                    "Loading RideWithGPS Encrypted Password failed. Please check the RideWithGPS password and try saving it again.",
                    "Password Decryption Failed.", JOptionPane.WARNING_MESSAGE);
        }
        try {
            garmin_password.setText(decrypt(GPXConverter.getPref("garmin_password")));
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this,
                    "Loading Garmin Encrypted Password failed. Please check the Garmin password and try saving it again.",
                    "Password Decryption Failed.", JOptionPane.WARNING_MESSAGE);
        }

    }

    public static String encrypt(String property) throws GeneralSecurityException, UnsupportedEncodingException {
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
        SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD));
        Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
        pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20));
        return base64Encode(pbeCipher.doFinal(property.getBytes("UTF-8")));
    }

    private static String base64Encode(byte[] bytes) {
        // NB: This class is internal, and you probably should use another impl
        return Base64.encodeBase64String(bytes);
    }

    public static String decrypt(String property) throws GeneralSecurityException, IOException {
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
        SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD));
        Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
        pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, 20));
        return new String(pbeCipher.doFinal(base64Decode(property)), "UTF-8");
    }

    private static byte[] base64Decode(String property) throws IOException {
        // NB: This class is internal, and you probably should use another impl
        return Base64.decodeBase64(property);
    }
}