From a8b2d7b5b5368c5703be72c2f9a46d6d99e332fd Mon Sep 17 00:00:00 2001 From: Gert Palok Date: Wed, 19 May 2021 12:51:54 +0300 Subject: [PATCH 1/3] [JENKINS-59109] Add failing test --- .../CredentialsParameterBinderTest.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) 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 +} From 5066aa310f6a6222809b2883bcb50638b429cec1 Mon Sep 17 00:00:00 2001 From: Gert Palok Date: Wed, 19 May 2021 12:45:46 +0300 Subject: [PATCH 2/3] [JENKINS-59109] Bind triggering user's credentials Use CredentialsProvider.triggeredBy to handle case when cause is UpstreamCause chain ending in UserIdCause --- .../cloudbees/plugins/credentials/CredentialsProvider.java | 2 +- .../credentials/builds/CredentialsParameterBinder.java | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/cloudbees/plugins/credentials/CredentialsProvider.java b/src/main/java/com/cloudbees/plugins/credentials/CredentialsProvider.java index 262fcd512..5ff73ca3a 100644 --- a/src/main/java/com/cloudbees/plugins/credentials/CredentialsProvider.java +++ b/src/main/java/com/cloudbees/plugins/credentials/CredentialsProvider.java @@ -971,7 +971,7 @@ public static C findCredentialById(@NonNull String id, * @return the trigger of the supplied run or {@code null} if this could not be determined. */ @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()); 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); From 3bc0a2eb998e2297ad68e387ec9b4974cb5f7d2d Mon Sep 17 00:00:00 2001 From: Gert Palok Date: Thu, 20 May 2021 15:18:11 +0300 Subject: [PATCH 3/3] Update src/main/java/com/cloudbees/plugins/credentials/CredentialsProvider.java Co-authored-by: Jesse Glick --- .../com/cloudbees/plugins/credentials/CredentialsProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/cloudbees/plugins/credentials/CredentialsProvider.java b/src/main/java/com/cloudbees/plugins/credentials/CredentialsProvider.java index 5ff73ca3a..65c83cf7a 100644 --- a/src/main/java/com/cloudbees/plugins/credentials/CredentialsProvider.java +++ b/src/main/java/com/cloudbees/plugins/credentials/CredentialsProvider.java @@ -970,6 +970,7 @@ 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 public static Map.Entry> triggeredBy(Run run) { Cause.UserIdCause cause = run.getCause(Cause.UserIdCause.class); @@ -1784,4 +1785,3 @@ public int compare(ListBoxModel.Option o1, ListBoxModel.Option o2) { } } } -