diff --git a/src/main/java/com/cloudbees/plugins/credentials/CredentialsProvider.java b/src/main/java/com/cloudbees/plugins/credentials/CredentialsProvider.java index 262fcd512..65c83cf7a 100644 --- a/src/main/java/com/cloudbees/plugins/credentials/CredentialsProvider.java +++ b/src/main/java/com/cloudbees/plugins/credentials/CredentialsProvider.java @@ -970,8 +970,9 @@ public static C findCredentialById(@NonNull String id, * @param run the {@link Run} to find the trigger of. * @return the trigger of the supplied run or {@code null} if this could not be determined. */ + @Restricted(NoExternalUse.class) @CheckForNull - private static Map.Entry> triggeredBy(Run run) { + public static Map.Entry> triggeredBy(Run run) { Cause.UserIdCause cause = run.getCause(Cause.UserIdCause.class); if (cause != null) { User u = User.get(cause.getUserId(), false, Collections.emptyMap()); @@ -1784,4 +1785,3 @@ public int compare(ListBoxModel.Option o1, ListBoxModel.Option o2) { } } } - diff --git a/src/main/java/com/cloudbees/plugins/credentials/builds/CredentialsParameterBinder.java b/src/main/java/com/cloudbees/plugins/credentials/builds/CredentialsParameterBinder.java index 36fecf887..eadbc4050 100644 --- a/src/main/java/com/cloudbees/plugins/credentials/builds/CredentialsParameterBinder.java +++ b/src/main/java/com/cloudbees/plugins/credentials/builds/CredentialsParameterBinder.java @@ -25,11 +25,12 @@ package com.cloudbees.plugins.credentials.builds; import com.cloudbees.plugins.credentials.CredentialsParameterValue; -import hudson.model.Cause; +import com.cloudbees.plugins.credentials.CredentialsProvider; import hudson.model.InvisibleAction; import hudson.model.ParameterValue; import hudson.model.ParametersAction; import hudson.model.Run; +import hudson.model.User; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -60,8 +61,8 @@ public static CredentialsParameterBinder getOrCreate(@Nonnull final Run ru resolver = new CredentialsParameterBinder(); final ParametersAction action = run.getAction(ParametersAction.class); if (action != null) { - final Cause.UserIdCause cause = run.getCause(Cause.UserIdCause.class); - final String userId = cause == null ? null : cause.getUserId(); + Map.Entry> triggeredBy = CredentialsProvider.triggeredBy(run); + final String userId = triggeredBy == null ? null : triggeredBy.getKey().getId(); for (final ParameterValue parameterValue : action) { if (parameterValue instanceof CredentialsParameterValue) { resolver.bindCredentialsParameter(userId, (CredentialsParameterValue) parameterValue); diff --git a/src/test/java/com/cloudbees/plugins/credentials/builds/CredentialsParameterBinderTest.java b/src/test/java/com/cloudbees/plugins/credentials/builds/CredentialsParameterBinderTest.java index edcd10ce1..69bab2a8e 100644 --- a/src/test/java/com/cloudbees/plugins/credentials/builds/CredentialsParameterBinderTest.java +++ b/src/test/java/com/cloudbees/plugins/credentials/builds/CredentialsParameterBinderTest.java @@ -36,6 +36,7 @@ import hudson.model.FreeStyleProject; import hudson.model.ParametersAction; import hudson.model.ParametersDefinitionProperty; +import hudson.model.Run; import hudson.model.User; import hudson.security.ACL; import hudson.security.ACLContext; @@ -125,6 +126,25 @@ public void forParameterNameReturnsTriggeringUser() throws Exception { assertNotNull(CredentialsProvider.findCredentialById(cred.getParameterName(), IdCredentials.class, build)); } + @Test + public void forParameterNameReturnsTriggeringUserForUpstream() throws Exception { + FreeStyleProject upstreamProject = j.createFreeStyleProject(); + upstreamProject.addProperty(new ParametersDefinitionProperty(new CredentialsParameterDefinition(PARAMETER_NAME, null, null, IdCredentials.class.getName(), true))); + final Run upstreamBuild = j.assertBuildStatusSuccess(upstreamProject.scheduleBuild2(0, + new Cause.UserIdCause(USER_ID), selectCredentialsById(USER_CREDENTIALS_ID))); + + addCredentialsParameterDefinition(); + final FreeStyleBuild build = j.assertBuildStatusSuccess(project.scheduleBuild2(0, + new Cause.UpstreamCause(upstreamBuild), selectCredentialsById(USER_CREDENTIALS_ID))); + final CredentialsParameterBinder binder = CredentialsParameterBinder.getOrCreate(build); + final CredentialsParameterBinding cred = binder.forParameterName(PARAMETER_NAME); + assertNotNull(cred); + assertEquals(USER_ID, cred.getUserId()); + assertEquals(USER_CREDENTIALS_ID, cred.getCredentialsId()); + // as a result: + assertNotNull(CredentialsProvider.findCredentialById(cred.getParameterName(), IdCredentials.class, build)); + } + private void addCredentialsParameterDefinition() throws IOException { project.addProperty(new ParametersDefinitionProperty(new CredentialsParameterDefinition(PARAMETER_NAME, null, null, IdCredentials.class.getName(), true))); } @@ -132,4 +152,4 @@ private void addCredentialsParameterDefinition() throws IOException { private static ParametersAction selectCredentialsById(String credentialsId) { return new ParametersAction(new CredentialsParameterValue(PARAMETER_NAME, credentialsId, null, false)); } -} \ No newline at end of file +}