1 package org
.argeo
.osgi
.useradmin
;
3 import java
.io
.ByteArrayInputStream
;
4 import java
.io
.ByteArrayOutputStream
;
6 import java
.io
.InputStream
;
8 import java
.nio
.file
.Files
;
9 import java
.nio
.file
.Path
;
10 import java
.util
.Arrays
;
11 import java
.util
.Base64
;
12 import java
.util
.Dictionary
;
13 import java
.util
.Hashtable
;
14 import java
.util
.List
;
15 import java
.util
.UUID
;
17 import javax
.transaction
.TransactionManager
;
19 import org
.osgi
.service
.useradmin
.Authorization
;
20 import org
.osgi
.service
.useradmin
.Group
;
21 import org
.osgi
.service
.useradmin
.Role
;
22 import org
.osgi
.service
.useradmin
.User
;
24 import bitronix
.tm
.BitronixTransactionManager
;
25 import bitronix
.tm
.TransactionManagerServices
;
26 import bitronix
.tm
.resource
.ehcache
.EhCacheXAResourceProducer
;
27 import junit
.framework
.TestCase
;
29 public class LdifUserAdminTest
extends TestCase
implements BasicTestConstants
{
30 private BitronixTransactionManager tm
;
32 private AbstractUserDirectory userAdmin
;
34 public void testConcurrent() throws Exception
{
37 @SuppressWarnings("unchecked")
38 public void testEdition() throws Exception
{
39 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
40 assertNotNull(demoUser
);
43 String newName
= "demo";
44 demoUser
.getProperties().put("cn", newName
);
45 assertEquals(newName
, demoUser
.getProperties().get("cn"));
48 assertEquals(newName
, demoUser
.getProperties().get("cn"));
51 userAdmin
.removeRole(DEMO_USER_DN
);
56 Role
[] search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
57 assertEquals(1, search
.length
);
58 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
59 assertNotNull(editorGroup
);
60 Role
[] members
= editorGroup
.getMembers();
61 assertEquals(1, members
.length
);
64 public void testRetrieve() throws Exception
{
66 User rootUser
= (User
) userAdmin
.getRole(ROOT_USER_DN
);
67 assertNotNull(rootUser
);
68 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
69 assertNotNull(demoUser
);
72 Group adminGroup
= (Group
) userAdmin
.getRole(ADMIN_GROUP_DN
);
73 assertNotNull(adminGroup
);
74 Role
[] members
= adminGroup
.getMembers();
75 assertEquals(1, members
.length
);
76 assertEquals(rootUser
, members
[0]);
78 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
79 assertNotNull(editorGroup
);
80 members
= editorGroup
.getMembers();
81 assertEquals(2, members
.length
);
82 assertEquals(adminGroup
, members
[0]);
83 assertEquals(demoUser
, members
[1]);
85 Authorization rootAuth
= userAdmin
.getAuthorization(rootUser
);
86 List
<String
> rootRoles
= Arrays
.asList(rootAuth
.getRoles());
87 assertEquals(3, rootRoles
.size());
88 assertTrue(rootRoles
.contains(ROOT_USER_DN
));
89 assertTrue(rootRoles
.contains(ADMIN_GROUP_DN
));
90 assertTrue(rootRoles
.contains(EDITORS_GROUP_DN
));
93 assertEquals("root@localhost", rootUser
.getProperties().get("mail"));
96 byte[] hashedPassword
= ("{SHA}" + Base64
.getEncoder().encodeToString(DigestUtils
.sha1("demo".getBytes())))
98 assertTrue(rootUser
.hasCredential(LdifName
.userPassword
.name(), hashedPassword
));
99 assertTrue(demoUser
.hasCredential(LdifName
.userPassword
.name(), hashedPassword
));
102 Role
[] search
= userAdmin
.getRoles(null);
103 assertEquals(4, search
.length
);
104 search
= userAdmin
.getRoles("(objectClass=groupOfNames)");
105 assertEquals(2, search
.length
);
106 search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
107 assertEquals(2, search
.length
);
108 search
= userAdmin
.getRoles("(&(objectclass=inetOrgPerson)(uid=demo))");
109 assertEquals(1, search
.length
);
112 public void testReadWriteRead() throws Exception
{
113 if (userAdmin
instanceof LdifUserAdmin
) {
114 Dictionary
<String
, Object
> props
= userAdmin
.getProperties();
115 ByteArrayOutputStream out
= new ByteArrayOutputStream();
116 ((LdifUserAdmin
) userAdmin
).save(out
);
117 byte[] arr
= out
.toByteArray();
120 // String written = new String(arr);
121 // System.out.print(written);
122 try (ByteArrayInputStream in
= new ByteArrayInputStream(arr
)) {
123 userAdmin
= new LdifUserAdmin(props
);
124 ((LdifUserAdmin
) userAdmin
).load(in
);
126 Role
[] search
= userAdmin
.getRoles(null);
127 assertEquals(4, search
.length
);
129 // test not relevant for LDAP
134 protected void setUp() throws Exception
{
135 Path tempDir
= Files
.createTempDirectory(getClass().getName());
136 String uriProp
= System
.getProperty("argeo.userdirectory.uri");
138 uri
= new URI(uriProp
);
140 tempDir
.toFile().deleteOnExit();
141 Path ldifPath
= tempDir
.resolve(BASE_DN
+ ".ldif");
142 try (InputStream in
= getClass().getResource("basic.ldif").openStream()) {
143 Files
.copy(in
, ldifPath
);
145 uri
= ldifPath
.toUri();
148 bitronix
.tm
.Configuration tmConf
= TransactionManagerServices
.getConfiguration();
149 tmConf
.setServerId(UUID
.randomUUID().toString());
150 tmConf
.setLogPart1Filename(new File(tempDir
.toFile(), "btm1.tlog").getAbsolutePath());
151 tmConf
.setLogPart2Filename(new File(tempDir
.toFile(), "btm2.tlog").getAbsolutePath());
152 tm
= TransactionManagerServices
.getTransactionManager();
154 userAdmin
= initUserAdmin(uri
, tm
);
157 private AbstractUserDirectory
initUserAdmin(URI uri
, TransactionManager tm
) {
158 Dictionary
<String
, Object
> props
= new Hashtable
<>();
159 props
.put(UserAdminConf
.uri
.name(), uri
.toString());
160 props
.put(UserAdminConf
.baseDn
.name(), BASE_DN
);
161 props
.put(UserAdminConf
.userBase
.name(), "ou=users");
162 props
.put(UserAdminConf
.groupBase
.name(), "ou=groups");
163 AbstractUserDirectory userAdmin
;
164 if (uri
.getScheme().startsWith("ldap"))
165 userAdmin
= new LdapUserAdmin(props
);
167 userAdmin
= new LdifUserAdmin(props
);
170 EhCacheXAResourceProducer
.registerXAResource(UserDirectory
.class.getName(), userAdmin
.getXaResource());
171 userAdmin
.setTransactionManager(tm
);
175 private void persistAndRestart() {
176 EhCacheXAResourceProducer
.unregisterXAResource(UserDirectory
.class.getName(), userAdmin
.getXaResource());
177 if (userAdmin
instanceof LdifUserAdmin
)
178 ((LdifUserAdmin
) userAdmin
).save();
180 userAdmin
= initUserAdmin(uri
, tm
);
184 protected void tearDown() throws Exception
{
185 EhCacheXAResourceProducer
.unregisterXAResource(UserDirectory
.class.getName(), userAdmin
.getXaResource());
187 if (userAdmin
!= null)