1 package org.melati.poem.test;
2
3 import java.util.Enumeration;
4
5 import org.melati.poem.AccessToken;
6 import org.melati.poem.CachedCount;
7 import org.melati.poem.Capability;
8 import org.melati.poem.DeletionIntegrityPoemException;
9 import org.melati.poem.Field;
10 import org.melati.poem.Group;
11 import org.melati.poem.GroupCapability;
12 import org.melati.poem.GroupMembership;
13 import org.melati.poem.NonRootSetAccessTokenPoemException;
14 import org.melati.poem.Persistent;
15 import org.melati.poem.PoemThread;
16 import org.melati.poem.ReadPersistentAccessPoemException;
17 import org.melati.poem.test.User;
18 import org.melati.poem.util.StringUtils;
19
20
21
22
23
24
25 public class ProtectedPersistentTest extends PersistentTest {
26
27 public ProtectedPersistentTest(String name) {
28 super(name);
29 }
30
31 protected void setUp() throws Exception {
32 super.setUp();
33 }
34
35 protected void tearDown() throws Exception {
36 super.tearDown();
37 }
38
39 protected void databaseUnchanged() {
40 deleteUser("moneypenny");
41 deleteUser("smiley");
42 deleteUser("bond");
43 deleteGroup("officeWorkers");
44 deleteGroup("spyMasters");
45 deleteCapability("monitor");
46 deleteCapability("commission");
47 getDb().getUserTable().getTableInfo().setDefaultcanread(null);
48 super.databaseUnchanged();
49 }
50 private void deleteCapability(String name) {
51 Capability c = (Capability)getDb().getCapabilityTable().getNameColumn().firstWhereEq(name);
52
53 if (c != null) {
54 System.err.println("Cleaning up: " + c);
55 c.delete();
56 } else {
57 System.err.println("Nothing to clean up");
58 }
59 }
60
61 private void deleteUser(String name) {
62 User u = (User)getDb().getUserTable().getLoginColumn().firstWhereEq(name);
63 if (u != null) {
64 System.err.println("Cleaning up: " + u);
65 u.delete();
66 } else
67 System.err.println("Nothing to clean up");
68 }
69 private void deleteGroup(String group) {
70 Group g = (Group)getDb().getGroupTable().getNameColumn().firstWhereEq(group);
71 if (g != null) {
72 System.err.println("Cleaning up: " + g);
73 Enumeration<Persistent> gcs = getDb().getGroupCapabilityTable().getGroupColumn().selectionWhereEq(g.getTroid());
74 while(gcs.hasMoreElements()) {
75 GroupCapability gc = (GroupCapability)gcs.nextElement();
76 System.err.println("Cleaning up: " + gc);
77 gc.delete();
78 }
79 Enumeration<Persistent> gms = getDb().getGroupMembershipTable().getGroupColumn().
80 selectionWhereEq(g.getTroid());
81 while (gms.hasMoreElements()) {
82 GroupMembership gm = (GroupMembership)gms.nextElement();
83 System.err.println("Cleaning up: " + gm);
84 gm.delete();
85 }
86 try {
87 g.delete();
88 } catch (DeletionIntegrityPoemException e) {
89 Enumeration<Persistent> refs = e.references;
90 while (refs.hasMoreElements()) {
91 Object o = refs.nextElement();
92 System.err.println("Failed to delete " + g + " due to " +o);
93 }
94 }
95 }
96
97 }
98
99
100
101
102
103 public void testDelete() {
104 if (!getDb().getDbms().canDropColumns()) {
105 return;
106 }
107 super.testDelete();
108 }
109
110
111
112
113
114 public void testDeleteAndCommit() {
115 if (!getDb().getDbms().canDropColumns()) {
116 return;
117 }
118 super.testDeleteAndCommit();
119 }
120
121
122
123
124 public void testAssertCanReadAccessToken() {
125 Persistent admin = getDb().getUserTable().administratorUser();
126 AccessToken guest = getDb().getUserTable().guestUser();
127 if (admin.getTable().getTableInfo().getDefaultcanread() == null)
128 admin.assertCanRead(guest);
129 admin.getTable().getTableInfo().setDefaultcanread(getDb().getCanAdminister());
130 try {
131 admin.assertCanRead(guest);
132 System.err.println("WTF:" + guest.givesCapability(getDb().administerCapability()));
133 fail("Should have bombed");
134 } catch (ReadPersistentAccessPoemException e) {
135 e = null;
136 }
137 AccessToken a = getDb().getUserTable().administratorUser();
138 admin.assertCanRead(a);
139 admin.getTable().getTableInfo().setDefaultcanread(null);
140 }
141
142
143
144
145 public void testAssertCanRead() {
146 Persistent p = getDb().getUserTable().administratorUser();
147 p.assertCanRead();
148 p.getTable().getTableInfo().setDefaultcanread(getDb().getCanAdminister());
149 AccessToken g = getDb().getUserTable().guestUser();
150 PoemThread.setAccessToken(g);
151 try {
152 p.assertCanRead();
153 fail("Should have bombed");
154 } catch (ReadPersistentAccessPoemException e) {
155 e = null;
156 }
157 AccessToken a = getDb().getUserTable().administratorUser();
158 try {
159 PoemThread.setAccessToken(a);
160 fail("Should have bombed");
161 } catch (NonRootSetAccessTokenPoemException e) {
162 e = null;
163 }
164
165
166 }
167
168
169
170
171 public void testGetReadable() {
172 Persistent p = getDb().getUserTable().administratorUser();
173 assertTrue(p.getReadable());
174 p.getTable().getTableInfo().setDefaultcanread(getDb().getCanAdminister());
175 AccessToken g = getDb().getUserTable().guestUser();
176 PoemThread.setAccessToken(g);
177 assertFalse(p.getReadable());
178
179
180 }
181
182
183
184
185 public void testGetPrimaryDisplayField() {
186 Persistent p = getDb().getGroupMembershipTable().getObject(0);
187 Field<?> f = p.getPrimaryDisplayField();
188 assertEquals("id: 0", f.toString());
189 }
190
191
192
193
194
195 public void testCachedCountStringBooleanBoolean() {
196 EverythingDatabase db = (EverythingDatabase)getDb();
197 Capability commission = db.getCapabilityTable().ensure("commission");
198 Capability monitor = db.getCapabilityTable().ensure("monitor");
199
200 User spy = ensureUser("bond");
201 User smiley = ensureUser("smiley");
202 User moneypenny = ensureUser("moneypenny");
203
204 Protected spyMission = (Protected)db.getProtectedTable().newPersistent();
205 spyMission.setCanRead(monitor);
206 spyMission.setCanSelect(monitor);
207 spyMission.setCanWrite(monitor);
208 spyMission.setCanDelete(commission);
209 spyMission.setSpy(spy);
210 spyMission.setMission("impossible");
211 spyMission.setDeleted(false);
212 spyMission.makePersistent();
213
214 Group officeWorkers = db.getGroupTable().ensure("officeWorkers");
215 GroupMembership inOfficeWorkersMoneyPenny = (GroupMembership)db.getGroupMembershipTable().newPersistent();
216 inOfficeWorkersMoneyPenny.setGroup(officeWorkers);
217 inOfficeWorkersMoneyPenny.setUser(moneypenny);
218 inOfficeWorkersMoneyPenny.makePersistent();
219
220
221 Group spyMasters = db.getGroupTable().ensure("spyMasters");
222 GroupMembership inSpyMastersSmiley = (GroupMembership)db.getGroupMembershipTable().newPersistent();
223 inSpyMastersSmiley.setGroup(spyMasters);
224 inSpyMastersSmiley.setUser(smiley);
225 inSpyMastersSmiley.makePersistent();
226
227 db.getGroupCapabilityTable().ensure(spyMasters, commission);
228 db.getGroupCapabilityTable().ensure(spyMasters, monitor);
229
230 PoemThread.setAccessToken(smiley);
231 spyMission.assertCanRead();
232 String query = db.getProtectedTable().getMissionColumn().fullQuotedName() + "='impossible'";
233 CachedCount cached = db.getProtectedTable().
234 cachedCount(query,false,true);
235 assertEquals(1, cached.count());
236
237 spyMission.delete();
238
239
240
241 }
242
243 private User ensureUser(String name) {
244 User u = (User)((EverythingDatabase)getDb()).getUserTable().newPersistent();
245 u.setLogin(name);
246 u.setName(StringUtils.capitalised(name));
247 u.setPassword(name);
248 u.makePersistent();
249 return u;
250 }
251 }