| 1 package info.magnolia.module.admininterface.pages; 2 3 import info.magnolia.cms.beans.config.ContentRepository; 4 import info.magnolia.cms.core.Content; 5 import info.magnolia.cms.gui.control.Button; 6 import info.magnolia.cms.gui.control.Edit; 7 import info.magnolia.cms.gui.control.Hidden; 8 import info.magnolia.cms.gui.control.Select; 9 import info.magnolia.cms.gui.dialog.DialogBox; 10 import info.magnolia.cms.gui.dialog.DialogButton; 11 import info.magnolia.cms.gui.dialog.DialogControlImpl; 12 import info.magnolia.cms.gui.dialog.DialogFactory; 13 import info.magnolia.cms.gui.misc.CssConstants; 14 import info.magnolia.cms.i18n.Messages; 15 import info.magnolia.cms.i18n.MessagesManager; 16 import info.magnolia.cms.security.Permission; 17 import info.magnolia.cms.util.ContentUtil; 18 import info.magnolia.module.admininterface.SimplePageMVCHandler; 19 20 import java.io.IOException ; 21 import java.io.PrintWriter ; 22 import java.util.ArrayList ; 23 import java.util.Arrays ; 24 import java.util.Iterator ; 25 import java.util.List ; 26 27 import javax.jcr.RepositoryException; 28 import javax.servlet.http.HttpServletRequest ; 29 import javax.servlet.http.HttpServletResponse ; 30 31 import org.apache.commons.collections.map.ListOrderedMap; 32 import org.apache.commons.lang.StringUtils; 33 34 35 39 public class RolesACLPage extends SimplePageMVCHandler { 40 41 public static int TYPE_ALL = 3; 43 public static int TYPE_SUBS = 2; 45 public static int TYPE_THIS = 1; 47 50 private static final long serialVersionUID = 222L; 51 52 55 public static List excludedRepositories = new ArrayList (Arrays.asList(new String []{"mgnlVersion", "mgnlSystem"})); 56 57 private static final long PERMISSION_ALL = Permission.ALL; 59 60 private static final long PERMISSION_READ = Permission.READ; 61 62 private static final long PERMISSION_NO = 0; 63 64 private static final String CSS_ACL_DIV = "aclDynamicTable"; 66 public RolesACLPage(String name, HttpServletRequest request, HttpServletResponse response) { 67 super(name, request, response); 68 } 69 70 private static String getHtmlRowInner(HttpServletRequest request, String dynamicTable, String repository) { 71 boolean small = true; 72 Messages msgs = MessagesManager.getMessages(); 73 74 Select accessRight = new Select(); 75 accessRight.setSaveInfo(false); 76 accessRight.setName("'+prefix+'AccessRight"); accessRight.setCssClass("mgnlDialogControlSelect"); accessRight.setOptions(escapeJs(msgs.get("roles.permission.readWrite")), Long.toString(PERMISSION_ALL)); accessRight.setOptions(escapeJs(msgs.get("roles.permission.readOnly")), Long.toString(PERMISSION_READ)); accessRight.setOptions(escapeJs(msgs.get("roles.permission.deny")), Long.toString(PERMISSION_NO)); accessRight.setValue("' + object.accessRight + '"); 83 Select accessType = new Select(); 84 accessType.setSaveInfo(false); 85 accessType.setName("'+prefix+'AccessType"); accessType.setCssClass("mgnlDialogControlSelect"); if (repository.equals(ContentRepository.WEBSITE)) { 88 accessType.setOptions(escapeJs(msgs.get("roles.edit.thisAndSubPages")), String.valueOf(TYPE_ALL)); accessType.setOptions(escapeJs(msgs.get("roles.edit.subPages")), String.valueOf(TYPE_SUBS)); } 91 else { 92 if (repository.equals(ContentRepository.CONFIG)) { 93 accessType.setOptions(escapeJs(msgs.get("roles.edit.thisNode")), String.valueOf(TYPE_THIS)); } 95 accessType.setOptions(escapeJs(msgs.get("roles.edit.thisAndSubNodes")), String.valueOf(TYPE_ALL)); accessType.setOptions(escapeJs(msgs.get("roles.edit.subNodes")), String.valueOf(TYPE_SUBS)); } 98 accessType.setValue("' + object.accessType + '"); 100 Edit path = new Edit(); 101 path.setSaveInfo(false); 102 path.setName("'+prefix+'Path"); path.setValue("'+object.path+'"); path.setCssClass(CssConstants.CSSCLASS_EDIT); 105 path.setCssStyles("width", "100%"); 107 Button choose = new Button(); 108 choose.setLabel(escapeJs(msgs.get("buttons.choose"))); choose.setOnclick("aclChoose(\\''+prefix+'\\',\\'" + repository + "\\');"); choose.setSmall(small); 111 112 Button delete = new Button(); 113 delete.setLabel(escapeJs(msgs.get("buttons.delete"))); delete.setOnclick(dynamicTable + ".del('+index+');"); delete.setSmall(small); 116 117 StringBuffer html = new StringBuffer (); 118 html.append("<table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"><tr>"); html.append("<td width=\"1\" class=\"" + CssConstants.CSSCLASS_EDITWITHBUTTON 123 + "\">" + accessRight.getHtml() 125 + "</td>"); html.append("<td width=\"1\" class=\"mgnlDialogBoxInput\"></td>"); 128 if (!repository.equals(ContentRepository.USERS) && !repository.equals(ContentRepository.USER_ROLES)) { 129 html.append("<td width=\"1\" class=\"" + CssConstants.CSSCLASS_EDITWITHBUTTON 131 + "\">" + accessType.getHtml() 133 + "</td>"); html.append("<td width=\"1\"></td>"); } 136 else { 137 html 138 .append("<input type=\"hidden\" id=\"' + prefix + 'AccessType\" name=\"' + prefix + 'AccessType\" value=\"sub\"/>"); } 140 141 html.append("<td width=\"100%\"class=\"" + CssConstants.CSSCLASS_EDITWITHBUTTON 143 + "\">" + path.getHtml() 145 + "</td>"); html.append("<td width=\"1\"></td>"); html.append("<td width=\"1\" class=\"" + CssConstants.CSSCLASS_EDITWITHBUTTON 149 + "\">" + choose.getHtml() 151 + "</td>"); html.append("<td width=\"1\"></td>"); html.append("<td width=\"1\" class=\"" + CssConstants.CSSCLASS_EDITWITHBUTTON 155 + "\">" + delete.getHtml() 157 + "</td>"); html.append("</tr></table>"); 160 return html.toString(); 161 } 162 163 167 protected void render(HttpServletRequest request, HttpServletResponse response) throws Exception { 168 PrintWriter out = response.getWriter(); 169 Messages msgs = MessagesManager.getMessages(); 170 171 DialogControlImpl dialogControl = (DialogControlImpl) request.getAttribute("dialogObject"); Content role = dialogControl.getWebsiteNode(); 173 174 Select repositorySelect = getRepositorySelect(request); 176 177 out.print(repositorySelect.getHtml()); 178 out.print("<p><p/>"); Iterator repositoryNames = ContentRepository.getAllRepositoryNames(); 180 181 while (repositoryNames.hasNext()) { 182 String name = (String ) repositoryNames.next(); 183 if (!excludedRepositories.contains(name)) { 185 writeRepositoryTable(request, response, msgs, out, role, name); 186 } 187 } 188 189 out.println("<script type=\"text/javascript\">aclChangeRepository('website');</script>"); 192 } 193 194 201 private void writeRepositoryTable(HttpServletRequest request, HttpServletResponse response, Messages msgs, 202 PrintWriter out, Content role, String repository) throws RepositoryException, IOException { 203 String tableName = "acl" + repository + "Table"; String dynamicTableName = "acl" + repository + "DynamicTable"; String hiddenFieldName = "acl" + repository + "List"; 207 out.println("<div id=\"acl" + repository + "Div\" class=\"" + CSS_ACL_DIV + "\">"); out.println(new Hidden(hiddenFieldName, StringUtils.EMPTY, false).getHtml()); 209 210 out.println("<table id=\"" + tableName 213 + "\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" width=\"100%\"><tr><td></td></tr></table>"); 215 217 out.println("<table width=\"100%\">"); DialogButton add = DialogFactory.getDialogButtonInstance(request, response, null, null); 219 add.setBoxType(DialogBox.BOXTYPE_1COL); 220 add.setConfig("buttonLabel", msgs.get("buttons.add")); add.setConfig("onclick", dynamicTableName + ".addNew();"); add.drawHtml(out); 223 out.println("</table>"); 225 out.println("</div>"); 227 out.println("<script type=\"text/javascript\">"); out.println("aclRepositories[aclRepositories.length]= '" + repository + "';"); 231 out.println("function acl" + repository + "RenderFunction(cell, prefix, index, object)"); out.println("{"); 235 out.println("mgnlDebug('acl" + repository + "RenderFunction: prefix = ' + prefix, 'acl', object)"); 237 out.println("cell.innerHTML= '" + getHtmlRowInner(request, dynamicTableName, repository) + "';\n"); out.println("document.getElementById(prefix + 'AccessType').value = object.accessType;\n"); 240 out.println("document.getElementById(prefix + 'AccessRight').value = object.accessRight;\n"); 242 out.println("}"); 244 out.println(dynamicTableName + " = new MgnlDynamicTable('" + tableName 247 + "',document.mgnlFormMain." + hiddenFieldName 249 + ", aclGetNewPermissionObject, aclGetPermissionObject, acl" + repository 251 + "RenderFunction, null);"); 253 addExistingAclToTable(out, role, dynamicTableName, repository); 256 257 out.println("</script>"); } 259 260 264 private void addExistingAclToTable(PrintWriter out, Content role, String dynamicTableName, String repository) { 265 ACLS acls = new ACLS(); 267 268 Content aclsNode = ContentUtil.getContent(role, "acl_" + repository); if (aclsNode == null || aclsNode.getChildren().size() == 0) { 270 out.println(dynamicTableName + ".addNew();"); return; 272 } 273 274 Iterator it = aclsNode.getChildren().iterator(); 275 while (it.hasNext()) { 276 Content c = (Content) it.next(); 277 String path = c.getNodeData("path").getString(); String accessRight = c.getNodeData("permissions").getString(); acls.register(path, Integer.valueOf(accessRight).intValue()); 280 } 281 282 for (Iterator iter = acls.values().iterator(); iter.hasNext();) { 283 ACL acl = (ACL) iter.next(); 284 out.println(dynamicTableName + ".add({accessRight:" + acl.accessRight 286 + ",accessType:'" + acl.type 288 + "',path:'" + acl.path 290 + "'});"); } 292 } 293 294 298 private Select getRepositorySelect(HttpServletRequest request) { 299 Select repositorySelect = new Select(); 300 repositorySelect.setName("aclRepository"); repositorySelect.setCssClass("mgnlDialogControlSelect"); repositorySelect.setEvent("onchange", "aclChangeRepository(this.value)"); repositorySelect.setSaveInfo(false); 304 repositorySelect.setValue(ContentRepository.WEBSITE); 305 306 Iterator repositoryNames = ContentRepository.getAllRepositoryNames(); 308 while (repositoryNames.hasNext()) { 309 String name = (String ) repositoryNames.next(); 310 if (!excludedRepositories.contains(name)) { 311 String label = MessagesManager.get("repository." + name); repositorySelect.setOptions(label, name); 313 } 314 } 315 return repositorySelect; 316 } 317 318 private static String escapeJs(String value) { 319 return StringUtils.replace(value, "'", "\\'"); 320 } 321 322 327 protected class ACL { 328 329 int type = 0; 330 331 String path; 332 333 int accessRight; 334 335 void registerEntry(String path) { 336 if (path.equals("/*")) { 337 type = TYPE_ALL; 338 } 339 else if (path.endsWith("/*")) { 340 type = type | TYPE_SUBS; 341 } 342 else { 343 type = type | TYPE_THIS; 344 } 345 } 346 } 347 348 353 protected class ACLS extends ListOrderedMap { 354 355 358 private static final long serialVersionUID = 1L; 359 360 365 void register(String path, int accessRight) { 366 String cleanPath = StringUtils.removeEnd(path, "/*"); 367 if (StringUtils.isEmpty(cleanPath)) { 368 cleanPath = "/"; 369 } 370 String key = cleanPath + ":" + accessRight; 371 if (!this.containsKey(key)) { 372 ACL acl = new ACL(); 373 acl.path = cleanPath; 374 acl.accessRight = accessRight; 375 this.put(key, acl); 376 } 377 ((ACL) this.get(key)).registerEntry(path); 378 } 379 } 380 381 } | Popular Tags |