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
.Dictionary
;
12 import java
.util
.Hashtable
;
13 import java
.util
.List
;
14 import java
.util
.UUID
;
16 import javax
.transaction
.TransactionManager
;
18 import org
.apache
.commons
.codec
.binary
.Base64
;
19 import org
.apache
.commons
.codec
.digest
.DigestUtils
;
20 import org
.apache
.commons
.io
.IOUtils
;
21 import org
.osgi
.service
.useradmin
.Authorization
;
22 import org
.osgi
.service
.useradmin
.Group
;
23 import org
.osgi
.service
.useradmin
.Role
;
24 import org
.osgi
.service
.useradmin
.User
;
26 import bitronix
.tm
.BitronixTransactionManager
;
27 import bitronix
.tm
.TransactionManagerServices
;
28 import bitronix
.tm
.resource
.ehcache
.EhCacheXAResourceProducer
;
29 import junit
.framework
.TestCase
;
31 public class LdifUserAdminTest
extends TestCase
implements BasicTestConstants
{
32 private BitronixTransactionManager tm
;
34 private AbstractUserDirectory userAdmin
;
36 public void testConcurrent() throws Exception
{
39 @SuppressWarnings("unchecked")
40 public void testEdition() throws Exception
{
41 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
42 assertNotNull(demoUser
);
45 String newName
= "demo";
46 demoUser
.getProperties().put("cn", newName
);
47 assertEquals(newName
, demoUser
.getProperties().get("cn"));
50 assertEquals(newName
, demoUser
.getProperties().get("cn"));
53 userAdmin
.removeRole(DEMO_USER_DN
);
58 Role
[] search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
59 assertEquals(1, search
.length
);
60 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
61 assertNotNull(editorGroup
);
62 Role
[] members
= editorGroup
.getMembers();
63 assertEquals(1, members
.length
);
66 public void testRetrieve() throws Exception
{
68 User rootUser
= (User
) userAdmin
.getRole(ROOT_USER_DN
);
69 assertNotNull(rootUser
);
70 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
71 assertNotNull(demoUser
);
74 Group adminGroup
= (Group
) userAdmin
.getRole(ADMIN_GROUP_DN
);
75 assertNotNull(adminGroup
);
76 Role
[] members
= adminGroup
.getMembers();
77 assertEquals(1, members
.length
);
78 assertEquals(rootUser
, members
[0]);
80 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
81 assertNotNull(editorGroup
);
82 members
= editorGroup
.getMembers();
83 assertEquals(2, members
.length
);
84 assertEquals(adminGroup
, members
[0]);
85 assertEquals(demoUser
, members
[1]);
87 Authorization rootAuth
= userAdmin
.getAuthorization(rootUser
);
88 List
<String
> rootRoles
= Arrays
.asList(rootAuth
.getRoles());
89 assertEquals(3, rootRoles
.size());
90 assertTrue(rootRoles
.contains(ROOT_USER_DN
));
91 assertTrue(rootRoles
.contains(ADMIN_GROUP_DN
));
92 assertTrue(rootRoles
.contains(EDITORS_GROUP_DN
));
95 assertEquals("root@localhost", rootUser
.getProperties().get("mail"));
98 byte[] hashedPassword
= ("{SHA}" + Base64
.encodeBase64String(DigestUtils
.sha1("demo".getBytes()))).getBytes();
99 assertTrue(rootUser
.hasCredential(LdifName
.userPassword
.name(), hashedPassword
));
100 assertTrue(demoUser
.hasCredential(LdifName
.userPassword
.name(), hashedPassword
));
103 Role
[] search
= userAdmin
.getRoles(null);
104 assertEquals(4, search
.length
);
105 search
= userAdmin
.getRoles("(objectClass=groupOfNames)");
106 assertEquals(2, search
.length
);
107 search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
108 assertEquals(2, search
.length
);
109 search
= userAdmin
.getRoles("(&(objectclass=inetOrgPerson)(uid=demo))");
110 assertEquals(1, search
.length
);
113 public void testReadWriteRead() throws Exception
{
114 if (userAdmin
instanceof LdifUserAdmin
) {
115 Dictionary
<String
, Object
> props
= userAdmin
.getProperties();
116 ByteArrayOutputStream out
= new ByteArrayOutputStream();
117 ((LdifUserAdmin
) userAdmin
).save(out
);
118 byte[] arr
= out
.toByteArray();
119 IOUtils
.closeQuietly(out
);
121 // String written = new String(arr);
122 // System.out.print(written);
123 try (ByteArrayInputStream in
= new ByteArrayInputStream(arr
)) {
124 userAdmin
= new LdifUserAdmin(props
);
125 ((LdifUserAdmin
) userAdmin
).load(in
);
127 Role
[] search
= userAdmin
.getRoles(null);
128 assertEquals(4, search
.length
);
130 // test not relevant for LDAP
135 protected void setUp() throws Exception
{
136 Path tempDir
= Files
.createTempDirectory(getClass().getName());
137 String uriProp
= System
.getProperty("argeo.userdirectory.uri");
139 uri
= new URI(uriProp
);
141 tempDir
.toFile().deleteOnExit();
142 Path ldifPath
= tempDir
.resolve(BASE_DN
+ ".ldif");
143 try (InputStream in
= getClass().getResource("basic.ldif").openStream()) {
144 Files
.copy(in
, ldifPath
);
146 uri
= ldifPath
.toUri();
149 bitronix
.tm
.Configuration tmConf
= TransactionManagerServices
.getConfiguration();
150 tmConf
.setServerId(UUID
.randomUUID().toString());
151 tmConf
.setLogPart1Filename(new File(tempDir
.toFile(), "btm1.tlog").getAbsolutePath());
152 tmConf
.setLogPart2Filename(new File(tempDir
.toFile(), "btm2.tlog").getAbsolutePath());
153 tm
= TransactionManagerServices
.getTransactionManager();
155 userAdmin
= initUserAdmin(uri
, tm
);
158 private AbstractUserDirectory
initUserAdmin(URI uri
, TransactionManager tm
) {
159 Dictionary
<String
, Object
> props
= new Hashtable
<>();
160 props
.put(UserAdminConf
.uri
.name(), uri
.toString());
161 props
.put(UserAdminConf
.baseDn
.name(), BASE_DN
);
162 props
.put(UserAdminConf
.userBase
.name(), "ou=users");
163 props
.put(UserAdminConf
.groupBase
.name(), "ou=groups");
164 AbstractUserDirectory userAdmin
;
165 if (uri
.getScheme().startsWith("ldap"))
166 userAdmin
= new LdapUserAdmin(props
);
168 userAdmin
= new LdifUserAdmin(props
);
171 EhCacheXAResourceProducer
.registerXAResource(UserDirectory
.class.getName(), userAdmin
.getXaResource());
172 userAdmin
.setTransactionManager(tm
);
176 private void persistAndRestart() {
177 EhCacheXAResourceProducer
.unregisterXAResource(UserDirectory
.class.getName(), userAdmin
.getXaResource());
178 if (userAdmin
instanceof LdifUserAdmin
)
179 ((LdifUserAdmin
) userAdmin
).save();
181 userAdmin
= initUserAdmin(uri
, tm
);
185 protected void tearDown() throws Exception
{
186 EhCacheXAResourceProducer
.unregisterXAResource(UserDirectory
.class.getName(), userAdmin
.getXaResource());
188 if (userAdmin
!= null)