]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.enterprise/ext/test/org/argeo/osgi/useradmin/LdifUserAdminTest.java
Adapt to Java 11
[lgpl/argeo-commons.git] / org.argeo.enterprise / ext / test / org / argeo / osgi / useradmin / LdifUserAdminTest.java
1 package org.argeo.osgi.useradmin;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.ByteArrayOutputStream;
5 import java.io.IOException;
6 import java.io.InputStream;
7 import java.net.URI;
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;
18
19 import javax.transaction.TransactionManager;
20
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;
27
28 import junit.framework.TestCase;
29
30 public class LdifUserAdminTest extends TestCase implements BasicTestConstants {
31 final static int TM_SIMPLE = 0;
32 final static int TM_BITRONIX = 1;
33
34 private int tmType = TM_SIMPLE;
35 private TransactionManager tm;
36 private URI uri;
37 private AbstractUserDirectory userAdmin;
38 private Path tempDir;
39
40 // public void testConcurrent() throws Exception {
41 // }
42
43 public void testEdition() throws Exception {
44 User demoUser = (User) userAdmin.getRole(DEMO_USER_DN);
45 assertNotNull(demoUser);
46
47 tm.begin();
48 String newName = "demo";
49 demoUser.getProperties().put("cn", newName);
50 assertEquals(newName, demoUser.getProperties().get("cn"));
51 tm.commit();
52 persistAndRestart();
53 assertEquals(newName, demoUser.getProperties().get("cn"));
54
55 tm.begin();
56 userAdmin.removeRole(DEMO_USER_DN);
57 tm.commit();
58 persistAndRestart();
59
60 // check data
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);
67 }
68
69 public void testRetrieve() throws Exception {
70 // users
71 User rootUser = (User) userAdmin.getRole(ROOT_USER_DN);
72 assertNotNull(rootUser);
73 User demoUser = (User) userAdmin.getRole(DEMO_USER_DN);
74 assertNotNull(demoUser);
75
76 // groups
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]);
82
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]);
89
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));
96
97 // properties
98 assertEquals("root@localhost", rootUser.getProperties().get("mail"));
99
100 // credentials
101 byte[] hashedPassword = ("{SHA}" + Base64.getEncoder().encodeToString(DigestUtils.sha1("demo".getBytes())))
102 .getBytes();
103 assertTrue(rootUser.hasCredential(LdapAttrs.userPassword.name(), hashedPassword));
104 assertTrue(demoUser.hasCredential(LdapAttrs.userPassword.name(), hashedPassword));
105
106 // search
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);
115 }
116
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();
123 out.close();
124 userAdmin.destroy();
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);
130 }
131 Role[] search = userAdmin.getRoles(null);
132 assertEquals(4, search.length);
133 } else {
134 // test not relevant for LDAP
135 }
136 }
137
138 @Override
139 protected void setUp() throws Exception {
140 tempDir = Files.createTempDirectory(getClass().getName());
141 tempDir.toFile().deleteOnExit();
142 String uriProp = System.getProperty("argeo.userdirectory.uri");
143 if (uriProp != null)
144 uri = new URI(uriProp);
145 else {
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);
150 }
151 uri = ldifPath.toUri();
152 }
153
154 // Init transaction manager
155 if (TM_SIMPLE == tmType) {
156 tm = new SimpleTransactionManager();
157 }
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();
164 // }
165
166 userAdmin = initUserAdmin(uri, tm);
167 }
168
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);
178 else
179 userAdmin = new LdifUserAdmin(props);
180 userAdmin.init();
181 // JTA
182 // if (TM_BITRONIX == tmType)
183 // EhCacheXAResourceProducer.registerXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
184 userAdmin.setTransactionManager(tm);
185 return userAdmin;
186 }
187
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();
193 userAdmin.destroy();
194 userAdmin = initUserAdmin(uri, tm);
195 }
196
197 @Override
198 protected void tearDown() throws Exception {
199 // if (TM_BITRONIX == tmType) {
200 // EhCacheXAResourceProducer.unregisterXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
201 // ((BitronixTransactionManager) tm).shutdown();
202 // }
203 if (userAdmin != null)
204 userAdmin.destroy();
205 if (tempDir != null)
206 Files.walkFileTree(tempDir, new SimpleFileVisitor<Path>() {
207 @Override
208 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
209 Files.delete(file);
210 return FileVisitResult.CONTINUE;
211 }
212
213 @Override
214 public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
215 Files.delete(dir);
216 return FileVisitResult.CONTINUE;
217 }
218
219 });
220 }
221
222 }