/* * SiteMgr.java * * Created on July 31, 2007, 8:38 AM * * @author pquiring */ import java.awt.Frame; import java.io.*; import javax.swing.tree.TreePath; import javax.swing.JOptionPane; import javax.swing.tree.TreeSelectionModel; import javaforce.*; import javax.swing.JFileChooser; import javax.swing.filechooser.FileNameExtensionFilter; public class SiteMgr extends javax.swing.JDialog implements XML.XMLEvent { public SiteMgr(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); setComponentOrientation(((parent == null) ? javax.swing.JOptionPane.getRootFrame() : parent).getComponentOrientation()); if (parent != null) setLocationRelativeTo(parent); clearFields(); } /** 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. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { bConnect = new javax.swing.JButton(); bSave = new javax.swing.JButton(); bDelete = new javax.swing.JButton(); bNewSite = new javax.swing.JButton(); settings = new javax.swing.JPanel(); lHost = new javax.swing.JLabel(); tHost = new javax.swing.JTextField(); lProtocol = new javax.swing.JLabel(); cbProtocol = new javax.swing.JComboBox(); lPort = new javax.swing.JLabel(); tPort = new javax.swing.JTextField(); lUsername = new javax.swing.JLabel(); tUsername = new javax.swing.JTextField(); lPassword = new javax.swing.JLabel(); tPassword = new javax.swing.JPasswordField(); lName = new javax.swing.JLabel(); tName = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); localDir = new javax.swing.JTextField(); jLabel2 = new javax.swing.JLabel(); remoteDir = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel(); tSSHKey = new javax.swing.JTextField(); selectSSHKey = new javax.swing.JButton(); listScroll = new javax.swing.JScrollPane(); tree = new javax.swing.JTree(); bNewFolder = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); setTitle("Site Manager"); setResizable(false); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { formWindowClosing(evt); } }); bConnect.setText("Connect"); bConnect.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bConnectActionPerformed(evt); } }); bSave.setText("Save"); bSave.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bSaveActionPerformed(evt); } }); bDelete.setText("Delete"); bDelete.setEnabled(false); bDelete.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bDeleteActionPerformed(evt); } }); bNewSite.setText("New Site"); bNewSite.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bNewSiteActionPerformed(evt); } }); settings.setBorder(javax.swing.BorderFactory.createTitledBorder("Settings")); lHost.setText("Host"); tHost.addKeyListener(new java.awt.event.KeyAdapter() { public void keyTyped(java.awt.event.KeyEvent evt) { anykey(evt); } }); lProtocol.setText("Protocol"); cbProtocol.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "FTP (21)", "FTPS (990)", "SFTP (22)", "SMB(445)" })); cbProtocol.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { cbProtocolItemStateChanged(evt); } }); lPort.setText("Port"); tPort.setText("23"); tPort.addKeyListener(new java.awt.event.KeyAdapter() { public void keyTyped(java.awt.event.KeyEvent evt) { anykey(evt); } }); lUsername.setText("Username"); tUsername.addKeyListener(new java.awt.event.KeyAdapter() { public void keyTyped(java.awt.event.KeyEvent evt) { anykey(evt); } }); lPassword.setText("Password"); tPassword.addKeyListener(new java.awt.event.KeyAdapter() { public void keyTyped(java.awt.event.KeyEvent evt) { anykey(evt); } }); lName.setText("Name"); tName.addKeyListener(new java.awt.event.KeyAdapter() { public void keyTyped(java.awt.event.KeyEvent evt) { anykey(evt); } }); jLabel1.setText("Init Local Folder"); jLabel2.setText("Init Remote Folder"); jLabel3.setText("Identity Key"); selectSSHKey.setText("File ..."); selectSSHKey.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { selectSSHKeyActionPerformed(evt); } }); javax.swing.GroupLayout settingsLayout = new javax.swing.GroupLayout(settings); settings.setLayout(settingsLayout); settingsLayout.setHorizontalGroup( settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(settingsLayout.createSequentialGroup() .addContainerGap() .addGroup(settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(tPassword, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 155, Short.MAX_VALUE) .addGroup(settingsLayout.createSequentialGroup() .addComponent(tSSHKey) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(selectSSHKey)) .addGroup(settingsLayout.createSequentialGroup() .addGroup(settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(lName) .addComponent(lHost) .addGroup(settingsLayout.createSequentialGroup() .addComponent(lProtocol) .addGap(46, 46, 46) .addComponent(lPort)) .addComponent(lUsername) .addComponent(lPassword) .addComponent(jLabel1) .addComponent(jLabel2) .addGroup(settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(remoteDir, javax.swing.GroupLayout.Alignment.LEADING) .addComponent(localDir, javax.swing.GroupLayout.Alignment.LEADING) .addComponent(tUsername, javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, settingsLayout.createSequentialGroup() .addComponent(cbProtocol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(tPort)) .addComponent(tHost, javax.swing.GroupLayout.Alignment.LEADING) .addComponent(tName, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 155, Short.MAX_VALUE)) .addComponent(jLabel3)) .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); settingsLayout.setVerticalGroup( settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(settingsLayout.createSequentialGroup() .addComponent(lName) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(tName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lHost) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(tHost, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lProtocol) .addComponent(lPort)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(cbProtocol, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(tPort, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lUsername) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(tUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lPassword) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(tPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(settingsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(tSSHKey, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(selectSSHKey)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(localDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(remoteDir, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); tree.setDragEnabled(true); tree.setEditable(true); tree.setModel(xml.getTreeModel()); tree.setShowsRootHandles(true); tree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() { public void valueChanged(javax.swing.event.TreeSelectionEvent evt) { treeValueChanged(evt); } }); listScroll.setViewportView(tree); bNewFolder.setText("New Folder"); bNewFolder.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { bNewFolderActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(listScroll, javax.swing.GroupLayout.PREFERRED_SIZE, 210, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(bConnect, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(bSave, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(bDelete, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(bNewFolder, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(bNewSite, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(settings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(settings, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(bConnect) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(bSave) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(bDelete) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(bNewSite) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(bNewFolder)) .addComponent(listScroll, javax.swing.GroupLayout.Alignment.LEADING)) .addContainerGap()) ); pack(); }// </editor-fold>//GEN-END:initComponents private void anykey(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_anykey if (evt.getKeyChar() == '\"') evt.consume(); if (evt.getKeyChar() == '\'') evt.consume(); }//GEN-LAST:event_anykey private void bNewFolderActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bNewFolderActionPerformed String name = JOptionPane.showInputDialog(this, null, "Enter Folder Name", JOptionPane.QUESTION_MESSAGE); if (name == null) return; if (!validField(name)) return; XML.XMLTag parent = selectedTag; if (parent == null) parent = sitesTag; if (parent.name.equalsIgnoreCase("site")) parent = parent.getParent(); xml.addTag(parent, "folder", " name=\"" + name + "\"", "").isNotLeaf = true; }//GEN-LAST:event_bNewFolderActionPerformed private void treeValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_treeValueChanged XML.XMLTag tag = getSelectedTag(), child; if (tag == null) return; clearFields(); selectedTag = tag; if (tag.name.equalsIgnoreCase("sites")) return; if (tag.name.equalsIgnoreCase("site")) { bDelete.setEnabled(true); } else { //must be folder if (selectedTag.getChildCount() == 0) bDelete.setEnabled(true); return; } isNew = false; /* for(Iterator i = tag.args.iterator(); i.hasNext();) { XML.XMLAttr attr = (XML.XMLAttr)i.next(); if (attr.name.equalsIgnoreCase("name")) tName.setText(attr.value); } */ tName.setText(tag.getName()); for(int a=0;a<tag.getChildCount();a++) { child = tag.getChildAt(a); if (child.name.equalsIgnoreCase("host")) tHost.setText(child.content); if (child.name.equalsIgnoreCase("protocol")) { if (child.content.equalsIgnoreCase("ftp")) cbProtocol.setSelectedIndex(0); if (child.content.equalsIgnoreCase("ftps")) cbProtocol.setSelectedIndex(1); if (child.content.equalsIgnoreCase("sftp")) cbProtocol.setSelectedIndex(2); if (child.content.equalsIgnoreCase("smb")) cbProtocol.setSelectedIndex(3); } if (child.name.equalsIgnoreCase("port")) tPort.setText(child.content); if (child.name.equalsIgnoreCase("username")) tUsername.setText(child.content); if (child.name.equalsIgnoreCase("password")) tPassword.setText(decodePassword(child.content)); if (child.name.equalsIgnoreCase("sshkey")) tSSHKey.setText(child.content); if (child.name.equalsIgnoreCase("localDir")) localDir.setText(child.content); if (child.name.equalsIgnoreCase("remoteDir")) remoteDir.setText(child.content); } tName.setEditable(false); }//GEN-LAST:event_treeValueChanged private void cbProtocolItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbProtocolItemStateChanged tPort.setText(ports[cbProtocol.getSelectedIndex()]); switch (cbProtocol.getSelectedIndex()) { case 0: //ftp case 1: //ftps (ssl) case 3: //smb tSSHKey.setEditable(false); break; case 2: //sftp (ssh) tSSHKey.setEditable(true); break; } }//GEN-LAST:event_cbProtocolItemStateChanged private void bDeleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bDeleteActionPerformed if (selectedTag == null) return; if (selectedTag.getParent() == null) return; xml.deleteTag(selectedTag); clearFields(); }//GEN-LAST:event_bDeleteActionPerformed private void bNewSiteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bNewSiteActionPerformed clearFields(); tree.clearSelection(); }//GEN-LAST:event_bNewSiteActionPerformed private void bSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bSaveActionPerformed XML.XMLTag parent, tag; if (!validFields()) return; if (isNew) { //save as new connection parent = getSelectedTag(); if (parent == null) parent = sitesTag; if (parent.name.equalsIgnoreCase("site")) parent = parent.getParent(); selectedTag = xml.addTag(parent, "site", " name=\"" + tName.getText() + "\"", ""); isNew = false; tName.setEditable(false); bDelete.setEnabled(true); } else { //save existing connection to selectedTag xml.setTag(selectedTag, "site", " name=\"" + tName.getText() + "\"", ""); } xml.addSetTag(selectedTag, "host", "", tHost.getText()); xml.addSetTag(selectedTag, "protocol", "", protocols[cbProtocol.getSelectedIndex()]); xml.addSetTag(selectedTag, "port", "", tPort.getText()); xml.addSetTag(selectedTag, "username", "", tUsername.getText()); xml.addSetTag(selectedTag, "password", "", encodePassword(new String(tPassword.getPassword()))); xml.addSetTag(selectedTag, "sshkey", "", tSSHKey.getText()); xml.addSetTag(selectedTag, "localDir", "", localDir.getText()); xml.addSetTag(selectedTag, "remoteDir", "", remoteDir.getText()); show(selectedTag); }//GEN-LAST:event_bSaveActionPerformed private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing saveAll(); dispose(); }//GEN-LAST:event_formWindowClosing private void bConnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bConnectActionPerformed XML.XMLTag child, child2; if ((selectedTag != null) && (selectedTag.name.equals("folder"))) { //return all sub-children int cnt = 0; for(int a=0;a<selectedTag.getChildCount();a++) { if (selectedTag.getChildAt(a).name.equals("site")) cnt++; } if (cnt == 0) return; retValue = new SiteDetails[cnt]; cnt = 0; for(int a=0;a<selectedTag.getChildCount();a++) { child = selectedTag.getChildAt(a); if (child.name.equals("site")) { retValue[cnt] = new SiteDetails(); retValue[cnt].name = child.getName(); for(int b=0;b<child.getChildCount();b++) { child2 = child.getChildAt(b); if (child2.name.equals("host")) retValue[cnt].host = child2.content; if (child2.name.equals("protocol")) retValue[cnt].protocol = child2.content; if (child2.name.equals("port")) retValue[cnt].port = child2.content; if (child2.name.equals("username")) retValue[cnt].username = child2.content; if (child2.name.equals("password")) retValue[cnt].password = decodePassword(child2.content); if (child2.name.equals("sshkey")) retValue[cnt].sshKey = child2.content; if (child2.name.equals("localDir")) retValue[cnt].localDir = child2.content; if (child2.name.equals("remoteDir")) retValue[cnt].remoteDir = child2.content; } cnt++; } } setVisible(false); return; } if (!validFields()) return; bSaveActionPerformed(null); saveAll(); retValue = new SiteDetails[1]; retValue[0] = new SiteDetails(); retValue[0].name = tName.getText(); retValue[0].host = tHost.getText(); retValue[0].protocol = protocols[cbProtocol.getSelectedIndex()]; retValue[0].port = tPort.getText(); retValue[0].username = tUsername.getText(); retValue[0].password = new String(tPassword.getPassword()); retValue[0].sshKey = tSSHKey.getText(); retValue[0].localDir = localDir.getText(); retValue[0].remoteDir = remoteDir.getText(); setVisible(false); }//GEN-LAST:event_bConnectActionPerformed private void selectSSHKeyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectSSHKeyActionPerformed JFileChooser chooser = new JFileChooser(); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); chooser.addChoosableFileFilter(new FileNameExtensionFilter("PEM", "pem")); chooser.setMultiSelectionEnabled(false); chooser.setCurrentDirectory(new File(JF.getUserPath())); if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { tSSHKey.setText(chooser.getSelectedFile().toString()); } }//GEN-LAST:event_selectSSHKeyActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton bConnect; private javax.swing.JButton bDelete; private javax.swing.JButton bNewFolder; private javax.swing.JButton bNewSite; private javax.swing.JButton bSave; private javax.swing.JComboBox cbProtocol; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel lHost; private javax.swing.JLabel lName; private javax.swing.JLabel lPassword; private javax.swing.JLabel lPort; private javax.swing.JLabel lProtocol; private javax.swing.JLabel lUsername; private javax.swing.JScrollPane listScroll; private javax.swing.JTextField localDir; private javax.swing.JTextField remoteDir; private javax.swing.JButton selectSSHKey; private javax.swing.JPanel settings; private javax.swing.JTextField tHost; private javax.swing.JTextField tName; private javax.swing.JPasswordField tPassword; private javax.swing.JTextField tPort; private javax.swing.JTextField tSSHKey; private javax.swing.JTextField tUsername; private javax.swing.JTree tree; // End of variables declaration//GEN-END:variables private boolean isNew = true; private String protocols[] = { "ftp", "ftps", "sftp", "smb" }; private String ports[] = { "21", "990", "22", "445" }; private XML xml = new XML(); private XML.XMLTag selectedTag = null; private SiteDetails retValue[] = null; private XML.XMLTag sitesTag = null; public static SiteDetails[] showSiteMgr(Frame parent) { SiteMgr mgr = new SiteMgr(parent, true); mgr.loadAll(); mgr.setVisible(true); //modal = true, therefore this func does not return till dialog is closed mgr.dispose(); return mgr.retValue; } private void show(XML.XMLTag tag) { tree.makeVisible(new TreePath(tag.getPath())); //ensure everything is visible // if (tag.isLeaf) return; for(int a=0;a<tag.getChildCount();a++) show(tag.getChildAt(a)); } private void loadAll() { InputStream fis = JF.fileopen(JF.getUserPath() + "/.jfftp.xml"); if (fis != null) { xml.read(new BufferedInputStream(fis), this); JF.fileclose(fis); } else { xml.setEventListener(this); } if (sitesTag == null) { xml.setTag(xml.root, "jfftp", "", ""); sitesTag = xml.addTag(xml.root, "sites", "", ""); } xml.setRoot(sitesTag); show(sitesTag); } private void saveAll() { FileOutputStream fos = JF.filecreate(JF.getUserPath() + "/.jfftp.xml"); if (fos == null) return; BufferedOutputStream bos = new BufferedOutputStream(fos); xml.write(fos); // JF.fileflush(bos); JF.fileclose(fos); } private boolean validField(String str) { if (str.indexOf('\"') != -1) return false; if (str.indexOf('\'') != -1) return false; return true; } private boolean validFieldNumber(String str) { if (!validField(str)) return false; for(int a=0;a<str.length();a++) if ((str.charAt(a) < '0') || (str.charAt(a) > '9')) return false; return true; } private boolean validFields() { if (!validField(tName.getText())) return false; if (tName.getText().length() == 0) return false; if (!validField(tHost.getText())) return false; if (tHost.getText().length() == 0) return false; if (!validFieldNumber(tPort.getText())) return false; if (tPort.getText().length() == 0) return false; if (!validField(tUsername.getText())) return false; if (!validField(new String(tPassword.getPassword()))) return false; return true; } public static String encodePassword(String in) { char ch[] = in.toCharArray(); char xor[] = "jfftp".toCharArray(); char out[] = new char[ch.length * 2]; int xorpos = 0; for(int a=0;a<ch.length;a++) { ch[a] ^= xor[xorpos++]; if (xorpos == xor.length) xorpos = 0; out[a * 2 + 0] = (char)((ch[a] & 0x0f) + 'a'); out[a * 2 + 1] = (char)(((ch[a] & 0xf0) >> 4) + 'b'); } return new String(out); } public static String decodePassword(String in) { char ch[] = in.toCharArray(); if (ch.length % 2 == 1) return ""; char xor[] = "jfftp".toCharArray(); char out[] = new char[ch.length / 2]; int xorpos = 0; for(int a=0;a<out.length;a++) { if ((ch[a * 2 + 0] < 'a') || (ch[a * 2 + 0] > 'p')) return ""; if ((ch[a * 2 + 1] < 'b') || (ch[a * 2 + 1] > 'q')) return ""; out[a] = (char)((ch[a * 2 + 0] - 'a') + ((ch[a * 2 + 1] - 'b') << 4)); out[a] ^= xor[xorpos++]; if (xorpos == xor.length) xorpos = 0; } return new String(out); } private XML.XMLTag getSelectedTag() { TreePath path = tree.getSelectionPath(); if (path == null) return null; return xml.getTag(path); } private void clearFields() { tName.setText(""); tHost.setText(""); cbProtocol.setSelectedIndex(0); tPort.setText("21"); tUsername.setText(""); tPassword.setText(""); tSSHKey.setText(""); tSSHKey.setEditable(false); bDelete.setEnabled(false); isNew = true; tName.setEditable(true); bDelete.setEnabled(false); localDir.setText(""); remoteDir.setText(""); selectedTag = null; } //interface XML.XMLEvent public void XMLTagAdded(XML.XMLTag tag) { if (tag.name.equalsIgnoreCase("folder")) {tag.isNotLeaf = true;} if (tag.name.equalsIgnoreCase("site")) {tag.isLeaf = true;} //this will hide the children if (tag.name.equalsIgnoreCase("sites")) {tag.isNotLeaf = true; tag.isReadOnly = true; sitesTag = tag;} show(tag); } public void XMLTagRenamed(XML.XMLTag tag) { if (tag.name.equalsIgnoreCase("folder")) return; tName.setText(tag.getName()); } }