+++ /dev/null
-/*
- * Copyright (C) 2007-2012 Argeo GmbH
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.argeo.cms.users;
-
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-
-import org.argeo.ArgeoException;
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.jcr.ArgeoNames;
-import org.argeo.security.UserAdminService;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-
-public class MainUserInfoWizardPage extends WizardPage implements
- ModifyListener, ArgeoNames {
- private static final long serialVersionUID = -3367329974808698649L;
- private Text username, firstName, lastName, primaryEmail, password1,
- password2;
- private UserAdminService userAdminService;
-
- public MainUserInfoWizardPage(UserAdminService userAdminService) {
- super("Main");
- this.userAdminService = userAdminService;
- setTitle("Required Information");
- }
-
- @Override
- public void createControl(Composite parent) {
- Composite composite = new Composite(parent, SWT.NONE);
- composite.setLayout(new GridLayout(2, false));
- username = EclipseUiUtils.createGridLT(composite, "Username", this);
- primaryEmail = EclipseUiUtils.createGridLT(composite, "Email", this);
- firstName = EclipseUiUtils.createGridLT(composite, "First name", this);
- lastName = EclipseUiUtils.createGridLT(composite, "Last name", this);
- password1 = EclipseUiUtils.createGridLP(composite, "Password", this);
- password2 = EclipseUiUtils.createGridLP(composite, "Repeat password",
- this);
- setControl(composite);
-
- // Initialize buttons
- setPageComplete(false);
- getContainer().updateButtons();
- }
-
- @Override
- public void modifyText(ModifyEvent event) {
- String message = checkComplete();
- if (message != null) {
- setMessage(message, WizardPage.ERROR);
- setPageComplete(false);
- } else {
- setMessage("Complete", WizardPage.INFORMATION);
- setPageComplete(true);
- }
- getContainer().updateButtons();
- }
-
- /** @return error message or null if complete */
- protected String checkComplete() {
- // if (!username.getText().matches(UserAdminService.USERNAME_PATTERN))
- // return
- // "Wrong user name format, should be lower case, between 3 and 64 characters with only '_' an '@' as acceptable special character.";
-
- if (username.getText().trim().equals(""))
- return "User name must not be empty";
-
- try {
- UserDetails userDetails = userAdminService
- .loadUserByUsername(username.getText());
- return "User " + userDetails.getUsername() + " already exists";
- } catch (UsernameNotFoundException e) {
- // silent
- }
- if (!primaryEmail.getText().matches(UserAdminService.EMAIL_PATTERN))
- return "Not a valid email address";
- if (firstName.getText().trim().equals(""))
- return "Specify a first name";
- if (lastName.getText().trim().equals(""))
- return "Specify a last name";
- if (password1.getText().trim().equals(""))
- return "Specify a password";
- if (password2.getText().trim().equals(""))
- return "Repeat the password";
- if (!password2.getText().equals(password1.getText()))
- return "Passwords are different";
- return null;
- }
-
- public String getUsername() {
- return username.getText();
- }
-
- public char[] getPassword() {
- return password1.getTextChars();
- }
-
- public void mapToProfileNode(Node up) {
- try {
- up.setProperty(ARGEO_PRIMARY_EMAIL, primaryEmail.getText());
- up.setProperty(ARGEO_FIRST_NAME, firstName.getText());
- up.setProperty(ARGEO_LAST_NAME, lastName.getText());
-
- // derived values
- // TODO add wizard pages to do it
- up.setProperty(Property.JCR_TITLE, firstName.getText() + " "
- + lastName.getText());
- up.setProperty(Property.JCR_DESCRIPTION, "");
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot map to " + up, e);
- }
- }
-}
+++ /dev/null
-/*
- * Copyright (C) 2007-2012 Argeo GmbH
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.argeo.cms.users;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.jcr.UserJcrUtils;
-import org.argeo.security.UserAdminService;
-import org.argeo.security.jcr.NewUserDetails;
-import org.eclipse.jface.wizard.Wizard;
-
-/** Wizard to create a new user */
-public class NewUserWizard extends Wizard {
- private final static Log log = LogFactory.getLog(NewUserWizard.class);
- private Session session;
- private UserAdminService userAdminService;
- // private JcrSecurityModel jcrSecurityModel;
-
- // pages
- private MainUserInfoWizardPage mainUserInfo;
-
- public NewUserWizard(Session session, UserAdminService userAdminService) {
- this.session = session;
- this.userAdminService = userAdminService;
- // this.jcrSecurityModel = jcrSecurityModel;
- }
-
- @Override
- public void addPages() {
- mainUserInfo = new MainUserInfoWizardPage(userAdminService);
- addPage(mainUserInfo);
- }
-
- @Override
- public boolean performFinish() {
- if (!canFinish())
- return false;
-
- String username = mainUserInfo.getUsername();
- try {
- // Node userProfile = SecurityJcrUtils.createUserProfile(session,
- // username);
- // Node userProfile = jcrSecurityModel.sync(session, username,
- // null);
- // session.getWorkspace().getVersionManager()
- // .checkout(userProfile.getPath());
- // mainUserInfo.mapToProfileNode(userProfile);
- char[] password = mainUserInfo.getPassword();
- // TODO add roles
- NewUserDetails jcrUserDetails = new NewUserDetails(username,
- password) {
- private static final long serialVersionUID = 7480071525603380742L;
-
- @Override
- public void mapToProfileNode(Node userProfile)
- throws RepositoryException {
- mainUserInfo.mapToProfileNode(userProfile);
- }
- };
- // session.save();
- // session.getWorkspace().getVersionManager()
- // .checkin(userProfile.getPath());
- userAdminService.createUser(jcrUserDetails);
- return true;
- } catch (Exception e) {
- JcrUtils.discardQuietly(session);
- Node userHome = UserJcrUtils.getUserHome(session, username);
- if (userHome != null) {
- try {
- userHome.remove();
- session.save();
- } catch (RepositoryException e1) {
- JcrUtils.discardQuietly(session);
- log.warn("Error when trying to clean up failed new user "
- + username, e1);
- }
- }
- ErrorFeedback.show("Cannot create new user " + username, e);
- return false;
- }
- }
-
- public void setSession(Session session) {
- this.session = session;
- }
-
-}
+++ /dev/null
-/*
- * Copyright (C) 2007-2012 Argeo GmbH
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.argeo.cms.users;
-
-import java.util.ArrayList;
-
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.ArgeoException;
-import org.argeo.cms.internal.auth.JcrSecurityModel;
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.jcr.ArgeoNames;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.jcr.UserJcrUtils;
-import org.argeo.security.UserAdminService;
-import org.argeo.security.jcr.JcrUserDetails;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Text;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-
-/** Wizard to create a new user */
-@Deprecated
-class UserCreationWizard extends Wizard {
- private final static Log log = LogFactory.getLog(UserCreationWizard.class);
- private Session session;
- private UserAdminService userAdminService;
- private JcrSecurityModel jcrSecurityModel;
-
- // pages
- private MainUserInfoWizardPage mainUserInfo;
-
- public UserCreationWizard(Session session,
- UserAdminService userAdminService, JcrSecurityModel jcrSecurityModel) {
- this.session = session;
- this.userAdminService = userAdminService;
- this.jcrSecurityModel = jcrSecurityModel;
- }
-
- @Override
- public void addPages() {
- mainUserInfo = new MainUserInfoWizardPage(userAdminService);
- addPage(mainUserInfo);
- }
-
- @Override
- public boolean performFinish() {
- if (!canFinish())
- return false;
-
- String username = mainUserInfo.getUsername();
- try {
- Node userProfile = jcrSecurityModel.sync(session, username, null);
- session.getWorkspace().getVersionManager()
- .checkout(userProfile.getPath());
- mainUserInfo.mapToProfileNode(userProfile);
- String password = mainUserInfo.getPassword();
- // TODO add roles
- JcrUserDetails jcrUserDetails = new JcrUserDetails(userProfile,
- password, new ArrayList<GrantedAuthority>());
- session.save();
- session.getWorkspace().getVersionManager()
- .checkin(userProfile.getPath());
- userAdminService.createUser(jcrUserDetails);
- return true;
- } catch (Exception e) {
- JcrUtils.discardQuietly(session);
- Node userHome = UserJcrUtils.getUserHome(session, username);
- if (userHome != null) {
- try {
- userHome.remove();
- session.save();
- } catch (RepositoryException e1) {
- JcrUtils.discardQuietly(session);
- log.warn("Error when trying to clean up failed new user "
- + username, e1);
- }
- }
- // FIXME re-get ErrorFeedback dialog after single sourcing
- // refactoring
- MessageDialog.openError(getShell(), "Error",
- "Cannot create new user " + username);
- log.error("Cannot create new user " + username);
- e.printStackTrace();
- return false;
- }
- }
-
- /** First page, collect all main info and check their validity */
- protected class MainUserInfoWizardPage extends WizardPage implements
- ModifyListener, ArgeoNames {
- private static final long serialVersionUID = -3367329974808698649L;
- private Text username, firstName, lastName, primaryEmail, password1,
- password2;
- private UserAdminService userAdminService;
-
- public MainUserInfoWizardPage(UserAdminService userAdminService) {
- super("Main");
- this.userAdminService = userAdminService;
- setTitle("Required Information");
- }
-
- @Override
- public void createControl(Composite parent) {
- Composite composite = new Composite(parent, SWT.NONE);
- composite.setLayout(new GridLayout(2, false));
- username = EclipseUiUtils.createGridLT(composite, "Username", this);
- primaryEmail = EclipseUiUtils
- .createGridLT(composite, "Email", this);
- firstName = EclipseUiUtils.createGridLT(composite, "First name",
- this);
- lastName = EclipseUiUtils
- .createGridLT(composite, "Last name", this);
- password1 = EclipseUiUtils
- .createGridLP(composite, "Password", this);
- password2 = EclipseUiUtils.createGridLP(composite,
- "Repeat password", this);
- setControl(composite);
-
- // Initialize buttons
- setPageComplete(false);
- getContainer().updateButtons();
- }
-
- @Override
- public void modifyText(ModifyEvent event) {
- String message = checkComplete();
- if (message != null) {
- setMessage(message, WizardPage.ERROR);
- setPageComplete(false);
- } else {
- setMessage("Complete", WizardPage.INFORMATION);
- setPageComplete(true);
- }
- getContainer().updateButtons();
- }
-
- /** @return error message or null if complete */
- protected String checkComplete() {
- // if
- // (!username.getText().matches(UserAdminService.USERNAME_PATTERN))
- // return
- // "Wrong user name format, should be lower case, between 3 and 64 characters with only '_' an '@' as acceptable special character.";
-
- if (username.getText().trim().equals(""))
- return "User name must not be empty";
-
- try {
- UserDetails userDetails = userAdminService
- .loadUserByUsername(username.getText());
- return "User " + userDetails.getUsername() + " already exists";
- } catch (UsernameNotFoundException e) {
- // silent
- }
- if (!primaryEmail.getText().matches(UserAdminService.EMAIL_PATTERN))
- return "Not a valid email address";
- if (firstName.getText().trim().equals(""))
- return "Specify a first name";
- if (lastName.getText().trim().equals(""))
- return "Specify a last name";
- if (password1.getText().trim().equals(""))
- return "Specify a password";
- if (password2.getText().trim().equals(""))
- return "Repeat the password";
- if (!password2.getText().equals(password1.getText()))
- return "Passwords are different";
- return null;
- }
-
- public String getUsername() {
- return username.getText();
- }
-
- public String getPassword() {
- return password1.getText();
- }
-
- public void mapToProfileNode(Node up) {
- try {
- up.setProperty(ARGEO_PRIMARY_EMAIL, primaryEmail.getText());
- up.setProperty(ARGEO_FIRST_NAME, firstName.getText());
- up.setProperty(ARGEO_LAST_NAME, lastName.getText());
-
- // derived values
- // TODO add wizard pages to do it
- up.setProperty(Property.JCR_TITLE, firstName.getText() + " "
- + lastName.getText());
- up.setProperty(Property.JCR_DESCRIPTION, "");
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot map to " + up, e);
- }
- }
- }
-}
\ No newline at end of file
+++ /dev/null
-package org.argeo.cms.users;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.CmsEditable;
-import org.argeo.cms.CmsUiProvider;
-import org.argeo.cms.util.CmsUtils;
-import org.argeo.cms.viewers.JcrVersionCmsEditable;
-import org.argeo.cms.widgets.ScrolledPage;
-import org.argeo.security.UserAdminService;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/** Enable management of a given user */
-public class UserPage implements CmsUiProvider {
-
- /* DEPENDENCY INJECTION */
- private UserAdminService userAdminService;
-
- @Override
- public Control createUi(Composite parent, Node context)
- throws RepositoryException {
- CmsEditable cmsEditable = new JcrVersionCmsEditable(context);
- Composite page = createPage(parent);
- UserViewer userViewer = new UserViewer(page, SWT.NONE, context,
- cmsEditable);
-
- Control control = userViewer.getControl();
-
- // FIXME not satisfying.
- if (control instanceof UserPart)
- ((UserPart) control).setUserAdminService(userAdminService);
-
- Composite par = control.getParent();
-
- UserRolesPart rolesPart = new UserRolesPart(par, SWT.NO_FOCUS, context,
- true);
- rolesPart.setUserAdminService(userAdminService);
- rolesPart.setUserAdminService(userAdminService);
- rolesPart.createControl(rolesPart, UserStyles.USER_FORM_TEXT);
- rolesPart.refresh();
- rolesPart.setLayoutData(CmsUtils.fillWidth());
-
- return page;
- }
-
- protected Composite createPage(Composite parent) {
- parent.setLayout(CmsUtils.noSpaceGridLayout());
- ScrolledPage scrolled = new ScrolledPage(parent, SWT.NONE);
- scrolled.setLayoutData(CmsUtils.fillAll());
- scrolled.setLayout(CmsUtils.noSpaceGridLayout());
- // TODO manage style
- // CmsUtils.style(scrolled, "maintenance_user_form");
-
- Composite page = new Composite(scrolled, SWT.NONE);
- page.setLayout(CmsUtils.noSpaceGridLayout());
- page.setBackgroundMode(SWT.INHERIT_NONE);
- page.setLayoutData(CmsUtils.fillAll());
- return page;
- }
-
- public void setUserAdminService(UserAdminService userAdminService) {
- this.userAdminService = userAdminService;
- }
-}
\ No newline at end of file
+++ /dev/null
-package org.argeo.cms.users;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.Item;
-import javax.jcr.Node;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-
-import org.argeo.ArgeoException;
-import org.argeo.cms.util.CmsUtils;
-import org.argeo.cms.viewers.EditablePart;
-import org.argeo.cms.viewers.NodePart;
-import org.argeo.cms.widgets.StyledControl;
-import org.argeo.eclipse.ui.EclipseUiUtils;
-import org.argeo.jcr.ArgeoNames;
-import org.argeo.security.UserAdminService;
-import org.argeo.security.jcr.JcrUserDetails;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.Text;
-
-/** Display a single user main info once it has been created. */
-public class UserPart extends StyledControl implements EditablePart, NodePart,
- FocusListener {
- private static final long serialVersionUID = -2883661960366940505L;
- // private final static Log log = LogFactory.getLog(UserPart.class);
-
- // A static list of supported properties.
- private List<Text> texts;
- private final static String KEY_PROP_NAME = "jcr:propertyName";
-
- // the 2 password fields
- private Text pwd1, pwd2;
-
- private UserAdminService userAdminService;
-
- // TODO implement to provide user creation ability for anonymous user?
- // public UserPart(Composite parent, int swtStyle) {
- // super(parent, swtStyle);
- // }
-
- public UserPart(Composite parent, int style, Item item)
- throws RepositoryException {
- this(parent, style, item, true);
- }
-
- public UserPart(Composite parent, int style, Item item,
- boolean cacheImmediately) throws RepositoryException {
- super(parent, style, item, cacheImmediately);
- }
-
- @Override
- public Item getItem() throws RepositoryException {
- return getNode();
- }
-
- @Override
- protected Control createControl(Composite box, String style) {
- Composite body = new Composite(box, SWT.NO_FOCUS);
- body.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
- CmsUtils.style(body, UserStyles.USER_FORM_TEXT);
-
- body.setLayout(new GridLayout(2, false));
-
- // Header
- Label headerLbl = new Label(body, SWT.NONE);
- headerLbl.setText(" Main user information");
- headerLbl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
- 2, 1));
- CmsUtils.style(headerLbl, UserStyles.USER_FORM_TITLE);
-
- // Form field
- createTexts(body, UserStyles.USER_FORM_TEXT);
-
- if (isEditing())
- for (Text txt : texts)
- txt.addFocusListener(this);
-
- // Change password link
- headerLbl = new Label(body, SWT.NONE);
- headerLbl.setText(" Reset password");
- headerLbl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false,
- 2, 1));
- CmsUtils.style(headerLbl, UserStyles.USER_FORM_TITLE);
-
- pwd1 = createLP(body, UserStyles.USER_FORM_TEXT, "Enter password");
- pwd2 = createLP(body, UserStyles.USER_FORM_TEXT, "Re-Enter");
-
- final Link link = new Link(body, SWT.NONE);
- link.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 2,
- 1));
- link.setText("<a>Change password</a>");
- link.addSelectionListener(new SelectionAdapter() {
- private static final long serialVersionUID = 8348668888548451776L;
-
- @Override
- public void widgetSelected(SelectionEvent e) {
- String msg = null;
- if ("".equals(pwd1.getText().trim()))
- msg = "Passwords cannot be blank";
- else if (!pwd1.getText().equals(pwd2.getText()))
- msg = "Passwords do not match, please try again.";
-
- if (msg != null) {
- MessageDialog.openError(link.getShell(), "Error", msg);
- } else {
- try {
- String username = getNode().getProperty(
- ArgeoNames.ARGEO_USER_ID).getString();
- if (userAdminService.userExists(username)) {
- JcrUserDetails userDetails = (JcrUserDetails) userAdminService
- .loadUserByUsername(username);
- userDetails = userDetails.cloneWithNewPassword(pwd1
- .getText());
- userAdminService.updateUser(userDetails);
- MessageDialog.openInformation(link.getShell(),
- "Password changed", "Password changed.");
- }
- } catch (Exception re) {
- throw new ArgeoException(
- "unable to reset password for user "
- + getNode(), re);
- }
- }
-
- pwd1.setText("");
- pwd2.setText("");
-
- }
- });
- return body;
- }
-
- private void createTexts(Composite parent, String style) {
- texts = new ArrayList<Text>();
- texts.add(createLT(parent, style, "Displayed Name", Property.JCR_TITLE));
- texts.add(createLT(parent, style, "First name",
- ArgeoNames.ARGEO_FIRST_NAME));
- texts.add(createLT(parent, style, "Last name",
- ArgeoNames.ARGEO_LAST_NAME));
- texts.add(createLT(parent, style, "Email",
- ArgeoNames.ARGEO_PRIMARY_EMAIL));
- texts.add(createLMT(parent, style, "Description",
- Property.JCR_DESCRIPTION));
- }
-
- void refresh() {
- for (Text txt : texts) {
- txt.setText(get(getNode(), (String) txt.getData(KEY_PROP_NAME)));
- txt.setEditable(isEditing());
- }
- }
-
- // his.listener methods
- @Override
- public void focusGained(FocusEvent e) {
- // Do nothing
- }
-
- @Override
- public void focusLost(FocusEvent e) {
- // Save change if needed
- Text text = (Text) e.getSource();
- set(getNode(), (String) text.getData(KEY_PROP_NAME), text.getText());
- }
-
- // HELPERS
- /** Creates label and text. */
- protected Text createLT(Composite body, String style, String label,
- String propName) {
- Label lbl = new Label(body, SWT.NONE);
- lbl.setText(label);
- lbl.setFont(EclipseUiUtils.getBoldFont(body));
- lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
- Text text = new Text(body, SWT.BORDER);
- text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
- CmsUtils.style(text, style);
- text.setData(KEY_PROP_NAME, propName);
- return text;
- }
-
- // HELPERS
- /** Creates label and password text. */
- protected Text createLP(Composite body, String style, String label) {
- Label lbl = new Label(body, SWT.NONE);
- lbl.setText(label);
- lbl.setFont(EclipseUiUtils.getBoldFont(body));
- lbl.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
- Text text = new Text(body, SWT.BORDER | SWT.PASSWORD);
- text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
- CmsUtils.style(text, style);
- return text;
- }
-
- /** Creates label and multiline text. */
- protected Text createLMT(Composite body, String style, String label,
- String propName) {
- Label lbl = new Label(body, SWT.NONE);
- lbl.setText(label);
- lbl.setFont(EclipseUiUtils.getBoldFont(body));
- GridData gd = new GridData(SWT.RIGHT, SWT.TOP, false, false);
- gd.verticalIndent = 0;
- lbl.setLayoutData(gd);
- Text text = new Text(body, SWT.BORDER | SWT.MULTI | SWT.WRAP);
- gd = new GridData(SWT.FILL, SWT.CENTER, true, true);
- gd.heightHint = 100;
- text.setLayoutData(gd);
- CmsUtils.style(text, style);
- text.setData(KEY_PROP_NAME, propName);
- return text;
- }
-
- /**
- * Concisely get the string value of a property. Returns an empty String
- * rather than null if this node doesn't have this property or if the
- * corresponding property is an empty string.
- */
- private String get(Node node, String propertyName) {
- try {
- if (!node.hasProperty(propertyName))
- return "";
- else
- return node.getProperty(propertyName).getString();
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot get property " + propertyName
- + " of " + node, e);
- }
- }
-
- private boolean set(Node node, String propName, String value) {
- try {
- if ("".equals(value)
- && (!node.hasProperty(propName) || node
- .hasProperty(propName)
- && "".equals(node.getProperty(propName).getString())))
- return false;
- else if (node.hasProperty(propName)
- && node.getProperty(propName).getString()
- .equals((String) value))
- return false;
- else {
- node.setProperty(propName, (String) value);
- node.getSession().save();
- return true;
- }
- } catch (RepositoryException e) {
- throw new ArgeoException("Cannot property " + propName + " on "
- + node + " with value " + value, e);
- }
- }
-
- public void setUserAdminService(UserAdminService userAdminService) {
- this.userAdminService = userAdminService;
- }
-}
\ No newline at end of file
+++ /dev/null
-package org.argeo.cms.users;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.Item;
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.ArgeoException;
-import org.argeo.cms.internal.auth.JcrSecurityModel;
-import org.argeo.cms.util.CmsUtils;
-import org.argeo.cms.viewers.EditablePart;
-import org.argeo.cms.viewers.NodePart;
-import org.argeo.cms.widgets.StyledControl;
-import org.argeo.jcr.ArgeoNames;
-import org.argeo.security.UserAdminService;
-import org.argeo.security.jcr.JcrUserDetails;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.springframework.security.core.GrantedAuthority;
-
-/** Display a single user main info once it has been created. */
-public class UserRolesPart extends StyledControl implements EditablePart,
- NodePart, FocusListener {
- private static final long serialVersionUID = -6013980335975055846L;
-
- private CheckboxTableViewer rolesViewer;
- private Table table;
-
- private JcrUserDetails userDetails;
- private UserAdminService userAdminService;
- private List<String> roles;
-
- // FIXME
- // private final Image checked;
-
- // TODO implement to provide user creation ability for anonymous user?
- // public UserPart(Composite parent, int swtStyle) {
- // super(parent, swtStyle);
- // }
-
- public UserRolesPart(Composite parent, int style, Item item,
- UserAdminService userAdminService, JcrSecurityModel jcrSecurityModel)
- throws RepositoryException {
- this(parent, style, item, true);
- }
-
- public UserRolesPart(Composite parent, int style, Item item,
- boolean cacheImmediately) throws RepositoryException {
- super(parent, style, item, cacheImmediately);
- // checked = new Image(parent, imageData);
- }
-
- @Override
- public Item getItem() throws RepositoryException {
- return getNode();
- }
-
- public void setMouseListener(MouseListener mouseListener) {
- super.setMouseListener(mouseListener);
- table.addMouseListener(mouseListener);
- }
-
- @Override
- public Control createControl(Composite box, String style) {
- // box.setLayout(CmsUtils.noSpaceGridLayout());
- box.setLayout(new GridLayout());
-
- Label header = new Label(box, SWT.NONE);
- header.setText(" Groups");
- CmsUtils.style(header, UserStyles.USER_FORM_TITLE);
- header.setLayoutData(CmsUtils.fillWidth());
-
- int swtStyle = SWT.CHECK | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL;
- if (!isEditing())
- swtStyle |= SWT.READ_ONLY;
-
- table = new Table(box, swtStyle);
- table.setLinesVisible(true);
- table.setHeaderVisible(false);
- CmsUtils.style(table, style);
-
- rolesViewer = new CheckboxTableViewer(table);
-
- TableViewerColumn column;
-
- // check column
- // TableViewerColumn column = createTableViewerColumn(rolesViewer,
- // "checked", 20);
- // column.setLabelProvider(new ColumnLabelProvider() {
- // public String getText(Object element) {
- // return null;
- // }
-
- // public Image getImage(Object element) {
- // String role = element.toString();
- // if (roles.contains(role)) {
- //
- // return ROLE_CHECKED;
- // } else {
- // return null;
- // }
- //
- // }
- // );
- // column.setEditingSupport(new RoleEditingSupport(rolesViewer, part));
-
- // role column
- column = createTableViewerColumn(rolesViewer, "Role", 400);
- column.setLabelProvider(new ColumnLabelProvider() {
- private static final long serialVersionUID = -7334412925967366255L;
-
- public String getText(Object element) {
- return element.toString();
- }
- });
- rolesViewer.setContentProvider(new RolesContentProvider());
- rolesViewer.setInput(userAdminService.listEditableRoles().toArray());
-
- // try to prevent edition on read only nodes. Does not work.
- // rolesViewer.setAllGrayed(!isEditing());
-
- rolesViewer.addCheckStateListener(new ICheckStateListener() {
-
- @Override
- public void checkStateChanged(CheckStateChangedEvent event) {
- String name = (String) event.getElement();
- boolean contained = roles.contains(name);
- boolean checked = event.getChecked();
- if (checked != contained) {
- if (!contained)
- roles.add(name);
- else
- roles.remove(name);
- userDetails = userDetails.cloneWithNewRoles(roles);
- userAdminService.updateUser(userDetails);
- }
- }
- });
- return table;
- }
-
- // THE LISTENER
- @Override
- public void focusGained(FocusEvent e) {
- // Do nothing
- }
-
- @Override
- public void focusLost(FocusEvent e) {
- // Save change if needed
- // Text text = (Text) e.getSource();
- }
-
- // private final static Image ROLE_CHECKED = SecurityAdminPlugin
- // .getImageDescriptor("icons/security.gif").createImage();
-
- public void setUserAdminService(UserAdminService userAdminService) {
- this.userAdminService = userAdminService;
- try {
- Node currNode = getNode();
- String username = currNode.getProperty(ArgeoNames.ARGEO_USER_ID)
- .getString();
- if (userAdminService.userExists(username)) {
- JcrUserDetails userDetails = (JcrUserDetails) userAdminService
- .loadUserByUsername(username);
- setUserDetails(userDetails);
- }
- } catch (Exception e) {
- throw new ArgeoException("Cannot retrieve userDetails for "
- + getNode(), e);
- }
-
- }
-
- public void setUserDetails(JcrUserDetails userDetails) {
- this.userDetails = userDetails;
- this.roles = new ArrayList<String>();
- for (GrantedAuthority ga : userDetails.getAuthorities())
- roles.add(ga.getAuthority());
- if (rolesViewer != null)
- rolesViewer.refresh();
- }
-
- protected TableViewerColumn createTableViewerColumn(TableViewer viewer,
- String title, int bound) {
- final TableViewerColumn viewerColumn = new TableViewerColumn(viewer,
- SWT.NONE);
- final TableColumn column = viewerColumn.getColumn();
- column.setText(title);
- column.setWidth(bound);
- column.setResizable(true);
- column.setMoveable(true);
- return viewerColumn;
-
- }
-
- public List<String> getRoles() {
- return roles;
- }
-
- public void refresh() {
-
- // return roles.toArray();
- rolesViewer.setCheckedElements(roles.toArray()); // setSelection(1);
- // rolesViewer.setInput(roles);
- rolesViewer.refresh();
- }
-
- private class RolesContentProvider implements IStructuredContentProvider {
- private static final long serialVersionUID = 4119915828862214310L;
-
- public Object[] getElements(Object inputElement) {
- return userAdminService.listEditableRoles().toArray();
- }
-
- public void dispose() {
- }
-
- public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- viewer.refresh();
- }
- }
-
- // /** Select the columns by editing the checkbox in the first column */
- // class RoleEditingSupport extends EditingSupport {
- //
- // private final TableViewer viewer;
- //
- // public RoleEditingSupport(TableViewer viewer) {
- // super(viewer);
- // this.viewer = viewer;
- // }
- //
- // @Override
- // protected CellEditor getCellEditor(Object element) {
- // return new CheckboxCellEditor(null, SWT.CHECK | SWT.READ_ONLY);
- //
- // }
- //
- // @Override
- // protected boolean canEdit(Object element) {
- // return true;
- // }
- //
- // @Override
- // protected Object getValue(Object element) {
- // String role = element.toString();
- // return roles.contains(role);
- //
- // }
- //
- // @Override
- // protected void setValue(Object element, Object value) {
- // Boolean inRole = (Boolean) value;
- // String role = element.toString();
- // if (inRole && !roles.contains(role)) {
- // roles.add(role);
- // } else if (!inRole && roles.contains(role)) {
- // roles.remove(role);
- // }
- // viewer.refresh();
- // }
- // }
-
-}
\ No newline at end of file
+++ /dev/null
-package org.argeo.cms.users;
-
-/** Some tries with the style */
-public interface UserStyles {
-
- /** A text in a form */
- public final static String USER_FORM_TEXT = "user_form_text";
- public final static String USER_FORM_TITLE = "user_form_title";
-
- public final static String USER_FORM_TEXT_ALT = "user_form_text_alt";
-}
\ No newline at end of file
+++ /dev/null
-package org.argeo.cms.users;
-
-import static org.eclipse.swt.SWT.NONE;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.argeo.cms.CmsEditable;
-import org.argeo.cms.util.CmsUtils;
-import org.argeo.cms.viewers.AbstractPageViewer;
-import org.argeo.cms.viewers.EditablePart;
-import org.argeo.cms.viewers.Section;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-public class UserViewer extends AbstractPageViewer {
- private static final long serialVersionUID = -717973369525981931L;
- private UserPart userPart;
-
- public UserViewer(Composite parent, int style, Node userNode,
- CmsEditable cmsEditable) throws RepositoryException {
- this(new UserPart(parent, SWT.NO_BACKGROUND, userNode), style,
- userNode, cmsEditable);
- }
-
- private UserViewer(UserPart userPart, int style, Node userNode,
- CmsEditable cmsEditable) throws RepositoryException {
- super(new Section(userPart, NONE, userNode), style, cmsEditable);
- this.userPart = userPart;
- userPart.createControl(userPart, "cms_test");
- userPart.setStyle("cms_test");
- refresh();
- userPart.setLayoutData(CmsUtils.fillWidth());
- userPart.setMouseListener(getMouseListener());
-
- // Add other parts
- // userRolesPart.createControl(userPart,"cms_test");
- // userPart.setStyle("cms_test");
- // refresh();
- // userPart.setLayoutData(CmsUtils.fillWidth());
- // userPart.setMouseListener(getMouseListener());
-
- }
-
- // private JcrComposite createParents(Composite parent, Node userNode)
- // throws RepositoryException {
- // this.parent = ;
- // return this.parent;
- // }
-
- @Override
- public Control getControl() {
- return userPart;
- }
-
- // MOUSE LISTENER
- @Override
- protected MouseListener createMouseListener() {
- return new ML();
- }
-
- private class ML extends MouseAdapter {
- private static final long serialVersionUID = 8526890859876770905L;
-
- @Override
- public void mouseDoubleClick(MouseEvent e) {
- if (e.button == 1) {
- Control source = (Control) e.getSource();
- if (getCmsEditable().canEdit()) {
- getCmsEditable().startEditing();
- EditablePart composite = findDataParent(source);
- Point point = new Point(e.x, e.y);
- edit(composite, source.toDisplay(point));
- }
- }
- }
- }
-
- protected void updateContent(EditablePart part) throws RepositoryException {
- if (part instanceof UserPart)
- ((UserPart) part).refresh();
- }
-
- protected void refresh(Control control) throws RepositoryException {
- if (control instanceof UserPart)
- ((UserPart) control).refresh();
- }
-
-}
+++ /dev/null
-package org.argeo.cms.users;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.ArgeoException;
-import org.argeo.cms.CmsUiProvider;
-import org.argeo.cms.maintenance.NonAdminPage;
-import org.argeo.cms.util.CmsUtils;
-import org.argeo.eclipse.ui.parts.UsersTable;
-import org.argeo.jcr.ArgeoNames;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.security.UserAdminService;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.context.SecurityContextHolder;
-
-/**
- * Simple page to manage users of a given repository. It relies on Argeo user
- * model: user profile nodes are stored in the main workspace
- */
-public class UsersPage implements CmsUiProvider {
- private final static Log log = LogFactory.getLog(UsersPage.class);
-
- /* DEPENDENCY INJECTION */
- private UserAdminService userAdminService;
- private String userWkspName;
-
- // TODO use a constant
- private final static String ROLE_USER_ADMIN = "ROLE_USER_ADMIN";
-
- // Local UI Providers
- private NonAdminPage nap = new NonAdminPage();
- private UserPage userPage = new UserPage();
-
- @Override
- public Control createUi(Composite parent, Node context)
- throws RepositoryException {
- // This page is only visible to user with role USER_ADMIN
- if (isAdmin(context)) {
- Session session = context.getSession().getRepository()
- .login(userWkspName);
- return createMainLayout(parent, session);
- } else
- nap.createUi(parent, context);
- return null;
- }
-
- // Main layout
- // Left: User Table - Right User Details Edition
- private Control createMainLayout(Composite parent, final Session session)
- throws RepositoryException {
-
- Composite layoutCmp = new Composite(parent, SWT.NO_FOCUS);
- layoutCmp.setLayoutData(CmsUtils.fillAll());
- layoutCmp
- .setLayout(CmsUtils.noSpaceGridLayout(new GridLayout(2, true)));
-
- Composite left = new Composite(layoutCmp, SWT.NO_FOCUS);
- left.setLayoutData(CmsUtils.fillAll());
- UsersTable table = createUsersTable(left, session);
-
- final Composite right = new Composite(layoutCmp, SWT.NO_FOCUS);
- right.setLayoutData(CmsUtils.fillAll());
-
- final TableViewer viewer = table.getTableViewer();
- viewer.addSelectionChangedListener(new ISelectionChangedListener() {
-
- @Override
- public void selectionChanged(SelectionChangedEvent event) {
- IStructuredSelection selection = (IStructuredSelection) viewer
- .getSelection();
- if (selection.isEmpty()) {
- // Should we clean the right column?
- CmsUtils.clear(right);
- right.layout();
- return;
- } else {
- Node context = (Node) selection.getFirstElement();
- try {
- CmsUtils.clear(right);
- userPage.createUi(right, context);
- right.layout();
- right.getParent().layout();
- } catch (RepositoryException e) {
- e.printStackTrace();
- throw new ArgeoException("unable to create "
- + "editor for user " + context, e);
- }
- }
- }
- });
- return left;
- }
-
- private UsersTable createUsersTable(Composite parent, final Session session)
- throws RepositoryException {
- parent.setLayout(CmsUtils.noSpaceGridLayout());
-
- // Add user CRUD buttons
- Composite buttonCmp = new Composite(parent, SWT.NO_FOCUS);
- buttonCmp.setLayoutData(CmsUtils.fillWidth());
- buttonCmp.setLayout(new GridLayout(2, false));
- // Delete
- final Button deleteBtn = new Button(buttonCmp, SWT.PUSH);
- deleteBtn.setText("Delete selected");
- deleteBtn
- .setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false));
-
- // Add
- final Button addBtn = new Button(buttonCmp, SWT.PUSH);
- addBtn.setText("Create");
-
- Composite bottomCmp = new Composite(parent, SWT.NO_FOCUS);
- bottomCmp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
- bottomCmp.setLayout(new GridLayout());
-
-
- // Create the composite that displays the list and a filter
- final UsersTable userTableCmp = new UsersTable(bottomCmp, SWT.BORDER,
- session);
- userTableCmp.populate(true, false);
- userTableCmp.setLayoutData(CmsUtils.fillAll());
-
- // The various listeners
- userTableCmp.addDisposeListener(new DisposeListener() {
- private static final long serialVersionUID = -8854052549807709846L;
-
- @Override
- public void widgetDisposed(DisposeEvent event) {
- JcrUtils.logoutQuietly(session);
- }
- });
-
- deleteBtn.addSelectionListener(new SelectionAdapter() {
- private static final long serialVersionUID = -7340611909297995666L;
-
- @Override
- public void widgetSelected(SelectionEvent e) {
-
- TableViewer viewer = userTableCmp.getTableViewer();
- ISelection selection = viewer.getSelection();
- if (selection.isEmpty())
- return;
-
- Map<String, Node> toDelete = new TreeMap<String, Node>();
- @SuppressWarnings("unchecked")
- Iterator<Node> it = ((IStructuredSelection) selection)
- .iterator();
- nodes: while (it.hasNext()) {
- Node profileNode = it.next();
- try {
- String userName = profileNode.getProperty(
- ArgeoNames.ARGEO_USER_ID).getString();
- if (userName.equals(profileNode.getSession()
- .getUserID())) {
- log.warn("Cannot delete its own user: " + userName);
- continue nodes;
- }
- toDelete.put(userName, profileNode);
- } catch (RepositoryException re) {
- log.warn("Cannot interpred user " + profileNode);
- }
- }
-
- if (!MessageDialog.openQuestion(
- userTableCmp.getShell(),
- "Delete User",
- "Are you sure that you want to delete users "
- + toDelete.keySet()
- + "?\n"
- + "This may lead to inconsistencies in the application."))
- return;
-
- for (String username : toDelete.keySet()) {
- Session session = null;
- try {
- Node profileNode = toDelete.get(username);
- userAdminService.deleteUser(username);
- profileNode.getParent().remove();
- session = profileNode.getSession();
- session.save();
- } catch (RepositoryException re) {
- JcrUtils.discardQuietly(session);
- throw new ArgeoException("Cannot list users", re);
- }
- }
- userTableCmp.refresh();
- }
- });
-
- addBtn.addSelectionListener(new SelectionAdapter() {
- private static final long serialVersionUID = 9214984636836267786L;
-
- @Override
- public void widgetSelected(SelectionEvent e) {
- NewUserWizard newUserWizard = new NewUserWizard(session,
- userAdminService);
- WizardDialog dialog = new WizardDialog(addBtn.getShell(),
- newUserWizard);
- if (dialog.open() == Dialog.OK)
- userTableCmp.refresh();
- }
- });
-
- // Configure
- // userTableCmp.getTableViewer().addDoubleClickListener(
- // new ViewDoubleClickListener());
- // getViewSite().setSelectionProvider(userTableCmp.getTableViewer());
-
- // Add listener to refresh the list when something changes
- // userStructureListener = new JcrUserListener(getSite().getShell()
- // .getDisplay());
- // JcrUtils.addListener(session, userStructureListener, Event.NODE_ADDED
- // | Event.NODE_REMOVED, ArgeoJcrConstants.PEOPLE_BASE_PATH, null);
- // userPropertiesListener = new JcrUserListener(getSite().getShell()
- // .getDisplay());
- // JcrUtils.addListener(session, userStructureListener,
- // Event.PROPERTY_CHANGED | Event.PROPERTY_ADDED
- // | Event.PROPERTY_REMOVED,
- // ArgeoJcrConstants.PEOPLE_BASE_PATH,
- // ArgeoTypes.ARGEO_USER_PROFILE);
-
- return userTableCmp;
- }
-
- private boolean isAdmin(Node node) throws RepositoryException {
- return isUserInRole(ROLE_USER_ADMIN);
- }
-
- /**
- * Returns true if the current user is in the specified role TODO factoize
- * in the user admin service
- */
- private boolean isUserInRole(String role) {
- Authentication authen = SecurityContextHolder.getContext()
- .getAuthentication();
- for (GrantedAuthority ga : authen.getAuthorities()) {
- if (ga.getAuthority().equals(role))
- return true;
- }
- return false;
- }
-
- /* DEPENDENCY INJECTION */
- public void setWorkspaceName(String workspaceName) {
- this.userWkspName = workspaceName;
- }
-
- public void setUserAdminService(UserAdminService userAdminService) {
- this.userAdminService = userAdminService;
- userPage.setUserAdminService(userAdminService);
- }
-}
\ No newline at end of file