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
.charset
.StandardCharsets
;
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
.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 /** {@link LdifUserAdmin} tests. */
31 public class LdifUserAdminTest
extends TestCase
implements BasicTestConstants
{
32 // We have to keep using JUnit because of
33 // https://issues.apache.org/jira/browse/SUREFIRE-1669
35 final static int TM_SIMPLE
= 0;
36 final static int TM_BITRONIX
= 1;
38 private int tmType
= TM_SIMPLE
;
39 private TransactionManager tm
;
41 private AbstractUserDirectory userAdmin
;
45 System
.out
.println("Enter setUp()");
47 tempDir
= Files
.createTempDirectory(getClass().getName());
48 tempDir
.toFile().deleteOnExit();
49 String uriProp
= System
.getProperty("argeo.userdirectory.uri");
51 uri
= new URI(uriProp
);
53 tempDir
.toFile().deleteOnExit();
54 Path ldifPath
= tempDir
.resolve(BASE_DN
+ ".ldif");
55 try (InputStream in
= getClass().getResource("basic.ldif").openStream()) {
56 Files
.copy(in
, ldifPath
);
58 uri
= ldifPath
.toUri();
61 // Init transaction manager
62 if (TM_SIMPLE
== tmType
) {
63 tm
= new SimpleTransactionManager();
65 // else if (TM_BITRONIX == tmType) {
66 // bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration();
67 // tmConf.setServerId(UUID.randomUUID().toString());
68 // tmConf.setLogPart1Filename(new File(tempDir.toFile(), "btm1.tlog").getAbsolutePath());
69 // tmConf.setLogPart2Filename(new File(tempDir.toFile(), "btm2.tlog").getAbsolutePath());
70 // tm = TransactionManagerServices.getTransactionManager();
73 userAdmin
= initUserAdmin(uri
, tm
);
74 } catch (Exception e
) {
75 throw new RuntimeException(e
);
79 public void testEdition() throws Exception
{
80 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
81 assert demoUser
!= null;
84 String newName
= "demo";
85 demoUser
.getProperties().put("cn", newName
);
86 assert newName
.equals(demoUser
.getProperties().get("cn"));
89 assert newName
.equals(demoUser
.getProperties().get("cn"));
92 userAdmin
.removeRole(DEMO_USER_DN
);
97 Role
[] search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
98 assert 1 == search
.length
;
99 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
100 assert editorGroup
!= null;
101 Role
[] members
= editorGroup
.getMembers();
102 assert 1 == members
.length
;
105 public void testRetrieve() throws Exception
{
107 User rootUser
= (User
) userAdmin
.getRole(ROOT_USER_DN
);
108 assert rootUser
!= null;
109 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
110 assert demoUser
!= null;
113 Group adminGroup
= (Group
) userAdmin
.getRole(ADMIN_GROUP_DN
);
114 assert adminGroup
!= null;
115 Role
[] members
= adminGroup
.getMembers();
116 assert 1 == members
.length
;
117 assert rootUser
.equals(members
[0]);
119 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
120 assert editorGroup
!= null;
121 members
= editorGroup
.getMembers();
122 assert 2 == members
.length
;
123 assert adminGroup
.equals(members
[0]);
124 assert demoUser
.equals(members
[1]);
126 Authorization rootAuth
= userAdmin
.getAuthorization(rootUser
);
127 List
<String
> rootRoles
= Arrays
.asList(rootAuth
.getRoles());
128 assert 3 == rootRoles
.size();
129 assert rootRoles
.contains(ROOT_USER_DN
);
130 assert rootRoles
.contains(ADMIN_GROUP_DN
);
131 assert rootRoles
.contains(EDITORS_GROUP_DN
);
134 assert "root@localhost".equals(rootUser
.getProperties().get("mail"));
138 assert rootUser
.hasCredential(LdapAttrs
.userPassword
.name(), "demo".getBytes(StandardCharsets
.UTF_8
));
140 assert demoUser
.hasCredential(LdapAttrs
.userPassword
.name(), "demo".getBytes(StandardCharsets
.UTF_8
));
143 Role
[] search
= userAdmin
.getRoles(null);
144 assert 4 == search
.length
;
145 search
= userAdmin
.getRoles("(objectClass=groupOfNames)");
146 assert 2 == search
.length
;
147 search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
148 assert 2 == search
.length
;
149 search
= userAdmin
.getRoles("(&(objectclass=inetOrgPerson)(uid=demo))");
150 assert 1 == search
.length
;
153 public void testReadWriteRead() throws Exception
{
154 if (userAdmin
instanceof LdifUserAdmin
) {
155 Dictionary
<String
, Object
> props
= userAdmin
.getProperties();
156 ByteArrayOutputStream out
= new ByteArrayOutputStream();
157 ((LdifUserAdmin
) userAdmin
).save(out
);
158 byte[] arr
= out
.toByteArray();
161 // String written = new String(arr);
162 // System.out.print(written);
163 try (ByteArrayInputStream in
= new ByteArrayInputStream(arr
)) {
164 userAdmin
= new LdifUserAdmin(props
);
165 ((LdifUserAdmin
) userAdmin
).load(in
);
167 Role
[] search
= userAdmin
.getRoles(null);
168 assert 4 == search
.length
;
170 // test not relevant for LDAP
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
);
202 public void tearDown() throws Exception
{
203 // if (TM_BITRONIX == tmType) {
204 // EhCacheXAResourceProducer.unregisterXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
205 // ((BitronixTransactionManager) tm).shutdown();
207 if (userAdmin
!= null)
210 Files
.walkFileTree(tempDir
, new SimpleFileVisitor
<Path
>() {
212 public FileVisitResult
visitFile(Path file
, BasicFileAttributes attrs
) throws IOException
{
214 return FileVisitResult
.CONTINUE
;
218 public FileVisitResult
postVisitDirectory(Path dir
, IOException exc
) throws IOException
{
220 return FileVisitResult
.CONTINUE
;