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