package com.psddev.cms.db; import com.psddev.cms.tool.CmsTool; import com.psddev.cms.tool.Dashboard; import com.psddev.cms.tool.DashboardContainer; import com.psddev.cms.tool.ToolEntityTfaRequired; import com.psddev.cms.tool.ToolPageContext; import com.psddev.dari.db.Application; import com.psddev.dari.db.Query; import com.psddev.dari.db.Record; import com.psddev.dari.util.ObjectUtils; import com.psddev.dari.util.SparseSet; @ToolUi.IconName("object-toolRole") @ToolRole.BootstrapPackages({ "Users and Roles", "Application" }) public class ToolRole extends Record implements Managed, ToolEntity { @Indexed(unique = true) @Required private String name; @ToolUi.FieldDisplayType("permissions") private String permissions; private transient SparseSet permissionsCache; @DisplayName("Dashboard") @ToolUi.Tab("Dashboard") private DashboardContainer dashboardContainer; @Deprecated @DisplayName("Legacy Dashboard") @ToolUi.Tab("Dashboard") @ToolUi.Note("Deprecated. Please use the Dashboard field above instead.") @Embedded private Dashboard dashboard; @ToolUi.DisplayName("Common Content Settings") @ToolUi.Tab("Dashboard") private CmsTool.CommonContentSettings roleCommonContentSettings; @ToolUi.Tab("Advanced") @DisplayName("Two-Factor Authentication Required?") @ToolUi.Placeholder("Default") private ToolEntityTfaRequired tfaRequired; /** Returns the name. */ public String getName() { return name; } /** Sets the name. */ public void setName(String name) { this.name = name; } /** Returns the permissions. */ public String getPermissions() { return permissions; } /** Sets the permissions. */ public void setPermissions(String permissions) { this.permissions = permissions; this.permissionsCache = null; } /** * Returns {@code true} if this role is allowed access to the * resources identified by the given {@code permissionId}. */ public boolean hasPermission(String permissionId) { if (permissionsCache == null) { permissionsCache = new SparseSet(ObjectUtils.isBlank(permissions) ? "+/" : permissions); } return permissionsCache.contains(permissionId); } public DashboardContainer getDashboardContainer() { if (dashboardContainer == null && dashboard != null) { DashboardContainer.OneOff oneOff = new DashboardContainer.OneOff(); oneOff.setDashboard(dashboard); return oneOff; } else { return dashboardContainer; } } public void setDashboardContainer(DashboardContainer dashboardContainer) { this.dashboardContainer = dashboardContainer; } @Deprecated public Dashboard getDashboard() { return dashboard; } @Deprecated public void setDashboard(Dashboard dashboard) { this.dashboard = dashboard; } public CmsTool.CommonContentSettings getRoleCommonContentSettings() { return roleCommonContentSettings; } public void setRoleCommonContentSettings(CmsTool.CommonContentSettings roleCommonContentSettings) { this.roleCommonContentSettings = roleCommonContentSettings; } @Override public Iterable<? extends ToolUser> getUsers() { return Query.from(ToolUser.class).where("role = ?", this).iterable(0); } public boolean isTfaRequired() { if (tfaRequired == null) { return Application.Static.getInstance(CmsTool.class).isTfaRequired(); } else { return ToolEntityTfaRequired.REQUIRED.equals(tfaRequired); } } @Override public String createManagedEditUrl(ToolPageContext page) { return page.cmsUrl("/admin/users.jsp", "id", getId()); } }