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 extends T> list, String className) {
+ public static @CheckForNull T find(Collection extends T> 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.