1 package org
.argeo
.osgi
.useradmin
;
3 import java
.io
.ByteArrayInputStream
;
4 import java
.io
.ByteArrayOutputStream
;
6 import java
.io
.IOException
;
7 import java
.io
.InputStream
;
9 import java
.nio
.file
.FileVisitResult
;
10 import java
.nio
.file
.Files
;
11 import java
.nio
.file
.Path
;
12 import java
.nio
.file
.SimpleFileVisitor
;
13 import java
.nio
.file
.attribute
.BasicFileAttributes
;
14 import java
.util
.Arrays
;
15 import java
.util
.Base64
;
16 import java
.util
.Dictionary
;
17 import java
.util
.Hashtable
;
18 import java
.util
.List
;
19 import java
.util
.UUID
;
21 import javax
.transaction
.TransactionManager
;
23 import org
.argeo
.naming
.LdapAttrs
;
24 import org
.argeo
.transaction
.simple
.SimpleTransactionManager
;
25 import org
.osgi
.service
.useradmin
.Authorization
;
26 import org
.osgi
.service
.useradmin
.Group
;
27 import org
.osgi
.service
.useradmin
.Role
;
28 import org
.osgi
.service
.useradmin
.User
;
30 import bitronix
.tm
.BitronixTransactionManager
;
31 import bitronix
.tm
.TransactionManagerServices
;
32 import bitronix
.tm
.resource
.ehcache
.EhCacheXAResourceProducer
;
33 import junit
.framework
.TestCase
;
35 public class LdifUserAdminTest
extends TestCase
implements BasicTestConstants
{
36 final static int TM_SIMPLE
= 0;
37 final static int TM_BITRONIX
= 1;
39 private int tmType
= TM_SIMPLE
;
40 private TransactionManager tm
;
42 private AbstractUserDirectory userAdmin
;
45 // public void testConcurrent() throws Exception {
48 @SuppressWarnings("unchecked")
49 public void testEdition() throws Exception
{
50 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
51 assertNotNull(demoUser
);
54 String newName
= "demo";
55 demoUser
.getProperties().put("cn", newName
);
56 assertEquals(newName
, demoUser
.getProperties().get("cn"));
59 assertEquals(newName
, demoUser
.getProperties().get("cn"));
62 userAdmin
.removeRole(DEMO_USER_DN
);
67 Role
[] search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
68 assertEquals(1, search
.length
);
69 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
70 assertNotNull(editorGroup
);
71 Role
[] members
= editorGroup
.getMembers();
72 assertEquals(1, members
.length
);
75 public void testRetrieve() throws Exception
{
77 User rootUser
= (User
) userAdmin
.getRole(ROOT_USER_DN
);
78 assertNotNull(rootUser
);
79 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
80 assertNotNull(demoUser
);
83 Group adminGroup
= (Group
) userAdmin
.getRole(ADMIN_GROUP_DN
);
84 assertNotNull(adminGroup
);
85 Role
[] members
= adminGroup
.getMembers();
86 assertEquals(1, members
.length
);
87 assertEquals(rootUser
, members
[0]);
89 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
90 assertNotNull(editorGroup
);
91 members
= editorGroup
.getMembers();
92 assertEquals(2, members
.length
);
93 assertEquals(adminGroup
, members
[0]);
94 assertEquals(demoUser
, members
[1]);
96 Authorization rootAuth
= userAdmin
.getAuthorization(rootUser
);
97 List
<String
> rootRoles
= Arrays
.asList(rootAuth
.getRoles());
98 assertEquals(3, rootRoles
.size());
99 assertTrue(rootRoles
.contains(ROOT_USER_DN
));
100 assertTrue(rootRoles
.contains(ADMIN_GROUP_DN
));
101 assertTrue(rootRoles
.contains(EDITORS_GROUP_DN
));
104 assertEquals("root@localhost", rootUser
.getProperties().get("mail"));
107 byte[] hashedPassword
= ("{SHA}" + Base64
.getEncoder().encodeToString(DigestUtils
.sha1("demo".getBytes())))
109 assertTrue(rootUser
.hasCredential(LdapAttrs
.userPassword
.name(), hashedPassword
));
110 assertTrue(demoUser
.hasCredential(LdapAttrs
.userPassword
.name(), hashedPassword
));
113 Role
[] search
= userAdmin
.getRoles(null);
114 assertEquals(4, search
.length
);
115 search
= userAdmin
.getRoles("(objectClass=groupOfNames)");
116 assertEquals(2, search
.length
);
117 search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
118 assertEquals(2, search
.length
);
119 search
= userAdmin
.getRoles("(&(objectclass=inetOrgPerson)(uid=demo))");
120 assertEquals(1, search
.length
);
123 public void testReadWriteRead() throws Exception
{
124 if (userAdmin
instanceof LdifUserAdmin
) {
125 Dictionary
<String
, Object
> props
= userAdmin
.getProperties();
126 ByteArrayOutputStream out
= new ByteArrayOutputStream();
127 ((LdifUserAdmin
) userAdmin
).save(out
);
128 byte[] arr
= out
.toByteArray();
131 // String written = new String(arr);
132 // System.out.print(written);
133 try (ByteArrayInputStream in
= new ByteArrayInputStream(arr
)) {
134 userAdmin
= new LdifUserAdmin(props
);
135 ((LdifUserAdmin
) userAdmin
).load(in
);
137 Role
[] search
= userAdmin
.getRoles(null);
138 assertEquals(4, search
.length
);
140 // test not relevant for LDAP
145 protected void setUp() throws Exception
{
146 tempDir
= Files
.createTempDirectory(getClass().getName());
147 tempDir
.toFile().deleteOnExit();
148 String uriProp
= System
.getProperty("argeo.userdirectory.uri");
150 uri
= new URI(uriProp
);
152 tempDir
.toFile().deleteOnExit();
153 Path ldifPath
= tempDir
.resolve(BASE_DN
+ ".ldif");
154 try (InputStream in
= getClass().getResource("basic.ldif").openStream()) {
155 Files
.copy(in
, ldifPath
);
157 uri
= ldifPath
.toUri();
160 // Init transaction manager
161 if (TM_SIMPLE
== tmType
) {
162 tm
= new SimpleTransactionManager();
163 } else if (TM_BITRONIX
== tmType
) {
164 bitronix
.tm
.Configuration tmConf
= TransactionManagerServices
.getConfiguration();
165 tmConf
.setServerId(UUID
.randomUUID().toString());
166 tmConf
.setLogPart1Filename(new File(tempDir
.toFile(), "btm1.tlog").getAbsolutePath());
167 tmConf
.setLogPart2Filename(new File(tempDir
.toFile(), "btm2.tlog").getAbsolutePath());
168 tm
= TransactionManagerServices
.getTransactionManager();
171 userAdmin
= initUserAdmin(uri
, tm
);
174 private AbstractUserDirectory
initUserAdmin(URI uri
, TransactionManager tm
) {
175 Dictionary
<String
, Object
> props
= new Hashtable
<>();
176 props
.put(UserAdminConf
.uri
.name(), uri
.toString());
177 props
.put(UserAdminConf
.baseDn
.name(), BASE_DN
);
178 props
.put(UserAdminConf
.userBase
.name(), "ou=users");
179 props
.put(UserAdminConf
.groupBase
.name(), "ou=groups");
180 AbstractUserDirectory userAdmin
;
181 if (uri
.getScheme().startsWith("ldap"))
182 userAdmin
= new LdapUserAdmin(props
);
184 userAdmin
= new LdifUserAdmin(props
);
187 if (TM_BITRONIX
== tmType
)
188 EhCacheXAResourceProducer
.registerXAResource(UserDirectory
.class.getName(), userAdmin
.getXaResource());
189 userAdmin
.setTransactionManager(tm
);
193 private void persistAndRestart() {
194 if (TM_BITRONIX
== tmType
)
195 EhCacheXAResourceProducer
.unregisterXAResource(UserDirectory
.class.getName(), userAdmin
.getXaResource());
196 if (userAdmin
instanceof LdifUserAdmin
)
197 ((LdifUserAdmin
) userAdmin
).save();
199 userAdmin
= initUserAdmin(uri
, tm
);
203 protected void tearDown() throws Exception
{
204 if (TM_BITRONIX
== tmType
) {
205 EhCacheXAResourceProducer
.unregisterXAResource(UserDirectory
.class.getName(), userAdmin
.getXaResource());
206 ((BitronixTransactionManager
) tm
).shutdown();
208 if (userAdmin
!= null)
211 Files
.walkFileTree(tempDir
, new SimpleFileVisitor
<Path
>() {
213 public FileVisitResult
visitFile(Path file
, BasicFileAttributes attrs
) throws IOException
{
215 return FileVisitResult
.CONTINUE
;
219 public FileVisitResult
postVisitDirectory(Path dir
, IOException exc
) throws IOException
{
221 return FileVisitResult
.CONTINUE
;