]> git.argeo.org Git - lgpl/argeo-commons.git/blob - LdifUserAdminTest.java
a8a7d226a1aa124c135d038882782af8e93bf291
[lgpl/argeo-commons.git] / LdifUserAdminTest.java
1 package org.argeo.osgi.useradmin;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.ByteArrayOutputStream;
5 import java.io.File;
6 import java.io.InputStream;
7 import java.net.URI;
8 import java.nio.file.Files;
9 import java.nio.file.Path;
10 import java.util.Arrays;
11 import java.util.Base64;
12 import java.util.Dictionary;
13 import java.util.Hashtable;
14 import java.util.List;
15 import java.util.UUID;
16
17 import javax.transaction.TransactionManager;
18
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;
23
24 import bitronix.tm.BitronixTransactionManager;
25 import bitronix.tm.TransactionManagerServices;
26 import bitronix.tm.resource.ehcache.EhCacheXAResourceProducer;
27 import junit.framework.TestCase;
28
29 public class LdifUserAdminTest extends TestCase implements BasicTestConstants {
30 private BitronixTransactionManager tm;
31 private URI uri;
32 private AbstractUserDirectory userAdmin;
33
34 public void testConcurrent() throws Exception {
35 }
36
37 @SuppressWarnings("unchecked")
38 public void testEdition() throws Exception {
39 User demoUser = (User) userAdmin.getRole(DEMO_USER_DN);
40 assertNotNull(demoUser);
41
42 tm.begin();
43 String newName = "demo";
44 demoUser.getProperties().put("cn", newName);
45 assertEquals(newName, demoUser.getProperties().get("cn"));
46 tm.commit();
47 persistAndRestart();
48 assertEquals(newName, demoUser.getProperties().get("cn"));
49
50 tm.begin();
51 userAdmin.removeRole(DEMO_USER_DN);
52 tm.commit();
53 persistAndRestart();
54
55 // check data
56 Role[] search = userAdmin.getRoles("(objectclass=inetOrgPerson)");
57 assertEquals(1, search.length);
58 Group editorGroup = (Group) userAdmin.getRole(EDITORS_GROUP_DN);
59 assertNotNull(editorGroup);
60 Role[] members = editorGroup.getMembers();
61 assertEquals(1, members.length);
62 }
63
64 public void testRetrieve() throws Exception {
65 // users
66 User rootUser = (User) userAdmin.getRole(ROOT_USER_DN);
67 assertNotNull(rootUser);
68 User demoUser = (User) userAdmin.getRole(DEMO_USER_DN);
69 assertNotNull(demoUser);
70
71 // groups
72 Group adminGroup = (Group) userAdmin.getRole(ADMIN_GROUP_DN);
73 assertNotNull(adminGroup);
74 Role[] members = adminGroup.getMembers();
75 assertEquals(1, members.length);
76 assertEquals(rootUser, members[0]);
77
78 Group editorGroup = (Group) userAdmin.getRole(EDITORS_GROUP_DN);
79 assertNotNull(editorGroup);
80 members = editorGroup.getMembers();
81 assertEquals(2, members.length);
82 assertEquals(adminGroup, members[0]);
83 assertEquals(demoUser, members[1]);
84
85 Authorization rootAuth = userAdmin.getAuthorization(rootUser);
86 List<String> rootRoles = Arrays.asList(rootAuth.getRoles());
87 assertEquals(3, rootRoles.size());
88 assertTrue(rootRoles.contains(ROOT_USER_DN));
89 assertTrue(rootRoles.contains(ADMIN_GROUP_DN));
90 assertTrue(rootRoles.contains(EDITORS_GROUP_DN));
91
92 // properties
93 assertEquals("root@localhost", rootUser.getProperties().get("mail"));
94
95 // credentials
96 byte[] hashedPassword = ("{SHA}" + Base64.getEncoder().encodeToString(DigestUtils.sha1("demo".getBytes())))
97 .getBytes();
98 assertTrue(rootUser.hasCredential(LdifName.userPassword.name(), hashedPassword));
99 assertTrue(demoUser.hasCredential(LdifName.userPassword.name(), hashedPassword));
100
101 // search
102 Role[] search = userAdmin.getRoles(null);
103 assertEquals(4, search.length);
104 search = userAdmin.getRoles("(objectClass=groupOfNames)");
105 assertEquals(2, search.length);
106 search = userAdmin.getRoles("(objectclass=inetOrgPerson)");
107 assertEquals(2, search.length);
108 search = userAdmin.getRoles("(&(objectclass=inetOrgPerson)(uid=demo))");
109 assertEquals(1, search.length);
110 }
111
112 public void testReadWriteRead() throws Exception {
113 if (userAdmin instanceof LdifUserAdmin) {
114 Dictionary<String, Object> props = userAdmin.getProperties();
115 ByteArrayOutputStream out = new ByteArrayOutputStream();
116 ((LdifUserAdmin) userAdmin).save(out);
117 byte[] arr = out.toByteArray();
118 out.close();
119 userAdmin.destroy();
120 // String written = new String(arr);
121 // System.out.print(written);
122 try (ByteArrayInputStream in = new ByteArrayInputStream(arr)) {
123 userAdmin = new LdifUserAdmin(props);
124 ((LdifUserAdmin) userAdmin).load(in);
125 }
126 Role[] search = userAdmin.getRoles(null);
127 assertEquals(4, search.length);
128 } else {
129 // test not relevant for LDAP
130 }
131 }
132
133 @Override
134 protected void setUp() throws Exception {
135 Path tempDir = Files.createTempDirectory(getClass().getName());
136 String uriProp = System.getProperty("argeo.userdirectory.uri");
137 if (uriProp != null)
138 uri = new URI(uriProp);
139 else {
140 tempDir.toFile().deleteOnExit();
141 Path ldifPath = tempDir.resolve(BASE_DN + ".ldif");
142 try (InputStream in = getClass().getResource("basic.ldif").openStream()) {
143 Files.copy(in, ldifPath);
144 }
145 uri = ldifPath.toUri();
146 }
147
148 bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration();
149 tmConf.setServerId(UUID.randomUUID().toString());
150 tmConf.setLogPart1Filename(new File(tempDir.toFile(), "btm1.tlog").getAbsolutePath());
151 tmConf.setLogPart2Filename(new File(tempDir.toFile(), "btm2.tlog").getAbsolutePath());
152 tm = TransactionManagerServices.getTransactionManager();
153
154 userAdmin = initUserAdmin(uri, tm);
155 }
156
157 private AbstractUserDirectory initUserAdmin(URI uri, TransactionManager tm) {
158 Dictionary<String, Object> props = new Hashtable<>();
159 props.put(UserAdminConf.uri.name(), uri.toString());
160 props.put(UserAdminConf.baseDn.name(), BASE_DN);
161 props.put(UserAdminConf.userBase.name(), "ou=users");
162 props.put(UserAdminConf.groupBase.name(), "ou=groups");
163 AbstractUserDirectory userAdmin;
164 if (uri.getScheme().startsWith("ldap"))
165 userAdmin = new LdapUserAdmin(props);
166 else
167 userAdmin = new LdifUserAdmin(props);
168 userAdmin.init();
169 // JTA
170 EhCacheXAResourceProducer.registerXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
171 userAdmin.setTransactionManager(tm);
172 return userAdmin;
173 }
174
175 private void persistAndRestart() {
176 EhCacheXAResourceProducer.unregisterXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
177 if (userAdmin instanceof LdifUserAdmin)
178 ((LdifUserAdmin) userAdmin).save();
179 userAdmin.destroy();
180 userAdmin = initUserAdmin(uri, tm);
181 }
182
183 @Override
184 protected void tearDown() throws Exception {
185 EhCacheXAResourceProducer.unregisterXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
186 tm.shutdown();
187 if (userAdmin != null)
188 userAdmin.destroy();
189 }
190
191 }