• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

evolvedbinary / elemental / 982

29 Apr 2025 08:34PM UTC coverage: 56.409% (+0.007%) from 56.402%
982

push

circleci

adamretter
[feature] Improve README.md badges

28451 of 55847 branches covered (50.94%)

Branch coverage included in aggregate %.

77468 of 131924 relevant lines covered (58.72%)

0.59 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/exist-core/src/main/java/org/exist/client/security/UserDialog.java
1
/*
2
 * Elemental
3
 * Copyright (C) 2024, Evolved Binary Ltd
4
 *
5
 * admin@evolvedbinary.com
6
 * https://www.evolvedbinary.com | https://www.elemental.xyz
7
 *
8
 * Use of this software is governed by the Business Source License 1.1
9
 * included in the LICENSE file and at www.mariadb.com/bsl11.
10
 *
11
 * Change Date: 2028-04-27
12
 *
13
 * On the date above, in accordance with the Business Source License, use
14
 * of this software will be governed by the Apache License, Version 2.0.
15
 *
16
 * Additional Use Grant: Production use of the Licensed Work for a permitted
17
 * purpose. A Permitted Purpose is any purpose other than a Competing Use.
18
 * A Competing Use means making the Software available to others in a commercial
19
 * product or service that: substitutes for the Software; substitutes for any
20
 * other product or service we offer using the Software that exists as of the
21
 * date we make the Software available; or offers the same or substantially
22
 * similar functionality as the Software.
23
 *
24
 * NOTE: Parts of this file contain code from 'The eXist-db Authors'.
25
 *       The original license header is included below.
26
 *
27
 * =====================================================================
28
 *
29
 * eXist-db Open Source Native XML Database
30
 * Copyright (C) 2001 The eXist-db Authors
31
 *
32
 * info@exist-db.org
33
 * http://www.exist-db.org
34
 *
35
 * This library is free software; you can redistribute it and/or
36
 * modify it under the terms of the GNU Lesser General Public
37
 * License as published by the Free Software Foundation; either
38
 * version 2.1 of the License, or (at your option) any later version.
39
 *
40
 * This library is distributed in the hope that it will be useful,
41
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
42
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
43
 * Lesser General Public License for more details.
44
 *
45
 * You should have received a copy of the GNU Lesser General Public
46
 * License along with this library; if not, write to the Free Software
47
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
48
 */
49
package org.exist.client.security;
50

51
import java.util.Iterator;
52
import java.util.regex.Pattern;
53
import javax.swing.InputVerifier;
54
import javax.swing.JOptionPane;
55
import org.exist.client.InteractiveClient;
56
import org.exist.security.AXSchemaType;
57
import org.exist.security.EXistSchemaType;
58
import org.exist.security.Permission;
59
import org.exist.security.PermissionDeniedException;
60
import org.exist.security.internal.aider.GroupAider;
61
import org.exist.security.internal.aider.UserAider;
62
import org.exist.xmldb.UserManagementService;
63
import org.xmldb.api.base.XMLDBException;
64

65
/**
66
 *
67
 * @author <a href="mailto:adam@evolvedbinary.com">Adam Retter</a>
68
 */
69
public class UserDialog extends javax.swing.JFrame {
70

71
    private static final long serialVersionUID = -7544980948396443454L;
72

73
    private final Pattern PTN_USERNAME = Pattern.compile("[a-zA-Z0-9\\-\\._@]{3,}");
×
74
    private final Pattern PTN_PASSWORD = Pattern.compile(".{3,}");
×
75
    private UserManagementService userManagementService;
76
    private SortedListModel<String> availableGroupsModel = null;
×
77
    private SortedListModel<String> memberOfGroupsModel = null;
×
78
    private String primaryGroup = null;
×
79
    
80
    private MemberOfGroupsListCellRenderer memberOfGroupsListCellRenderer = null;
×
81
    
82
    public UserDialog(final UserManagementService userManagementService) {
×
83
        this.userManagementService = userManagementService;
×
84
        this.setIconImage(InteractiveClient.getElementalIcon(getClass()).getImage());
×
85
        initComponents();
×
86
    }
×
87

88
    /**
89
     * This method is called from within the constructor to initialize the form.
90
     * WARNING: Do NOT modify this code. The content of this method is always
91
     * regenerated by the Form Editor.
92
     */
93
    @SuppressWarnings("unchecked")
94
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
95
    private void initComponents() {
96

97
        pmMemberOfGroups = new javax.swing.JPopupMenu();
×
98
        cbmiPrimaryGroup = new javax.swing.JCheckBoxMenuItem();
×
99
        jSeparator1 = new javax.swing.JSeparator();
×
100
        lblUsername = new javax.swing.JLabel();
×
101
        txtUsername = new javax.swing.JTextField();
×
102
        lblFullName = new javax.swing.JLabel();
×
103
        txtFullName = new javax.swing.JTextField();
×
104
        lblDescription = new javax.swing.JLabel();
×
105
        txtDescription = new javax.swing.JTextField();
×
106
        lblPassword = new javax.swing.JLabel();
×
107
        txtPassword = new javax.swing.JPasswordField();
×
108
        lblPasswordConfirm = new javax.swing.JLabel();
×
109
        txtPasswordConfirm = new javax.swing.JPasswordField();
×
110
        cbDisabled = new javax.swing.JCheckBox();
×
111
        jSeparator2 = new javax.swing.JSeparator();
×
112
        spnUmask = new javax.swing.JSpinner();
×
113
        lblUmask = new javax.swing.JLabel();
×
114
        jSeparator3 = new javax.swing.JSeparator();
×
115
        btnClose = new javax.swing.JButton();
×
116
        btnCreate = new javax.swing.JButton();
×
117
        cbPersonalGroup = new javax.swing.JCheckBox();
×
118
        jScrollPane1 = new javax.swing.JScrollPane();
×
119
        lstMemberOfGroups = new javax.swing.JList();
×
120
        lblMemberOfGroups = new javax.swing.JLabel();
×
121
        jScrollPane2 = new javax.swing.JScrollPane();
×
122
        lstAvailableGroups = new javax.swing.JList();
×
123
        lblAvailableGroups = new javax.swing.JLabel();
×
124
        btnAddGroup = new javax.swing.JButton();
×
125
        btnRemoveGroup = new javax.swing.JButton();
×
126
        jSeparator4 = new javax.swing.JSeparator();
×
127

128
        cbmiPrimaryGroup.setSelected(true);
×
129
        cbmiPrimaryGroup.setText("Primary Group");
×
130
        cbmiPrimaryGroup.addActionListener(this::cbmiPrimaryGroupActionPerformed);
×
131
        pmMemberOfGroups.add(cbmiPrimaryGroup);
×
132

133
        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
×
134
        setTitle("New User");
×
135

136
        lblUsername.setText("User name:");
×
137

138
        txtUsername.setInputVerifier(getUsernameInputVerifier());
×
139

140
        lblFullName.setText("Full name:");
×
141

142
        lblDescription.setText("Description:");
×
143

144
        lblPassword.setText("Password:");
×
145

146
        txtPassword.setInputVerifier(getPasswordInputVerifier());
×
147

148
        lblPasswordConfirm.setText("Confirm password:");
×
149

150
        txtPasswordConfirm.setInputVerifier(getPasswordInputVerifier());
×
151

152
        cbDisabled.setText("Account is disabled");
×
153

154
        spnUmask.setModel(new UmaskSpinnerModel());
×
155
        spnUmask.setEditor(new UmaskEditor(spnUmask));
×
156
        spnUmask.setValue(getUmask());
×
157

158
        lblUmask.setText("umask:");
×
159

160
        btnClose.setText("Close");
×
161
        btnClose.addActionListener(this::btnCloseActionPerformed);
×
162

163
        btnCreate.setText("Create");
×
164
        btnCreate.addActionListener(this::btnCreateActionPerformed);
×
165

166
        cbPersonalGroup.setSelected(true);
×
167
        cbPersonalGroup.setText("Create personal user group");
×
168

169
        lstMemberOfGroups.setModel(getMemberOfGroupsListModel());
×
170
        lstMemberOfGroups.setCellRenderer(getMemberOfGroupsListCellRenderer());
×
171
        lstMemberOfGroups.setComponentPopupMenu(pmMemberOfGroups);
×
172
        lstMemberOfGroups.addMouseListener(new java.awt.event.MouseAdapter() {
×
173
            public void mouseClicked(java.awt.event.MouseEvent evt) {
174
                lstMemberOfGroupsMouseClicked(evt);
×
175
            }
×
176
        });
177
        jScrollPane1.setViewportView(lstMemberOfGroups);
×
178

179
        lblMemberOfGroups.setText("Member of Groups:");
×
180

181
        lstAvailableGroups.setModel(getAvailableGroupsListModel());
×
182
        jScrollPane2.setViewportView(lstAvailableGroups);
×
183

184
        lblAvailableGroups.setText("Available Groups:");
×
185

186
        btnAddGroup.setText("->");
×
187
        btnAddGroup.setToolTipText("Add to Group");
×
188
        btnAddGroup.addActionListener(this::btnAddGroupActionPerformed);
×
189

190
        btnRemoveGroup.setText("<-");
×
191
        btnRemoveGroup.setToolTipText("Remove from Group");
×
192
        btnRemoveGroup.addActionListener(this::btnRemoveGroupActionPerformed);
×
193

194
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
×
195
        getContentPane().setLayout(layout);
×
196
        layout.setHorizontalGroup(
×
197
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
198
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
×
199
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
×
200
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
×
201
                        .addGap(6, 6, 6)
×
202
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
×
203
                            .addGroup(layout.createSequentialGroup()
×
204
                                .addComponent(btnClose)
×
205
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
206
                                .addComponent(btnCreate)
×
207
                                .addGap(6, 6, 6))
×
208
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
×
209
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
210
                                    .addGroup(layout.createSequentialGroup()
×
211
                                        .addGap(6, 6, 6)
×
212
                                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE)
×
213
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
214
                                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
×
215
                                            .addComponent(btnAddGroup, javax.swing.GroupLayout.PREFERRED_SIZE, 58, javax.swing.GroupLayout.PREFERRED_SIZE)
×
216
                                            .addComponent(btnRemoveGroup, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))
×
217
                                    .addComponent(lblAvailableGroups))
×
218
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
219
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
220
                                    .addComponent(lblMemberOfGroups)
×
221
                                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 177, javax.swing.GroupLayout.PREFERRED_SIZE)))))
×
222
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
×
223
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
224
                            .addGroup(layout.createSequentialGroup()
×
225
                                .addGap(25, 25, 25)
×
226
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
227
                                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
228
                                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
×
229
                                            .addComponent(lblDescription)
×
230
                                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED))
×
231
                                        .addGroup(layout.createSequentialGroup()
×
232
                                            .addComponent(lblFullName)
×
233
                                            .addGap(24, 24, 24)))
×
234
                                    .addGroup(layout.createSequentialGroup()
×
235
                                        .addComponent(lblUsername)
×
236
                                        .addGap(3, 3, 3)))
×
237
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
×
238
                                    .addComponent(txtUsername, javax.swing.GroupLayout.DEFAULT_SIZE, 296, Short.MAX_VALUE)
×
239
                                    .addComponent(txtFullName, javax.swing.GroupLayout.Alignment.LEADING)
×
240
                                    .addComponent(txtDescription, javax.swing.GroupLayout.Alignment.LEADING)))
×
241
                            .addGroup(layout.createSequentialGroup()
×
242
                                .addGap(24, 24, 24)
×
243
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
244
                                    .addComponent(lblPasswordConfirm)
×
245
                                    .addComponent(lblPassword))
×
246
                                .addGap(18, 18, 18)
×
247
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
×
248
                                    .addComponent(txtPassword, javax.swing.GroupLayout.DEFAULT_SIZE, 248, Short.MAX_VALUE)
×
249
                                    .addComponent(txtPasswordConfirm))))
×
250
                        .addGap(0, 35, Short.MAX_VALUE))
×
251
                    .addGroup(layout.createSequentialGroup()
×
252
                        .addContainerGap()
×
253
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
×
254
                            .addComponent(jSeparator4)
×
255
                            .addComponent(jSeparator1, javax.swing.GroupLayout.Alignment.LEADING))))
×
256
                .addContainerGap())
×
257
            .addGroup(layout.createSequentialGroup()
×
258
                .addContainerGap()
×
259
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
260
                    .addGroup(layout.createSequentialGroup()
×
261
                        .addGap(16, 16, 16)
×
262
                        .addComponent(lblUmask)
×
263
                        .addGap(18, 18, 18)
×
264
                        .addComponent(spnUmask, javax.swing.GroupLayout.PREFERRED_SIZE, 76, javax.swing.GroupLayout.PREFERRED_SIZE)
×
265
                        .addGap(0, 0, Short.MAX_VALUE))
×
266
                    .addGroup(layout.createSequentialGroup()
×
267
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
268
                            .addComponent(jSeparator2)
×
269
                            .addComponent(jSeparator3))
×
270
                        .addContainerGap())))
×
271
            .addGroup(layout.createSequentialGroup()
×
272
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
273
                    .addGroup(layout.createSequentialGroup()
×
274
                        .addGap(16, 16, 16)
×
275
                        .addComponent(cbDisabled))
×
276
                    .addGroup(layout.createSequentialGroup()
×
277
                        .addContainerGap()
×
278
                        .addComponent(cbPersonalGroup)))
×
279
                .addGap(0, 0, Short.MAX_VALUE))
×
280
        );
281
        layout.setVerticalGroup(
×
282
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
283
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
×
284
                .addGap(22, 22, 22)
×
285
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
×
286
                    .addComponent(lblUsername)
×
287
                    .addComponent(txtUsername, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
×
288
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
289
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
×
290
                    .addComponent(lblFullName)
×
291
                    .addComponent(txtFullName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
×
292
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
293
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
×
294
                    .addComponent(lblDescription)
×
295
                    .addComponent(txtDescription, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
×
296
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
297
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
×
298
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
299
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
×
300
                    .addComponent(lblPassword)
×
301
                    .addComponent(txtPassword, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
×
302
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
303
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
×
304
                    .addComponent(txtPasswordConfirm, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
×
305
                    .addComponent(lblPasswordConfirm))
×
306
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
307
                .addComponent(cbDisabled)
×
308
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
309
                .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
×
310
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
311
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
312
                    .addComponent(spnUmask, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
×
313
                    .addComponent(lblUmask))
×
314
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
×
315
                .addComponent(jSeparator3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
×
316
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
317
                .addComponent(cbPersonalGroup)
×
318
                .addGap(18, 18, 18)
×
319
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
320
                    .addComponent(lblMemberOfGroups, javax.swing.GroupLayout.Alignment.TRAILING)
×
321
                    .addComponent(lblAvailableGroups))
×
322
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
323
                    .addGroup(layout.createSequentialGroup()
×
324
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
325
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
326
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
×
327
                            .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
×
328
                    .addGroup(layout.createSequentialGroup()
×
329
                        .addGap(52, 52, 52)
×
330
                        .addComponent(btnAddGroup)
×
331
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
×
332
                        .addComponent(btnRemoveGroup)))
×
333
                .addGap(10, 10, 10)
×
334
                .addComponent(jSeparator4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
×
335
                .addGap(18, 18, 18)
×
336
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
×
337
                    .addComponent(btnClose)
×
338
                    .addComponent(btnCreate))
×
339
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
×
340
        );
341

342
        pack();
×
343
    }// </editor-fold>//GEN-END:initComponents
×
344

345
    private void btnCloseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCloseActionPerformed
346
        setVisible(false);
×
347
        dispose();
×
348
    }//GEN-LAST:event_btnCloseActionPerformed
×
349

350
    private void btnCreateActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCreateActionPerformed
351
        if(!isValidUserDetails()) {
×
352
            return;
×
353
        }
354
        
355
        //create the user
356
        createUser();
×
357
        
358
        //close the dialog
359
        setVisible(false);
×
360
        dispose();
×
361
    }//GEN-LAST:event_btnCreateActionPerformed
×
362

363
    protected void createUser() {
364

365
        //0 - determine the primary group
366
        final GroupAider primaryGroup;
367
        if (getPrimaryGroup() == null) {
×
368
            if (cbPersonalGroup.isSelected()) {
×
369
                primaryGroup = new GroupAider(txtUsername.getText());
×
370
            } else {
×
371
                final String firstGroup = memberOfGroupsModel.firstElement();
×
372
                if (firstGroup != null) {
×
373
                    primaryGroup = new GroupAider(firstGroup);
×
374
                } else {
×
375
                    JOptionPane.showMessageDialog(this, "Could not determine primary group for user '" + txtUsername.getText() + "'. User must create personal group or belong to at least one existing group", "Create User Error", JOptionPane.ERROR_MESSAGE);
×
376
                    return;
×
377
                }
378
            }
379
        } else {
380
            primaryGroup = new GroupAider(getPrimaryGroup());
×
381
        }
382
        
383
        //1 - create personal group
384
        GroupAider groupAider = null;
×
385
        if(cbPersonalGroup.isSelected()) {
×
386
            groupAider = new GroupAider(txtUsername.getText());
×
387
            groupAider.setMetadataValue(EXistSchemaType.DESCRIPTION, "Personal group for " + txtUsername.getText());
×
388
            try {
389
                getUserManagementService().addGroup(groupAider);
×
390
            } catch(final XMLDBException xmldbe) {
×
391
                JOptionPane.showMessageDialog(this, "Could not create personal group '" + txtUsername.getText() + "': " + xmldbe.getMessage(), "Create User Error", JOptionPane.ERROR_MESSAGE);
×
392
                return;
×
393
            }
394
        }
395
        
396
        //2 - create the user
397
        final UserAider userAider = new UserAider(txtUsername.getText());
×
398
        userAider.setMetadataValue(AXSchemaType.FULLNAME, txtFullName.getText());
×
399
        userAider.setMetadataValue(EXistSchemaType.DESCRIPTION, txtDescription.getText());
×
400
        userAider.setPassword(txtPassword.getText());
×
401
        userAider.setEnabled(!cbDisabled.isSelected());
×
402
        userAider.setUserMask(UmaskSpinnerModel.octalUmaskToInt((String)spnUmask.getValue()));
×
403
        
404
        //add the personal group to the user
405
        if(cbPersonalGroup.isSelected()) {
×
406
            userAider.addGroup(txtUsername.getText());
×
407
        }
408
        
409
        //add any other groups to the user
410
        final Iterator<String> itMemberOfGroups = memberOfGroupsModel.iterator();
×
411
        while(itMemberOfGroups.hasNext()) {
×
412
            final String memberOfGroup = itMemberOfGroups.next();
×
413
            userAider.addGroup(memberOfGroup);
×
414
        }
415
        
416
        //set the primary group
417
        try {
418
            userAider.setPrimaryGroup(primaryGroup);
×
419
        } catch(final PermissionDeniedException pde) {
×
420
            JOptionPane.showMessageDialog(this, "Could not set primary group '" + getPrimaryGroup() + "' of user '" + txtUsername.getText() + "': " + pde.getMessage(), "Create User Error", JOptionPane.ERROR_MESSAGE);
×
421
            return;
×
422
        }
423
        
424
        try {
425
            getUserManagementService().addAccount(userAider);
×
426
        } catch(final XMLDBException xmldbe) {
×
427
            JOptionPane.showMessageDialog(this, "Could not create user '" + txtUsername.getText() + "': " + xmldbe.getMessage(), "Create User Error", JOptionPane.ERROR_MESSAGE);
×
428
            return;
×
429
        }
430
        
431
        //3 - if created personal group, then add us as the manager
432
        if(cbPersonalGroup.isSelected()) {
×
433
            try {
434
                groupAider.addManager(userAider);
×
435
                getUserManagementService().updateGroup(groupAider);
×
436
            } catch(final XMLDBException | PermissionDeniedException xmldbe) {
×
437
                JOptionPane.showMessageDialog(this, "Could not set user '" + txtUsername.getText() + "' as manager of personal group '" + txtUsername.getText() + "': " + xmldbe.getMessage(), "Create User Error", JOptionPane.ERROR_MESSAGE);
×
438
                return;
×
439
            }
440
        }
441
    }
×
442
    
443
    private void btnAddGroupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAddGroupActionPerformed
444
        
445
        for(final Object value: lstAvailableGroups.getSelectedValues()) {
×
446
            memberOfGroupsModel.add(value.toString());
×
447
            availableGroupsModel.removeElement(value.toString());
×
448
            
449
            //is this the first group added to the user?
450
            if(getMemberOfGroupsListModel().getSize() == 1 && !cbPersonalGroup.isSelected()) {
×
451
                final String firstGroup = (String)getMemberOfGroupsListModel().getElementAt(0);
×
452
                setPrimaryGroup(firstGroup);
×
453
                getMemberOfGroupsListCellRenderer().setCellOfInterest(getPrimaryGroup());
×
454
            }
455
        }
456
    }//GEN-LAST:event_btnAddGroupActionPerformed
×
457

458
    private void btnRemoveGroupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveGroupActionPerformed
459
        for(final Object value: lstMemberOfGroups.getSelectedValues()) {
×
460
            final String group = value.toString();
×
461
            availableGroupsModel.add(group);
×
462
            memberOfGroupsModel.removeElement(group);
×
463
            
464
            //are we removing the users primary group?
465
            if(group.equals(getPrimaryGroup())) {
×
466
                if(getMemberOfGroupsListModel().getSize() == 0 || cbPersonalGroup.isSelected()) {
×
467
                    setPrimaryGroup(null);
×
468
                } else {
×
469
                    //default to the first group
470
                    final String firstGroup = (String)getMemberOfGroupsListModel().getElementAt(0);
×
471
                    setPrimaryGroup(firstGroup);
×
472
                }
473
            }
474
            getMemberOfGroupsListCellRenderer().setCellOfInterest(getPrimaryGroup());
×
475
        }
476
    }//GEN-LAST:event_btnRemoveGroupActionPerformed
×
477

478
    private void cbmiPrimaryGroupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbmiPrimaryGroupActionPerformed
479
        final String newPrimaryGroup = (String)getMemberOfGroupsListModel().getElementAt(lstMemberOfGroups.getSelectedIndex());
×
480
        if (newPrimaryGroup.equals(this.primaryGroup)) {
×
481
            // deselect existing primary group
482
            this.primaryGroup = null;
×
483
        } else {
×
484
            // select new primary group
485
            this.primaryGroup = newPrimaryGroup;
×
486
        }
487
        getMemberOfGroupsListCellRenderer().setCellOfInterest(primaryGroup);
×
488
    }//GEN-LAST:event_cbmiPrimaryGroupActionPerformed
×
489

490
    private void lstMemberOfGroupsMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_lstMemberOfGroupsMouseClicked
491
        cbmiPrimaryGroup.setState(((String)getMemberOfGroupsListModel().getElementAt(lstMemberOfGroups.getSelectedIndex())).equals(primaryGroup));
×
492
    }//GEN-LAST:event_lstMemberOfGroupsMouseClicked
×
493

494
    private boolean isValidUserDetails() {
495
        return isValidUsername() && isValidPassword() && isValidGroups();
×
496
    }
497
    
498
    private boolean isValidUsername() {
499
        if(PTN_USERNAME.matcher(txtUsername.getText()).matches()) {
×
500
            return true;
×
501
        }
502
        
503
        JOptionPane.showMessageDialog(this, "Username must be at least 3 characters (" + PTN_USERNAME.toString() + ")");
×
504
        return false;
×
505
    }
506
    
507
    private boolean isValidPassword() {
508
        if(txtPassword != null && PTN_PASSWORD.matcher(txtPassword.getText()).matches() && txtPassword.getText().equals(txtPasswordConfirm.getText())) {
×
509
            return true;
×
510
        }
511
        
512
        JOptionPane.showMessageDialog(this, "Passwords do not match or are less than 3 characters.");
×
513
        return false;
×
514
    }
515
    
516
    private boolean isValidGroups() {
517
        if(cbPersonalGroup.isSelected() || memberOfGroupsModel.getSize() > 0) {
×
518
            return true;
×
519
        }
520
        
521
        JOptionPane.showMessageDialog(this, "The user must be in at least one group, or a personal group must be created for them.");
×
522
        return false;
×
523
    }
524
    
525
    private InputVerifier getUsernameInputVerifier() {
526
        return new RegExpInputVerifier(PTN_USERNAME);
×
527
    }
528
    
529
    private InputVerifier getPasswordInputVerifier() {
530
        return new RegExpInputVerifier(PTN_PASSWORD);
×
531
    }
532
    
533
    private String getUmask() {
534
        return String.format("%4s", Integer.toString(Permission.DEFAULT_UMASK, UmaskSpinnerModel.OCTAL_RADIX)).replace(' ', '0');
×
535
    }
536
    
537
    protected SortedListModel getAvailableGroupsListModel() {
538
        if(availableGroupsModel == null) {
×
539
            try {
540
                final String groupNames[] = getUserManagementService().getGroups();
×
541
                availableGroupsModel = new SortedListModel<>();
×
542
                availableGroupsModel.addAll(groupNames);
×
543
            } catch (final XMLDBException xmldbe) {
×
544
                JOptionPane.showMessageDialog(this, "Could not get available groups: " + xmldbe.getMessage(), "Create User Error", JOptionPane.ERROR_MESSAGE);
×
545
            }
546
        }
547
        return availableGroupsModel;
×
548
    }
549
    
550
    protected SortedListModel getMemberOfGroupsListModel() {
551
        if(memberOfGroupsModel == null) {
×
552
            memberOfGroupsModel = new SortedListModel<>();
×
553
        }
554
        return memberOfGroupsModel;
×
555
    }
556

557
    protected UserManagementService getUserManagementService() {
558
        return userManagementService;
×
559
    }
560
    
561
    protected void setPrimaryGroup(final String primaryGroup) {
562
        this.primaryGroup = primaryGroup;
×
563
    }
×
564
    
565
    protected String getPrimaryGroup() {
566
        return primaryGroup;
×
567
    }
568
    
569
    protected void setUserManagementService(final UserManagementService userManagementService) {
570
        this.userManagementService = userManagementService;
×
571
    }
×
572
    
573
    // Variables declaration - do not modify//GEN-BEGIN:variables
574
    private javax.swing.JButton btnAddGroup;
575
    private javax.swing.JButton btnClose;
576
    protected javax.swing.JButton btnCreate;
577
    private javax.swing.JButton btnRemoveGroup;
578
    protected javax.swing.JCheckBox cbDisabled;
579
    protected javax.swing.JCheckBox cbPersonalGroup;
580
    private javax.swing.JCheckBoxMenuItem cbmiPrimaryGroup;
581
    private javax.swing.JScrollPane jScrollPane1;
582
    private javax.swing.JScrollPane jScrollPane2;
583
    private javax.swing.JSeparator jSeparator1;
584
    private javax.swing.JSeparator jSeparator2;
585
    private javax.swing.JSeparator jSeparator3;
586
    private javax.swing.JSeparator jSeparator4;
587
    private javax.swing.JLabel lblAvailableGroups;
588
    private javax.swing.JLabel lblDescription;
589
    private javax.swing.JLabel lblFullName;
590
    private javax.swing.JLabel lblMemberOfGroups;
591
    private javax.swing.JLabel lblPassword;
592
    private javax.swing.JLabel lblPasswordConfirm;
593
    private javax.swing.JLabel lblUmask;
594
    private javax.swing.JLabel lblUsername;
595
    private javax.swing.JList lstAvailableGroups;
596
    private javax.swing.JList lstMemberOfGroups;
597
    private javax.swing.JPopupMenu pmMemberOfGroups;
598
    protected javax.swing.JSpinner spnUmask;
599
    protected javax.swing.JTextField txtDescription;
600
    protected javax.swing.JTextField txtFullName;
601
    protected javax.swing.JPasswordField txtPassword;
602
    protected javax.swing.JPasswordField txtPasswordConfirm;
603
    protected javax.swing.JTextField txtUsername;
604
    // End of variables declaration//GEN-END:variables
605

606
    protected MemberOfGroupsListCellRenderer getMemberOfGroupsListCellRenderer() {
607
        if(memberOfGroupsListCellRenderer == null) {
×
608
            memberOfGroupsListCellRenderer = new MemberOfGroupsListCellRenderer();
×
609
        }
610
        return memberOfGroupsListCellRenderer;
×
611
    }
612
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc