diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index c581a2e82d1b2c65c9e6451cbf676cd6417432d6..e5512c2cd362b50dd5dc33535c52d55c151a1baf 100644 --- a/core/src/main/java/hudson/model/AbstractProject.java +++ b/core/src/main/java/hudson/model/AbstractProject.java @@ -1794,6 +1794,13 @@ public abstract class AbstractProject

,R extends A triggers = buildDescribable(req, Trigger.for_(this)); for (Trigger t : triggers) t.start(this,true); + + for (Publisher _t : Descriptor.newInstancesFromHeteroList(req, json, "publisher", Jenkins.getInstance().getExtensionList(BuildTrigger.DescriptorImpl.class))) { + BuildTrigger t = (BuildTrigger) _t; + for (AbstractProject downstream : t.getChildProjects(this)) { + downstream.checkPermission(BUILD); + } + } } /** diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index 1ba4236b6866abcb2927890bad161ff1639747e5..7e918abf972ddcc8d28a8476da8702fe5b41642c 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -72,6 +72,7 @@ import java.lang.reflect.Type; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.beans.Introspector; +import javax.annotation.CheckForNull; /** * Metadata about a configurable instance. @@ -909,7 +910,10 @@ public abstract class Descriptor> implements Saveable { for (Object o : JSONArray.fromObject(formData)) { JSONObject jo = (JSONObject)o; String kind = jo.getString("kind"); - items.add(find(descriptors,kind).newInstance(req,jo)); + Descriptor d = find(descriptors, kind); + if (d != null) { + items.add(d.newInstance(req, jo)); + } } } @@ -919,7 +923,7 @@ public abstract class Descriptor> implements Saveable { /** * Finds a descriptor from a collection by its class name. */ - public static T find(Collection list, String className) { + public static @CheckForNull T find(Collection list, String className) { for (T d : list) { if(d.getClass().getName().equals(className)) return d; @@ -933,7 +937,7 @@ public abstract class Descriptor> implements Saveable { return null; } - public static Descriptor find(String className) { + public static @CheckForNull Descriptor find(String className) { return find(Jenkins.getInstance().getExtensionList(Descriptor.class),className); } diff --git a/core/src/main/java/hudson/tasks/BuildTrigger.java b/core/src/main/java/hudson/tasks/BuildTrigger.java index 2392086b21b39a7909645e541bedef37729f13f4..c66592b1f42fd58f0f06c3051c1220a9b56ed118 100644 --- a/core/src/main/java/hudson/tasks/BuildTrigger.java +++ b/core/src/main/java/hudson/tasks/BuildTrigger.java @@ -318,7 +318,7 @@ public class BuildTrigger extends Recorder implements DependecyDeclarer { /** * Form validation method. */ - public FormValidation doCheck(@AncestorInPath Item project, @QueryParameter String value ) { + public FormValidation doCheck(@AncestorInPath Item project, @QueryParameter String value, @QueryParameter boolean upstream) { // Require CONFIGURE permission on this project if(!project.hasPermission(Item.CONFIGURE)) return FormValidation.ok(); @@ -333,6 +333,9 @@ public class BuildTrigger extends Recorder implements DependecyDeclarer { AbstractProject.findNearest(projectName,project.getParent()).getRelativeNameFrom(project))); if(!(item instanceof AbstractProject)) return FormValidation.error(Messages.BuildTrigger_NotBuildable(projectName)); + if (!upstream && !item.hasPermission(Item.BUILD)) { + return FormValidation.error(Messages.BuildTrigger_you_have_no_permission_to_build_(projectName)); + } hasProjects = true; } } diff --git a/core/src/main/resources/hudson/tasks/Messages.properties b/core/src/main/resources/hudson/tasks/Messages.properties index 3612c006353e7fb79c2119b94940cc11208eb652..0499c27c74d42170caa0b5e10d9c881f411b6def 100644 --- a/core/src/main/resources/hudson/tasks/Messages.properties +++ b/core/src/main/resources/hudson/tasks/Messages.properties @@ -47,6 +47,7 @@ BuildTrigger.NoSuchProject=No such project ''{0}''. Did you mean ''{1}''? BuildTrigger.NoProjectSpecified=No project specified BuildTrigger.NotBuildable={0} is not buildable BuildTrigger.Triggering=Triggering a new build of {0} +BuildTrigger.you_have_no_permission_to_build_=You have no permission to build {0} CommandInterpreter.CommandFailed=command execution failed CommandInterpreter.UnableToDelete=Unable to delete script file {0} diff --git a/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger.jelly b/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger.jelly index 1aa57e758806d389eca1c6b870bc2d007c5e8e48..a4634c724de9338bdd9e5eedfa699cfbdf629f3d 100644 --- a/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger.jelly +++ b/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger.jelly @@ -38,7 +38,7 @@ THE SOFTWARE.