]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.enterprise/ext/test/org/argeo/osgi/useradmin/LdifUserAdminTest.java
Add www.argeo.org home page URL.
[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 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 /** {@link LdifUserAdmin} tests. */
31 public class LdifUserAdminTest extends TestCase implements BasicTestConstants {
32 // We have to keep using JUnit because of
33 // https://issues.apache.org/jira/browse/SUREFIRE-1669
34
35 final static int TM_SIMPLE = 0;
36 final static int TM_BITRONIX = 1;
37
38 private int tmType = TM_SIMPLE;
39 private TransactionManager tm;
40 private URI uri;
41 private AbstractUserDirectory userAdmin;
42 private Path tempDir;
43
44 public void setUp() {
45 System.out.println("Enter setUp()");
46 try {
47 tempDir = Files.createTempDirectory(getClass().getName());
48 tempDir.toFile().deleteOnExit();
49 String uriProp = System.getProperty("argeo.userdirectory.uri");
50 if (uriProp != null)
51 uri = new URI(uriProp);
52 else {
53 tempDir.toFile().deleteOnExit();
54 Path ldifPath = tempDir.resolve(BASE_DN + ".ldif");
55 try (InputStream in = getClass().getResource("basic.ldif").openStream()) {
56 Files.copy(in, ldifPath);
57 }
58 uri = ldifPath.toUri();
59 }
60
61 // Init transaction manager
62 if (TM_SIMPLE == tmType) {
63 tm = new SimpleTransactionManager();
64 }
65 // else if (TM_BITRONIX == tmType) {
66 // bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration();
67 // tmConf.setServerId(UUID.randomUUID().toString());
68 // tmConf.setLogPart1Filename(new File(tempDir.toFile(), "btm1.tlog").getAbsolutePath());
69 // tmConf.setLogPart2Filename(new File(tempDir.toFile(), "btm2.tlog").getAbsolutePath());
70 // tm = TransactionManagerServices.getTransactionManager();
71 // }
72
73 userAdmin = initUserAdmin(uri, tm);
74 } catch (Exception e) {
75 throw new RuntimeException(e);
76 }
77 }
78
79 public void testEdition() throws Exception {
80 User demoUser = (User) userAdmin.getRole(DEMO_USER_DN);
81 assert demoUser != null;
82
83 tm.begin();
84 String newName = "demo";
85 demoUser.getProperties().put("cn", newName);
86 assert newName.equals(demoUser.getProperties().get("cn"));
87 tm.commit();
88 persistAndRestart();
89 assert newName.equals(demoUser.getProperties().get("cn"));
90
91 tm.begin();
92 userAdmin.removeRole(DEMO_USER_DN);
93 tm.commit();
94 persistAndRestart();
95
96 // check data
97 Role[] search = userAdmin.getRoles("(objectclass=inetOrgPerson)");
98 assert 1 == search.length;
99 Group editorGroup = (Group) userAdmin.getRole(EDITORS_GROUP_DN);
100 assert editorGroup != null;
101 Role[] members = editorGroup.getMembers();
102 assert 1 == members.length;
103 }
104
105 public void testRetrieve() throws Exception {
106 // users
107 User rootUser = (User) userAdmin.getRole(ROOT_USER_DN);
108 assert rootUser != null;
109 User demoUser = (User) userAdmin.getRole(DEMO_USER_DN);
110 assert demoUser != null;
111
112 // groups
113 Group adminGroup = (Group) userAdmin.getRole(ADMIN_GROUP_DN);
114 assert adminGroup != null;
115 Role[] members = adminGroup.getMembers();
116 assert 1 == members.length;
117 assert rootUser.equals(members[0]);
118
119 Group editorGroup = (Group) userAdmin.getRole(EDITORS_GROUP_DN);
120 assert editorGroup != null;
121 members = editorGroup.getMembers();
122 assert 2 == members.length;
123 assert adminGroup.equals(members[0]);
124 assert demoUser.equals(members[1]);
125
126 Authorization rootAuth = userAdmin.getAuthorization(rootUser);
127 List<String> rootRoles = Arrays.asList(rootAuth.getRoles());
128 assert 3 == rootRoles.size();
129 assert rootRoles.contains(ROOT_USER_DN);
130 assert rootRoles.contains(ADMIN_GROUP_DN);
131 assert rootRoles.contains(EDITORS_GROUP_DN);
132
133 // properties
134 assert "root@localhost".equals(rootUser.getProperties().get("mail"));
135
136 // credentials
137 // {SHA}
138 assert rootUser.hasCredential(LdapAttrs.userPassword.name(), "demo".getBytes(StandardCharsets.UTF_8));
139 // {PBKDF2_SHA256}
140 assert demoUser.hasCredential(LdapAttrs.userPassword.name(), "demo".getBytes(StandardCharsets.UTF_8));
141
142 // search
143 Role[] search = userAdmin.getRoles(null);
144 assert 4 == search.length;
145 search = userAdmin.getRoles("(objectClass=groupOfNames)");
146 assert 2 == search.length;
147 search = userAdmin.getRoles("(objectclass=inetOrgPerson)");
148 assert 2 == search.length;
149 search = userAdmin.getRoles("(&(objectclass=inetOrgPerson)(uid=demo))");
150 assert 1 == search.length;
151 }
152
153 public void testReadWriteRead() throws Exception {
154 if (userAdmin instanceof LdifUserAdmin) {
155 Dictionary<String, Object> props = userAdmin.getProperties();
156 ByteArrayOutputStream out = new ByteArrayOutputStream();
157 ((LdifUserAdmin) userAdmin).save(out);
158 byte[] arr = out.toByteArray();
159 out.close();
160 userAdmin.destroy();
161 // String written = new String(arr);
162 // System.out.print(written);
163 try (ByteArrayInputStream in = new ByteArrayInputStream(arr)) {
164 userAdmin = new LdifUserAdmin(props);
165 ((LdifUserAdmin) userAdmin).load(in);
166 }
167 Role[] search = userAdmin.getRoles(null);
168 assert 4 == search.length;
169 } else {
170 // test not relevant for LDAP
171 }
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 public void tearDown() throws Exception {
203 // if (TM_BITRONIX == tmType) {
204 // EhCacheXAResourceProducer.unregisterXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
205 // ((BitronixTransactionManager) tm).shutdown();
206 // }
207 if (userAdmin != null)
208 userAdmin.destroy();
209 if (tempDir != null)
210 Files.walkFileTree(tempDir, new SimpleFileVisitor<Path>() {
211 @Override
212 public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
213 Files.delete(file);
214 return FileVisitResult.CONTINUE;
215 }
216
217 @Override
218 public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
219 Files.delete(dir);
220 return FileVisitResult.CONTINUE;
221 }
222
223 });
224 }
225
226 }