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 org
.argeo
.naming
.LdapAttrs
;
20 import org
.argeo
.osgi
.transaction
.SimpleTransactionManager
;
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 junit
.framework
.TestCase
;
28 /** {@link LdifUserAdmin} tests. */
29 public class LdifUserAdminTest
extends TestCase
implements BasicTestConstants
{
30 // We have to keep using JUnit because of
31 // https://issues.apache.org/jira/browse/SUREFIRE-1669
33 final static int TM_SIMPLE
= 0;
34 final static int TM_BITRONIX
= 1;
36 private int tmType
= TM_SIMPLE
;
37 private SimpleTransactionManager tm
;
39 private AbstractUserDirectory userAdmin
;
43 System
.out
.println("Enter setUp()");
45 tempDir
= Files
.createTempDirectory(getClass().getName());
46 tempDir
.toFile().deleteOnExit();
47 String uriProp
= System
.getProperty("argeo.userdirectory.uri");
49 uri
= new URI(uriProp
);
51 tempDir
.toFile().deleteOnExit();
52 Path ldifPath
= tempDir
.resolve(BASE_DN
+ ".ldif");
53 try (InputStream in
= getClass().getResource("basic.ldif").openStream()) {
54 Files
.copy(in
, ldifPath
);
56 uri
= ldifPath
.toUri();
59 // Init transaction manager
60 if (TM_SIMPLE
== tmType
) {
61 tm
= new SimpleTransactionManager();
63 // else if (TM_BITRONIX == tmType) {
64 // bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration();
65 // tmConf.setServerId(UUID.randomUUID().toString());
66 // tmConf.setLogPart1Filename(new File(tempDir.toFile(), "btm1.tlog").getAbsolutePath());
67 // tmConf.setLogPart2Filename(new File(tempDir.toFile(), "btm2.tlog").getAbsolutePath());
68 // tm = TransactionManagerServices.getTransactionManager();
71 userAdmin
= initUserAdmin(uri
, tm
);
72 } catch (Exception e
) {
73 throw new RuntimeException(e
);
77 public void testEdition() throws Exception
{
78 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
79 assert demoUser
!= null;
82 String newName
= "demo";
83 demoUser
.getProperties().put("cn", newName
);
84 assert newName
.equals(demoUser
.getProperties().get("cn"));
87 assert newName
.equals(demoUser
.getProperties().get("cn"));
90 userAdmin
.removeRole(DEMO_USER_DN
);
95 Role
[] search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
96 assert 1 == search
.length
;
97 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
98 assert editorGroup
!= null;
99 Role
[] members
= editorGroup
.getMembers();
100 assert 1 == members
.length
;
103 public void testRetrieve() throws Exception
{
105 User rootUser
= (User
) userAdmin
.getRole(ROOT_USER_DN
);
106 assert rootUser
!= null;
107 User demoUser
= (User
) userAdmin
.getRole(DEMO_USER_DN
);
108 assert demoUser
!= null;
111 Group adminGroup
= (Group
) userAdmin
.getRole(ADMIN_GROUP_DN
);
112 assert adminGroup
!= null;
113 Role
[] members
= adminGroup
.getMembers();
114 assert 1 == members
.length
;
115 assert rootUser
.equals(members
[0]);
117 Group editorGroup
= (Group
) userAdmin
.getRole(EDITORS_GROUP_DN
);
118 assert editorGroup
!= null;
119 members
= editorGroup
.getMembers();
120 assert 2 == members
.length
;
121 assert adminGroup
.equals(members
[0]);
122 assert demoUser
.equals(members
[1]);
124 Authorization rootAuth
= userAdmin
.getAuthorization(rootUser
);
125 List
<String
> rootRoles
= Arrays
.asList(rootAuth
.getRoles());
126 assert 3 == rootRoles
.size();
127 assert rootRoles
.contains(ROOT_USER_DN
);
128 assert rootRoles
.contains(ADMIN_GROUP_DN
);
129 assert rootRoles
.contains(EDITORS_GROUP_DN
);
132 assert "root@localhost".equals(rootUser
.getProperties().get("mail"));
136 assert rootUser
.hasCredential(LdapAttrs
.userPassword
.name(), "demo".getBytes(StandardCharsets
.UTF_8
));
138 assert demoUser
.hasCredential(LdapAttrs
.userPassword
.name(), "demo".getBytes(StandardCharsets
.UTF_8
));
141 Role
[] search
= userAdmin
.getRoles(null);
142 assert 4 == search
.length
;
143 search
= userAdmin
.getRoles("(objectClass=groupOfNames)");
144 assert 2 == search
.length
;
145 search
= userAdmin
.getRoles("(objectclass=inetOrgPerson)");
146 assert 2 == search
.length
;
147 search
= userAdmin
.getRoles("(&(objectclass=inetOrgPerson)(uid=demo))");
148 assert 1 == search
.length
;
151 public void testReadWriteRead() throws Exception
{
152 if (userAdmin
instanceof LdifUserAdmin
) {
153 Dictionary
<String
, Object
> props
= userAdmin
.getProperties();
154 ByteArrayOutputStream out
= new ByteArrayOutputStream();
155 ((LdifUserAdmin
) userAdmin
).save(out
);
156 byte[] arr
= out
.toByteArray();
159 // String written = new String(arr);
160 // System.out.print(written);
161 try (ByteArrayInputStream in
= new ByteArrayInputStream(arr
)) {
162 userAdmin
= new LdifUserAdmin(props
);
163 ((LdifUserAdmin
) userAdmin
).load(in
);
165 Role
[] search
= userAdmin
.getRoles(null);
166 assert 4 == search
.length
;
168 // test not relevant for LDAP
172 private AbstractUserDirectory
initUserAdmin(URI uri
, SimpleTransactionManager tm
) {
173 Dictionary
<String
, Object
> props
= new Hashtable
<>();
174 props
.put(UserAdminConf
.uri
.name(), uri
.toString());
175 props
.put(UserAdminConf
.baseDn
.name(), BASE_DN
);
176 props
.put(UserAdminConf
.userBase
.name(), "ou=users");
177 props
.put(UserAdminConf
.groupBase
.name(), "ou=groups");
178 AbstractUserDirectory userAdmin
;
179 if (uri
.getScheme().startsWith("ldap"))
180 userAdmin
= new LdapUserAdmin(props
);
182 userAdmin
= new LdifUserAdmin(props
);
185 // if (TM_BITRONIX == tmType)
186 // EhCacheXAResourceProducer.registerXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
187 userAdmin
.setTransactionControl(tm
);
191 private void persistAndRestart() {
192 // if (TM_BITRONIX == tmType)
193 // EhCacheXAResourceProducer.unregisterXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
194 if (userAdmin
instanceof LdifUserAdmin
)
195 ((LdifUserAdmin
) userAdmin
).save();
197 userAdmin
= initUserAdmin(uri
, tm
);
200 public void tearDown() throws Exception
{
201 // if (TM_BITRONIX == tmType) {
202 // EhCacheXAResourceProducer.unregisterXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
203 // ((BitronixTransactionManager) tm).shutdown();
205 if (userAdmin
!= null)
208 Files
.walkFileTree(tempDir
, new SimpleFileVisitor
<Path
>() {
210 public FileVisitResult
visitFile(Path file
, BasicFileAttributes attrs
) throws IOException
{
212 return FileVisitResult
.CONTINUE
;
216 public FileVisitResult
postVisitDirectory(Path dir
, IOException exc
) throws IOException
{
218 return FileVisitResult
.CONTINUE
;