Separate part of PermissionCollection#filter into separate function
Change-Id: I486db4af7e10c2384e3c320a6d2b8c7d4f9f609d
This commit is contained in:
@@ -60,6 +60,49 @@ public class PermissionCollection {
|
|||||||
this.sorter = sorter;
|
this.sorter = sorter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drop the SectionMatchers that don't apply to the current ref. The user is only used for
|
||||||
|
* expanding per-user ref patterns, and not for checking group memberships.
|
||||||
|
*
|
||||||
|
* @param matcherList the input sections.
|
||||||
|
* @param ref the ref name for which to filter.
|
||||||
|
* @param user Only used for expanding per-user ref patterns.
|
||||||
|
* @param out the filtered sections.
|
||||||
|
* @return true if the result is only valid for this user.
|
||||||
|
*/
|
||||||
|
private static boolean filterRefMatchingSections(
|
||||||
|
Iterable<SectionMatcher> matcherList,
|
||||||
|
String ref,
|
||||||
|
CurrentUser user,
|
||||||
|
Map<AccessSection, Project.NameKey> out) {
|
||||||
|
boolean perUser = false;
|
||||||
|
for (SectionMatcher sm : matcherList) {
|
||||||
|
// If the matcher has to expand parameters and its prefix matches the
|
||||||
|
// reference there is a very good chance the reference is actually user
|
||||||
|
// specific, even if the matcher does not match the reference. Since its
|
||||||
|
// difficult to prove this is true all of the time, use an approximation
|
||||||
|
// to prevent reuse of collections across users accessing the same
|
||||||
|
// reference at the same time.
|
||||||
|
//
|
||||||
|
// This check usually gets caching right, as most per-user references
|
||||||
|
// use a common prefix like "refs/sandbox/" or "refs/heads/users/"
|
||||||
|
// that will never be shared with non-user references, and the per-user
|
||||||
|
// references are usually less frequent than the non-user references.
|
||||||
|
if (sm.getMatcher() instanceof ExpandParameters) {
|
||||||
|
if (!((ExpandParameters) sm.getMatcher()).matchPrefix(ref)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
perUser = true;
|
||||||
|
if (sm.match(ref, user)) {
|
||||||
|
out.put(sm.getSection(), sm.getProject());
|
||||||
|
}
|
||||||
|
} else if (sm.match(ref, null)) {
|
||||||
|
out.put(sm.getSection(), sm.getProject());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return perUser;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all permissions that apply to a reference. The user is only used for per-user ref names,
|
* Get all permissions that apply to a reference. The user is only used for per-user ref names,
|
||||||
* so the return value may include permissions for groups the user is not part of.
|
* so the return value may include permissions for groups the user is not part of.
|
||||||
@@ -80,33 +123,9 @@ public class PermissionCollection {
|
|||||||
ref = ref.substring(0, ref.length() - 1);
|
ref = ref.substring(0, ref.length() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean perUser = false;
|
|
||||||
Map<AccessSection, Project.NameKey> sectionToProject = new LinkedHashMap<>();
|
Map<AccessSection, Project.NameKey> sectionToProject = new LinkedHashMap<>();
|
||||||
for (SectionMatcher sm : matcherList) {
|
boolean perUser = filterRefMatchingSections(matcherList, ref, user, sectionToProject);
|
||||||
// If the matcher has to expand parameters and its prefix matches the
|
|
||||||
// reference there is a very good chance the reference is actually user
|
|
||||||
// specific, even if the matcher does not match the reference. Since its
|
|
||||||
// difficult to prove this is true all of the time, use an approximation
|
|
||||||
// to prevent reuse of collections across users accessing the same
|
|
||||||
// reference at the same time.
|
|
||||||
//
|
|
||||||
// This check usually gets caching right, as most per-user references
|
|
||||||
// use a common prefix like "refs/sandbox/" or "refs/heads/users/"
|
|
||||||
// that will never be shared with non-user references, and the per-user
|
|
||||||
// references are usually less frequent than the non-user references.
|
|
||||||
//
|
|
||||||
if (sm.getMatcher() instanceof ExpandParameters) {
|
|
||||||
if (!((ExpandParameters) sm.getMatcher()).matchPrefix(ref)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
perUser = true;
|
|
||||||
if (sm.match(ref, user)) {
|
|
||||||
sectionToProject.put(sm.getSection(), sm.getProject());
|
|
||||||
}
|
|
||||||
} else if (sm.match(ref, null)) {
|
|
||||||
sectionToProject.put(sm.getSection(), sm.getProject());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
List<AccessSection> sections = Lists.newArrayList(sectionToProject.keySet());
|
List<AccessSection> sections = Lists.newArrayList(sectionToProject.keySet());
|
||||||
sorter.sort(ref, sections);
|
sorter.sort(ref, sections);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user