]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.security.ui.admin/src/org/argeo/security/ui/admin/internal/UiAdminUtils.java
Work on security Admin UI, batch processing, specific admin abilities, some code...
[lgpl/argeo-commons.git] / org.argeo.security.ui.admin / src / org / argeo / security / ui / admin / internal / UiAdminUtils.java
1 package org.argeo.security.ui.admin.internal;
2
3 import java.security.AccessController;
4 import java.util.List;
5 import java.util.Set;
6
7 import javax.naming.InvalidNameException;
8 import javax.naming.ldap.LdapName;
9 import javax.naming.ldap.Rdn;
10 import javax.security.auth.Subject;
11 import javax.security.auth.x500.X500Principal;
12 import javax.transaction.Status;
13 import javax.transaction.UserTransaction;
14
15 import org.argeo.ArgeoException;
16 import org.argeo.cms.auth.AuthConstants;
17 import org.argeo.cms.auth.CurrentUser;
18 import org.argeo.osgi.useradmin.LdifName;
19 import org.argeo.security.ui.admin.internal.providers.UserTransactionProvider;
20 import org.eclipse.ui.IWorkbenchWindow;
21 import org.eclipse.ui.PlatformUI;
22 import org.eclipse.ui.services.ISourceProviderService;
23 import org.osgi.service.useradmin.Role;
24 import org.osgi.service.useradmin.User;
25 import org.osgi.service.useradmin.UserAdmin;
26
27 /** First effort to centralize back end methods used by the user admin UI */
28 public class UiAdminUtils {
29
30 /** returns the local name of the current connected user */
31 public final static String getUsername(UserAdmin userAdmin) {
32 LdapName dn = getLdapName();
33 return getUsername(getUser(userAdmin, dn));
34 }
35
36 /** Returns true if the current user is in the specified role */
37 public static boolean isUserInRole(String role) {
38 Set<String> roles = CurrentUser.roles();
39 return roles.contains(role);
40 }
41
42 public final static boolean isCurrentUser(User user) {
43 String userName = getProperty(user, LdifName.dn.name());
44 try {
45 LdapName selfUserName = UiAdminUtils.getLdapName();
46 LdapName userLdapName = new LdapName(userName);
47 if (userLdapName.equals(selfUserName))
48 return true;
49 else
50 return false;
51 } catch (InvalidNameException e) {
52 throw new ArgeoException("User " + user + " has an unvalid dn: "
53 + userName, e);
54 }
55 }
56
57 public final static LdapName getLdapName() {
58 Subject subject = Subject.getSubject(AccessController.getContext());
59 String name = subject.getPrincipals(X500Principal.class).iterator()
60 .next().toString();
61 LdapName dn;
62 try {
63 dn = new LdapName(name);
64 } catch (InvalidNameException e) {
65 throw new ArgeoException("Invalid user dn " + name, e);
66 }
67 return dn;
68 }
69
70 public final static User getUser(UserAdmin userAdmin, LdapName dn) {
71 User user = userAdmin.getUser(LdifName.dn.name(), dn.toString());
72 return user;
73 }
74
75 public final static String getUsername(User user) {
76 String cn = getProperty(user, LdifName.dn.name());
77 if (isEmpty(cn))
78 cn = getProperty(user, LdifName.uid.name());
79 return cn;
80 }
81
82 /** Simply retrieves a display name of the relevant domain */
83 public final static String getDomainName(User user) {
84 String dn = (String) user.getProperties().get(LdifName.dn.name());
85 if (dn.endsWith(AuthConstants.ROLES_BASEDN))
86 return "System roles";
87 try {
88 LdapName name;
89 name = new LdapName(dn);
90 List<Rdn> rdns = name.getRdns();
91 String dname = null;
92 int i = 0;
93 loop: while (i < rdns.size()) {
94 Rdn currrRdn = rdns.get(i);
95 if (!"dc".equals(currrRdn.getType()))
96 break loop;
97 else {
98 String currVal = (String) currrRdn.getValue();
99 dname = dname == null ? currVal : currVal + "." + dname;
100 }
101 i++;
102 }
103 return dname;
104 } catch (InvalidNameException e) {
105 throw new ArgeoException("Unable to get domain name for " + dn, e);
106 }
107 }
108
109 public final static String getProperty(Role role, String key) {
110 Object obj = role.getProperties().get(key);
111 if (obj != null)
112 return (String) obj;
113 else
114 return "";
115 }
116
117 public final static String getDefaultCn(String firstName, String lastName) {
118 return (firstName.trim() + " " + lastName.trim() + " ").trim();
119 }
120
121 /*
122 * INTERNAL METHODS: Below methods are meant to stay here and are not part
123 * of a potential generic backend to manage the useradmin
124 */
125 public final static boolean notNull(String string) {
126 if (string == null)
127 return false;
128 else
129 return !"".equals(string.trim());
130 }
131
132 public final static boolean isEmpty(String string) {
133 if (string == null)
134 return true;
135 else
136 return "".equals(string.trim());
137 }
138
139 /** Must be called from the UI Thread. */
140 public final static void beginTransactionIfNeeded(
141 UserTransaction userTransaction) {
142 try {
143 if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION) {
144 userTransaction.begin();
145 notifyTransactionStateChange(userTransaction);
146 }
147 } catch (Exception e) {
148 throw new ArgeoException("Unable to begin transaction", e);
149 }
150 }
151
152 /** Easily notify the ActiveWindow that the transaction had a state change */
153 public final static void notifyTransactionStateChange(
154 UserTransaction userTransaction) {
155 try {
156 IWorkbenchWindow aww = PlatformUI.getWorkbench()
157 .getActiveWorkbenchWindow();
158 ISourceProviderService sourceProviderService = (ISourceProviderService) aww
159 .getService(ISourceProviderService.class);
160 UserTransactionProvider esp = (UserTransactionProvider) sourceProviderService
161 .getSourceProvider(UserTransactionProvider.TRANSACTION_STATE);
162 esp.fireTransactionStateChange();
163 } catch (Exception e) {
164 throw new ArgeoException("Unable to begin transaction", e);
165 }
166 }
167 }