]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.enterprise/ext/test/org/argeo/osgi/useradmin/LdifUserAdminTest.java
Remove dependency to JTA
[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.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;
18
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;
25
26 import junit.framework.TestCase;
27
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
32
33 final static int TM_SIMPLE = 0;
34 final static int TM_BITRONIX = 1;
35
36 private int tmType = TM_SIMPLE;
37 private SimpleTransactionManager tm;
38 private URI uri;
39 private AbstractUserDirectory userAdmin;
40 private Path tempDir;
41
42 public void setUp() {
43 System.out.println("Enter setUp()");
44 try {
45 tempDir = Files.createTempDirectory(getClass().getName());
46 tempDir.toFile().deleteOnExit();
47 String uriProp = System.getProperty("argeo.userdirectory.uri");
48 if (uriProp != null)
49 uri = new URI(uriProp);
50 else {
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);
55 }
56 uri = ldifPath.toUri();
57 }
58
59 // Init transaction manager
60 if (TM_SIMPLE == tmType) {
61 tm = new SimpleTransactionManager();
62 }
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();
69 // }
70
71 userAdmin = initUserAdmin(uri, tm);
72 } catch (Exception e) {
73 throw new RuntimeException(e);
74 }
75 }
76
77 public void testEdition() throws Exception {
78 User demoUser = (User) userAdmin.getRole(DEMO_USER_DN);
79 assert demoUser != null;
80
81 tm.begin();
82 String newName = "demo";
83 demoUser.getProperties().put("cn", newName);
84 assert newName.equals(demoUser.getProperties().get("cn"));
85 tm.commit();
86 persistAndRestart();
87 assert newName.equals(demoUser.getProperties().get("cn"));
88
89 tm.begin();
90 userAdmin.removeRole(DEMO_USER_DN);
91 tm.commit();
92 persistAndRestart();
93
94 // check data
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;
101 }
102
103 public void testRetrieve() throws Exception {
104 // users
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;
109
110 // groups
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]);
116
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]);
123
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);
130
131 // properties
132 assert "root@localhost".equals(rootUser.getProperties().get("mail"));
133
134 // credentials
135 // {SHA}
136 assert rootUser.hasCredential(LdapAttrs.userPassword.name(), "demo".getBytes(StandardCharsets.UTF_8));
137 // {PBKDF2_SHA256}
138 assert demoUser.hasCredential(LdapAttrs.userPassword.name(), "demo".getBytes(StandardCharsets.UTF_8));
139
140 // search
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;
149 }
150
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();
157 out.close();
158 userAdmin.destroy();
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);
164 }
165 Role[] search = userAdmin.getRoles(null);
166 assert 4 == search.length;
167 } else {
168 // test not relevant for LDAP
169 }
170 }
171
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);
181 else
182 userAdmin = new LdifUserAdmin(props);
183 userAdmin.init();
184 // JTA
185 // if (TM_BITRONIX == tmType)
186 // EhCacheXAResourceProducer.registerXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
187 userAdmin.setTransactionControl(tm);
188 return userAdmin;
189 }
190
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();
196 userAdmin.destroy();
197 userAdmin = initUserAdmin(uri, tm);
198 }
199
200 public void tearDown() throws Exception {
201 // if (TM_BITRONIX == tmType) {
202 // EhCacheXAResourceProducer.unregisterXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
203 // ((BitronixTransactionManager) tm).shutdown();
204 // }
205 if (userAdmin != null)
206 userAdmin.destroy();
207 if (tempDir != null)
208 Files.walkFileTree(tempDir, new SimpleFileVisitor<Path>() {
209 @Override
210 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
211 Files.delete(file);
212 return FileVisitResult.CONTINUE;
213 }
214
215 @Override
216 public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
217 Files.delete(dir);
218 return FileVisitResult.CONTINUE;
219 }
220
221 });
222 }
223
224 }