Merge branch 'stable-2.14'
* stable-2.14:
DeleteImage: Add missing cases in switch on RefUpdate.Result
PostImage: Remove unused Config
ImageServlet: Suppress warning about deprecated Hashing.md5()
Fix unnecessarily nested else-clauses
Format Java files with google-java-format
Change-Id: I0f4b84f78a41a169c64634d1d5cd5a927235e2fe
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
index 33311c0..9f71e9d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/DeleteImage.java
@@ -15,6 +15,7 @@
package com.googlesource.gerrit.plugins.imagare;
import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.extensions.api.access.PluginPermission;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
@@ -23,6 +24,9 @@
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.googlesource.gerrit.plugins.imagare.DeleteImage.Input;
@@ -46,32 +50,38 @@
private final Provider<IdentifiedUser> self;
private final GitRepositoryManager repoManager;
private final GitReferenceUpdated referenceUpdated;
+ private final PermissionBackend permissionBackend;
@Inject
public DeleteImage(
@PluginName String pluginName,
Provider<IdentifiedUser> self,
GitRepositoryManager repoManager,
- GitReferenceUpdated referenceUpdated) {
+ GitReferenceUpdated referenceUpdated,
+ PermissionBackend permissionBackend) {
this.pluginName = pluginName;
this.self = self;
this.repoManager = repoManager;
this.referenceUpdated = referenceUpdated;
+ this.permissionBackend = permissionBackend;
}
@Override
public Response<?> apply(ImageResource rsrc, Input input)
throws AuthException, ResourceConflictException, RepositoryNotFoundException, IOException,
- ResourceNotFoundException {
- if (!rsrc.getControl().canDelete()
- && !self.get()
- .getCapabilities()
- .canPerform(pluginName + "-" + DeleteOwnImagesCapability.DELETE_OWN_IMAGES)) {
- throw new AuthException("not allowed to delete image");
+ ResourceNotFoundException, PermissionBackendException {
+
+ if (!permissionBackend.user(self).ref(rsrc.getBranchKey()).testOrFalse(RefPermission.DELETE)) {
+ permissionBackend
+ .user(self)
+ .test(new PluginPermission(pluginName, DeleteOwnImagesCapability.DELETE_OWN_IMAGES));
}
try (Repository r = repoManager.openRepository(rsrc.getProject())) {
- if (!rsrc.getControl().canDelete()) {
+ if (!permissionBackend
+ .user(self)
+ .ref(rsrc.getBranchKey())
+ .testOrFalse(RefPermission.DELETE)) {
validateOwnImage(r, rsrc.getRef());
}
@@ -103,6 +113,8 @@
case NOT_ATTEMPTED:
case REJECTED:
case RENAMED:
+ case REJECTED_MISSING_OBJECT:
+ case REJECTED_OTHER_REASON:
default:
log.error("Cannot delete " + rsrc.getRef() + ": " + result.name());
throw new ResourceConflictException("cannot delete branch: " + result.name());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java
index 0fc0732..4c5041b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/GetPreference.java
@@ -14,6 +14,8 @@
package com.googlesource.gerrit.plugins.imagare;
+import static com.google.gerrit.server.permissions.GlobalPermission.ADMINISTRATE_SERVER;
+
import com.google.common.base.MoreObjects;
import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.extensions.restapi.AuthException;
@@ -21,6 +23,8 @@
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountResource;
import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.project.ProjectCache;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -37,23 +41,26 @@
private final ProjectCache projectCache;
private final String pluginName;
private final Provider<GetConfig> getConfig;
+ private final PermissionBackend permissionBackend;
@Inject
GetPreference(
Provider<IdentifiedUser> self,
ProjectCache projectCache,
@PluginName String pluginName,
- Provider<GetConfig> getConfig) {
+ Provider<GetConfig> getConfig,
+ PermissionBackend permissionBackend) {
this.self = self;
this.projectCache = projectCache;
this.pluginName = pluginName;
this.getConfig = getConfig;
+ this.permissionBackend = permissionBackend;
}
@Override
- public ConfigInfo apply(AccountResource rsrc) throws AuthException {
- if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) {
- throw new AuthException("not allowed to get preference");
+ public ConfigInfo apply(AccountResource rsrc) throws AuthException, PermissionBackendException {
+ if (self.get() != rsrc.getUser()) {
+ permissionBackend.user(self).check(ADMINISTRATE_SERVER);
}
String username = self.get().getUserName();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
index 8252fb2..6c52b46 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImageServlet.java
@@ -25,9 +25,13 @@
import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.mime.FileTypeRegistry;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.permissions.RefPermission;
+import com.google.gerrit.server.project.CommitsCollection;
import com.google.gerrit.server.project.GetHead;
import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.gerrit.server.project.ProjectCache;
@@ -63,29 +67,35 @@
public static final String PATH_PREFIX = "/project/";
private final String pluginName;
- private final Provider<ReviewDb> db;
private final ProjectControl.Factory projectControlFactory;
private final ProjectCache projectCache;
private final Provider<GetHead> getHead;
private final GitRepositoryManager repoManager;
private final FileTypeRegistry fileTypeRegistry;
+ private final CommitsCollection commits;
+ private final Provider<CurrentUser> self;
+ private final PermissionBackend permissionBackend;
@Inject
ImageServlet(
@PluginName String pluginName,
- Provider<ReviewDb> db,
ProjectControl.Factory projectControlFactory,
ProjectCache projectCache,
Provider<GetHead> getHead,
GitRepositoryManager repoManager,
- FileTypeRegistry fileTypeRegistry) {
+ FileTypeRegistry fileTypeRegistry,
+ CommitsCollection commits,
+ Provider<CurrentUser> self,
+ PermissionBackend permissionBackend) {
this.pluginName = pluginName;
- this.db = db;
this.projectControlFactory = projectControlFactory;
this.projectCache = projectCache;
this.getHead = getHead;
this.repoManager = repoManager;
this.fileTypeRegistry = fileTypeRegistry;
+ this.commits = commits;
+ this.self = self;
+ this.permissionBackend = permissionBackend;
}
@Override
@@ -103,14 +113,14 @@
return;
}
- MimeType mimeType = fileTypeRegistry.getMimeType(key.file, null);
+ MimeType mimeType = fileTypeRegistry.getMimeType(key.file, (byte[]) null);
if (!("image".equals(mimeType.getMediaType()) && fileTypeRegistry.isSafeInline(mimeType))) {
notFound(res);
return;
}
try {
- ProjectControl projectControl = projectControlFactory.validateFor(key.project);
+ ProjectControl projectControl = projectControlFactory.controlFor(key.project);
String rev = key.revision;
if (rev == null || Constants.HEAD.equals(rev)) {
rev = getHead.get().apply(new ProjectResource(projectControl));
@@ -119,7 +129,10 @@
if (!rev.startsWith(Constants.R_REFS)) {
rev = Constants.R_HEADS + rev;
}
- if (!projectControl.controlForRef(rev).isVisible()) {
+ PermissionBackend.ForProject perm = permissionBackend.user(self).project(key.project);
+ try {
+ perm.ref(rev).check(RefPermission.READ);
+ } catch (AuthException e) {
notFound(res);
return;
}
@@ -135,7 +148,7 @@
if (ObjectId.isId(rev)) {
try (RevWalk rw = new RevWalk(repo)) {
RevCommit commit = rw.parseCommit(repo.resolve(rev));
- if (!projectControl.canReadCommit(db.get(), repo, commit)) {
+ if (!commits.canRead(state, repo, commit)) {
notFound(res);
return;
}
@@ -193,7 +206,8 @@
| NoSuchProjectException
| ResourceNotFoundException
| AuthException
- | RevisionSyntaxException e) {
+ | RevisionSyntaxException
+ | PermissionBackendException e) {
notFound(res);
return;
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java
index c810abb..992bbff 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/ImagesCollection.java
@@ -22,8 +22,9 @@
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.RefPermission;
import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.server.project.RefControl;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -31,12 +32,16 @@
implements ChildCollection<ProjectResource, ImageResource>, AcceptsPost<ProjectResource> {
private final DynamicMap<RestView<ImageResource>> views;
private final Provider<PostImage> createImage;
+ private final PermissionBackend permissionBackend;
@Inject
public ImagesCollection(
- DynamicMap<RestView<ImageResource>> views, Provider<PostImage> createImage) {
+ DynamicMap<RestView<ImageResource>> views,
+ Provider<PostImage> createImage,
+ PermissionBackend permissionBackend) {
this.views = views;
this.createImage = createImage;
+ this.permissionBackend = permissionBackend;
}
@Override
@@ -46,10 +51,12 @@
@Override
public ImageResource parse(ProjectResource parent, IdString id) throws ResourceNotFoundException {
- RefControl refControl =
- parent.getControl().controlForRef(new Branch.NameKey(parent.getNameKey(), id.get()));
- if (refControl.canRead()) {
- return new ImageResource(refControl);
+ Branch.NameKey branchName = new Branch.NameKey(parent.getNameKey(), id.get());
+ if (permissionBackend
+ .user(parent.getControl().getUser())
+ .ref(branchName)
+ .testOrFalse(RefPermission.READ)) {
+ return new ImageResource(parent.getControl().controlForRef(branchName));
}
throw new ResourceNotFoundException(id);
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
index f336cc4..f1b54d3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java
@@ -21,18 +21,21 @@
import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
+import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.config.CanonicalWebUrl;
import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.mime.FileTypeRegistry;
+import com.google.gerrit.server.permissions.PermissionBackendException;
+import com.google.gerrit.server.project.CreateRefControl;
+import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.gerrit.server.project.ProjectControl;
import com.google.gerrit.server.project.ProjectResource;
-import com.google.gerrit.server.project.RefControl;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.googlesource.gerrit.plugins.imagare.PostImage.Input;
@@ -67,8 +70,8 @@
private final GitReferenceUpdated referenceUpdated;
private final PersonIdent myIdent;
private final String canonicalWebUrl;
- private final Provider<ReviewDb> db;
private final String pluginName;
+ private final CreateRefControl createRefControl;
@Inject
public PostImage(
@@ -78,8 +81,8 @@
GitReferenceUpdated referenceUpdated,
@GerritPersonIdent PersonIdent myIdent,
@CanonicalWebUrl String canonicalWebUrl,
- Provider<ReviewDb> db,
- @PluginName String pluginName) {
+ @PluginName String pluginName,
+ CreateRefControl createRefControl) {
this.registry = registry;
this.imageDataPattern = Pattern.compile("data:([\\w/.-]+);([\\w]+),(.*)");
this.self = self;
@@ -87,14 +90,13 @@
this.referenceUpdated = referenceUpdated;
this.myIdent = myIdent;
this.canonicalWebUrl = canonicalWebUrl;
- this.db = db;
this.pluginName = pluginName;
+ this.createRefControl = createRefControl;
}
@Override
public Response<ImageInfo> apply(ProjectResource rsrc, Input input)
- throws MethodNotAllowedException, BadRequestException, AuthException, IOException,
- ResourceConflictException {
+ throws RestApiException, IOException, PermissionBackendException, NoSuchProjectException {
if (input == null) {
input = new Input();
}
@@ -108,8 +110,7 @@
}
private ImageInfo storeImage(ProjectControl pc, String imageData, String fileName)
- throws MethodNotAllowedException, BadRequestException, AuthException, IOException,
- ResourceConflictException {
+ throws RestApiException, IOException, PermissionBackendException, NoSuchProjectException {
Matcher m = imageDataPattern.matcher(imageData);
if (m.matches()) {
String receivedMimeType = m.group(1);
@@ -142,7 +143,8 @@
}
private String storeImage(ProjectControl pc, byte[] content, String fileName)
- throws AuthException, IOException, ResourceConflictException {
+ throws AuthException, IOException, ResourceConflictException, PermissionBackendException,
+ NoSuchProjectException {
long maxSize = pc.getProjectState().getEffectiveMaxObjectSizeLimit().value;
// maxSize == 0 means that there is no limit
if (maxSize > 0 && content.length > maxSize) {
@@ -150,7 +152,6 @@
}
String ref = getRef(content, fileName);
- RefControl rc = pc.controlForRef(ref);
try (Repository repo = repoManager.openRepository(pc.getProject().getNameKey())) {
ObjectId commitId = repo.resolve(ref);
@@ -180,7 +181,13 @@
commitId = oi.insert(cb);
oi.flush();
- if (!rc.canCreate(db.get(), repo, rw.parseCommit(commitId))) {
+ try {
+ createRefControl.checkCreateRef(
+ self,
+ repo,
+ new Branch.NameKey(pc.getProject().getNameKey(), ref),
+ rw.parseCommit(commitId));
+ } catch (AuthException e) {
throw new AuthException(
String.format("Project %s doesn't allow image upload.", pc.getProject().getName()));
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java b/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java
index bebef61..025475a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/imagare/PutPreference.java
@@ -14,6 +14,7 @@
package com.googlesource.gerrit.plugins.imagare;
+import static com.google.gerrit.server.permissions.GlobalPermission.ADMINISTRATE_SERVER;
import static com.googlesource.gerrit.plugins.imagare.GetPreference.KEY_DEFAULT_PROJECT;
import static com.googlesource.gerrit.plugins.imagare.GetPreference.KEY_LINK_DECORATION;
import static com.googlesource.gerrit.plugins.imagare.GetPreference.KEY_STAGE;
@@ -30,6 +31,8 @@
import com.google.gerrit.server.account.AccountResource;
import com.google.gerrit.server.git.MetaDataUpdate;
import com.google.gerrit.server.git.ProjectLevelConfig;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gerrit.server.project.ProjectCache;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -43,24 +46,28 @@
private final ProjectCache projectCache;
private final MetaDataUpdate.User metaDataUpdateFactory;
private final String pluginName;
+ private final PermissionBackend permissionBackend;
@Inject
PutPreference(
Provider<IdentifiedUser> self,
ProjectCache projectCache,
MetaDataUpdate.User metaDataUpdateFactory,
- @PluginName String pluginName) {
+ @PluginName String pluginName,
+ PermissionBackend permissionBackend) {
this.self = self;
this.projectCache = projectCache;
this.metaDataUpdateFactory = metaDataUpdateFactory;
this.pluginName = pluginName;
+ this.permissionBackend = permissionBackend;
}
@Override
public Response<String> apply(AccountResource rsrc, Input input)
- throws AuthException, RepositoryNotFoundException, IOException, UnprocessableEntityException {
- if (self.get() != rsrc.getUser() && !self.get().getCapabilities().canAdministrateServer()) {
- throw new AuthException("not allowed to change preference");
+ throws AuthException, RepositoryNotFoundException, IOException, UnprocessableEntityException,
+ PermissionBackendException {
+ if (self.get() != rsrc.getUser()) {
+ permissionBackend.user(self).check(ADMINISTRATE_SERVER);
}
if (input == null) {
input = new Input();