001/**
002 * Copyright (C) 2014  Universidade de Aveiro, DETI/IEETA, Bioinformatics Group - http://bioinformatics.ua.pt/
003 *
004 * This file is part of Dicoogle/dicoogle.
005 *
006 * Dicoogle/dicoogle is free software: you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published by
008 * the Free Software Foundation, either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * Dicoogle/dicoogle is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with Dicoogle.  If not, see <http://www.gnu.org/licenses/>.
018 */
019/*
020 * UsersManager.java
021 *
022 * Created on 6/Abr/2010, 14:07:58
023 */
024package pt.ua.dicoogle.rGUI.client.windows;
025
026import java.awt.Image;
027import java.awt.Toolkit;
028import java.net.URL;
029import java.rmi.RemoteException;
030import java.util.ArrayList;
031import java.util.concurrent.Semaphore;
032import org.slf4j.Logger;
033import org.slf4j.LoggerFactory;
034import org.slf4j.Logger;
035import org.slf4j.LoggerFactory;
036import javax.swing.DefaultListModel;
037import javax.swing.ImageIcon;
038import javax.swing.JOptionPane;
039import pt.ua.dicoogle.rGUI.client.AdminRefs;
040import pt.ua.dicoogle.rGUI.interfaces.controllers.IUsersManager;
041import pt.ua.dicoogle.server.users.HashService;
042
043/**
044 *
045 * @author samuelcampos
046 */
047@Deprecated
048public class UsersManager extends javax.swing.JFrame {
049
050    private static Semaphore sem = new Semaphore(1, true);
051    private static UsersManager instance = null;
052    private IUsersManager userManager;
053
054    public static synchronized UsersManager getInstance() {
055        try {
056            sem.acquire();
057            if (instance == null) {
058                instance = new UsersManager();
059            }
060            sem.release();
061        } catch (InterruptedException ex) {
062            LoggerFactory.getLogger(UsersManager.class).error(ex.getMessage(), ex);
063        }
064        return instance;
065    }
066    public static Image getImage(final String pathAndFileName) {
067        final URL url = Thread.currentThread().getContextClassLoader().getResource(pathAndFileName);
068        return Toolkit.getDefaultToolkit().getImage(url);
069    }
070    
071
072    /** Creates new form UsersManager */
073    private UsersManager() {
074        initComponents();
075
076        userManager = AdminRefs.getInstance().getUsersManager();
077
078        load();
079        
080        Image image = Toolkit.getDefaultToolkit().getImage(Thread.currentThread().getContextClassLoader().getResource("trayicon.gif"));
081        this.setIconImage(image);
082
083        this.setTitle("User Accounts");
084
085        jButtonRemove.setEnabled(false);
086        jButtonReset.setEnabled(false);
087    }
088
089    private void load() {
090        try {
091            DefaultListModel model = (DefaultListModel) jListUsers.getModel();
092            model.clear();
093
094            ArrayList<String> list = userManager.getUsernames();
095            
096            for (int i = 0; i < list.size(); i++)
097                model.addElement(list.get(i));
098
099            jListUsers.setModel(model);
100
101            jCheckBoxEncrypt.setSelected(userManager.getEncryptUsersFile());
102        } catch (RemoteException ex) {
103            LoggerFactory.getLogger(UsersManager.class).error(ex.getMessage(), ex);
104        }
105    }
106
107    /** This method is called from within the constructor to
108     * initialize the form.
109     * WARNING: Do NOT modify this code. The content of this method is
110     * always regenerated by the Form Editor.
111     */
112    @SuppressWarnings("unchecked")
113    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
114    private void initComponents() {
115
116        jScrollPane1 = new javax.swing.JScrollPane();
117        DefaultListModel modelUsers = new DefaultListModel();
118        jListUsers = new javax.swing.JList(modelUsers);
119        jLabel1 = new javax.swing.JLabel();
120        jButtonAdd = new javax.swing.JButton();
121        jButtonRemove = new javax.swing.JButton();
122        jLabel2 = new javax.swing.JLabel();
123        jLabel3 = new javax.swing.JLabel();
124        jCheckBox = new javax.swing.JCheckBox();
125        jTextUsername = new javax.swing.JTextField();
126        jPasswordField = new javax.swing.JPasswordField();
127        jButtonWrite = new javax.swing.JButton();
128        jCheckBoxEncrypt = new javax.swing.JCheckBox();
129        jSeparator1 = new javax.swing.JSeparator();
130        jButtonReset = new javax.swing.JButton();
131
132        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
133        setMinimumSize(new java.awt.Dimension(413, 223));
134
135        jListUsers.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
136            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
137                jListUsersValueChanged(evt);
138            }
139        });
140        jScrollPane1.setViewportView(jListUsers);
141
142        jLabel1.setText("List of Users:");
143
144        jButtonAdd.setIcon(new ImageIcon(getImage("add.png")));
145        jButtonAdd.setText("Add User");
146        jButtonAdd.addActionListener(new java.awt.event.ActionListener() {
147            public void actionPerformed(java.awt.event.ActionEvent evt) {
148                jButtonAddActionPerformed(evt);
149            }
150        });
151
152        jButtonRemove.setIcon(new ImageIcon(getImage("remove.png")));
153        jButtonRemove.setText("Remove User");
154        jButtonRemove.addActionListener(new java.awt.event.ActionListener() {
155            public void actionPerformed(java.awt.event.ActionEvent evt) {
156                jButtonRemoveActionPerformed(evt);
157            }
158        });
159
160        jLabel2.setText("Username:");
161
162        jLabel3.setText("Password:");
163
164        jCheckBox.setText("Administrator");
165
166        jTextUsername.addKeyListener(new java.awt.event.KeyAdapter() {
167            public void keyPressed(java.awt.event.KeyEvent evt) {
168                jTextUsernameKeyPressed(evt);
169            }
170        });
171
172        jPasswordField.addKeyListener(new java.awt.event.KeyAdapter() {
173            public void keyPressed(java.awt.event.KeyEvent evt) {
174                jPasswordFieldKeyPressed(evt);
175            }
176        });
177
178        jButtonWrite.setIcon(new ImageIcon(getImage("floopy-icon.png")));
179        jButtonWrite.setText("Save Configurations");
180        jButtonWrite.addActionListener(new java.awt.event.ActionListener() {
181            public void actionPerformed(java.awt.event.ActionEvent evt) {
182                jButtonWriteActionPerformed(evt);
183            }
184        });
185
186        jCheckBoxEncrypt.setText("Encrypt the users file");
187        jCheckBoxEncrypt.addActionListener(new java.awt.event.ActionListener() {
188            public void actionPerformed(java.awt.event.ActionEvent evt) {
189                jCheckBoxEncryptActionPerformed(evt);
190            }
191        });
192
193        jButtonReset.setIcon(new ImageIcon(getImage("reset.png")));
194        jButtonReset.setText("Reset Pass");
195        jButtonReset.addActionListener(new java.awt.event.ActionListener() {
196            public void actionPerformed(java.awt.event.ActionEvent evt) {
197                jButtonResetActionPerformed(evt);
198            }
199        });
200
201        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
202        getContentPane().setLayout(layout);
203        layout.setHorizontalGroup(
204            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
205            .add(layout.createSequentialGroup()
206                .add(15, 15, 15)
207                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
208                    .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
209                        .add(jButtonAdd)
210                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
211                        .add(jButtonRemove, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 118, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
212                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
213                        .add(jButtonReset, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 118, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
214                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
215                        .add(jButtonWrite))
216                    .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
217                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
218                            .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
219                                .add(layout.createSequentialGroup()
220                                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
221                                        .add(jLabel2)
222                                        .add(jLabel3))
223                                    .add(24, 24, 24)
224                                    .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
225                                        .add(jCheckBox, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
226                                        .add(jPasswordField)
227                                        .add(jTextUsername, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 152, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
228                                .add(org.jdesktop.layout.GroupLayout.TRAILING, jSeparator1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 264, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
229                            .add(jCheckBoxEncrypt))
230                        .add(38, 38, 38)
231                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
232                            .add(jLabel1)
233                            .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 195, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))))
234                .addContainerGap(14, Short.MAX_VALUE))
235        );
236        layout.setVerticalGroup(
237            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
238            .add(layout.createSequentialGroup()
239                .add(13, 13, 13)
240                .add(jLabel1)
241                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
242                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
243                    .add(layout.createSequentialGroup()
244                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
245                            .add(jLabel2)
246                            .add(jTextUsername, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
247                        .add(2, 2, 2)
248                        .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
249                            .add(jLabel3)
250                            .add(jPasswordField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
251                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
252                        .add(jCheckBox)
253                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 39, Short.MAX_VALUE)
254                        .add(jSeparator1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
255                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
256                        .add(jCheckBoxEncrypt)
257                        .add(30, 30, 30))
258                    .add(layout.createSequentialGroup()
259                        .add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 181, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
260                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
261                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
262                    .add(jButtonRemove)
263                    .add(jButtonReset)
264                    .add(jButtonWrite)
265                    .add(jButtonAdd))
266                .add(20, 20, 20))
267        );
268
269        pack();
270    }// </editor-fold>//GEN-END:initComponents
271
272    private void jListUsersValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_jListUsersValueChanged
273        try {
274            if(!jListUsers.isSelectionEmpty()){
275                String username = (String) jListUsers.getSelectedValue();
276                jTextUsername.setText(username);
277
278                jCheckBox.setSelected(userManager.isAdmin(username));
279                
280                jCheckBox.setEnabled(false);
281                //jPasswordField.setEnabled(false);
282                jButtonAdd.setEnabled(false);
283                jButtonRemove.setEnabled(true);
284            }
285        } catch (RemoteException ex) {
286            LoggerFactory.getLogger(UsersManager.class).error(ex.getMessage(), ex);
287        }
288    }//GEN-LAST:event_jListUsersValueChanged
289
290    private void jTextUsernameKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextUsernameKeyPressed
291        jCheckBox.setEnabled(true);
292        jPasswordField.setEnabled(true);
293        jButtonAdd.setEnabled(true);
294        jButtonRemove.setEnabled(false);
295        jButtonReset.setEnabled(false);
296        jListUsers.clearSelection();
297    }//GEN-LAST:event_jTextUsernameKeyPressed
298
299    private void jButtonAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonAddActionPerformed
300        try {
301            String passPlainText = new String(jPasswordField.getPassword());
302
303            if (passPlainText.length() == 0){
304                JOptionPane.showMessageDialog(this, "Password must have characters!",
305                    "Password Empty", JOptionPane.INFORMATION_MESSAGE);
306
307                return;
308            }
309
310            String passHash = HashService.getSHA1Hash(passPlainText);
311
312            if(!userManager.addUser(jTextUsername.getText(), passHash, jCheckBox.isSelected()))
313                JOptionPane.showMessageDialog(this, "Username already exists or invalid username or password!",
314                    "Error Adding User", JOptionPane.ERROR_MESSAGE);
315
316            load();
317            
318        } catch (RemoteException ex) {
319            LoggerFactory.getLogger(UsersManager.class).error(ex.getMessage(), ex);
320        }
321    }//GEN-LAST:event_jButtonAddActionPerformed
322
323    private void jButtonRemoveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonRemoveActionPerformed
324        try {
325            if (!userManager.deleteUser(jTextUsername.getText())) {
326                JOptionPane.showMessageDialog(this, "Username doesn't exists or this user is the last administrator!", "Error Removing User", JOptionPane.ERROR_MESSAGE);
327            }
328
329            jCheckBox.setEnabled(true);
330            jPasswordField.setEnabled(true);
331            jButtonAdd.setEnabled(true);
332            jButtonRemove.setEnabled(false);
333            jButtonReset.setEnabled(false);
334            jListUsers.clearSelection();
335            
336            load();
337        } catch (RemoteException ex) {
338            LoggerFactory.getLogger(UsersManager.class).error(ex.getMessage(), ex);
339        }
340    }//GEN-LAST:event_jButtonRemoveActionPerformed
341
342    private void jButtonWriteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonWriteActionPerformed
343        AdminRefs.getInstance().saveSettings();
344}//GEN-LAST:event_jButtonWriteActionPerformed
345
346    private void jCheckBoxEncryptActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxEncryptActionPerformed
347        try {
348            userManager.setEncryptUsersFile(jCheckBoxEncrypt.isSelected());
349        } catch (RemoteException ex) {
350            LoggerFactory.getLogger(UsersManager.class).error(ex.getMessage(), ex);
351        }
352    }//GEN-LAST:event_jCheckBoxEncryptActionPerformed
353
354    private void jButtonResetActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonResetActionPerformed
355        try {
356            String passPlainText = new String(jPasswordField.getPassword());
357            
358            if (passPlainText.length() == 0) {
359                JOptionPane.showMessageDialog(this, "Password must have characters!", "Password Empty", JOptionPane.ERROR_MESSAGE);
360                return;
361            }
362            
363            String passHash = HashService.getSHA1Hash(passPlainText);
364            
365            if (!userManager.resetPassword(jTextUsername.getText(), passHash)) {
366                JOptionPane.showMessageDialog(this, "Password was not changed!", "Error Reseting Password", JOptionPane.ERROR_MESSAGE);
367                return;
368            }
369
370            JOptionPane.showMessageDialog(this, "Password successfully changed!", "Password Reseted", JOptionPane.INFORMATION_MESSAGE);
371            
372            jCheckBox.setEnabled(true);
373            jPasswordField.setEnabled(true);
374            jButtonAdd.setEnabled(true);
375            jButtonRemove.setEnabled(false);
376            jButtonReset.setEnabled(false);
377            jListUsers.clearSelection();
378
379        } catch (RemoteException ex) {
380            LoggerFactory.getLogger(UsersManager.class).error(ex.getMessage(), ex);
381        }
382    }//GEN-LAST:event_jButtonResetActionPerformed
383
384    private void jPasswordFieldKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jPasswordFieldKeyPressed
385        if(jListUsers.getSelectedValue() != null){
386            jButtonReset.setEnabled(true);
387        }
388    }//GEN-LAST:event_jPasswordFieldKeyPressed
389
390    // Variables declaration - do not modify//GEN-BEGIN:variables
391    private javax.swing.JButton jButtonAdd;
392    private javax.swing.JButton jButtonRemove;
393    private javax.swing.JButton jButtonReset;
394    private javax.swing.JButton jButtonWrite;
395    private javax.swing.JCheckBox jCheckBox;
396    private javax.swing.JCheckBox jCheckBoxEncrypt;
397    private javax.swing.JLabel jLabel1;
398    private javax.swing.JLabel jLabel2;
399    private javax.swing.JLabel jLabel3;
400    private javax.swing.JList jListUsers;
401    private javax.swing.JPasswordField jPasswordField;
402    private javax.swing.JScrollPane jScrollPane1;
403    private javax.swing.JSeparator jSeparator1;
404    private javax.swing.JTextField jTextUsername;
405    // End of variables declaration//GEN-END:variables
406}