1 package org
.argeo
.security
.ui
.admin
.internal
;
3 import java
.security
.AccessController
;
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
;
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
;
27 /** First effort to centralize back end methods used by the user admin UI */
28 public class UiAdminUtils
{
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
));
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
);
42 public final static boolean isCurrentUser(User user
) {
43 String userName
= getProperty(user
, LdifName
.dn
.name());
45 LdapName selfUserName
= UiAdminUtils
.getLdapName();
46 LdapName userLdapName
= new LdapName(userName
);
47 if (userLdapName
.equals(selfUserName
))
51 } catch (InvalidNameException e
) {
52 throw new ArgeoException("User " + user
+ " has an unvalid dn: "
57 public final static LdapName
getLdapName() {
58 Subject subject
= Subject
.getSubject(AccessController
.getContext());
59 String name
= subject
.getPrincipals(X500Principal
.class).iterator()
63 dn
= new LdapName(name
);
64 } catch (InvalidNameException e
) {
65 throw new ArgeoException("Invalid user dn " + name
, e
);
70 public final static User
getUser(UserAdmin userAdmin
, LdapName dn
) {
71 User user
= userAdmin
.getUser(LdifName
.dn
.name(), dn
.toString());
75 public final static String
getUsername(User user
) {
76 String cn
= getProperty(user
, LdifName
.dn
.name());
78 cn
= getProperty(user
, LdifName
.uid
.name());
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";
89 name
= new LdapName(dn
);
90 List
<Rdn
> rdns
= name
.getRdns();
93 loop
: while (i
< rdns
.size()) {
94 Rdn currrRdn
= rdns
.get(i
);
95 if (!"dc".equals(currrRdn
.getType()))
98 String currVal
= (String
) currrRdn
.getValue();
99 dname
= dname
== null ? currVal
: currVal
+ "." + dname
;
104 } catch (InvalidNameException e
) {
105 throw new ArgeoException("Unable to get domain name for " + dn
, e
);
109 public final static String
getProperty(Role role
, String key
) {
110 Object obj
= role
.getProperties().get(key
);
117 public final static String
getDefaultCn(String firstName
, String lastName
) {
118 return (firstName
.trim() + " " + lastName
.trim() + " ").trim();
122 * INTERNAL METHODS: Below methods are meant to stay here and are not part
123 * of a potential generic backend to manage the useradmin
125 public final static boolean notNull(String string
) {
129 return !"".equals(string
.trim());
132 public final static boolean isEmpty(String string
) {
136 return "".equals(string
.trim());
139 /** Must be called from the UI Thread. */
140 public final static void beginTransactionIfNeeded(
141 UserTransaction userTransaction
) {
143 if (userTransaction
.getStatus() == Status
.STATUS_NO_TRANSACTION
) {
144 userTransaction
.begin();
145 notifyTransactionStateChange(userTransaction
);
147 } catch (Exception e
) {
148 throw new ArgeoException("Unable to begin transaction", e
);
152 /** Easily notify the ActiveWindow that the transaction had a state change */
153 public final static void notifyTransactionStateChange(
154 UserTransaction userTransaction
) {
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
);