From 5a708a8b459c4ac6b66a01d2c10f4254d4636c6a Mon Sep 17 00:00:00 2001 From: Sasa Zivkov Date: Fri, 28 Jun 2013 17:07:55 +0200 Subject: [PATCH] Allow per project maxObjectSizeLimit. Project owners can define receive.maxObjectSizeLimit in their project.config in order to further restrict the global receive.maxObjectSizeLimit setting from etc/gerrit.config. The project specific maxObjectSizeLimit is only honored if smaller than the global maxObjectSizeLimit, otherwise it is ignored. Change-Id: Ia14354e0c9b6bfb4fa62295162e8f2c127b09997 --- Documentation/config-gerrit.txt | 4 ++++ .../com/google/gerrit/server/git/ProjectConfig.java | 12 ++++++++++++ .../google/gerrit/server/project/ProjectState.java | 4 ++++ .../com/google/gerrit/sshd/commands/Receive.java | 13 ++++++++++++- 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt index 8558d2b49d..8864054a24 100644 --- a/Documentation/config-gerrit.txt +++ b/Documentation/config-gerrit.txt @@ -2099,6 +2099,10 @@ limit. Gerrit administrators can use this setting to prevent developers from pushing objects which are too large to Gerrit. + +This setting can also be set in the `project.config` in order to further +reduce the global setting. The project specific setting is only honored +when it further reduces the global limit. ++ Default is zero. + Common unit suffixes of 'k', 'm', or 'g' are supported. diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java index c618501392..229004bbc5 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ProjectConfig.java @@ -107,6 +107,7 @@ public class ProjectConfig extends VersionedMetaData { private static final String RECEIVE = "receive"; private static final String KEY_REQUIRE_SIGNED_OFF_BY = "requireSignedOffBy"; private static final String KEY_REQUIRE_CHANGE_ID = "requireChangeId"; + private static final String KEY_MAX_OBJECT_SIZE_LIMIT = "maxObjectSizeLimit"; private static final String KEY_REQUIRE_CONTRIBUTOR_AGREEMENT = "requireContributorAgreement"; @@ -145,6 +146,7 @@ public class ProjectConfig extends VersionedMetaData { private List commentLinkSections; private List validationErrors; private ObjectId rulesId; + private long maxObjectSizeLimit; public static ProjectConfig read(MetaDataUpdate update) throws IOException, ConfigInvalidException { @@ -318,6 +320,14 @@ public class ProjectConfig extends VersionedMetaData { return rulesId; } + /** + * @return the maxObjectSizeLimit for this project, if set. Zero if this + * project doesn't define own maxObjectSizeLimit. + */ + public long getMaxObjectSizeLimit() { + return maxObjectSizeLimit; + } + /** * Check all GroupReferences use current group name, repairing stale ones. * @@ -386,6 +396,8 @@ public class ProjectConfig extends VersionedMetaData { loadNotifySections(rc, groupsByName); loadLabelSections(rc); loadCommentLinkSections(rc); + + maxObjectSizeLimit = rc.getLong(RECEIVE, null, KEY_MAX_OBJECT_SIZE_LIMIT, 0); } private void loadAccountsSection( diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java index 6f80841a9a..800fa6ea2c 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java @@ -216,6 +216,10 @@ public class ProjectState { return config; } + public long getMaxObjectSizeLimit() { + return config.getMaxObjectSizeLimit(); + } + /** Get the sections that pertain only to this project. */ List getLocalAccessSections() { List sm = localAccessSections; diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java index e0dd38fc70..28f20cf95a 100644 --- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java +++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/Receive.java @@ -94,7 +94,7 @@ final class Receive extends AbstractGitCommand { final ReceivePack rp = receive.getReceivePack(); rp.setRefLogIdent(currentUser.newRefLogIdent()); rp.setTimeout(config.getTimeout()); - rp.setMaxObjectSizeLimit(config.getMaxObjectSizeLimit()); + rp.setMaxObjectSizeLimit(getMaxObjectSizeLimit()); try { receive.advertiseHistory(); rp.receive(in, out, err); @@ -170,4 +170,15 @@ final class Receive extends AbstractGitCommand { } } } + + private long getMaxObjectSizeLimit() { + long global = config.getMaxObjectSizeLimit(); + long local = projectControl.getProjectState().getMaxObjectSizeLimit(); + if (global > 0 && local > 0) { + return Math.min(global, local); + } else { + // zero means "no limit", in this case the max is more limiting + return Math.max(global, local); + } + } }