diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java
index 8ffbdd9d06..17c42968b9 100644
--- a/core/src/main/java/hudson/PluginManager.java
+++ b/core/src/main/java/hudson/PluginManager.java
@@ -34,6 +34,8 @@ import hudson.model.Descriptor;
import hudson.model.Failure;
import hudson.model.UpdateCenter;
import hudson.model.UpdateSite;
+import hudson.security.Permission;
+import hudson.security.PermissionScope;
import hudson.util.CyclicGraphDetector;
import hudson.util.CyclicGraphDetector.CycleDetectedException;
import hudson.util.IOException2;
@@ -689,7 +691,7 @@ public abstract class PluginManager extends AbstractModelObject {
*/
public HttpResponse doUploadPlugin(StaplerRequest req) throws IOException, ServletException {
try {
- Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER);
+ Jenkins.getInstance().checkPermission(UPLOAD_PLUGINS);
ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
@@ -830,7 +832,9 @@ public abstract class PluginManager extends AbstractModelObject {
private static final Logger LOGGER = Logger.getLogger(PluginManager.class.getName());
public static boolean FAST_LOOKUP = !Boolean.getBoolean(PluginManager.class.getName()+".noFastLookup");
-
+
+ public static final Permission UPLOAD_PLUGINS = new Permission(Jenkins.PERMISSIONS, "UploadPlugins", Messages._PluginManager_UploadPluginsPermission_Description(),Jenkins.ADMINISTER,PermissionScope.JENKINS);
+
/**
* Remembers why a plugin failed to deploy.
*/
diff --git a/core/src/main/resources/hudson/Messages.properties b/core/src/main/resources/hudson/Messages.properties
index 0bb1216d96..d6e8c52de4 100644
--- a/core/src/main/resources/hudson/Messages.properties
+++ b/core/src/main/resources/hudson/Messages.properties
@@ -54,5 +54,8 @@ FilePath.TildaDoesntWork=''~'' is only supported in a Unix shell and nowhere els
PluginManager.DisplayName=Plugin Manager
PluginManager.PortNotANumber=Port is not a number
PluginManager.PortNotInRange=Port does''t range from {0} to {1}
+PluginManager.UploadPluginsPermission.Description=\
+ The "upload plugin" permission allows a user to upload arbitrary plugins.
+
AboutJenkins.DisplayName=About Jenkins
AboutJenkins.Description=See the version and license information
diff --git a/core/src/main/resources/hudson/PluginManager/advanced.jelly b/core/src/main/resources/hudson/PluginManager/advanced.jelly
index da82f1f666..c7431659f0 100644
--- a/core/src/main/resources/hudson/PluginManager/advanced.jelly
+++ b/core/src/main/resources/hudson/PluginManager/advanced.jelly
@@ -46,6 +46,7 @@ THE SOFTWARE.
+ ${%Upload Plugin}