/*
 * CredentialManagerFrame.java
 *
 * Created on 04 January 2006, 12:31
 */

package org.owasp.webscarab.ui.swing;

import java.awt.event. ComponentAdapter;
import java.awt.event. ComponentEvent;
import javax.swing.table. AbstractTableModel;
import org.owasp.webscarab.model. Preferences;
import org.owasp.webscarab.plugin. BasicCredential;
import org.owasp.webscarab.plugin. CredentialManager;
import org.owasp.webscarab.plugin. DomainCredential;

/**
 *
 * @author  rdawes
 */
public class CredentialManagerFrame extends javax.swing. JFrame {
    
    /**
	 * 
	 */
	private static final long serialVersionUID = 1688116674185863060L;
	private CredentialManager _manager;
    private BasicTableModel _btm;
    private DomainTableModel _dtm;
    
    /** Creates new form CredentialManagerFrame */
    public CredentialManagerFrame(CredentialManager manager) {
        initComponents();
        boolean prompt = Boolean.valueOf(Preferences.getPreference("WebScarab.promptForCredentials", "false")).booleanValue();
        promptCheckBox.setSelected(prompt);
        addComponentListener(new Updater());
        _manager = manager;
        _btm = new BasicTableModel();
        _dtm = new DomainTableModel();
        basicTable.setModel(_btm);
        domainTable.setModel(_dtm);
    }
    
    private void updateCredentials() {
        _btm.fireTableDataChanged();
        _dtm.fireTableDataChanged();
    }
    
    /** 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() {
        java.awt. GridBagConstraints gridBagConstraints;

        jLabel1 = new javax.swing. JLabel();
        jScrollPane1 = new javax.swing. JScrollPane();
        basicTable = new javax.swing. JTable();
        jLabel2 = new javax.swing. JLabel();
        jScrollPane2 = new javax.swing. JScrollPane();
        domainTable = new javax.swing. JTable();
        jPanel1 = new javax.swing. JPanel();
        addButton = new javax.swing. JButton();
        deleteButton = new javax.swing. JButton();
        clearButton = new javax.swing. JButton();
        closeButton = new javax.swing. JButton();
        promptCheckBox = new javax.swing. JCheckBox();

        getContentPane().setLayout(new java.awt. GridBagLayout());

        setTitle("WebScarab Credentials");
        jLabel1.setText("Basic Credentials");
        gridBagConstraints = new java.awt. GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 0;
        gridBagConstraints.anchor = java.awt. GridBagConstraints. WEST;
        getContentPane().add(jLabel1, gridBagConstraints);

        basicTable.setModel(new javax.swing.table. DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(basicTable);

        gridBagConstraints = new java.awt. GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt. GridBagConstraints. BOTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        getContentPane().add(jScrollPane1, gridBagConstraints);

        jLabel2.setText("Domain Credentials");
        gridBagConstraints = new java.awt. GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.anchor = java.awt. GridBagConstraints. WEST;
        getContentPane().add(jLabel2, gridBagConstraints);

        domainTable.setModel(new javax.swing.table. DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane2.setViewportView(domainTable);

        gridBagConstraints = new java.awt. GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.fill = java.awt. GridBagConstraints. BOTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.weighty = 1.0;
        getContentPane().add(jScrollPane2, gridBagConstraints);

        addButton.setText("Add");
        addButton.addActionListener(new java.awt.event. ActionListener() {
            public void actionPerformed(java.awt.event. ActionEvent evt) {
                addButtonActionPerformed(evt);
            }
        });

        jPanel1.add(addButton);

        deleteButton.setText("Delete");
        deleteButton.addActionListener(new java.awt.event. ActionListener() {
            public void actionPerformed(java.awt.event. ActionEvent evt) {
                deleteButtonActionPerformed(evt);
            }
        });

        jPanel1.add(deleteButton);

        clearButton.setText("Clear all");
        clearButton.addActionListener(new java.awt.event. ActionListener() {
            public void actionPerformed(java.awt.event. ActionEvent evt) {
                clearButtonActionPerformed(evt);
            }
        });

        jPanel1.add(clearButton);

        closeButton.setText("Close");
        closeButton.addActionListener(new java.awt.event. ActionListener() {
            public void actionPerformed(java.awt.event. ActionEvent evt) {
                closeButtonActionPerformed(evt);
            }
        });

        jPanel1.add(closeButton);

        gridBagConstraints = new java.awt. GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 5;
        getContentPane().add(jPanel1, gridBagConstraints);

        promptCheckBox.setText("Ask when required");
        promptCheckBox.setBorder(javax.swing. BorderFactory.createEmptyBorder(0, 0, 0, 0));
        promptCheckBox.setMargin(new java.awt. Insets(0, 0, 0, 0));
        promptCheckBox.addActionListener(new java.awt.event. ActionListener() {
            public void actionPerformed(java.awt.event. ActionEvent evt) {
                promptCheckBoxActionPerformed(evt);
            }
        });

        gridBagConstraints = new java.awt. GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 4;
        gridBagConstraints.anchor = java.awt. GridBagConstraints. WEST;
        gridBagConstraints.insets = new java.awt. Insets(4, 4, 4, 4);
        getContentPane().add(promptCheckBox, gridBagConstraints);

        java.awt. Dimension screenSize = java.awt. Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-400)/2, (screenSize.height-300)/2, 400, 300);
    }// </editor-fold>//GEN-END:initComponents

    private void promptCheckBoxActionPerformed(java.awt.event. ActionEvent evt) {//GEN-FIRST:event_promptCheckBoxActionPerformed
        Preferences.setPreference("WebScarab.promptForCredentials", Boolean.toString(promptCheckBox.isSelected()));
    }//GEN-LAST:event_promptCheckBoxActionPerformed

    private void clearButtonActionPerformed(java.awt.event. ActionEvent evt) {//GEN-FIRST:event_clearButtonActionPerformed
        for (int i=_manager.getBasicCredentialCount()-1; i>=0; i--) {
            _manager.deleteBasicCredentialAt(i);
        }
        for (int i=_manager.getDomainCredentialCount()-1; i>=0; i--) {
            _manager.deleteDomainCredentialAt(i);
        }
        updateCredentials();
    }//GEN-LAST:event_clearButtonActionPerformed

    private void closeButtonActionPerformed(java.awt.event. ActionEvent evt) {//GEN-FIRST:event_closeButtonActionPerformed
        setVisible(false);
    }//GEN-LAST:event_closeButtonActionPerformed

    private void deleteButtonActionPerformed(java.awt.event. ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed
        int basicSelection = basicTable.getSelectedRow();
        int domainSelection = domainTable.getSelectedRow();
        if (basicSelection > -1 && domainSelection > -1)
            return;
        if (basicSelection > -1)
            _manager.deleteBasicCredentialAt(basicSelection);
        if (domainSelection> -1)
            _manager.deleteDomainCredentialAt(domainSelection);
        updateCredentials();
    }//GEN-LAST:event_deleteButtonActionPerformed

    private void addButtonActionPerformed(java.awt.event. ActionEvent evt) {//GEN-FIRST:event_addButtonActionPerformed
        new CredentialRequestDialog(this, true, _manager).requestCredentials(null, null);
        updateCredentials();
    }//GEN-LAST:event_addButtonActionPerformed
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing. JButton addButton;
    private javax.swing. JTable basicTable;
    private javax.swing. JButton clearButton;
    private javax.swing. JButton closeButton;
    private javax.swing. JButton deleteButton;
    private javax.swing. JTable domainTable;
    private javax.swing. JLabel jLabel1;
    private javax.swing. JLabel jLabel2;
    private javax.swing. JPanel jPanel1;
    private javax.swing. JScrollPane jScrollPane1;
    private javax.swing. JScrollPane jScrollPane2;
    private javax.swing. JCheckBox promptCheckBox;
    // End of variables declaration//GEN-END:variables
    
    private class BasicTableModel extends AbstractTableModel {
        
        /**
		 * 
		 */
		private static final long serialVersionUID = 4101228666708000944L;
		private String[] _columnNames = { "Host", "Realm", "Username"};
        
        public String getColumnName(int column) {
            return _columnNames[column];
        }
        
        public int getColumnCount() {
            return 3;
        }

        public int getRowCount() {
            return _manager.getBasicCredentialCount();
        }

        public Object getValueAt(int row, int column) {
            BasicCredential bc = _manager.getBasicCredentialAt(row);
            switch (column) {
                case 0: return bc.getHost();
                case 1: return bc.getRealm();
                case 2: return bc.getUsername();
            }
            return null;
        }
        
    }
    
    private class DomainTableModel extends AbstractTableModel {
        
        /**
		 * 
		 */
		private static final long serialVersionUID = -4483058953578321230L;
		private String[] _columnNames = { "Host", "Domain", "Username"};
        
        public String getColumnName(int column) {
            return _columnNames[column];
        }
        
        public int getColumnCount() {
            return 3;
        }

        public int getRowCount() {
            return _manager.getDomainCredentialCount();
        }

        public Object getValueAt(int row, int column) {
            DomainCredential dc = _manager.getDomainCredentialAt(row);
            switch (column) {
                case 0: return dc.getHost();
                case 1: return dc.getDomain();
                case 2: return dc.getUsername();
            }
            return null;
        }
        
    }
    
    private class Updater extends ComponentAdapter {
        public void componentShown(ComponentEvent e) {
            updateCredentials();
        }
    }
    
}
