1 package org
.argeo
.osgi
.useradmin
;
3 import java
.io
.ByteArrayInputStream
;
4 import java
.io
.ByteArrayOutputStream
;
5 import java
.io
.IOException
;
6 import java
.io
.InputStream
;
8 import java
.nio
.file
.FileVisitResult
;
9 import java
.nio
.file
.Files
;
10 import java
.nio
.file
.Path
;
11 import java
.nio
.file
.SimpleFileVisitor
;
12 import java
.nio
.file
.attribute
.BasicFileAttributes
;
13 import java
.util
.Arrays
;
14 import java
.util
.Base64
;
15 import java
.util
.Dictionary
;
16 import java
.util
.Hashtable
;
17 import java
.util
.List
;
19 import javax
.transaction
.TransactionManager
;
21 import org
.argeo
.naming
.LdapAttrs
;
22 import org
.argeo
.transaction
.simple
.SimpleTransactionManager
;
23 import org
.osgi
.service
.useradmin
.Authorization
;
24 import org
.osgi
.service
.useradmin
.Group
;
25 import org
.osgi
.service
.useradmin
.Role
;
26 import org
.osgi
.service
.useradmin
.User
;
28 import junit
.framework
.TestCase
;
30 public class LdifUserAdminTest
extends TestCase
implements BasicTestConstants
{
31 final static int TM_SIMPLE
= 0;
32 final static int TM_BITRONIX
= 1;
34 private int tmType
= TM_SIMPLE
;
35 private TransactionManager tm
;
37 private AbstractUserDirectory userAdmin
;
40 // public void testConcurrent() throws Exception {
43 public void testEdition() throws Exception
{
44 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
45 assertNotNull(demoUser
);
48 String newName
= "demo";
49 demoUser
.getProperties().put("cn", newName
);
50 assertEquals(newName
, demoUser
.getProperties().get("cn"));
53 assertEquals(newName
, demoUser
.getProperties().get("cn"));
56 userAdmin
.removeRole(DEMO_USER_DN
);
61 Role
[] search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
62 assertEquals(1, search
.length
);
63 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
64 assertNotNull(editorGroup
);
65 Role
[] members
= editorGroup
.getMembers();
66 assertEquals(1, members
.length
);
69 public void testRetrieve() throws Exception
{
71 User rootUser
= (User
) userAdmin
.getRole(ROOT_USER_DN
);
72 assertNotNull(rootUser
);
73 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
74 assertNotNull(demoUser
);
77 Group adminGroup
= (Group
) userAdmin
.getRole(ADMIN_GROUP_DN
);
78 assertNotNull(adminGroup
);
79 Role
[] members
= adminGroup
.getMembers();
80 assertEquals(1, members
.length
);
81 assertEquals(rootUser
, members
[0]);
83 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
84 assertNotNull(editorGroup
);
85 members
= editorGroup
.getMembers();
86 assertEquals(2, members
.length
);
87 assertEquals(adminGroup
, members
[0]);
88 assertEquals(demoUser
, members
[1]);
90 Authorization rootAuth
= userAdmin
.getAuthorization(rootUser
);
91 List
<String
> rootRoles
= Arrays
.asList(rootAuth
.getRoles());
92 assertEquals(3, rootRoles
.size());
93 assertTrue(rootRoles
.contains(ROOT_USER_DN
));
94 assertTrue(rootRoles
.contains(ADMIN_GROUP_DN
));
95 assertTrue(rootRoles
.contains(EDITORS_GROUP_DN
));
98 assertEquals("root@localhost", rootUser
.getProperties().get("mail"));
101 byte[] hashedPassword
= ("{SHA}" + Base64
.getEncoder().encodeToString(DigestUtils
.sha1("demo".getBytes())))
103 assertTrue(rootUser
.hasCredential(LdapAttrs
.userPassword
.name(), hashedPassword
));
104 assertTrue(demoUser
.hasCredential(LdapAttrs
.userPassword
.name(), hashedPassword
));
107 Role
[] search
= userAdmin
.getRoles(null);
108 assertEquals(4, search
.length
);
109 search
= userAdmin
.getRoles("(objectClass=groupOfNames)");
110 assertEquals(2, search
.length
);
111 search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
112 assertEquals(2, search
.length
);
113 search
= userAdmin
.getRoles("(&(objectclass=inetOrgPerson)(uid=demo))");
114 assertEquals(1, search
.length
);
117 public void testReadWriteRead() throws Exception
{
118 if (userAdmin
instanceof LdifUserAdmin
) {
119 Dictionary
<String
, Object
> props
= userAdmin
.getProperties();
120 ByteArrayOutputStream out
= new ByteArrayOutputStream();
121 ((LdifUserAdmin
) userAdmin
).save(out
);
122 byte[] arr
= out
.toByteArray();
125 // String written = new String(arr);
126 // System.out.print(written);
127 try (ByteArrayInputStream in
= new ByteArrayInputStream(arr
)) {
128 userAdmin
= new LdifUserAdmin(props
);
129 ((LdifUserAdmin
) userAdmin
).load(in
);
131 Role
[] search
= userAdmin
.getRoles(null);
132 assertEquals(4, search
.length
);
134 // test not relevant for LDAP
139 protected void setUp() throws Exception
{
140 tempDir
= Files
.createTempDirectory(getClass().getName());
141 tempDir
.toFile().deleteOnExit();
142 String uriProp
= System
.getProperty("argeo.userdirectory.uri");
144 uri
= new URI(uriProp
);
146 tempDir
.toFile().deleteOnExit();
147 Path ldifPath
= tempDir
.resolve(BASE_DN
+ ".ldif");
148 try (InputStream in
= getClass().getResource("basic.ldif").openStream()) {
149 Files
.copy(in
, ldifPath
);
151 uri
= ldifPath
.toUri();
154 // Init transaction manager
155 if (TM_SIMPLE
== tmType
) {
156 tm
= new SimpleTransactionManager();
158 // else if (TM_BITRONIX == tmType) {
159 // bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration();
160 // tmConf.setServerId(UUID.randomUUID().toString());
161 // tmConf.setLogPart1Filename(new File(tempDir.toFile(), "btm1.tlog").getAbsolutePath());
162 // tmConf.setLogPart2Filename(new File(tempDir.toFile(), "btm2.tlog").getAbsolutePath());
163 // tm = TransactionManagerServices.getTransactionManager();
166 userAdmin
= initUserAdmin(uri
, tm
);
169 private AbstractUserDirectory
initUserAdmin(URI uri
, TransactionManager tm
) {
170 Dictionary
<String
, Object
> props
= new Hashtable
<>();
171 props
.put(UserAdminConf
.uri
.name(), uri
.toString());
172 props
.put(UserAdminConf
.baseDn
.name(), BASE_DN
);
173 props
.put(UserAdminConf
.userBase
.name(), "ou=users");
174 props
.put(UserAdminConf
.groupBase
.name(), "ou=groups");
175 AbstractUserDirectory userAdmin
;
176 if (uri
.getScheme().startsWith("ldap"))
177 userAdmin
= new LdapUserAdmin(props
);
179 userAdmin
= new LdifUserAdmin(props
);
182 // if (TM_BITRONIX == tmType)
183 // EhCacheXAResourceProducer.registerXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
184 userAdmin
.setTransactionManager(tm
);
188 private void persistAndRestart() {
189 // if (TM_BITRONIX == tmType)
190 // EhCacheXAResourceProducer.unregisterXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
191 if (userAdmin
instanceof LdifUserAdmin
)
192 ((LdifUserAdmin
) userAdmin
).save();
194 userAdmin
= initUserAdmin(uri
, tm
);
198 protected void tearDown() throws Exception
{
199 // if (TM_BITRONIX == tmType) {
200 // EhCacheXAResourceProducer.unregisterXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
201 // ((BitronixTransactionManager) tm).shutdown();
203 if (userAdmin
!= null)
206 Files
.walkFileTree(tempDir
, new SimpleFileVisitor
<Path
>() {
208 public FileVisitResult
visitFile(Path file
, BasicFileAttributes attrs
) throws IOException
{
210 return FileVisitResult
.CONTINUE
;
214 public FileVisitResult
postVisitDirectory(Path dir
, IOException exc
) throws IOException
{
216 return FileVisitResult
.CONTINUE
;