diff --git a/webapp/rdf/auth/everytime/permission_config.n3 b/webapp/rdf/auth/everytime/permission_config.n3 index 13bf22021..9b61615f2 100644 --- a/webapp/rdf/auth/everytime/permission_config.n3 +++ b/webapp/rdf/auth/everytime/permission_config.n3 @@ -23,6 +23,7 @@ auth:ADMIN auth:hasPermission simplePermission:UseAdvancedDataToolsPages ; auth:hasPermission simplePermission:UseMiscellaneousAdminPages ; auth:hasPermission simplePermission:UseSparqlQueryPage ; + auth:hasPermission simplePermission:PageViewableAdmin ; # permissions for CURATOR and above. auth:hasPermission simplePermission:EditOntology ; @@ -31,6 +32,7 @@ auth:ADMIN auth:hasPermission simplePermission:ManageTabs ; auth:hasPermission simplePermission:SeeVerbosePropertyInformation ; auth:hasPermission simplePermission:UseMiscellaneousCuratorPages ; + auth:hasPermission simplePermission:PageViewableCurator ; # permissions for EDITOR and above. auth:hasPermission simplePermission:DoBackEndEditing ; @@ -38,6 +40,7 @@ auth:ADMIN auth:hasPermission simplePermission:SeeRevisionInfo ; auth:hasPermission simplePermission:SeeSiteAdminPage ; auth:hasPermission simplePermission:UseMiscellaneousEditorPages ; + auth:hasPermission simplePermission:PageViewableEditor ; # permissions for ANY logged-in user. auth:hasPermission simplePermission:DoFrontEndEditing ; @@ -46,9 +49,11 @@ auth:ADMIN auth:hasPermission simplePermission:QueryUserAccountsModel ; auth:hasPermission simplePermission:UseBasicAjaxControllers ; auth:hasPermission simplePermission:UseMiscellaneousPages ; + auth:hasPermission simplePermission:PageViewableLoggedIn ; # permissions for ANY user, even if they are not logged in. auth:hasPermission simplePermission:QueryFullModel ; + auth:hasPermission simplePermission:PageViewablePublic ; # role-based permissions for ADMIN auth:hasPermission displayByRole:Admin ; @@ -66,6 +71,7 @@ auth:CURATOR auth:hasPermission simplePermission:ManageTabs ; auth:hasPermission simplePermission:SeeVerbosePropertyInformation ; auth:hasPermission simplePermission:UseMiscellaneousCuratorPages ; + auth:hasPermission simplePermission:PageViewableCurator ; # permissions for EDITOR and above. auth:hasPermission simplePermission:DoBackEndEditing ; @@ -73,6 +79,7 @@ auth:CURATOR auth:hasPermission simplePermission:SeeRevisionInfo ; auth:hasPermission simplePermission:SeeSiteAdminPage ; auth:hasPermission simplePermission:UseMiscellaneousEditorPages ; + auth:hasPermission simplePermission:PageViewableEditor ; # permissions for ANY logged-in user. auth:hasPermission simplePermission:DoFrontEndEditing ; @@ -81,9 +88,11 @@ auth:CURATOR auth:hasPermission simplePermission:QueryUserAccountsModel ; auth:hasPermission simplePermission:UseBasicAjaxControllers ; auth:hasPermission simplePermission:UseMiscellaneousPages ; + auth:hasPermission simplePermission:PageViewableLoggedIn ; # permissions for ANY user, even if they are not logged in. auth:hasPermission simplePermission:QueryFullModel ; + auth:hasPermission simplePermission:PageViewablePublic ; # role-based permissions for CURATOR auth:hasPermission displayByRole:Curator ; @@ -100,6 +109,7 @@ auth:EDITOR auth:hasPermission simplePermission:SeeRevisionInfo ; auth:hasPermission simplePermission:SeeSiteAdminPage ; auth:hasPermission simplePermission:UseMiscellaneousEditorPages ; + auth:hasPermission simplePermission:PageViewableEditor ; # permissions for ANY logged-in user. auth:hasPermission simplePermission:DoFrontEndEditing ; @@ -108,9 +118,11 @@ auth:EDITOR auth:hasPermission simplePermission:QueryUserAccountsModel ; auth:hasPermission simplePermission:UseBasicAjaxControllers ; auth:hasPermission simplePermission:UseMiscellaneousPages ; + auth:hasPermission simplePermission:PageViewableLoggedIn ; # permissions for ANY user, even if they are not logged in. auth:hasPermission simplePermission:QueryFullModel ; + auth:hasPermission simplePermission:PageViewablePublic ; # role-based permissions for EDITOR auth:hasPermission displayByRole:Editor ; @@ -129,9 +141,11 @@ auth:SELF_EDITOR auth:hasPermission simplePermission:QueryUserAccountsModel ; auth:hasPermission simplePermission:UseBasicAjaxControllers ; auth:hasPermission simplePermission:UseMiscellaneousPages ; + auth:hasPermission simplePermission:PageViewableLoggedIn ; # permissions for ANY user, even if they are not logged in. auth:hasPermission simplePermission:QueryFullModel ; + auth:hasPermission simplePermission:PageViewablePublic ; # role-based permissions for SELF_EDITOR # For role-based display and editing, SelfEditor is like Public. @@ -146,6 +160,7 @@ auth:PUBLIC # permissions for ANY user, even if they are not logged in. auth:hasPermission simplePermission:QueryFullModel ; + auth:hasPermission simplePermission:PageViewablePublic ; # role-based permissions for PUBLIC auth:hasPermission displayByRole:Public ; diff --git a/webapp/rdf/display/everytime/permissions.n3 b/webapp/rdf/display/everytime/permissions.n3 index b11bb9d98..d622a8aa7 100644 --- a/webapp/rdf/display/everytime/permissions.n3 +++ b/webapp/rdf/display/everytime/permissions.n3 @@ -157,3 +157,23 @@ action:UseMiscellaneousPages a display:RequiredAction ; rdfs:label "USE_MISCELLANEOUS_PAGES" . +##Page specific permissions +action:PageViewableAdmin + a display:RequiredAction ; + rdfs:label "PAGE_VIEWABLE_ADMIN" . + +action:PageViewableCurator + a display:RequiredAction ; + rdfs:label "PAGE_VIEWABLE_CURATOR" . + +action:PageViewableEditor + a display:RequiredAction ; + rdfs:label "PAGE_VIEWABLE_EDITOR" . + +action:PageViewableLoggedIn + a display:RequiredAction ; + rdfs:label "PAGE_VIEWABLE_LOGGEDIN" . + +action:PageViewablePublic + a display:RequiredAction ; + rdfs:label "PAGE_VIEWABLE_PUBLIC" . \ No newline at end of file diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/SimplePermission.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/SimplePermission.java index a68384e87..cf0a7e272 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/SimplePermission.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/auth/permissions/SimplePermission.java @@ -95,6 +95,22 @@ public class SimplePermission extends Permission { public static final SimplePermission USE_MISCELLANEOUS_PAGES = new SimplePermission( NAMESPACE + "UseMiscellaneousPages"); + // ---------------------------------------------------------------------- + // These instances are permissions that can be specified for a given page created/managed through page management, + // e.g. this page is viewable only by admins, this page is viewable to anyone who is logged in, etc. + // ---------------------------------------------------------------------- + public static final SimplePermission PAGE_VIEWABLE_ADMIN = new SimplePermission( + NAMESPACE + "PageViewableAdmin"); + public static final SimplePermission PAGE_VIEWABLE_CURATOR = new SimplePermission( + NAMESPACE + "PageViewableCurator"); + public static final SimplePermission PAGE_VIEWABLE_LOGGEDIN = new SimplePermission( + NAMESPACE + "PageViewableLoggedIn"); + public static final SimplePermission PAGE_VIEWABLE_EDITOR = new SimplePermission( + NAMESPACE + "PageViewableEditor"); + public static final SimplePermission PAGE_VIEWABLE_PUBLIC = new SimplePermission( + NAMESPACE + "PageViewablePublic"); + + public static List getAllInstances() { return new ArrayList(allInstances.values()); } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java index b5f27a09d..bdb18cafd 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/edit/n3editing/configuration/generators/ManagePageGenerator.java @@ -40,6 +40,7 @@ import edu.cornell.mannlib.vitro.webapp.edit.n3editing.VTwo.fields.FieldVTwo; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.ManagePagePreprocessor; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils.ProcessDataGetterN3; import edu.cornell.mannlib.vitro.webapp.edit.n3editing.configuration.preprocessors.utils.ProcessDataGetterN3Utils; +import edu.cornell.mannlib.vitro.webapp.i18n.I18n; import edu.cornell.mannlib.vitro.webapp.utils.dataGetter.DataGetterUtils; import edu.cornell.mannlib.vitro.webapp.utils.menuManagement.MenuManagementDataUtils; @@ -98,7 +99,7 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen private void setUrisAndLiteralsOnForm(EditConfigurationVTwo conf, VitroRequest vreq) { - conf.setUrisOnForm(new String[]{"page", "menuItem"}); //new resources: should this be on form for new - should be for existing + conf.setUrisOnForm(new String[]{"page", "menuItem", "action"}); //new resources: should this be on form for new - should be for existing conf.setLiteralsOnForm(new String[]{"pageName", "prettyUrl", "menuPosition", "menuLinkText", "customTemplate", "isSelfContainedTemplate", "pageContentUnit"}); //page content unit = data getter JSON object } @@ -118,7 +119,8 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen //body template is not required, and a given page may or may not be a menu item, but should linked to menu if menu item conf.setN3Optional(new ArrayList(Arrays.asList(prefixes + pageBodyTemplateN3, prefixes + menuItemN3 + menuN3, - prefixes + isSelfContainedTemplateN3))); + prefixes + isSelfContainedTemplateN3, + prefixes + permissionN3))); } private void setN3Required(EditConfigurationVTwo conf) { @@ -155,6 +157,10 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen FieldVTwo isSelfContainedTemplateField = new FieldVTwo().setName("isSelfContainedTemplate"); conf.addField(isSelfContainedTemplateField); + //Permission for the page + FieldVTwo permissionField = new FieldVTwo().setName("action"); + conf.addField(permissionField); + //The actual page content information is stored in this field, and then //interpreted using the preprocessor FieldVTwo pageContentUnitField = new FieldVTwo().setName("pageContentUnit"); @@ -413,6 +419,7 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen private HashMap generateSparqlForExistingUris() { HashMap map = new HashMap(); map.put("menuItem", getExistingMenuItemQuery()); + map.put("action", getExistingActionQuery()); return map; } @@ -420,6 +427,11 @@ public class ManagePageGenerator extends BaseEditConfigurationGenerator implemen String query = getSparqlPrefix() + "SELECT ?menuItem WHERE {?menuItem display:toPage ?page .}"; return query; } + + private String getExistingActionQuery() { + String query = getSparqlPrefix() + "SELECT ?action WHERE {?page display:requiresAction ?action .}"; + return query; + } //Page level literals: //"pageName", "prettyUrl", "menuPosition", "menuLinkText", "customTemplate" @@ -509,6 +521,8 @@ private String getExistingIsSelfContainedTemplateQuery() { MenuManagementDataUtils.includeRequiredSystemData(vreq.getSession().getServletContext(), data); data.put("classGroup", new ArrayList()); data.put("classGroups", DataGetterUtils.getClassGroups(vreq)); + data.put("availablePermissions", this.getAvailablePermissions(vreq)); + data.put("availablePermissionOrderedList", this.getAvailablePermissonsOrderedURIs()); } private void addExistingPageData(VitroRequest vreq, Map data) { @@ -531,6 +545,31 @@ private String getExistingIsSelfContainedTemplateQuery() { } } + private HashMap getAvailablePermissions(VitroRequest vreq) { + HashMap availablePermissions = new HashMap(); + String actionNamespace = "java:edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission#"; + availablePermissions.put(actionNamespace + "PageViewableAdmin", I18n.text(vreq, "page_admin_permission_option")); + availablePermissions.put(actionNamespace + "PageViewableCurator", I18n.text(vreq,"page_curator_permission_option")); + availablePermissions.put(actionNamespace + "PageViewableEditor", I18n.text(vreq,"page_editor_permission_option")); + availablePermissions.put(actionNamespace + "PageViewableLoggedIn", I18n.text(vreq,"page_loggedin_permission_option")); + availablePermissions.put(actionNamespace + "PageViewablePublic", I18n.text(vreq,"page_public_permission_option")); + return availablePermissions; + } + + //To display the permissions in a specific order, we can't rely on the hashmap whose keys are not guaranteed to return in a specific order + //This is to allow the display to work correctly + private List getAvailablePermissonsOrderedURIs() { + List availablePermissionsOrdered = new ArrayList(); + String actionNamespace = "java:edu.cornell.mannlib.vitro.webapp.auth.permissions.SimplePermission#"; + availablePermissionsOrdered.add(actionNamespace + "PageViewableAdmin"); + availablePermissionsOrdered.add(actionNamespace + "PageViewableCurator"); + availablePermissionsOrdered.add(actionNamespace + "PageViewableEditor"); + availablePermissionsOrdered.add(actionNamespace + "PageViewableLoggedIn"); + availablePermissionsOrdered.add(actionNamespace + "PageViewablePublic"); + + return availablePermissionsOrdered; + } + //N3 strings //For new or existing page @@ -563,6 +602,9 @@ private String getExistingIsSelfContainedTemplateQuery() { final static String menuN3 = "display:DefaultMenu display:hasElement ?menuItem ."; + //N3 that will assign a permission to a page + final static String permissionN3 = "?page display:requiresAction ?action ."; + //These are public static methods that can be used in the preprocessor public final static String getDataGetterN3(String dataGetterVar) { return prefixes + "?page display:hasDataGetter " + dataGetterVar + "."; diff --git a/webapp/web/i18n/all.properties b/webapp/web/i18n/all.properties index 5799fc6cd..62fd42caa 100644 --- a/webapp/web/i18n/all.properties +++ b/webapp/web/i18n/all.properties @@ -403,6 +403,14 @@ pages = pages menu_management = Menu Management setup_navigation_menu = Setup the primary navigation menu for your website save_button = Save +page_select_permission = Select page permissions +page_select_permission_option = Select permission +page_admin_permission_option = Only admins can view this page +page_curator_permission_option = Curators and above can view this page +page_editor_permission_option = Editors and above can view this page +page_loggedin_permission_option = Logged in individuals can view this page +page_public_permission_option = Anyone can view this page + recompute_inferences = Recompute Inferences diff --git a/webapp/web/templates/freemarker/edit/forms/pageManagement.ftl b/webapp/web/templates/freemarker/edit/forms/pageManagement.ftl index 5e1d3811c..2d9d8a26c 100644 --- a/webapp/web/templates/freemarker/edit/forms/pageManagement.ftl +++ b/webapp/web/templates/freemarker/edit/forms/pageManagement.ftl @@ -4,12 +4,15 @@ <#--------Set up variables--------> <#assign pageData = editConfiguration.pageData /> <#assign menuAction = pageData.menuAction /> +<#assign pageAvailablePermissions = pageData.availablePermissions /> +<#assign pageAvailablePermissionsURIsList = pageData.availablePermissionOrderedList /> <#assign pageName = "" /> <#assign selectedTemplateType = "default" /> <#assign prettyUrl = ""/> <#assign menuItem = ""/> <#assign menuLinkText = "" /> +<#assign action = "" /> <#assign menuPosition = pageData.highestMenuPosition /> <#assign addMenuItem = "" /> <#assign pageHeading = "${i18n().add_new_page}" /> @@ -27,6 +30,8 @@ <#assign menuLinkText = lvf.getFormFieldValue(editSubmission, editConfiguration, "menuLinkText")/> <#assign customTemplate = lvf.getFormFieldValue(editSubmission, editConfiguration, "customTemplate")/> <#assign selfContainedTemplate = lvf.getFormFieldValue(editSubmission, editConfiguration, "isSelfContainedTemplate")/> + <#assign action = lvf.getFormFieldValue(editSubmission, editConfiguration, "action")/> + <#assign pageHeading = "${i18n().edit_page(pageName)}" /> <#assign saveBtnText = "${i18n().save_changes}" /> <#if customTemplate?has_content> @@ -121,10 +126,24 @@ > + + +

${i18n().if_blank_page_title_used}

+ + + +
${i18n().page_select_permission} +