package jfconfig; /** * Created : Apr 3, 2012 * * @author pquiring */ import java.io.*; import java.util.Arrays; import javax.swing.*; import javaforce.*; import javaforce.linux.*; public class VPNPanel extends javax.swing.JPanel { /** * Creates new form VPNPanel */ public VPNPanel() { initComponents(); loadConfig(); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jToolBar1 = new javax.swing.JToolBar(); back = new javax.swing.JButton(); add = new javax.swing.JButton(); delete = new javax.swing.JButton(); edit = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); list = new javax.swing.JList(); jToolBar1.setFloatable(false); jToolBar1.setRollover(true); back.setText("< Back"); back.setFocusable(false); back.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); back.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); back.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { backActionPerformed(evt); } }); jToolBar1.add(back); add.setText("Add"); add.setFocusable(false); add.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); add.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); add.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addActionPerformed(evt); } }); jToolBar1.add(add); delete.setText("Delete"); delete.setFocusable(false); delete.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); delete.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); delete.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { deleteActionPerformed(evt); } }); jToolBar1.add(delete); edit.setText("Edit"); edit.setFocusable(false); edit.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); edit.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); edit.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { editActionPerformed(evt); } }); jToolBar1.add(edit); list.setModel(model); jScrollPane1.setViewportView(list); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 448, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 418, Short.MAX_VALUE) .addContainerGap()) ); }// </editor-fold>//GEN-END:initComponents private void addActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addActionPerformed VPNDialog dialog = new VPNDialog(null, true, null); dialog.setVisible(true); if (!dialog.accepted) return; VPN newVPN = new VPN(); dialog.get(newVPN); config.vpn = Arrays.copyOf(config.vpn, config.vpn.length + 1); config.vpn[config.vpn.length-1] = newVPN; updateConfig(); saveConfig(); }//GEN-LAST:event_addActionPerformed private void deleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteActionPerformed int idx = list.getSelectedIndex(); if (idx == -1) return; int len = config.vpn.length; VPN newList[] = new VPN[len-1]; System.arraycopy(config.vpn, 0, newList, 0, idx); System.arraycopy(config.vpn, idx+1, newList, idx, len - idx - 1); config.vpn = newList; updateConfig(); saveConfig(); }//GEN-LAST:event_deleteActionPerformed private void editActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editActionPerformed int idx = list.getSelectedIndex(); if (idx == -1) return; VPNDialog dialog = new VPNDialog(null, true, config.vpn[idx]); dialog.setVisible(true); if (!dialog.accepted) return; dialog.get(config.vpn[idx]); updateConfig(); saveConfig(); }//GEN-LAST:event_editActionPerformed private void backActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_backActionPerformed ConfigApp.This.setPanel(new NetworkPanel()); }//GEN-LAST:event_backActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton add; private javax.swing.JButton back; private javax.swing.JButton delete; private javax.swing.JButton edit; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JToolBar jToolBar1; private javax.swing.JList list; // End of variables declaration//GEN-END:variables public static class VPN { public String name; public String host; public String caps; //windows = pre-defined, else: pap, mschap, etc. public String capsOpts; //flags public String routes; //comma list public String routeOpts; //flags public String user, pass, domain; public String domainsearch; } public static class Config { public VPN vpn[]; } private DefaultListModel model = new DefaultListModel(); private Config config; private String configFile = "/etc/jconfig.d/vpn.xml"; private void loadConfig() { defaultConfig(); try { XML xml = new XML(); File tmpFile = File.createTempFile("vpn", ".xml"); if (!Linux.copyFile(configFile, tmpFile.getAbsolutePath())) throw new Exception("copy failed"); FileInputStream fis = new FileInputStream(tmpFile.getAbsoluteFile()); xml.read(fis); xml.writeClass(config); tmpFile.delete(); } catch (FileNotFoundException e1) { defaultConfig(); } catch (Exception e2) { JFLog.log(e2); defaultConfig(); } updateConfig(); } private void defaultConfig() { config = new Config(); config.vpn = new VPN[0]; } private void updateConfig() { model.removeAllElements(); for(int a=0;a<config.vpn.length;a++) { model.addElement(config.vpn[a].name); } } private void saveConfig() { try { XML xml = new XML(); File tmpFile = File.createTempFile("vpn", ".xml"); FileOutputStream fos = new FileOutputStream(tmpFile); Runtime.getRuntime().exec(new String[] {"chmod", "600", tmpFile.getAbsolutePath()}); //protect passwords xml.readClass("vpn", config); xml.write(fos); fos.close(); if (!Linux.copyFile(tmpFile.getAbsolutePath(), configFile)) throw new Exception("copy failed"); tmpFile.delete(); } catch (Exception e) { JFLog.log(e); } } }