Changeset 320
- Timestamp:
- 04/03/06 00:22:34
- Files:
-
- trunk/calendar3/access/src/edu/rpi/cct/uwcal/access/Access.java (modified) (6 diffs)
- trunk/calendar3/access/src/edu/rpi/cct/uwcal/access/Acl.java (modified) (9 diffs)
- trunk/calendar3/access/src/edu/rpi/cct/uwcal/access/PrivilegeDefs.java (modified) (1 diff)
- trunk/calendar3/appcommon/src/org/bedework/appcommon/AccessAppUtil.java (moved) (moved from trunk/calendar3/appcommon/src/org/bedework/appcommon/AccessUtil.java) (4 diffs)
- trunk/calendar3/appcommon/src/org/bedework/appcommon/EventFormatter.java (modified) (1 diff)
- trunk/calendar3/calCore/src/org/bedework/calcore/hibernate/AccessUtil.java (modified) (4 diffs)
- trunk/calendar3/calCore/src/org/bedework/calcore/hibernate/Calendars.java (modified) (3 diffs)
- trunk/calendar3/calFacade/src/org/bedework/calfacade/BwCalendar.java (modified) (3 diffs)
- trunk/calendar3/caldav/src/edu/rpi/cct/uwcal/caldav/CaldavBWIntf.java (modified) (2 diffs)
- trunk/calendar3/caldav/src/edu/rpi/cct/uwcal/caldav/EmitAccess.java (modified) (2 diffs)
- trunk/calendar3/lib/tlds/bedework.tld (modified) (1 diff)
- trunk/calendar3/test/src/org/bedework/tests/access/AccessTest.java (modified) (4 diffs)
- trunk/calendar3/webclient/war/WEB-INF/struts-config.xml (modified) (5 diffs)
- trunk/calendar3/webclient/war/docs/calendar/emitCalendar.jsp (modified) (1 diff)
- trunk/calendar3/webclient/war/docs/calendar/emitPublicCalendars.jsp (added)
- trunk/calendar3/webclient/war/docs/subs/subscriptions.jsp (modified) (3 diffs)
- trunk/calendar3/webcommon/build.xml (modified) (1 diff)
- trunk/calendar3/webcommon/src/org/bedework/webcommon/taglib/EmitCurrentPrivsTag.java (added)
- trunk/calendar3/webcommon/src/org/bedework/webcommon/taglib/EmitTextTag.java (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/calendar3/access/src/edu/rpi/cct/uwcal/access/Access.java
r314 r320 55 55 56 56 import java.io.Serializable; 57 58 import edu.rpi.cct.uwcal.access.Acl.CurrentAccess; 57 59 58 60 /** Class to handle access control. Because we may be evaluating access … … 184 186 * @param how Privilege set definign desired access 185 187 * @param aclString String defining current acls for object 186 * @return booleanallowed/disallowed187 * @throws AccessException 188 */ 189 public booleanevaluateAccess(AccessPrincipal who, String owner,190 Privilege[] how, String aclString)188 * @return CurrentAccess access + allowed/disallowed 189 * @throws AccessException 190 */ 191 public CurrentAccess evaluateAccess(AccessPrincipal who, String owner, 192 Privilege[] how, String aclString) 191 193 throws AccessException { 192 194 return new Acl(debug).evaluateAccess(who, owner, how, aclString.toCharArray()); … … 199 201 * @param how Privilege set defining desired access 200 202 * @param aclChars char[] defining current acls for object 201 * @return booleanallowed/disallowed202 * @throws AccessException 203 */ 204 public booleanevaluateAccess(AccessPrincipal who, String owner,205 Privilege[] how, char[] aclChars)203 * @return CurrentAccess access + allowed/disallowed 204 * @throws AccessException 205 */ 206 public CurrentAccess evaluateAccess(AccessPrincipal who, String owner, 207 Privilege[] how, char[] aclChars) 206 208 throws AccessException { 207 209 return new Acl(debug).evaluateAccess(who, owner, how, aclChars); … … 213 215 * @param owner String owner of object 214 216 * @param aclChars char[] defining current acls for object 215 * @return booleanallowed/disallowed216 * @throws AccessException 217 */ 218 public booleancheckRead(AccessPrincipal who, String owner,219 char[] aclChars)217 * @return CurrentAccess access + allowed/disallowed 218 * @throws AccessException 219 */ 220 public CurrentAccess checkRead(AccessPrincipal who, String owner, 221 char[] aclChars) 220 222 throws AccessException { 221 223 return new Acl(debug).evaluateAccess(who, owner, privSetRead, aclChars); … … 227 229 * @param owner String owner of object 228 230 * @param aclChars char[] defining current acls for object 229 * @return booleanallowed/disallowed230 * @throws AccessException 231 */ 232 public booleancheckReadWrite(AccessPrincipal who, String owner,233 char[] aclChars)231 * @return CurrentAccess access + allowed/disallowed 232 * @throws AccessException 233 */ 234 public CurrentAccess checkReadWrite(AccessPrincipal who, String owner, 235 char[] aclChars) 234 236 throws AccessException { 235 237 return new Acl(debug).evaluateAccess(who, owner, privSetReadWrite, aclChars); … … 242 244 * @param priv int desired access as defined above 243 245 * @param aclChars char[] defining current acls for object 244 * @return booleanallowed/disallowed245 * @throws AccessException 246 */ 247 public booleanevaluateAccess(AccessPrincipal who, String owner,248 int priv, char[] aclChars)246 * @return CurrentAccess access + allowed/disallowed 247 * @throws AccessException 248 */ 249 public CurrentAccess evaluateAccess(AccessPrincipal who, String owner, 250 int priv, char[] aclChars) 249 251 throws AccessException { 250 252 return new Acl(debug).evaluateAccess(who, owner, trunk/calendar3/access/src/edu/rpi/cct/uwcal/access/Acl.java
r314 r320 119 119 aces = null; 120 120 } 121 122 /** Result of evaluating access to an object for a principal 123 */ 124 public static class CurrentAccess { 125 /** Allowed access for each privilege type 126 * @see PrivilegeDefs 127 */ 128 public char[] privileges = null; 129 130 /** Privileges desired */ 131 public Privilege[] desiredAccess; 132 133 /** Was it succesful */ 134 public boolean accessAllowed; 135 } 121 136 122 137 /** Evaluating an ACL … … 152 167 * @param how 153 168 * @param acl 154 * @return boolean true for accessallowed155 * @throws AccessException 156 */ 157 public synchronized booleanevaluateAccess(AccessPrincipal who, String owner,158 Privilege[] how, char[] acl)169 * @return CurrentAccess access + allowed/disallowed 170 * @throws AccessException 171 */ 172 public CurrentAccess evaluateAccess(AccessPrincipal who, String owner, 173 Privilege[] how, char[] acl) 159 174 throws AccessException { 160 175 boolean authenticated = !who.getUnauthenticated(); 161 176 boolean isOwner = false; 162 char[] privileges = null; 177 CurrentAccess ca = new CurrentAccess(); 178 ca.desiredAccess = how; 163 179 164 180 setEncoded(acl); … … 182 198 if (!authenticated) { 183 199 if (ace.decode(this, false, null, Ace.whoTypeUnauthenticated)) { 184 privileges = ace.getHow();200 ca.privileges = ace.getHow(); 185 201 } 186 202 … … 190 206 if (isOwner) { 191 207 if (ace.decode(this, false, null, Ace.whoTypeOwner)) { 192 privileges = ace.getHow();208 ca.privileges = ace.getHow(); 193 209 } else { 194 privileges = defaultOwnerPrivileges;210 ca.privileges = defaultOwnerPrivileges; 195 211 } 196 212 … … 200 216 // Not owner - look for user 201 217 if (ace.decode(this, false, who.getAccount(), Ace.whoTypeUser)) { 202 privileges = ace.getHow();218 ca.privileges = ace.getHow(); 203 219 if (debug) { 204 debugsb.append("... For user got: " + new String( privileges));220 debugsb.append("... For user got: " + new String(ca.privileges)); 205 221 } 206 222 … … 219 235 } 220 236 if (ace.decode(this, false, group, Ace.whoTypeGroup)) { 221 privileges = mergePrivileges(privileges, ace.getHow());237 ca.privileges = mergePrivileges(ca.privileges, ace.getHow()); 222 238 } 223 239 } 224 240 } 225 241 226 if ( privileges != null) {242 if (ca.privileges != null) { 227 243 if (debug) { 228 debugsb.append("...For groups got: " + new String( privileges));244 debugsb.append("...For groups got: " + new String(ca.privileges)); 229 245 } 230 246 … … 234 250 // "other" access set? 235 251 if (ace.decode(this, false, null, Ace.whoTypeOther)) { 236 privileges = ace.getHow();252 ca.privileges = ace.getHow(); 237 253 238 254 if (debug) { 239 debugsb.append("...For other got: " + new String( privileges));255 debugsb.append("...For other got: " + new String(ca.privileges)); 240 256 } 241 257 … … 244 260 } // getPrivileges 245 261 246 if ( privileges == null) {262 if (ca.privileges == null) { 247 263 if (debug) { 248 264 debugMsg(debugsb.toString() + "...Check access denied (noprivs)"); 249 265 } 250 return false; 251 } 252 266 return ca; 267 } 268 269 ca.privileges = (char[])ca.privileges.clone(); 270 for (int pi = 0; pi < ca.privileges.length; pi++) { 271 if (ca.privileges[pi] == unspecified) { 272 if (isOwner) { 273 ca.privileges[pi] = allowed; 274 } else { 275 ca.privileges[pi] = denied; 276 } 277 } 278 } 279 253 280 for (int i = 0; i < how.length; i++) { 254 char priv = privileges[how[i].getIndex()]; 255 if (priv == unspecified) { 256 if (isOwner) { 257 priv = allowed; 258 } else { 259 priv = denied; 260 } 261 } 281 char priv = ca.privileges[how[i].getIndex()]; 282 262 283 if (priv != allowed) { 263 284 if (debug) { 264 285 debugMsg(debugsb.toString() + "...Check access denied (!allowed)"); 265 286 } 266 return false;287 return ca; 267 288 } 268 289 } … … 272 293 } 273 294 274 return true; 295 ca.accessAllowed = true; 296 return ca; 275 297 } 276 298 trunk/calendar3/access/src/edu/rpi/cct/uwcal/access/PrivilegeDefs.java
r2 r320 76 76 public static final char unspecified = '1'; 77 77 78 // ENUM 78 79 /** Define a privilege type index 79 80 */ trunk/calendar3/appcommon/src/org/bedework/appcommon/AccessAppUtil.java
r318 r320 61 61 import edu.rpi.cct.uwcal.access.Acl; 62 62 import edu.rpi.cct.uwcal.access.Privilege; 63 import edu.rpi.cct.uwcal.access.PrivilegeDefs; 63 64 import edu.rpi.cct.uwcal.access.Privileges; 64 65 import edu.rpi.sss.util.xml.QName; … … 75 76 * @author Mike Douglass douglm @ rpi.edu 76 77 */ 77 public class Access Util implements Serializable {78 public class AccessAppUtil implements Serializable { 78 79 public static final QName[] privTags = { 79 80 WebdavTags.all, // privAll = 0; … … 98 99 * @param xml 99 100 */ 100 public Access Util(XmlEmit xml) {101 public AccessAppUtil(XmlEmit xml) { 101 102 this.xml = xml; 102 103 } 103 104 104 public static String getXml String(Acl acl) throws CalFacadeException {105 public static String getXmlAclString(Acl acl) throws CalFacadeException { 105 106 try { 106 107 XmlEmit xml = new XmlEmit(true); // no headers 107 108 StringWriter su = new StringWriter(); 108 109 xml.startEmit(su); 109 Access Util au = new AccessUtil(xml);110 AccessAppUtil au = new AccessAppUtil(xml); 110 111 111 112 au.emitAcl(acl); … … 197 198 } 198 199 } 200 201 /** Produce an xml representation of current user privileges from an array 202 * of allowed/disallowed/unspecified flags indexed by a privilege index. 203 * 204 * @param privs char[] of allowed/disallowed 205 * @throws CalFacadeException 206 */ 207 public void emitCurrentPrivSet(char[] privileges) throws CalFacadeException { 208 try { 209 xml.openTag(WebdavTags.currentUserPrivilegeSet); 210 211 for (int pi = 0; pi < privileges.length; pi++) { 212 if (privileges[pi] == PrivilegeDefs.allowed) { 213 // XXX further work - don't emit abstract privs or contained privs. 214 QName pr = privTags[pi]; 215 216 if (pr != null) { 217 xml.propertyTagVal(WebdavTags.privilege, pr); 218 } 219 } 220 } 221 222 xml.closeTag(WebdavTags.currentUserPrivilegeSet); 223 } catch (Throwable t) { 224 throw new CalFacadeException(t); 225 } 226 } 227 228 /** Produce an xml representation of current user privileges from an array 229 * of allowed/disallowed/unspecified flags indexed by a privilege index, 230 * returning the representation a a String 231 * 232 * @param privs char[] of allowed/disallowed 233 * @return String xml 234 * @throws CalFacadeException 235 */ 236 public static String getCurrentPrivSetString(char[] privileges) 237 throws CalFacadeException { 238 try { 239 XmlEmit xml = new XmlEmit(true); // no headers 240 StringWriter su = new StringWriter(); 241 xml.startEmit(su); 242 AccessAppUtil au = new AccessAppUtil(xml); 243 244 au.emitCurrentPrivSet(privileges); 245 246 su.close(); 247 248 return su.toString(); 249 } catch (CalFacadeException cfe) { 250 throw cfe; 251 } catch (Throwable t) { 252 throw new CalFacadeException(t); 253 } 254 } 255 256 /* ==================================================================== 257 * Private methods 258 * ==================================================================== */ 199 259 200 260 private void emitSupportedPriv(Privilege priv) throws Throwable { trunk/calendar3/appcommon/src/org/bedework/appcommon/EventFormatter.java
r314 r320 211 211 if (xmlAccess == null) { 212 212 Acl acl = svci.getAcl(getEvent()); 213 xmlAccess = Access Util.getXmlString(acl);213 xmlAccess = AccessAppUtil.getXmlAclString(acl); 214 214 } 215 215 } catch (Throwable t) { trunk/calendar3/calCore/src/org/bedework/calcore/hibernate/AccessUtil.java
r314 r320 58 58 import edu.rpi.cct.uwcal.access.Acl; 59 59 import edu.rpi.cct.uwcal.access.PrivilegeDefs; 60 import edu.rpi.cct.uwcal.access.Acl.CurrentAccess; 60 61 61 62 import org.bedework.calfacade.base.BwShareableContainedDbentity; … … 236 237 boolean accessible(BwShareableDbentity ent, int desiredAccess, 237 238 boolean nullForNoAccess) throws CalFacadeException { 239 return checkAccess(ent, desiredAccess, nullForNoAccess).accessAllowed; 240 } 241 242 /* Check access for the given entity. Returns the current access 243 */ 244 CurrentAccess checkAccess(BwShareableDbentity ent, int desiredAccess, 245 boolean nullForNoAccess) throws CalFacadeException { 238 246 if (ent == null) { 239 return false;247 return new CurrentAccess(); 240 248 } 241 249 242 250 if ((authUser != null) && superUser) { 243 251 // Nobody can stop us - BWAAA HAA HAA 244 return true; 252 CurrentAccess ca = new CurrentAccess(); 253 ca.accessAllowed = true; 254 255 return ca; 245 256 } 246 257 … … 254 265 char[] aclChars = getAclChars((BwShareableDbentity)ent); 255 266 256 if (checkAccess(aclChars, ent.getOwner(), desiredAccess, 257 nullForNoAccess)) { 258 return true; 259 } 260 261 return false; 267 return checkAccess(aclChars, ent.getOwner(), desiredAccess, 268 nullForNoAccess); 262 269 } 263 270 … … 310 317 * @param returnResult if true we return false for no access else throw 311 318 * an exception 312 */ 313 private boolean checkAccess(char[] aclChars, BwUser owner, int desiredAccess, 319 * @return CurrentAccess access + allowed/disallowed 320 */ 321 private CurrentAccess checkAccess(char[] aclChars, BwUser owner, int desiredAccess, 314 322 boolean returnResult) throws CalFacadeException { 315 323 316 boolean allowed; 317 318 try { 324 try { 325 CurrentAccess ca; 319 326 if (desiredAccess == privRead) { 320 allowed = access.checkRead(authUser, owner.getAccount(), 327 ca = access.checkRead(authUser, owner.getAccount(), 328 aclChars); 329 } else if (desiredAccess == privWrite) { 330 ca = access.checkReadWrite(authUser, owner.getAccount(), 321 331 aclChars); 322 } else if (desiredAccess == privWrite) {323 allowed = access.checkReadWrite(authUser, owner.getAccount(),324 aclChars);325 332 } else { 326 333 /* Do it the awkward way */ 327 allowed = access.evaluateAccess(authUser, owner.getAccount(), 328 desiredAccess, aclChars); 329 } 330 331 if (!allowed) { 332 if (returnResult) { 333 return false; 334 } 334 ca = access.evaluateAccess(authUser, owner.getAccount(), 335 desiredAccess, aclChars); 336 } 337 338 if (!ca.accessAllowed && !returnResult) { 335 339 throw new CalFacadeAccessException(); 336 340 } 337 341 338 return true;342 return ca; 339 343 } catch (CalFacadeException cfe) { 340 344 throw cfe; trunk/calendar3/calCore/src/org/bedework/calcore/hibernate/Calendars.java
r301 r320 60 60 import org.bedework.calfacade.CalFacadeException; 61 61 62 import edu.rpi.cct.uwcal.access.Acl.CurrentAccess; 63 62 64 import java.util.Collection; 63 65 import java.util.Iterator; … … 421 423 private BwCalendar cloneAndCheckOne(BwCalendar subroot, int desiredAccess, 422 424 boolean nullForNoAccess) throws CalFacadeException { 423 if (!access.accessible(subroot, desiredAccess, nullForNoAccess)) { 425 CurrentAccess ca = access.checkAccess(subroot, desiredAccess, 426 nullForNoAccess); 427 428 if (!ca.accessAllowed) { 424 429 return null; 425 430 } … … 428 433 // XXX Temp fix - add id to the clone 429 434 cal.setId(subroot.getId()); 435 436 cal.setCurrentAccess(ca); 430 437 431 438 Iterator it = subroot.iterateChildren(); trunk/calendar3/calFacade/src/org/bedework/calfacade/BwCalendar.java
r249 r320 56 56 import org.bedework.calfacade.base.BwShareableContainedDbentity; 57 57 58 import edu.rpi.cct.uwcal.access.Acl.CurrentAccess; 59 58 60 import java.net.URLEncoder; 59 61 import java.util.Collection; … … 100 102 /** The children of this calendar */ 101 103 private Collection children; 104 105 /* This field must only be used for cloned copies of an entity as it is 106 * specific to a current thread. 107 */ 108 private CurrentAccess currentAccess; 102 109 103 110 /** Constructor … … 264 271 265 272 /* ==================================================================== 273 * Transient object methods 274 * ==================================================================== */ 275 276 public void setCurrentAccess(CurrentAccess val) { 277 currentAccess = val; 278 } 279 280 public CurrentAccess getCurrentAccess() { 281 return currentAccess; 282 } 283 284 /* ==================================================================== 266 285 * Convenience methods 267 286 * ==================================================================== */ trunk/calendar3/caldav/src/edu/rpi/cct/uwcal/caldav/CaldavBWIntf.java
r314 r320 54 54 package edu.rpi.cct.uwcal.caldav; 55 55 56 import org.bedework.appcommon.Access Util;56 import org.bedework.appcommon.AccessAppUtil; 57 57 import org.bedework.calfacade.BwCalendar; 58 58 import org.bedework.calfacade.BwEvent; … … 782 782 findPriv: { 783 783 // ENUM 784 for (priv = 0; priv < Access Util.privTags.length; priv++) {785 if (MethodBase.nodeMatches(el, Access Util.privTags[priv])) {784 for (priv = 0; priv < AccessAppUtil.privTags.length; priv++) { 785 if (MethodBase.nodeMatches(el, AccessAppUtil.privTags[priv])) { 786 786 break findPriv; 787 787 } trunk/calendar3/caldav/src/edu/rpi/cct/uwcal/caldav/EmitAccess.java
r310 r320 54 54 package edu.rpi.cct.uwcal.caldav; 55 55 56 import org.bedework.appcommon.Access Util;56 import org.bedework.appcommon.AccessAppUtil; 57 57 import edu.rpi.sss.util.xml.XmlEmit; 58 58 … … 61 61 * 62 62 */ 63 public class EmitAccess extends Access Util {63 public class EmitAccess extends AccessAppUtil { 64 64 private String namespacePrefix; 65 65 trunk/calendar3/lib/tlds/bedework.tld
r312 r320 53 53 </attribute> 54 54 </tag> 55 56 <tag> 57 <name>emitCurrentPrivs</name> 58 <tagclass>org.bedework.webcommon.taglib.EmitCurrentPrivsTag</tagclass> 59 <bodycontent>empty</bodycontent> 60 <info>Emit txt in a tag</info> 61 62 <attribute> 63 <name>name</name> 64 <required>true</required> 65 <rtexprvalue>false</rtexprvalue> 66 </attribute> 67 68 <attribute> 69 <name>property</name> 70 <required>false</required> 71 <rtexprvalue>false</rtexprvalue> 72 </attribute> 73 74 <attribute> 75 <name>scope</name> 76 <required>false</required> 77 <rtexprvalue>false</rtexprvalue> 78 </attribute> 79 80 <attribute> 81 <name>tagName</name> 82 <required>false</required> 83 <rtexprvalue>false</rtexprvalue> 84 </attribute> 85 </tag> 55 86 </taglib> 56 87 trunk/calendar3/test/src/org/bedework/tests/access/AccessTest.java
r314 r320 63 63 import edu.rpi.cct.uwcal.access.Privilege; 64 64 import edu.rpi.cct.uwcal.access.Privileges; 65 import edu.rpi.cct.uwcal.access.Acl.CurrentAccess; 65 66 66 67 import junit.framework.TestCase; … … 73 74 public class AccessTest extends TestCase { 74 75 boolean debug = true; 75 76 Acl acl = new Acl(debug);77 76 78 77 /** … … 100 99 101 100 /* See what we get when we encode a null - that's default - acl. */ 101 102 Acl acl = new Acl(debug); 102 103 103 104 char[] encoded = logEncoded(acl, "default encoded"); … … 154 155 Privilege[] how,char[] encoded, 155 156 boolean expected, String title) throws Throwable { 156 boolean allowed = acl.evaluateAccess(who, owner.getAccount(), how, encoded);157 CurrentAccess ca = new Acl().evaluateAccess(who, owner.getAccount(), how, encoded); 157 158 158 159 if (debug) { 159 log(title + " got " + allowed + " and expected " + expected);160 log(title + " got " + ca.accessAllowed + " and expected " + expected); 160 161 } 161 assertEquals(title, expected, allowed);162 assertEquals(title, expected, ca.accessAllowed); 162 163 } 163 164 trunk/calendar3/webclient/war/WEB-INF/struts-config.xml
r319 r320 434 434 <action path="/subs/fetch" 435 435 type="org.bedework.webcommon.subs.GetSubscriptionsAction" 436 name=" peForm"436 name="calForm" 437 437 scope="session" 438 438 validate="false"> … … 442 442 <action path="/subs/fetchForUpdate" 443 443 type="org.bedework.webcommon.subs.FetchSubscriptionAction" 444 name=" peForm"444 name="calForm" 445 445 scope="session" 446 446 validate="false"> … … 451 451 <action path="/subs/initAdd" 452 452 type="org.bedework.webcommon.subs.InitSubscribeAction" 453 name=" peForm"453 name="calForm" 454 454 scope="session" 455 455 validate="false"> … … 461 461 <action path="/subs/subscribe" 462 462 type="org.bedework.webcommon.subs.SubscribeAction" 463 name=" peForm"463 name="calForm" 464 464 scope="session" 465 465 validate="false"> … … 472 472 <action path="/subs/unsubscribe" 473 473 type="org.bedework.webcommon.subs.UnsubscribeAction" 474 name=" peForm"474 name="calForm" 475 475 scope="session" 476 476 validate="false"> trunk/calendar3/webclient/war/docs/calendar/emitCalendar.jsp
r319 r320 1 1 <%@ taglib uri='struts-bean' prefix='bean' %> 2 2 <%@ taglib uri='struts-logic' prefix='logic' %> 3 <%@ taglib uri='bedework' prefix='bw' %> 3 4 4 5 <calendar> 5 6 <id><bean:write name="calendar" property="id" /></id> 6 < name><bean:write name="calendar" property="name" /></name>7 < path><bean:write name="calendar" property="path" /></path>8 < desc><bean:write name="calendar" property="description" /></desc>7 <bw:emitText name="calendar" property="name" /> 8 <bw:emitText name="calendar" property="path" /> 9 <bw:emitText name="calendar" property="description" tagName="desc" /> 9 10 <calendarCollection><bean:write name="calendar" property="calendarCollection" /></calendarCollection> 10 <mailListId><bean:write name="calendar" property="mailListId" /></mailListId> 11 <bw:emitText name="calendar" property="mailListId" /> 12 <bw:emitCurrentPrivs name="calendar" property="currentAccess" /> 11 13 12 14 <logic:iterate name="calendar" property="children" id="cal"> trunk/calendar3/webclient/war/docs/subs/subscriptions.jsp
r319 r320 1 1 <%@ taglib uri='struts-bean' prefix='bean' %> 2 2 <%@ taglib uri='struts-logic' prefix='logic' %> 3 <%@ taglib uri='bedework' prefix='bw' %> 3 4 4 5 <%@include file="/docs/header.jsp"%> 6 7 <% 8 try { 9 %> 5 10 6 11 <page>subscriptions</page> … … 9 14 <logic:iterate name="calForm" property="subscriptions" id="subscription"> 10 15 <subscription> 11 < name><bean:write name="subscription" property="name" /></name>12 < uri><bean:write name="subscription" property="uri" /></uri>16 <bw:emitText name="subscription" property="name" /> 17 <bw:emitText name="subscription" property="uri" /> 13 18 <affectsFreeBusy><bean:write name="subscription" property="affectsFreeBusy" /></affectsFreeBusy> 14 19 <display><bean:write name="subscription" property="display" /></display> 15 < style><bean:write name="subscription" property="style" /></style>20 <bw:emitText name="subscription" property="style" /> 16 21 <internal><bean:write name="subscription" property="internalSubscription" /></internal> 17 22 <emailNotifications><bean:write name="subscription" property="emailNotifications" /></emailNotifications> … … 23 28 <subscribe> 24 29 <!-- List of calendars to subscribe to--> 25 <%@include file="/docs/calendar/emit Calendars.jsp"%>30 <%@include file="/docs/calendar/emitPublicCalendars.jsp"%> 26 31 </subscribe> 27 32 </subscriptions> 28 33 34 <% 35 } catch (Throwable t) { 36 t.printStackTrace(); 37 } 38 %> 39 29 40 30 41 <%@include file="/docs/footer.jsp"%> trunk/calendar3/webcommon/build.xml
r312 r320 36 36 <pathelement location="${ical4j.jar}"/> 37 37 38 <pathelement location="${org.bedework.access.jar}"/> 38 39 <pathelement location="${org.bedework.common.jar}"/> 39 40 <pathelement location="${org.bedework.calenv.jar}"/> trunk/calendar3/webcommon/src/org/bedework/webcommon/taglib/EmitTextTag.java
r312 r320 93 93 public int doEndTag() throws JspTagException { 94 94 try { 95 /* Try to retrieve the path from category */96 97 95 /* Try to retrieve the value */ 98 96 String val = getString(false);
