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 org
.apache
.commons
.codec
.binary
.Base64
;
17 import org
.apache
.commons
.codec
.digest
.DigestUtils
;
18 import org
.apache
.commons
.io
.IOUtils
;
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 AbstractUserDirectory userAdmin
;
31 private BitronixTransactionManager tm
;
33 @SuppressWarnings("unchecked")
34 public void testEdition() throws Exception
{
35 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
36 assertNotNull(demoUser
);
39 String newName
= "demo";
40 demoUser
.getProperties().put("cn", newName
);
41 assertEquals(newName
, demoUser
.getProperties().get("cn"));
43 assertEquals(newName
, demoUser
.getProperties().get("cn"));
46 userAdmin
.removeRole(DEMO_USER_DN
);
50 Role
[] search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
51 assertEquals(1, search
.length
);
52 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
53 assertNotNull(editorGroup
);
54 Role
[] members
= editorGroup
.getMembers();
55 assertEquals(1, members
.length
);
58 public void testRetrieve() throws Exception
{
60 User rootUser
= (User
) userAdmin
.getRole(ROOT_USER_DN
);
61 assertNotNull(rootUser
);
62 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
63 assertNotNull(demoUser
);
66 Group adminGroup
= (Group
) userAdmin
.getRole(ADMIN_GROUP_DN
);
67 assertNotNull(adminGroup
);
68 Role
[] members
= adminGroup
.getMembers();
69 assertEquals(1, members
.length
);
70 assertEquals(rootUser
, members
[0]);
72 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
73 assertNotNull(editorGroup
);
74 members
= editorGroup
.getMembers();
75 assertEquals(2, members
.length
);
76 assertEquals(adminGroup
, members
[0]);
77 assertEquals(demoUser
, members
[1]);
79 Authorization rootAuth
= userAdmin
.getAuthorization(rootUser
);
80 List
<String
> rootRoles
= Arrays
.asList(rootAuth
.getRoles());
81 assertEquals(3, rootRoles
.size());
82 assertTrue(rootRoles
.contains(ROOT_USER_DN
));
83 assertTrue(rootRoles
.contains(ADMIN_GROUP_DN
));
84 assertTrue(rootRoles
.contains(EDITORS_GROUP_DN
));
87 assertEquals("root@localhost", rootUser
.getProperties().get("mail"));
90 byte[] hashedPassword
= ("{SHA}" + Base64
.encodeBase64String(DigestUtils
.sha1("demo".getBytes()))).getBytes();
91 assertTrue(rootUser
.hasCredential(LdifName
.userPassword
.name(), hashedPassword
));
92 assertTrue(demoUser
.hasCredential(LdifName
.userPassword
.name(), hashedPassword
));
95 Role
[] search
= userAdmin
.getRoles(null);
96 assertEquals(4, search
.length
);
97 search
= userAdmin
.getRoles("(objectClass=groupOfNames)");
98 assertEquals(2, search
.length
);
99 search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
100 assertEquals(2, search
.length
);
101 search
= userAdmin
.getRoles("(&(objectclass=inetOrgPerson)(uid=demo))");
102 assertEquals(1, search
.length
);
105 public void testReadWriteRead() throws Exception
{
106 if (userAdmin
instanceof LdifUserAdmin
) {
107 Dictionary
<String
, Object
> props
= userAdmin
.getProperties();
108 ByteArrayOutputStream out
= new ByteArrayOutputStream();
109 ((LdifUserAdmin
) userAdmin
).save(out
);
110 byte[] arr
= out
.toByteArray();
111 IOUtils
.closeQuietly(out
);
113 // String written = new String(arr);
114 // System.out.print(written);
115 try (ByteArrayInputStream in
= new ByteArrayInputStream(arr
)) {
116 userAdmin
= new LdifUserAdmin(props
);
117 ((LdifUserAdmin
) userAdmin
).load(in
);
119 Role
[] search
= userAdmin
.getRoles(null);
120 assertEquals(4, search
.length
);
122 // test not relevant for LDAP
127 protected void setUp() throws Exception
{
128 Path tempDir
= Files
.createTempDirectory(getClass().getName());
130 String uriProp
= System
.getProperty("argeo.useradmin.uri");
132 uri
= new URI(uriProp
);
134 tempDir
.toFile().deleteOnExit();
135 Path ldifPath
= tempDir
.resolve(BASE_DN
+ ".ldif");
136 try (InputStream in
= getClass().getResource("basic.ldif").openStream()) {
137 Files
.copy(in
, ldifPath
);
139 uri
= ldifPath
.toUri();
142 Dictionary
<String
, Object
> props
= new Hashtable
<>();
143 props
.put(UserAdminConf
.uri
.name(), uri
.toString());
144 props
.put(UserAdminConf
.baseDn
.name(), BASE_DN
);
145 props
.put(UserAdminConf
.userBase
.name(), "ou=users");
146 props
.put(UserAdminConf
.groupBase
.name(), "ou=groups");
147 if (uri
.getScheme().startsWith("ldap"))
148 userAdmin
= new LdapUserAdmin(props
);
150 userAdmin
= new LdifUserAdmin(props
);
153 bitronix
.tm
.Configuration tmConf
= TransactionManagerServices
.getConfiguration();
154 tmConf
.setServerId(UUID
.randomUUID().toString());
155 tmConf
.setLogPart1Filename(new File(tempDir
.toFile(), "btm1.tlog").getAbsolutePath());
156 tmConf
.setLogPart2Filename(new File(tempDir
.toFile(), "btm2.tlog").getAbsolutePath());
157 tm
= TransactionManagerServices
.getTransactionManager();
158 EhCacheXAResourceProducer
.registerXAResource(UserDirectory
.class.getName(), userAdmin
.getXaResource());
160 userAdmin
.setTransactionManager(tm
);
164 protected void tearDown() throws Exception
{
165 EhCacheXAResourceProducer
.unregisterXAResource(UserDirectory
.class.getName(), userAdmin
.getXaResource());
167 if (userAdmin
!= null)