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