diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..172cf91 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +/config +.apex_file_properties +.apex_script +.debug +.describe +.session +.settings +*.sublime-project \ No newline at end of file diff --git a/UserAccessVisualization/src/classes/UserAccessDetailsController.cls b/UserAccessVisualization/src/classes/UserAccessDetailsController.cls index 3eca8b6..80c369a 100644 --- a/UserAccessVisualization/src/classes/UserAccessDetailsController.cls +++ b/UserAccessVisualization/src/classes/UserAccessDetailsController.cls @@ -54,30 +54,30 @@ public class UserAccessDetailsController { // Likewise, the list of permsets for which we're displaying information is pretty // important for every request, so we should hold on to that in viewstate. - public List permsetInfo { get; private set; } + public List permsetInfo { get; private set; } - // A note about the various MapHolder variables. These are Maps for permission set id + // A note about the various UserAccessMapHolder variables. These are Maps for permission set id // to access settings construct. Each of these maps will have one entry with a null // key which represents the users total access. // User perm info is only used for the initial request, so don't hold on to it. The // comments on the following lines identify the patterns used for variables declared // in subsequent blocks. - private transient List xUserPermLabels; // API Names and Labels, and IDs - private transient MapHolder xUserPermStatus; // Which perms are enabled for this user + private transient List xUserPermLabels; // API Names and Labels, and IDs + private transient UserAccessMapHolder xUserPermStatus; // Which perms are enabled for this user private transient Map xUserPerms; // Map from permset Id to PermissionSet Object, // which has the userperm settings // Likewise, object perm info is only used for the initial request, so don't hold on to it - private transient List xObjectLabels; - private transient MapHolder xObjectStatus; + private transient List xObjectLabels; + private transient UserAccessMapHolder xObjectStatus; // Map from permset id -> object name -> ObjectPermissions object. private transient Map> xObjectPerms; // FLS info used for rendering is only used a single time per request and not needed // from request to request, so we don't need to hold on to it. - private transient List xFieldLabels; - private transient MapHolder xFieldStatus; + private transient List xFieldLabels; + private transient UserAccessMapHolder xFieldStatus; // Map from permset id -> field name -> FieldPermissions object. This is the set of // FLS data relevant for the object defined by flsObjectType (see below) private transient Map> xFls; @@ -89,7 +89,7 @@ public class UserAccessDetailsController { get { if (null != userId && null == flsObjectType) { // Default flsObjectType to the first "visible" object. - for (NameLabel nl : getObjectLabels()) { + for (UserAccessNameLabel nl : getObjectLabels()) { if (getObjectPermStatus().it.get(nl.apiName)) { flsObjectType = nl.apiName; break; @@ -112,11 +112,11 @@ public class UserAccessDetailsController { } // ApexClass info is only used during the initial request. Don't need to hold on to it. - private transient List xClassNames; + private transient List xClassNames; private transient Map> xApexClasses; // Likewise, we don't need to hold onto VisualForce page information. - private transient List xPageNames; + private transient List xPageNames; private transient Map> xPages; public UserAccessDetailsController() { @@ -140,22 +140,22 @@ public class UserAccessDetailsController { userId = userData.Id; userFullName = userData.Name; - NameLabel totalAccess = new NameLabel('1TOTAL_ACCESS', 'TOTAL ACCESS'); - NameLabel profilePermsetInfo; - List nls = new List(); + UserAccessNameLabel totalAccess = new UserAccessNameLabel('1TOTAL_ACCESS', 'TOTAL ACCESS'); + UserAccessNameLabel profilePermsetInfo; + List nls = new List(); for (PermissionSetAssignment psa : userData.PermissionSetAssignments) { if (psa.PermissionSet.isOwnedByProfile) { - profilePermsetInfo = new NameLabel( + profilePermsetInfo = new UserAccessNameLabel( psa.PermissionSet.Id, psa.PermissionSet.Name, psa.PermissionSet.Profile.Name ); } else { - nls.add(new NameLabel( + nls.add(new UserAccessNameLabel( psa.PermissionSet.Id, psa.PermissionSet.Name, psa.PermissionSet.Label )); } } - permsetInfo = new List(); + permsetInfo = new List(); permsetInfo.add(totalAccess); permsetInfo.add(profilePermsetInfo); if (!nls.isEmpty()) { @@ -171,14 +171,14 @@ public class UserAccessDetailsController { * Use Apex describe information to determine the set of User Permissions available within * this organization. */ - public List getUserPermLabels() { + public List getUserPermLabels() { if (null == xUserPermLabels) { - List result = new List(); + List result = new List(); Map fMap = Schema.SObjectType.PermissionSet.fields.getMap(); for (String fName : fMap.keySet()) { if (fName.startsWith(PERMISSIONS)) { String label = fMap.get(fName).getDescribe().getLabel(); - result.add(new NameLabel(fName, label)); + result.add(new UserAccessNameLabel(fName, label)); } } result.sort(); @@ -201,7 +201,7 @@ public class UserAccessDetailsController { for (SObject sobj : queryUserPerms(extractPsIds(permsetInfo))) { PermissionSet ps = (PermissionSet) sobj; result.put(ps.Id, ps); - for (NameLabel nl : getUserPermLabels()) { + for (UserAccessNameLabel nl : getUserPermLabels()) { // Total access computation totalAccess.put(nl.apiName, getWithDefault(totalAccess, nl.apiName, false) @@ -230,24 +230,24 @@ public class UserAccessDetailsController { * Basically provides an alternate representation of total access to make our * grid display consistent between access settings. */ - public MapHolder getUserPermStatus() { + public UserAccessMapHolder getUserPermStatus() { if (null == xUserPermStatus) { PermissionSet totalAccess = getUserPerms().get(null); Map msb = new Map(); - for (NameLabel nl : getUserPermLabels()) { + for (UserAccessNameLabel nl : getUserPermLabels()) { msb.put(nl.apiName, (Boolean) totalAccess.get(nl.apiName)); } - xUserPermStatus = new MapHolder(msb); + xUserPermStatus = new UserAccessMapHolder(msb); } return xUserPermStatus; } /** - * Transforms a list of NameLabel objects into just a List of Id objects + * Transforms a list of UserAccessNameLabel objects into just a List of Id objects */ - private List extractPsIds(List psInfo) { + private List extractPsIds(List psInfo) { List result = new List(); - for (NameLabel nl : psInfo) { + for (UserAccessNameLabel nl : psInfo) { if (null != nl.Id) result.add(nl.Id); } return result; @@ -260,7 +260,7 @@ public class UserAccessDetailsController { */ private List queryUserPerms(List psIds) { String soql = 'SELECT Id'; - for (NameLabel nl : getUserPermLabels()) { + for (UserAccessNameLabel nl : getUserPermLabels()) { soql += ', ' + nl.apiName; } soql += ' FROM PermissionSet WHERE Id IN :psIds'; @@ -271,9 +271,9 @@ public class UserAccessDetailsController { * Computes the API Name and Label information for the set of business objects available * to the organization */ - public List getObjectLabels() { + public List getObjectLabels() { if (null == xObjectLabels) { - List result = new List(); + List result = new List(); Map describe = Schema.getGlobalDescribe(); // We can't really depend on describe to give us the object we want @@ -286,7 +286,7 @@ public class UserAccessDetailsController { // for now. for (ObjectPermissions op : [SELECT SObjectType FROM ObjectPermissions WHERE Parent.Profile.Name = 'System Administrator']) { - result.add(new NameLabel(op.SObjectType, + result.add(new UserAccessNameLabel(op.SObjectType, describe.get(op.SObjectType).getDescribe().getLabel())); } result.sort(); @@ -305,15 +305,15 @@ public class UserAccessDetailsController { /** * */ - public MapHolder getObjectPermStatus() { + public UserAccessMapHolder getObjectPermStatus() { if (null == xObjectStatus) { Map msb = new Map(); - for (NameLabel nl : getObjectLabels()) { - // Converts total access into our MapHolder data structure. + for (UserAccessNameLabel nl : getObjectLabels()) { + // Converts total access into our UserAccessMapHolder data structure. msb.put(nl.apiName, getWithDefault(getObjectPerms().get(null).get(nl.apiName), READ, false)); } - xObjectStatus = new MapHolder(msb); + xObjectStatus = new UserAccessMapHolder(msb); } return xObjectStatus; } @@ -327,9 +327,9 @@ public class UserAccessDetailsController { Map> result = new Map>(); // Ensure that each permset and object has an entry in our map structure - for (NameLabel ps : permsetInfo) { + for (UserAccessNameLabel ps : permsetInfo) { result.put(ps.Id, new Map()); - for (NameLabel op : getObjectLabels()) { + for (UserAccessNameLabel op : getObjectLabels()) { result.get(ps.Id).put(op.apiName, new ObjectPermissions()); } } @@ -338,7 +338,7 @@ public class UserAccessDetailsController { // an ObjectPermissions entry for every object. Map totalAccess = new Map(); result.put(null, totalAccess); - for (NameLabel op : getObjectLabels()) { + for (UserAccessNameLabel op : getObjectLabels()) { totalAccess.put(op.apiName, new ObjectPermissions()); } @@ -376,13 +376,13 @@ public class UserAccessDetailsController { * shouldn't be much of an issue here since a user won't have FieldPermissions assigned * for fields they do not have access to */ - public List getFieldLabels() { + public List getFieldLabels() { if (null == flsObjectType) return null; if (null == xFieldLabels) { - List result = new List(); + List result = new List(); Map fmap = Schema.getGlobalDescribe().get(flsObjectType).getDescribe().fields.getMap(); for (String key : fmap.keySet()) { - result.add(new NameLabel(key, fmap.get(key).getDescribe().getLabel())); + result.add(new UserAccessNameLabel(key, fmap.get(key).getDescribe().getLabel())); } result.sort(); xFieldLabels = result; @@ -405,7 +405,7 @@ public class UserAccessDetailsController { Map> result = new Map>(); Set psIds = new Set(); - for (NameLabel ps : permsetInfo) { + for (UserAccessNameLabel ps : permsetInfo) { result.put(ps.Id, new Map()); psIds.add(ps.Id); } @@ -448,18 +448,18 @@ public class UserAccessDetailsController { return xFls; } - public MapHolder getFieldStatus() { + public UserAccessMapHolder getFieldStatus() { if (null == xFieldStatus) { Map msb = new Map(); - for (NameLabel nl : getFieldLabels()) { - for (NameLabel ps : permsetInfo) { + for (UserAccessNameLabel nl : getFieldLabels()) { + for (UserAccessNameLabel ps : permsetInfo) { if (!getFls().get(ps.Id).containsKey(nl.apiName)) { getFls().get(ps.Id).put(nl.apiName, new FieldPermissions()); } } msb.put(nl.apiName, getFls().get(null).get(nl.apiName).PermissionsRead); } - xFieldStatus = new MapHolder(msb); + xFieldStatus = new UserAccessMapHolder(msb); } return xFieldStatus; } @@ -467,11 +467,11 @@ public class UserAccessDetailsController { /** * Computes the list of classes available in the org */ - public List getClassNames() { + public List getClassNames() { if (null == xClassNames) { - List result = new List(); + List result = new List(); for (ApexClass ac : [SELECT Id, Name FROM ApexClass]) { - result.add(new NameLabel(ac.Id, ac.Name, ac.Name)); + result.add(new UserAccessNameLabel(ac.Id, ac.Name, ac.Name)); } result.sort(); xClassNames = result; @@ -489,18 +489,18 @@ public class UserAccessDetailsController { return xApexClasses; } - public MapHolder getClassStatus() { - return new MapHolder(getApexClasses().get(null)); + public UserAccessMapHolder getClassStatus() { + return new UserAccessMapHolder(getApexClasses().get(null)); } /** * Computes which Visual Force pages are present in the org */ - public List getPageNames() { + public List getPageNames() { if (null == xPageNames) { - List result = new List(); + List result = new List(); for (ApexPage ap : [SELECT Id, Name FROM ApexPage]) { - result.add(new NameLabel(ap.Id, ap.Name, ap.Name)); + result.add(new UserAccessNameLabel(ap.Id, ap.Name, ap.Name)); } result.sort(); xPageNames = result; @@ -515,8 +515,8 @@ public class UserAccessDetailsController { return xPages; } - public MapHolder getPageStatus() { - return new MapHolder(getPages().get(null)); + public UserAccessMapHolder getPageStatus() { + return new UserAccessMapHolder(getPages().get(null)); } /** @@ -524,7 +524,7 @@ public class UserAccessDetailsController { * they can easily be processed using common logic with some variables used to account for * differences */ - private Map> calculateSetupEntityAccess(String seaType, List seaNames) { + private Map> calculateSetupEntityAccess(String seaType, List seaNames) { Map> result = new Map>(); Map seaMap = new Map(); @@ -547,14 +547,14 @@ public class UserAccessDetailsController { // Ensure that each permset and setup entity has a row in our result datastructure. This // keeps VisualForce happy when it does Map processing. - for (NameLabel ps : permsetInfo) { + for (UserAccessNameLabel ps : permsetInfo) { if (null != ps.Id) { Map seaStatus = result.get(ps.Id); if (null == seaStatus) { seaStatus = new Map(); result.put(ps.Id, seaStatus); } - for (NameLabel nl : seaNames) { + for (UserAccessNameLabel nl : seaNames) { boolean hasSea = enabledByPermset.containsKey(ps.Id) && enabledByPermset.get(ps.Id).contains(nl.id); seaStatus.put(nl.apiName, hasSea); if (hasSea || !total.containsKey(nl.apiName)) total.put(nl.apiName, hasSea); diff --git a/UserAccessVisualization/src/classes/MapHolder.cls b/UserAccessVisualization/src/classes/UserAccessMapHolder.cls similarity index 94% rename from UserAccessVisualization/src/classes/MapHolder.cls rename to UserAccessVisualization/src/classes/UserAccessMapHolder.cls index ac34537..2498de6 100644 --- a/UserAccessVisualization/src/classes/MapHolder.cls +++ b/UserAccessVisualization/src/classes/UserAccessMapHolder.cls @@ -29,10 +29,10 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -public class MapHolder { +public class UserAccessMapHolder { public Map it { get; private set; } - public MapHolder(Map it) { + public UserAccessMapHolder(Map it) { this.it = it; } } \ No newline at end of file diff --git a/UserAccessVisualization/src/classes/MapHolder.cls-meta.xml b/UserAccessVisualization/src/classes/UserAccessMapHolder.cls-meta.xml similarity index 100% rename from UserAccessVisualization/src/classes/MapHolder.cls-meta.xml rename to UserAccessVisualization/src/classes/UserAccessMapHolder.cls-meta.xml diff --git a/UserAccessVisualization/src/classes/NameLabel.cls b/UserAccessVisualization/src/classes/UserAccessNameLabel.cls similarity index 88% rename from UserAccessVisualization/src/classes/NameLabel.cls rename to UserAccessVisualization/src/classes/UserAccessNameLabel.cls index ac0dcdf..e598831 100644 --- a/UserAccessVisualization/src/classes/NameLabel.cls +++ b/UserAccessVisualization/src/classes/UserAccessNameLabel.cls @@ -29,23 +29,23 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -global class NameLabel implements Comparable { +global class UserAccessNameLabel implements Comparable { public Id id { get; private set; } public String apiName { get; private set; } public String label { get; private set; } - public NameLabel(String apiName, String label) { + public UserAccessNameLabel(String apiName, String label) { this(null, apiName, label); } - public NameLabel(Id id, String apiName, String label) { + public UserAccessNameLabel(Id id, String apiName, String label) { this.id = id; this.apiName = apiName; this.label = label; } global Integer compareTo(Object obj) { - NameLabel other = (NameLabel) obj; + UserAccessNameLabel other = (UserAccessNameLabel) obj; return label.compareTo(other.label); } } \ No newline at end of file diff --git a/UserAccessVisualization/src/classes/NameLabel.cls-meta.xml b/UserAccessVisualization/src/classes/UserAccessNameLabel.cls-meta.xml similarity index 100% rename from UserAccessVisualization/src/classes/NameLabel.cls-meta.xml rename to UserAccessVisualization/src/classes/UserAccessNameLabel.cls-meta.xml diff --git a/UserAccessVisualization/src/components/PermsetAccessTable.component b/UserAccessVisualization/src/components/UserAccessPermsetAccessTable.component similarity index 88% rename from UserAccessVisualization/src/components/PermsetAccessTable.component rename to UserAccessVisualization/src/components/UserAccessPermsetAccessTable.component index aa1c07e..934f5fc 100644 --- a/UserAccessVisualization/src/components/PermsetAccessTable.component +++ b/UserAccessVisualization/src/components/UserAccessPermsetAccessTable.component @@ -30,9 +30,9 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --> - - - + + + diff --git a/UserAccessVisualization/src/components/PermsetAccessTable.component-meta.xml b/UserAccessVisualization/src/components/UserAccessPermsetAccessTable.component-meta.xml similarity index 87% rename from UserAccessVisualization/src/components/PermsetAccessTable.component-meta.xml rename to UserAccessVisualization/src/components/UserAccessPermsetAccessTable.component-meta.xml index 196e32e..1d60fb7 100644 --- a/UserAccessVisualization/src/components/PermsetAccessTable.component-meta.xml +++ b/UserAccessVisualization/src/components/UserAccessPermsetAccessTable.component-meta.xml @@ -2,5 +2,5 @@ 25.0 This is a generic template for Visualforce Component. With this template, you may adjust the default elements and values and add new elements and values. - + diff --git a/UserAccessVisualization/src/pages/UserAccessDetails.page b/UserAccessVisualization/src/pages/UserAccessDetails.page index 12711bd..297b702 100644 --- a/UserAccessVisualization/src/pages/UserAccessDetails.page +++ b/UserAccessVisualization/src/pages/UserAccessDetails.page @@ -29,20 +29,27 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --> - - - + + + - - - + + + + + - + + + No user id specified + + + - @@ -50,7 +57,7 @@ - + @@ -65,7 +72,7 @@ Modify All Records - @@ -80,7 +87,7 @@ - +
Field Level Security: {!flsObjectType}
- @@ -110,29 +117,29 @@ - +
-
-
+
-
-
+
diff --git a/UserAccessVisualization/src/staticresources/css.resource b/UserAccessVisualization/src/staticresources/UserAccessCSS.resource similarity index 100% rename from UserAccessVisualization/src/staticresources/css.resource rename to UserAccessVisualization/src/staticresources/UserAccessCSS.resource diff --git a/UserAccessVisualization/src/staticresources/css.resource-meta.xml b/UserAccessVisualization/src/staticresources/UserAccessCSS.resource-meta.xml similarity index 100% rename from UserAccessVisualization/src/staticresources/css.resource-meta.xml rename to UserAccessVisualization/src/staticresources/UserAccessCSS.resource-meta.xml diff --git a/UserAccessVisualization/src/staticresources/jQuery.resource b/UserAccessVisualization/src/staticresources/UserAccessJQuery.resource similarity index 100% rename from UserAccessVisualization/src/staticresources/jQuery.resource rename to UserAccessVisualization/src/staticresources/UserAccessJQuery.resource diff --git a/UserAccessVisualization/src/staticresources/jQuery.resource-meta.xml b/UserAccessVisualization/src/staticresources/UserAccessJQuery.resource-meta.xml similarity index 100% rename from UserAccessVisualization/src/staticresources/jQuery.resource-meta.xml rename to UserAccessVisualization/src/staticresources/UserAccessJQuery.resource-meta.xml diff --git a/UserAccessVisualization/src/staticresources/js.resource b/UserAccessVisualization/src/staticresources/UserAccessJS.resource similarity index 100% rename from UserAccessVisualization/src/staticresources/js.resource rename to UserAccessVisualization/src/staticresources/UserAccessJS.resource diff --git a/UserAccessVisualization/src/staticresources/js.resource-meta.xml b/UserAccessVisualization/src/staticresources/UserAccessJS.resource-meta.xml similarity index 100% rename from UserAccessVisualization/src/staticresources/js.resource-meta.xml rename to UserAccessVisualization/src/staticresources/UserAccessJS.resource-meta.xml