diff options
Diffstat (limited to 'java/com/google/gerrit/server/permissions/ChangeControl.java')
-rw-r--r-- | java/com/google/gerrit/server/permissions/ChangeControl.java | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/java/com/google/gerrit/server/permissions/ChangeControl.java b/java/com/google/gerrit/server/permissions/ChangeControl.java index ee36200283..c3be7f2609 100644 --- a/java/com/google/gerrit/server/permissions/ChangeControl.java +++ b/java/com/google/gerrit/server/permissions/ChangeControl.java @@ -65,6 +65,8 @@ class ChangeControl { private final RefControl refControl; private final ChangeNotes notes; + private ChangeData cd; + private ChangeControl( ChangeData.Factory changeDataFactory, RefControl refControl, ChangeNotes notes) { this.changeDataFactory = changeDataFactory; @@ -73,7 +75,8 @@ class ChangeControl { } ForChange asForChange(@Nullable ChangeData cd) { - return new ForChangeImpl(cd); + setChangeData(cd); + return new ForChangeImpl(); } private CurrentUser getUser() { @@ -88,12 +91,27 @@ class ChangeControl { return notes.getChange(); } + private ChangeData changeData() { + if (cd == null) { + cd = changeDataFactory.create(notes); + } + return cd; + } + + ChangeControl setChangeData(@Nullable ChangeData cd) { + if (cd != null) { + this.cd = cd; + } + return this; + } + /** Can this user see this change? */ - private boolean isVisible(@Nullable ChangeData cd) { - if (getChange().isPrivate() && !isPrivateVisible(cd)) { + boolean isVisible() { + if (getChange().isPrivate() && !isPrivateVisible(changeData())) { return false; } - return refControl.isVisible(); + // Does the user have READ permission on the destination? + return refControl.asForRef().testOrFalse(RefPermission.READ); } /** Can this user abandon this change? */ @@ -219,20 +237,11 @@ class ChangeControl { } private class ForChangeImpl extends ForChange { - private ChangeData cd; + private Map<String, PermissionRange> labels; private String resourcePath; - ForChangeImpl(@Nullable ChangeData cd) { - this.cd = cd; - } - - private ChangeData changeData() { - if (cd == null) { - cd = changeDataFactory.create(notes); - } - return cd; - } + private ForChangeImpl() {} @Override public String resourcePath() { @@ -285,7 +294,7 @@ class ChangeControl { try { switch (perm) { case READ: - return isVisible(changeData()); + return isVisible(); case ABANDON: return canAbandon(); case DELETE: |