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}