├── .github ├── CODEOWNERS ├── dependabot.yml └── workflows │ ├── cd.yaml │ └── jenkins-security-scan.yml ├── .gitignore ├── .mvn ├── extensions.xml └── maven.config ├── CHANGELOG.md ├── Jenkinsfile ├── README.md ├── docs └── images │ └── build-user-vars-plugin-sample-usage.png ├── pom.xml └── src ├── main ├── java │ └── org │ │ └── jenkinsci │ │ └── plugins │ │ └── builduser │ │ ├── BuildUser.java │ │ ├── BuildUserVarsConfig.java │ │ ├── BuildUserVarsEnvironmentContributor.java │ │ ├── utils │ │ ├── BuildUserVariable.java │ │ └── UsernameUtils.java │ │ └── varsetter │ │ ├── IUsernameSettable.java │ │ └── impl │ │ ├── BranchIndexingTriggerDeterminant.java │ │ ├── RemoteCauseDeterminant.java │ │ ├── SCMTriggerCauseDeterminant.java │ │ ├── TimerTriggerCauseDeterminant.java │ │ ├── UserCauseDeterminant.java │ │ └── UserIdCauseDeterminant.java ├── resources │ ├── index.jelly │ └── org │ │ └── jenkinsci │ │ └── plugins │ │ └── builduser │ │ ├── BuildUser │ │ ├── config.jelly │ │ ├── global.jelly │ │ └── help.html │ │ └── BuildUserVarsConfig │ │ ├── config.jelly │ │ └── help-allBuilds.html └── webapp │ └── help.html └── test └── java └── org └── jenkinsci └── plugins └── builduser ├── BuildUserTest.java ├── BuildUserVarsConfigTest.java ├── BuildUserVarsIntegrationTest.java ├── utils └── UsernameUtilsTest.java └── varsetter └── impl ├── BranchIndexingTriggerDeterminantTest.java ├── RemoteCauseDeterminantTest.java ├── SCMTriggerCauseDeterminantTest.java ├── TimerTriggerCauseDeterminantTest.java ├── UserCauseDeterminantTest.java ├── UserIdCauseDeterminantEmailTest.java ├── UserIdCauseDeterminantSamlTest.java └── UserIdCauseDeterminantTest.java /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @jenkinsci/build-user-vars-plugin-developers 2 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuring-dependabot-version-updates 2 | 3 | version: 2 4 | updates: 5 | - package-ecosystem: maven 6 | directory: / 7 | schedule: 8 | interval: monthly 9 | - package-ecosystem: github-actions 10 | directory: / 11 | schedule: 12 | interval: monthly 13 | -------------------------------------------------------------------------------- /.github/workflows/cd.yaml: -------------------------------------------------------------------------------- 1 | name: cd 2 | on: 3 | workflow_dispatch: 4 | check_run: 5 | types: 6 | - completed 7 | 8 | permissions: 9 | checks: read 10 | contents: write 11 | 12 | jobs: 13 | maven-cd: 14 | uses: jenkins-infra/github-reusable-workflows/.github/workflows/maven-cd.yml@v1 15 | secrets: 16 | MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }} 17 | MAVEN_TOKEN: ${{ secrets.MAVEN_TOKEN }} 18 | -------------------------------------------------------------------------------- /.github/workflows/jenkins-security-scan.yml: -------------------------------------------------------------------------------- 1 | name: Jenkins Security Scan 2 | on: 3 | push: 4 | branches: 5 | - main 6 | pull_request: 7 | types: [ opened, synchronize, reopened ] 8 | workflow_dispatch: 9 | 10 | permissions: 11 | security-events: write 12 | contents: read 13 | actions: read 14 | 15 | jobs: 16 | security-scan: 17 | uses: jenkins-infra/jenkins-security-scan/.github/workflows/jenkins-security-scan.yaml@v2 18 | with: 19 | java-cache: 'maven' # Optionally enable use of a build dependency cache. Specify 'maven' or 'gradle' as appropriate. 20 | # java-version: 21 # Optionally specify what version of Java to set up for the build, or remove to use a recent default. 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | pom.xml.tag 3 | pom.xml.releaseBackup 4 | pom.xml.versionsBackup 5 | pom.xml.next 6 | release.properties 7 | dependency-reduced-pom.xml 8 | buildNumber.properties 9 | .idea 10 | *.iml 11 | work/ 12 | .classpath 13 | .project 14 | .settings/ -------------------------------------------------------------------------------- /.mvn/extensions.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | io.jenkins.tools.incrementals 4 | git-changelist-maven-extension 5 | 1.8 6 | 7 | 8 | -------------------------------------------------------------------------------- /.mvn/maven.config: -------------------------------------------------------------------------------- 1 | -Pconsume-incrementals 2 | -Pmight-produce-incrementals 3 | -Dchangelist.format=%d.v%s -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## Changelog 2 | 3 | ### 1.5 (Dec 11, 2015) 4 | 5 | - Support for [**Pipeline**](https://github.com/jenkinsci/pipeline-plugin). 6 | - Requires Jenkins version **1.609** or later. 7 | 8 | ### 1.4 (Oct 10, 2014) 9 | 10 | - Support for **BUILD\_USER\_EMAIL**. (see [MailerPlugin](https://github.com/jenkinsci/mailer-plugin)) 11 | - [JENKINS-22974](https://issues.jenkins-ci.org/browse/JENKINS-22974) - Fix **NPE** on non-existent upstream builds. 12 | 13 | ### 1.3 (Apr 12, 2014) 14 | 15 | - [JENKINS-19187](https://issues.jenkins-ci.org/browse/JENKINS-19187) - Set build user variables for Maven3 builds. 16 | 17 | ### 1.2 (Mar 18, 2014) 18 | 19 | - [JENKINS-21955](https://issues.jenkins-ci.org/browse/JENKINS-21955) - Set **BUILD\_USER** for cases where the build is triggered because of a source code change. 20 | - Set **BUILD\_USER** for cases where the build is triggered by an upstream build. 21 | 22 | ### 1.1 (Feb 18, 2012) 23 | 24 | - Add compatibility with all Jenkins versions starting from **1.396**. 25 | 26 | ### 1.0 (Feb 15, 2012) 27 | 28 | - Initial version. 29 | -------------------------------------------------------------------------------- /Jenkinsfile: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env groovy 2 | 3 | /* `buildPlugin` step provided by: https://github.com/jenkins-infra/pipeline-library */ 4 | buildPlugin(useContainerAgent: true, configurations: [ 5 | [platform: 'linux', jdk: 21], 6 | [platform: 'windows', jdk: 17], 7 | ]) 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Build User Vars Plugin 2 | 3 | [![Build Status](https://ci.jenkins.io/job/Plugins/job/build-user-vars-plugin/job/master/badge/icon)](https://ci.jenkins.io/job/Plugins/job/build-user-vars-plugin/job/master/) 4 | [![Coverage](https://ci.jenkins.io/job/Plugins/job/build-user-vars-plugin/job/master/badge/icon?status=${instructionCoverage}&subject=coverage&color=${colorInstructionCoverage})](https://ci.jenkins.io/job/Plugins/job/build-user-vars-plugin/job/master/coverage) 5 | [![Contributors](https://img.shields.io/github/contributors/jenkinsci/build-user-vars-plugin.svg)](https://github.com/jenkinsci/build-user-vars-plugin/graphs/contributors) 6 | [![Jenkins Plugin](https://img.shields.io/jenkins/plugin/v/build-user-vars-plugin.svg)](https://plugins.jenkins.io/build-user-vars-plugin) 7 | [![GitHub release](https://img.shields.io/github/release/jenkinsci/build-user-vars-plugin.svg?label=changelog)](https://github.com/jenkinsci/build-user-vars-plugin/releases/latest) 8 | [![Jenkins Plugin Installs](https://img.shields.io/jenkins/plugin/i/build-user-vars-plugin.svg?color=blue)](https://plugins.jenkins.io/build-user-vars-plugin) 9 | 10 | Set of **environment variables** that describe the user who started the build. 11 | 12 | ## Variables provided 13 | 14 | The plugin provides the following environment variables: 15 | 16 | | Variable | Description | 17 | |--------------------------|------------------------------------| 18 | | BUILD\_USER | Full name (first name + last name) | 19 | | BUILD\_USER\_FIRST\_NAME | First name | 20 | | BUILD\_USER\_LAST\_NAME | Last name | 21 | | BUILD\_USER\_ID | Jenkins user ID | 22 | | BUILD\_USER\_GROUPS | Jenkins user groups | 23 | | BUILD\_USER\_EMAIL | Email address | 24 | 25 | ## Since 1.8 26 | 27 | Set the global option to add build user variables to the environment for all builds (in **Manage Jenkins, Configure System**). 28 | 29 | ## Usage example 30 | 31 | Select *Set Jenkins user build variables* and reference the variables during the build: 32 | 33 | ![](docs/images/build-user-vars-plugin-sample-usage.png) 34 | 35 | ## Pipeline Examples 36 | 37 | ```groovy 38 | node { 39 | withBuildUser { 40 | def user = env.BUILD_USER_ID 41 | } 42 | } 43 | ``` 44 | 45 | or with declarative option: 46 | 47 | ```groovy 48 | options { 49 | withBuildUser() 50 | } 51 | ``` 52 | 53 | ## Changelog 54 | 55 | Release notes are available in [GitHub Releases](https://github.com/jenkinsci/build-user-vars-plugin/releases) since July 2020 (build-user-vars plugin 1.6 and later). 56 | Prior release notes are available in the plugin repository [changelog](https://github.com/jenkinsci/build-user-vars-plugin/blob/master/CHANGELOG.md). 57 | -------------------------------------------------------------------------------- /docs/images/build-user-vars-plugin-sample-usage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jenkinsci/build-user-vars-plugin/ea67c9d9d83122699b040b212e86ce35339a6ddf/docs/images/build-user-vars-plugin-sample-usage.png -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | 5 | org.jenkins-ci.plugins 6 | plugin 7 | 5.12 8 | 9 | 10 | 11 | build-user-vars-plugin 12 | ${changelist} 13 | hpi 14 | Jenkins build user vars plugin 15 | Sets username build variables 16 | 17 | https://github.com/jenkinsci/${project.artifactId} 18 | 19 | 20 | 21 | 22 | io.jenkins.tools.bom 23 | bom-${jenkins.baseline}.x 24 | 4228.v0a_71308d905b_ 25 | import 26 | pom 27 | 28 | 29 | 30 | 31 | 32 | 33 | MIT license 34 | https://opensource.org/licenses/MIT 35 | All source code is under the MIT license. 36 | 37 | 38 | 39 | 40 | 41 | gkonovalenko 42 | Gavriil Konovalenko 43 | gkonovalenko@gmail.com 44 | 45 | 46 | 47 | 48 | 49 | org.jenkins-ci.plugins 50 | mailer 51 | 52 | 53 | org.easymock 54 | easymock 55 | test 56 | 5.5.0 57 | 58 | 59 | org.jenkins-ci.plugins 60 | saml 61 | true 62 | 63 | 64 | org.jenkins-ci.plugins 65 | branch-api 66 | true 67 | 68 | 69 | 70 | 71 | 999999-SNAPSHOT 72 | 73 | 2.479 74 | ${jenkins.baseline}.1 75 | jenkinsci/${project.artifactId} 76 | 77 | 78 | 79 | scm:git:https://github.com/${gitHubRepo}.git 80 | scm:git:git@github.com:${gitHubRepo}.git 81 | https://github.com/${gitHubRepo} 82 | ${scmTag} 83 | 84 | 85 | 86 | 87 | repo.jenkins-ci.org 88 | https://repo.jenkins-ci.org/public/ 89 | 90 | 91 | 92 | 93 | 94 | 95 | repo.jenkins-ci.org 96 | https://repo.jenkins-ci.org/public/ 97 | 98 | 99 | 100 | 101 | 102 | 103 | org.apache.maven.plugins 104 | maven-surefire-plugin 105 | 106 | 107 | without-optional-test 108 | 109 | test 110 | 111 | 112 | 113 | org.jenkins-ci.plugins:saml 114 | 115 | 116 | **/*Saml* 117 | 118 | 119 | 120 | 121 | 122 | 1C 123 | all 124 | true 125 | 126 | 127 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /src/main/java/org/jenkinsci/plugins/builduser/BuildUser.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser; 2 | 3 | import edu.umd.cs.findbugs.annotations.NonNull; 4 | import hudson.EnvVars; 5 | import hudson.Extension; 6 | import hudson.FilePath; 7 | import hudson.Launcher; 8 | import hudson.model.AbstractProject; 9 | import hudson.model.Cause.RemoteCause; 10 | import hudson.model.Cause.UpstreamCause; 11 | import hudson.model.Cause.UserCause; 12 | import hudson.model.Cause.UserIdCause; 13 | import hudson.model.Job; 14 | import hudson.model.Run; 15 | import hudson.model.TaskListener; 16 | import hudson.tasks.BuildWrapperDescriptor; 17 | import hudson.triggers.SCMTrigger.SCMTriggerCause; 18 | import hudson.triggers.TimerTrigger.TimerTriggerCause; 19 | import jenkins.branch.BranchEventCause; 20 | import jenkins.branch.BranchIndexingCause; 21 | import jenkins.model.Jenkins; 22 | import jenkins.tasks.SimpleBuildWrapper; 23 | import org.jenkinsci.Symbol; 24 | import org.jenkinsci.plugins.builduser.varsetter.IUsernameSettable; 25 | import org.jenkinsci.plugins.builduser.varsetter.impl.*; 26 | import org.kohsuke.accmod.Restricted; 27 | import org.kohsuke.accmod.restrictions.NoExternalUse; 28 | import org.kohsuke.stapler.DataBoundConstructor; 29 | 30 | import java.util.Arrays; 31 | import java.util.HashMap; 32 | import java.util.Map; 33 | import java.util.logging.Logger; 34 | 35 | /** 36 | * This plugin is used to set build user variables, see {@link IUsernameSettable}: 37 | * 38 | * @author GKonovalenko 39 | * @see IUsernameSettable 40 | */ 41 | public class BuildUser extends SimpleBuildWrapper { 42 | 43 | private static final Logger log = Logger.getLogger(BuildUser.class.getName()); 44 | 45 | private static final String EXTENSION_DISPLAY_NAME = "Set jenkins user build variables"; 46 | 47 | 48 | @DataBoundConstructor 49 | public BuildUser() { 50 | //noop 51 | } 52 | 53 | @Override 54 | public void setUp(Context context, Run build, FilePath workspace, 55 | Launcher launcher, TaskListener listener, EnvVars initialEnvironment) { 56 | Map variables = new HashMap<>(); 57 | makeUserBuildVariables(build, variables); 58 | for (Map.Entry entry : variables.entrySet()) { 59 | context.env(entry.getKey(), entry.getValue()); 60 | } 61 | } 62 | 63 | /** 64 | * Retrieve user cause that triggered this build and populate variables accordingly 65 | *

66 | * TODO: The whole hierarchy and way of applying could be refactored. 67 | */ 68 | @Restricted(NoExternalUse.class) 69 | static void makeUserBuildVariables(@NonNull Run build, @NonNull Map variables) { 70 | 71 | /* Try to use UserIdCause to get & set jenkins user build variables */ 72 | UserIdCause userIdCause = build.getCause(UserIdCause.class); 73 | if (new UserIdCauseDeterminant().setJenkinsUserBuildVars(userIdCause, variables)) { 74 | return; 75 | } 76 | 77 | // Try to use deprecated UserCause to get & set jenkins user build variables 78 | @SuppressWarnings("deprecation") 79 | UserCause userCause = build.getCause(UserCause.class); 80 | if (new UserCauseDeterminant().setJenkinsUserBuildVars(userCause, variables)) { 81 | return; 82 | } 83 | 84 | // If build has been triggered form an upstream build, get UserCause from there to set user build variables 85 | UpstreamCause upstreamCause = build.getCause(UpstreamCause.class); 86 | if (upstreamCause != null) { 87 | Job job = Jenkins.get().getItemByFullName(upstreamCause.getUpstreamProject(), Job.class); 88 | if (job != null) { 89 | Run upstream = job.getBuildByNumber(upstreamCause.getUpstreamBuild()); 90 | if (upstream != null) { 91 | makeUserBuildVariables(upstream, variables); 92 | return; 93 | } 94 | } 95 | } 96 | 97 | // Other causes should be checked after as build can be triggered automatically and later rerun manually by a human. 98 | // In that case there will be multiple causes and the direct manually one is preferred to set in a variable. 99 | handleOtherCausesOrLogWarningIfUnhandled(build, variables); 100 | } 101 | 102 | private static void handleOtherCausesOrLogWarningIfUnhandled(@NonNull Run build, @NonNull Map variables) { 103 | // set BUILD_USER_NAME and ID to fixed value if the build was triggered by a change in the scm, timer or remotely with token 104 | SCMTriggerCause scmTriggerCause = build.getCause(SCMTriggerCause.class); 105 | if (new SCMTriggerCauseDeterminant().setJenkinsUserBuildVars(scmTriggerCause, variables)) { 106 | return; 107 | } 108 | 109 | TimerTriggerCause timerTriggerCause = build.getCause(TimerTriggerCause.class); 110 | if (new TimerTriggerCauseDeterminant().setJenkinsUserBuildVars(timerTriggerCause, variables)) { 111 | return; 112 | } 113 | 114 | RemoteCause remoteTriggerCause = build.getCause(RemoteCause.class); 115 | if (new RemoteCauseDeterminant().setJenkinsUserBuildVars(remoteTriggerCause, variables)) { 116 | return; 117 | } 118 | 119 | try { 120 | BranchIndexingCause branchIndexingCause = build.getCause(BranchIndexingCause.class); 121 | if (new BranchIndexingTriggerDeterminant().setJenkinsUserBuildVars(branchIndexingCause, variables)) { 122 | return; 123 | } 124 | 125 | BranchEventCause branchEventCause = build.getCause(BranchEventCause.class); 126 | if (branchEventCause != null) { 127 | // branch event cause does not have to be logged. 128 | return; 129 | } 130 | } catch (NoClassDefFoundError e) { 131 | log.fine("It seems the branch-api plugin is not installed, skipping."); 132 | } 133 | 134 | log.warning(() -> "Unsupported cause type(s): " + Arrays.toString(build.getCauses().toArray())); 135 | } 136 | 137 | @Extension 138 | @Symbol("withBuildUser") 139 | public static class DescriptorImpl extends BuildWrapperDescriptor { 140 | @Override 141 | public boolean isApplicable(AbstractProject item) { 142 | return true; 143 | } 144 | 145 | @NonNull 146 | @Override 147 | public String getDisplayName() { 148 | return EXTENSION_DISPLAY_NAME; 149 | } 150 | } 151 | } 152 | 153 | -------------------------------------------------------------------------------- /src/main/java/org/jenkinsci/plugins/builduser/BuildUserVarsConfig.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser; 2 | 3 | import hudson.Extension; 4 | import hudson.ExtensionList; 5 | 6 | import jenkins.model.GlobalConfiguration; 7 | 8 | import org.jenkinsci.Symbol; 9 | import org.kohsuke.stapler.DataBoundSetter; 10 | 11 | @Extension 12 | @Symbol("buildUserVars") 13 | public class BuildUserVarsConfig extends GlobalConfiguration { 14 | 15 | /** @return the singleton instance */ 16 | public static BuildUserVarsConfig get() { 17 | return ExtensionList.lookupSingleton(BuildUserVarsConfig.class); 18 | } 19 | 20 | /** Whether to activate {@link BuildUserVarsEnvironmentContributor}. */ 21 | private boolean allBuilds; 22 | 23 | public BuildUserVarsConfig() { 24 | // When Jenkins is restarted, load any saved configuration from disk. 25 | load(); 26 | } 27 | 28 | public boolean isAllBuilds() { 29 | return allBuilds; 30 | } 31 | 32 | @DataBoundSetter 33 | public void setAllBuilds(boolean allBuilds) { 34 | this.allBuilds = allBuilds; 35 | save(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/org/jenkinsci/plugins/builduser/BuildUserVarsEnvironmentContributor.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser; 2 | 3 | import edu.umd.cs.findbugs.annotations.NonNull; 4 | 5 | import hudson.EnvVars; 6 | import hudson.Extension; 7 | import hudson.model.EnvironmentContributor; 8 | import hudson.model.Run; 9 | import hudson.model.TaskListener; 10 | 11 | @Extension 12 | public class BuildUserVarsEnvironmentContributor extends EnvironmentContributor { 13 | 14 | @Override 15 | public void buildEnvironmentFor( 16 | @NonNull Run r, @NonNull EnvVars envs, @NonNull TaskListener listener) { 17 | if (BuildUserVarsConfig.get().isAllBuilds()) { 18 | BuildUser.makeUserBuildVariables(r, envs); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/org/jenkinsci/plugins/builduser/utils/BuildUserVariable.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.utils; 2 | 3 | public class BuildUserVariable { 4 | public static final String USERNAME = "BUILD_USER"; 5 | public static final String GROUPS = "BUILD_USER_GROUPS"; 6 | public static final String FIRST_NAME = "BUILD_USER_FIRST_NAME"; 7 | public static final String LAST_NAME = "BUILD_USER_LAST_NAME"; 8 | public static final String EMAIL = "BUILD_USER_EMAIL"; 9 | public static final String ID = "BUILD_USER_ID"; 10 | public static final String UNDEFINED = "UNDEFINED"; 11 | 12 | private BuildUserVariable() { 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/org/jenkinsci/plugins/builduser/utils/UsernameUtils.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.utils; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | * Utility class for manipulating and extracting parts from a full username. 7 | * This class provides methods to split a full username into first and last names. 8 | * 9 | * @author GKonovalenko 10 | */ 11 | public final class UsernameUtils { 12 | 13 | private UsernameUtils() { 14 | } 15 | 16 | /** 17 | * Splits a full username string into first and last names and sets the appropriate build variables. 18 | * 19 | * @param username The full username string, usually in the format "First Last" 20 | * @param variables A map to store the extracted variables, where to put build variables. 21 | */ 22 | public static void setUsernameVars(String username, Map variables) { 23 | variables.put(BuildUserVariable.USERNAME, username); 24 | variables.put(BuildUserVariable.FIRST_NAME, getFirstName(username)); 25 | variables.put(BuildUserVariable.LAST_NAME, getLastName(username)); 26 | } 27 | 28 | /** 29 | * Extracts the first name from a full name. 30 | * 31 | * @param fullName The full name string, e.g., "First Last" 32 | * @return The first name ("First") 33 | */ 34 | public static String getFirstName(String fullName) { 35 | if (fullName == null || fullName.trim().isEmpty()) { 36 | return ""; 37 | } 38 | String[] parts = splitName(fullName); 39 | return parts[0]; 40 | } 41 | 42 | /** 43 | * Extracts the last name from a full name. 44 | * 45 | * @param fullName The full name string, e.g., "First Last" 46 | * @return The last name ("Last") 47 | */ 48 | public static String getLastName(String fullName) { 49 | if (fullName == null || fullName.trim().isEmpty()) { 50 | return ""; 51 | } 52 | String[] parts = splitName(fullName); 53 | return parts.length >= 2 ? parts[1] : ""; 54 | } 55 | 56 | /** 57 | * Splits a full name into its constituent parts. 58 | * 59 | * @param fullName The full name string, e.g., "First Last" 60 | * @return An array containing the first and last name 61 | */ 62 | private static String[] splitName(String fullName) { 63 | return fullName.trim().split("\\s+"); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/org/jenkinsci/plugins/builduser/varsetter/IUsernameSettable.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter; 2 | 3 | import hudson.model.Cause; 4 | 5 | import java.util.Map; 6 | 7 | /** 8 | * Interface declaring method for setting jenkins user build variables parametrized by 9 | * {@link Cause} subclasses. 10 | *

11 | * User based {@link Cause} instance is the source of username data. 12 | * 13 | *

19 | * 20 | * @author GKonovalenko 21 | */ 22 | public interface IUsernameSettable { 23 | /** 24 | * Adds username build variables extracted from build cause to map of build variables. 25 | * 26 | * @param cause cause where to get username from. 27 | * @param variables ap of build variables, where to add username variables. 28 | * @return 29 | * true if username was determined and added to the passed map, 30 | * false otherwise. 31 | */ 32 | boolean setJenkinsUserBuildVars(T cause, Map variables); 33 | 34 | /** 35 | * Returns {@link Cause} subclass used to determine username. 36 | * @return class used to determine username. 37 | */ 38 | Class getUsedCauseClass(); 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/org/jenkinsci/plugins/builduser/varsetter/impl/BranchIndexingTriggerDeterminant.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import jenkins.branch.BranchIndexingCause; 4 | import org.jenkinsci.plugins.builduser.utils.BuildUserVariable; 5 | import org.jenkinsci.plugins.builduser.utils.UsernameUtils; 6 | import org.jenkinsci.plugins.builduser.varsetter.IUsernameSettable; 7 | 8 | import java.util.Map; 9 | 10 | public class BranchIndexingTriggerDeterminant implements IUsernameSettable { 11 | 12 | @Override 13 | public boolean setJenkinsUserBuildVars(BranchIndexingCause cause, Map variables) { 14 | if (cause == null) { 15 | return false; 16 | } 17 | 18 | UsernameUtils.setUsernameVars("Branch Indexing", variables); 19 | variables.put(BuildUserVariable.ID, "branchIndexing"); 20 | return true; 21 | } 22 | 23 | @Override 24 | public Class getUsedCauseClass() { 25 | return BranchIndexingCause.class; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/org/jenkinsci/plugins/builduser/varsetter/impl/RemoteCauseDeterminant.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import hudson.model.Cause.RemoteCause; 4 | import org.jenkinsci.plugins.builduser.utils.BuildUserVariable; 5 | import org.jenkinsci.plugins.builduser.utils.UsernameUtils; 6 | import org.jenkinsci.plugins.builduser.varsetter.IUsernameSettable; 7 | 8 | import java.util.Map; 9 | 10 | public class RemoteCauseDeterminant implements IUsernameSettable { 11 | 12 | @Override 13 | public boolean setJenkinsUserBuildVars(RemoteCause cause, Map variables) { 14 | if (cause == null) { 15 | return false; 16 | } 17 | 18 | //As of Jenkins 2.51 remote cause is set the build was triggered using token and real user is not set 19 | UsernameUtils.setUsernameVars(String.format("%s %s", cause.getAddr(), cause.getNote()), variables); 20 | variables.put(BuildUserVariable.ID, "remoteRequest"); 21 | return true; 22 | } 23 | 24 | @Override 25 | public Class getUsedCauseClass() { 26 | return RemoteCause.class; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/org/jenkinsci/plugins/builduser/varsetter/impl/SCMTriggerCauseDeterminant.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import hudson.triggers.SCMTrigger.SCMTriggerCause; 4 | import org.jenkinsci.plugins.builduser.utils.BuildUserVariable; 5 | import org.jenkinsci.plugins.builduser.utils.UsernameUtils; 6 | import org.jenkinsci.plugins.builduser.varsetter.IUsernameSettable; 7 | 8 | import java.util.Map; 9 | 10 | public class SCMTriggerCauseDeterminant implements IUsernameSettable { 11 | 12 | public boolean setJenkinsUserBuildVars(SCMTriggerCause cause, Map variables) { 13 | if (cause == null) { 14 | return false; 15 | } 16 | 17 | UsernameUtils.setUsernameVars("SCM Change", variables); 18 | variables.put(BuildUserVariable.ID, "scmChange"); 19 | 20 | return true; 21 | } 22 | 23 | public Class getUsedCauseClass() { 24 | return SCMTriggerCause.class; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/org/jenkinsci/plugins/builduser/varsetter/impl/TimerTriggerCauseDeterminant.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import hudson.triggers.TimerTrigger.TimerTriggerCause; 4 | import org.jenkinsci.plugins.builduser.utils.BuildUserVariable; 5 | import org.jenkinsci.plugins.builduser.utils.UsernameUtils; 6 | import org.jenkinsci.plugins.builduser.varsetter.IUsernameSettable; 7 | 8 | import java.util.Map; 9 | 10 | public class TimerTriggerCauseDeterminant implements IUsernameSettable { 11 | 12 | protected static final String TIMER_TRIGGER_DUMMY_USER_NAME = "Timer Trigger"; 13 | protected static final String TIMER_TRIGGER_DUMMY_USER_ID = "timer"; 14 | 15 | @Override 16 | public boolean setJenkinsUserBuildVars(TimerTriggerCause cause, Map variables) { 17 | if (cause == null) { 18 | return false; 19 | } 20 | 21 | UsernameUtils.setUsernameVars(TIMER_TRIGGER_DUMMY_USER_NAME, variables); 22 | variables.put(BuildUserVariable.ID, TIMER_TRIGGER_DUMMY_USER_ID); 23 | return true; 24 | } 25 | 26 | @Override 27 | public Class getUsedCauseClass() { 28 | return TimerTriggerCause.class; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/org/jenkinsci/plugins/builduser/varsetter/impl/UserCauseDeterminant.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import hudson.model.Cause.UserCause; 4 | import hudson.model.Cause.UserIdCause; 5 | import org.jenkinsci.plugins.builduser.utils.UsernameUtils; 6 | import org.jenkinsci.plugins.builduser.varsetter.IUsernameSettable; 7 | 8 | import java.util.Map; 9 | 10 | /** 11 | * This implementation is used to determine build username variables from {@link UserCause}. 12 | * This could be used with legacy version of jenkins, where {@link UserCause} is used instead of {@link UserIdCause}. 13 | * 14 | * @author GKonovalenko 15 | */ 16 | @SuppressWarnings("deprecation") 17 | public class UserCauseDeterminant implements IUsernameSettable { 18 | 19 | /** 20 | * {@inheritDoc} 21 | *

22 | * {@link UserCause} based implementation. 23 | */ 24 | public boolean setJenkinsUserBuildVars(UserCause cause, Map variables) { 25 | if (cause == null) { 26 | return false; 27 | } 28 | 29 | String username = cause.getUserName(); 30 | UsernameUtils.setUsernameVars(username, variables); 31 | 32 | return true; 33 | } 34 | 35 | /** 36 | * {@inheritDoc} 37 | */ 38 | public Class getUsedCauseClass() { 39 | return UserCause.class; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/org/jenkinsci/plugins/builduser/varsetter/impl/UserIdCauseDeterminant.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import hudson.model.Cause.UserIdCause; 4 | import hudson.model.User; 5 | import hudson.security.ACL; 6 | import hudson.security.SecurityRealm; 7 | import hudson.tasks.MailAddressResolver; 8 | import jenkins.model.Jenkins; 9 | import org.apache.commons.lang.StringUtils; 10 | import org.jenkinsci.plugins.builduser.utils.BuildUserVariable; 11 | import org.jenkinsci.plugins.builduser.utils.UsernameUtils; 12 | import org.jenkinsci.plugins.builduser.varsetter.IUsernameSettable; 13 | import org.jenkinsci.plugins.saml.SamlSecurityRealm; 14 | import org.springframework.security.core.GrantedAuthority; 15 | 16 | import java.util.Map; 17 | import java.util.Optional; 18 | import java.util.logging.Logger; 19 | import java.util.stream.Collectors; 20 | 21 | /** 22 | * This implementation is used to determine build username variables from {@link UserIdCause}. 23 | * 24 | * @author GKonovalenko 25 | */ 26 | public class UserIdCauseDeterminant implements IUsernameSettable { 27 | 28 | private static final Logger log = Logger.getLogger(UserIdCauseDeterminant.class.getName()); 29 | 30 | /** 31 | * {@inheritDoc} 32 | *

33 | * {@link UserIdCause} based implementation. 34 | */ 35 | public boolean setJenkinsUserBuildVars(UserIdCause cause, Map variables) { 36 | if (cause == null) { 37 | return false; 38 | } 39 | 40 | String username = cause.getUserName(); 41 | UsernameUtils.setUsernameVars(username, variables); 42 | 43 | String trimmedUserId = StringUtils.trimToEmpty(cause.getUserId()); 44 | String originalUserId = trimmedUserId.isEmpty() ? ACL.ANONYMOUS_USERNAME : trimmedUserId; 45 | String userid = mapUserId(originalUserId); 46 | 47 | variables.put(BuildUserVariable.ID, userid); 48 | 49 | setUserGroups(originalUserId, variables); 50 | setUserEmail(originalUserId, variables); 51 | 52 | return true; 53 | } 54 | 55 | private String mapUserId(String userId) { 56 | try { 57 | SecurityRealm realm = Jenkins.get().getSecurityRealm(); 58 | if (realm instanceof SamlSecurityRealm samlSecurityRealm) { 59 | String conversion = samlSecurityRealm.getUsernameCaseConversion(); 60 | return switch (conversion) { 61 | case "lowercase" -> userId.toLowerCase(); 62 | case "uppercase" -> userId.toUpperCase(); 63 | default -> userId; 64 | }; 65 | } 66 | } catch (NoClassDefFoundError e) { 67 | log.fine("It seems the saml plugin is not installed, skipping saml user name mapping."); 68 | } 69 | return userId; 70 | } 71 | 72 | private void setUserGroups(String userId, Map variables) { 73 | try { 74 | Optional.ofNullable(User.getById(userId, false)) 75 | .map(User::impersonate2) 76 | .map(authentication -> authentication.getAuthorities().stream() 77 | .map(GrantedAuthority::getAuthority) 78 | .filter(authority -> authority != null && !authority.isEmpty()) 79 | .collect(Collectors.joining(",")) 80 | ).ifPresentOrElse(groups -> 81 | variables.put(BuildUserVariable.GROUPS, groups) 82 | , () -> 83 | variables.put(BuildUserVariable.GROUPS, "") 84 | ); 85 | } catch (Exception err) { 86 | log.warning(String.format("Failed to get groups for user: %s error: %s ", userId, err)); 87 | } 88 | } 89 | 90 | private void setUserEmail(String userId, Map variables) { 91 | Optional.ofNullable(User.getById(userId, false)) 92 | .map(MailAddressResolver::resolve) 93 | .ifPresent(email -> variables.put(BuildUserVariable.EMAIL, email)); 94 | } 95 | 96 | /** 97 | * {@inheritDoc} 98 | */ 99 | public Class getUsedCauseClass() { 100 | return UserIdCause.class; 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/main/resources/index.jelly: -------------------------------------------------------------------------------- 1 | 2 | 7 |

8 | This plugin is used to set user build variables: jenkins user name and id. 9 |
-------------------------------------------------------------------------------- /src/main/resources/org/jenkinsci/plugins/builduser/BuildUser/config.jelly: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | -------------------------------------------------------------------------------- /src/main/resources/org/jenkinsci/plugins/builduser/BuildUser/global.jelly: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/resources/org/jenkinsci/plugins/builduser/BuildUser/help.html: -------------------------------------------------------------------------------- 1 |
2 | This plugin is used to set user build variables: 3 |
    4 |
  • BUILD_USER -- full name of user started build,
  • 5 |
  • BUILD_USER_FIRST_NAME -- first name of user started build,
  • 6 |
  • BUILD_USER_LAST_NAME -- last name of user started build,
  • 7 |
  • BUILD_USER_ID -- id of user started build.
  • 8 |
  • BUILD_USER_EMAIL -- email of user started build.
  • 9 |
10 |
-------------------------------------------------------------------------------- /src/main/resources/org/jenkinsci/plugins/builduser/BuildUserVarsConfig/config.jelly: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/main/resources/org/jenkinsci/plugins/builduser/BuildUserVarsConfig/help-allBuilds.html: -------------------------------------------------------------------------------- 1 |
2 | When checked, build user variables will be added to the environment for all builds. 3 | There is no need to use the Set Jenkins user build variables wrapper. 4 |
5 | -------------------------------------------------------------------------------- /src/main/webapp/help.html: -------------------------------------------------------------------------------- 1 |
2 | This plugin is used to set user build variables: 3 |
    4 |
  • BUILD_USER -- full name of user started build,
  • 5 |
  • BUILD_USER_FIRST_NAME -- first name of user started build,
  • 6 |
  • BUILD_USER_LAST_NAME -- last name of user started build,
  • 7 |
  • BUILD_USER_ID -- id of user started build.
  • 8 |
  • BUILD_USER_EMAIL -- email of user started build.
  • 9 |
10 |
11 | -------------------------------------------------------------------------------- /src/test/java/org/jenkinsci/plugins/builduser/BuildUserTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * The MIT License 3 | * 4 | * Copyright (c) 2013 Oleg Nenashev 5 | * 6 | * Permission is hereby granted, free of charge, to any person obtaining a copy 7 | * of this software and associated documentation files (the "Software"), to deal 8 | * in the Software without restriction, including without limitation the rights 9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | * copies of the Software, and to permit persons to whom the Software is 11 | * furnished to do so, subject to the following conditions: 12 | * 13 | * The above copyright notice and this permission notice shall be included in 14 | * all copies or substantial portions of the Software. 15 | * 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | * THE SOFTWARE. 23 | */ 24 | package org.jenkinsci.plugins.builduser; 25 | 26 | import hudson.model.AbstractProject; 27 | import hudson.model.Build; 28 | import hudson.model.Cause; 29 | import hudson.model.CauseAction; 30 | import hudson.model.FreeStyleBuild; 31 | import hudson.model.FreeStyleProject; 32 | import hudson.model.Result; 33 | import hudson.tasks.BuildTrigger; 34 | import java.util.ArrayList; 35 | import java.util.HashMap; 36 | import java.util.List; 37 | import java.util.Map; 38 | 39 | import static org.junit.jupiter.api.Assertions.*; 40 | 41 | import org.junit.jupiter.api.Test; 42 | import org.jvnet.hudson.test.Issue; 43 | import org.jvnet.hudson.test.JenkinsRule; 44 | import org.jvnet.hudson.test.MockBuilder; 45 | import org.jvnet.hudson.test.junit.jupiter.WithJenkins; 46 | 47 | /** 48 | * Contains tests of {@link BuildUser}. 49 | * @author Oleg Nenashev 50 | */ 51 | @WithJenkins 52 | class BuildUserTest { 53 | 54 | @Issue("JENKINS-22974") 55 | @Test 56 | void testMakeUserBuildVariablesWithoutUpstream(JenkinsRule r) throws Exception { 57 | // Initialize 58 | FreeStyleProject childProject = r.createFreeStyleProject(); 59 | List> childProjects = new ArrayList<>(1); 60 | childProjects.add(childProject); 61 | Map outputVars = new HashMap<>(); 62 | BuildUser buildUser = new BuildUser(); 63 | 64 | // Create the parent job 65 | FreeStyleProject parentProject = r.createFreeStyleProject(); 66 | parentProject.getBuildersList().add(new MockBuilder(Result.SUCCESS)); 67 | parentProject.getPublishersList().add(new BuildTrigger(childProjects, Result.SUCCESS)); 68 | parentProject.save(); 69 | r.jenkins.rebuildDependencyGraph(); 70 | 71 | // Trigger the first job. It should not trigger anything 72 | FreeStyleBuild upstreamBuild = r.buildAndAssertSuccess(parentProject); 73 | Thread.sleep(20000); 74 | assertEquals(1, childProject.getBuilds().toArray().length); 75 | 76 | // Register non-existent build as an execution cause 77 | Build downstreamBuild = childProject.getLastBuild(); 78 | List actions = downstreamBuild.getActions(CauseAction.class); 79 | assertEquals(1, actions.size(), "CauseAction has not been created properly"); 80 | Cause.UpstreamCause upstreamCause = null; 81 | List causes = actions.get(0).getCauses(); 82 | for (Cause cause : causes) { 83 | if (cause instanceof Cause.UpstreamCause) { 84 | upstreamCause = (Cause.UpstreamCause) cause; 85 | } 86 | } 87 | assertNotNull(upstreamCause, "Cannot extract the UpstreamCause"); 88 | buildUser.makeBuildVariables(downstreamBuild, outputVars); // Just a smoke check 89 | 90 | // Delete master build and check the correctness 91 | upstreamBuild.delete(); 92 | assertDoesNotThrow(() -> buildUser.makeBuildVariables(downstreamBuild, outputVars), 93 | "MakeBuildVariables() has failed with exception on non-existent upstream cause"); 94 | } 95 | 96 | } 97 | -------------------------------------------------------------------------------- /src/test/java/org/jenkinsci/plugins/builduser/BuildUserVarsConfigTest.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser; 2 | 3 | import static org.junit.jupiter.api.Assertions.assertFalse; 4 | import static org.junit.jupiter.api.Assertions.assertTrue; 5 | 6 | import org.htmlunit.html.HtmlCheckBoxInput; 7 | import org.htmlunit.html.HtmlForm; 8 | 9 | import org.junit.jupiter.api.Test; 10 | import org.jvnet.hudson.test.JenkinsRule; 11 | import org.jvnet.hudson.test.junit.jupiter.WithJenkins; 12 | 13 | @WithJenkins 14 | class BuildUserVarsConfigTest { 15 | 16 | /** 17 | * Tries to exercise enough code paths to catch common mistakes: 18 | * 19 | *
    20 | *
  • missing {@code load} 21 | *
  • missing {@code save} 22 | *
  • misnamed or absent getter/setter 23 | *
  • misnamed {@code textbox} 24 | *
25 | */ 26 | @Test 27 | void uiAndStorage(JenkinsRule r) throws Throwable { 28 | assertFalse(BuildUserVarsConfig.get().isAllBuilds(), "not set initially"); 29 | HtmlForm config = r.createWebClient().goTo("configure").getFormByName("config"); 30 | HtmlCheckBoxInput checkbox = config.getInputByName("_.allBuilds"); 31 | checkbox.setChecked(true); 32 | r.submit(config); 33 | assertTrue( 34 | BuildUserVarsConfig.get().isAllBuilds(), 35 | "global config page let us edit it"); 36 | 37 | r.restart(); 38 | 39 | assertTrue( 40 | BuildUserVarsConfig.get().isAllBuilds(), 41 | "still there after restart of Jenkins"); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/test/java/org/jenkinsci/plugins/builduser/BuildUserVarsIntegrationTest.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser; 2 | 3 | import hudson.EnvVars; 4 | import hudson.model.Cause; 5 | import hudson.model.CauseAction; 6 | import hudson.model.FreeStyleProject; 7 | import hudson.model.User; 8 | import hudson.tasks.Mailer; 9 | import org.junit.jupiter.api.Test; 10 | import org.jvnet.hudson.test.CaptureEnvironmentBuilder; 11 | import org.jvnet.hudson.test.JenkinsRule; 12 | import org.jvnet.hudson.test.junit.jupiter.WithJenkins; 13 | 14 | import static org.junit.jupiter.api.Assertions.assertEquals; 15 | 16 | @WithJenkins 17 | class BuildUserVarsIntegrationTest { 18 | private static final String TEST_USER_NAME = "Bob Smith"; 19 | private static final String TEST_USER_EMAIL = "bob@example.com"; 20 | 21 | @Test 22 | void smokes(JenkinsRule r) throws Exception { 23 | User user = User.getById("bob", true); 24 | user.setFullName(TEST_USER_NAME); 25 | user.addProperty(new Mailer.UserProperty(TEST_USER_EMAIL)); 26 | r.jenkins.setSecurityRealm(r.createDummySecurityRealm()); 27 | 28 | FreeStyleProject p = r.createFreeStyleProject(); 29 | p.getBuildWrappersList().add(new BuildUser()); 30 | CaptureEnvironmentBuilder captureEnvironment = new CaptureEnvironmentBuilder(); 31 | p.getBuildersList().add(captureEnvironment); 32 | r.assertBuildStatusSuccess( 33 | p.scheduleBuild2(0, new CauseAction(new Cause.UserIdCause(user.getId())))); 34 | 35 | EnvVars envVars = captureEnvironment.getEnvVars(); 36 | assertEquals(TEST_USER_NAME, envVars.get("BUILD_USER")); 37 | assertEquals("authenticated", envVars.get("BUILD_USER_GROUPS")); 38 | assertEquals("Bob", envVars.get("BUILD_USER_FIRST_NAME")); 39 | assertEquals("Smith", envVars.get("BUILD_USER_LAST_NAME")); 40 | assertEquals(TEST_USER_EMAIL, envVars.get("BUILD_USER_EMAIL")); 41 | assertEquals("bob", envVars.get("BUILD_USER_ID")); 42 | } 43 | 44 | @Test 45 | void allBuilds(JenkinsRule r) throws Exception { 46 | BuildUserVarsConfig config = BuildUserVarsConfig.get(); 47 | config.setAllBuilds(true); 48 | config.save(); 49 | 50 | User user = User.getById("bob", true); 51 | user.setFullName(TEST_USER_NAME); 52 | user.addProperty(new Mailer.UserProperty(TEST_USER_EMAIL)); 53 | r.jenkins.setSecurityRealm(r.createDummySecurityRealm()); 54 | 55 | FreeStyleProject p = r.createFreeStyleProject(); 56 | CaptureEnvironmentBuilder captureEnvironment = new CaptureEnvironmentBuilder(); 57 | p.getBuildersList().add(captureEnvironment); 58 | r.assertBuildStatusSuccess( 59 | p.scheduleBuild2(0, new CauseAction(new Cause.UserIdCause(user.getId())))); 60 | 61 | EnvVars envVars = captureEnvironment.getEnvVars(); 62 | assertEquals(TEST_USER_NAME, envVars.get("BUILD_USER")); 63 | assertEquals("authenticated", envVars.get("BUILD_USER_GROUPS")); 64 | assertEquals("Bob", envVars.get("BUILD_USER_FIRST_NAME")); 65 | assertEquals("Smith", envVars.get("BUILD_USER_LAST_NAME")); 66 | assertEquals(TEST_USER_EMAIL, envVars.get("BUILD_USER_EMAIL")); 67 | assertEquals("bob", envVars.get("BUILD_USER_ID")); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/test/java/org/jenkinsci/plugins/builduser/utils/UsernameUtilsTest.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.utils; 2 | 3 | import org.junit.jupiter.api.Test; 4 | 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | 8 | import static org.junit.jupiter.api.Assertions.assertEquals; 9 | 10 | /** 11 | * 12 | * @author GKonovalenko 13 | */ 14 | class UsernameUtilsTest { 15 | 16 | @Test 17 | void testGetFirstName() { 18 | assertEquals("First", UsernameUtils.getFirstName("First Second")); 19 | assertEquals("First", UsernameUtils.getFirstName("First Second")); 20 | assertEquals("First", UsernameUtils.getFirstName("First\tSecond")); 21 | assertEquals("First", UsernameUtils.getFirstName("First\t\tSecond")); 22 | assertEquals("First", UsernameUtils.getFirstName(" First Second ")); 23 | assertEquals("First", UsernameUtils.getFirstName("\t \tFirst\t \tSecond \t ")); 24 | assertEquals("", UsernameUtils.getFirstName("")); 25 | assertEquals("First", UsernameUtils.getFirstName(" First ")); 26 | assertEquals("", UsernameUtils.getFirstName(null)); 27 | } 28 | 29 | @Test 30 | void testGetLastName() { 31 | assertEquals("Second", UsernameUtils.getLastName("First Second")); 32 | assertEquals("Second", UsernameUtils.getLastName("First Second")); 33 | assertEquals("Second", UsernameUtils.getLastName("First\tSecond")); 34 | assertEquals("Second", UsernameUtils.getLastName("First\t\tSecond")); 35 | assertEquals("Second", UsernameUtils.getLastName(" First Second ")); 36 | assertEquals("Second", UsernameUtils.getLastName("\t \tFirst\t \tSecond \t ")); 37 | assertEquals("", UsernameUtils.getLastName("")); 38 | assertEquals("", UsernameUtils.getLastName(" First ")); 39 | assertEquals("", UsernameUtils.getLastName(null)); 40 | } 41 | 42 | @Test 43 | void testSetUsernameVars() { 44 | Map variables = new HashMap<>(); 45 | UsernameUtils.setUsernameVars("John Doe", variables); 46 | assertEquals("John Doe", variables.get(BuildUserVariable.USERNAME)); 47 | assertEquals("John", variables.get(BuildUserVariable.FIRST_NAME)); 48 | assertEquals("Doe", variables.get(BuildUserVariable.LAST_NAME)); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/test/java/org/jenkinsci/plugins/builduser/varsetter/impl/BranchIndexingTriggerDeterminantTest.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import jenkins.branch.BranchIndexingCause; 4 | import org.jenkinsci.plugins.builduser.utils.BuildUserVariable; 5 | import org.junit.jupiter.api.Test; 6 | 7 | import java.lang.reflect.Constructor; 8 | import java.util.Collections; 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | import static org.hamcrest.MatcherAssert.assertThat; 13 | import static org.hamcrest.Matchers.*; 14 | import static org.junit.jupiter.api.Assertions.assertFalse; 15 | import static org.junit.jupiter.api.Assertions.assertTrue; 16 | 17 | class BranchIndexingTriggerDeterminantTest { 18 | 19 | @Test 20 | void usedCauseClassIsBranchIndexingCause() { 21 | assertThat(new BranchIndexingTriggerDeterminant().getUsedCauseClass(), equalTo(BranchIndexingCause.class)); 22 | } 23 | 24 | @Test 25 | void setVarsReturnsFalseWithoutBuildUserVarsOnNullCause() { 26 | Map variables = new HashMap<>(); 27 | assertFalse(new BranchIndexingTriggerDeterminant().setJenkinsUserBuildVars(null, variables)); 28 | assertThat(variables, equalTo(Collections.emptyMap())); 29 | } 30 | 31 | @Test 32 | void setVarsReturnsTrueWithBuildUsersVarsOnValidCause() throws Exception { 33 | Map variables = new HashMap<>(); 34 | assertTrue(new BranchIndexingTriggerDeterminant().setJenkinsUserBuildVars(mockCause(), variables)); 35 | assertThat(variables, allOf(hasEntry(BuildUserVariable.USERNAME, "Branch Indexing"), 36 | hasEntry(BuildUserVariable.FIRST_NAME, "Branch"), 37 | hasEntry(BuildUserVariable.LAST_NAME, "Indexing"), 38 | hasEntry(BuildUserVariable.ID, "branchIndexing") 39 | )); 40 | } 41 | 42 | private static BranchIndexingCause mockCause() throws Exception { 43 | Constructor ctor = BranchIndexingCause.class.getDeclaredConstructor(); 44 | ctor.setAccessible(true); 45 | return ctor.newInstance(); 46 | } 47 | 48 | } -------------------------------------------------------------------------------- /src/test/java/org/jenkinsci/plugins/builduser/varsetter/impl/RemoteCauseDeterminantTest.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import hudson.model.Cause.RemoteCause; 4 | import org.jenkinsci.plugins.builduser.utils.BuildUserVariable; 5 | import org.junit.jupiter.api.Test; 6 | 7 | import java.lang.reflect.Constructor; 8 | import java.util.Collections; 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | import static org.hamcrest.MatcherAssert.assertThat; 13 | import static org.hamcrest.Matchers.*; 14 | import static org.junit.jupiter.api.Assertions.assertFalse; 15 | import static org.junit.jupiter.api.Assertions.assertTrue; 16 | 17 | class RemoteCauseDeterminantTest { 18 | 19 | @Test 20 | void usedCauseClassIsRemoteCause() { 21 | assertThat(new RemoteCauseDeterminant().getUsedCauseClass(), equalTo(RemoteCause.class)); 22 | } 23 | 24 | @Test 25 | void setVarsReturnsFalseWithoutBuildUserVarsOnNullCause() { 26 | Map variables = new HashMap<>(); 27 | assertFalse(new RemoteCauseDeterminant().setJenkinsUserBuildVars(null, variables)); 28 | assertThat(variables, equalTo(Collections.emptyMap())); 29 | } 30 | 31 | @Test 32 | void setVarsReturnsTrueWithBuildUsersVarsOnValidCause() throws Exception { 33 | Map variables = new HashMap<>(); 34 | assertTrue(new RemoteCauseDeterminant().setJenkinsUserBuildVars(mockCause(), variables)); 35 | assertThat(variables, allOf(hasEntry(BuildUserVariable.USERNAME, "host note"), 36 | hasEntry(BuildUserVariable.FIRST_NAME, "host"), 37 | hasEntry(BuildUserVariable.LAST_NAME, "note"), 38 | hasEntry(BuildUserVariable.ID, "remoteRequest") 39 | )); 40 | } 41 | 42 | private static RemoteCause mockCause() throws Exception { 43 | Constructor ctor = RemoteCause.class.getDeclaredConstructor(String.class, String.class); 44 | ctor.setAccessible(true); 45 | return ctor.newInstance("host", "note"); 46 | } 47 | 48 | } -------------------------------------------------------------------------------- /src/test/java/org/jenkinsci/plugins/builduser/varsetter/impl/SCMTriggerCauseDeterminantTest.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import hudson.triggers.SCMTrigger.SCMTriggerCause; 4 | import org.jenkinsci.plugins.builduser.utils.BuildUserVariable; 5 | import org.junit.jupiter.api.Test; 6 | 7 | import java.lang.reflect.Constructor; 8 | import java.util.Collections; 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | import static org.hamcrest.MatcherAssert.assertThat; 13 | import static org.hamcrest.Matchers.*; 14 | import static org.junit.jupiter.api.Assertions.assertFalse; 15 | import static org.junit.jupiter.api.Assertions.assertTrue; 16 | 17 | class SCMTriggerCauseDeterminantTest { 18 | 19 | @Test 20 | void usedCauseClassIsSCMTriggerCause() { 21 | assertThat(new SCMTriggerCauseDeterminant().getUsedCauseClass(), equalTo(SCMTriggerCause.class)); 22 | } 23 | 24 | @Test 25 | void setVarsReturnsFalseWithoutBuildUserVarsOnNullCause() { 26 | Map variables = new HashMap<>(); 27 | assertFalse(new SCMTriggerCauseDeterminant().setJenkinsUserBuildVars(null, variables)); 28 | assertThat(variables, equalTo(Collections.emptyMap())); 29 | } 30 | 31 | @Test 32 | void setVarsReturnsTrueWithBuildUsersVarsOnValidCause() throws Exception { 33 | Map variables = new HashMap<>(); 34 | assertTrue(new SCMTriggerCauseDeterminant().setJenkinsUserBuildVars(mockCause(), variables)); 35 | assertThat(variables, allOf(hasEntry(BuildUserVariable.USERNAME, "SCM Change"), 36 | hasEntry(BuildUserVariable.FIRST_NAME, "SCM"), 37 | hasEntry(BuildUserVariable.LAST_NAME, "Change"), 38 | hasEntry(BuildUserVariable.ID, "scmChange") 39 | )); 40 | } 41 | 42 | private static SCMTriggerCause mockCause() throws Exception { 43 | Constructor ctor = SCMTriggerCause.class.getDeclaredConstructor(); 44 | ctor.setAccessible(true); 45 | return ctor.newInstance(); 46 | } 47 | 48 | } -------------------------------------------------------------------------------- /src/test/java/org/jenkinsci/plugins/builduser/varsetter/impl/TimerTriggerCauseDeterminantTest.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import hudson.triggers.TimerTrigger.TimerTriggerCause; 4 | import org.jenkinsci.plugins.builduser.utils.BuildUserVariable; 5 | import org.jenkinsci.plugins.builduser.utils.UsernameUtils; 6 | import org.junit.jupiter.api.Test; 7 | 8 | import java.lang.reflect.Constructor; 9 | import java.util.Collections; 10 | import java.util.HashMap; 11 | import java.util.Map; 12 | 13 | import static org.hamcrest.MatcherAssert.assertThat; 14 | import static org.hamcrest.Matchers.*; 15 | import static org.junit.jupiter.api.Assertions.assertFalse; 16 | import static org.junit.jupiter.api.Assertions.assertTrue; 17 | 18 | class TimerTriggerCauseDeterminantTest { 19 | 20 | @Test 21 | void usedCauseClassIsSCMTriggerCause() { 22 | assertThat(new TimerTriggerCauseDeterminant().getUsedCauseClass(), equalTo(TimerTriggerCause.class)); 23 | } 24 | 25 | @Test 26 | void setVarsReturnsFalseWithoutBuildUserVarsOnNullCause() { 27 | Map variables = new HashMap<>(); 28 | assertFalse(new TimerTriggerCauseDeterminant().setJenkinsUserBuildVars(null, variables)); 29 | assertThat(variables, equalTo(Collections.emptyMap())); 30 | } 31 | 32 | @Test 33 | void setVarsReturnsTrueWithBuildUsersVarsOnValidCause() throws Exception { 34 | Map variables = new HashMap<>(); 35 | assertTrue(new TimerTriggerCauseDeterminant().setJenkinsUserBuildVars(mockCause(), variables)); 36 | assertThat(variables, allOf(hasEntry(BuildUserVariable.USERNAME, TimerTriggerCauseDeterminant.TIMER_TRIGGER_DUMMY_USER_NAME), 37 | hasEntry(BuildUserVariable.FIRST_NAME, UsernameUtils.getFirstName(TimerTriggerCauseDeterminant.TIMER_TRIGGER_DUMMY_USER_NAME)), 38 | hasEntry(BuildUserVariable.LAST_NAME, UsernameUtils.getLastName(TimerTriggerCauseDeterminant.TIMER_TRIGGER_DUMMY_USER_NAME)), 39 | hasEntry(BuildUserVariable.ID, TimerTriggerCauseDeterminant.TIMER_TRIGGER_DUMMY_USER_ID) 40 | )); 41 | } 42 | 43 | private static TimerTriggerCause mockCause() throws Exception { 44 | Constructor ctor = TimerTriggerCause.class.getDeclaredConstructor(); 45 | ctor.setAccessible(true); 46 | return ctor.newInstance(); 47 | } 48 | 49 | } -------------------------------------------------------------------------------- /src/test/java/org/jenkinsci/plugins/builduser/varsetter/impl/UserCauseDeterminantTest.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import hudson.model.Cause.UserCause; 4 | import org.jenkinsci.plugins.builduser.utils.BuildUserVariable; 5 | import org.junit.jupiter.api.Test; 6 | 7 | import java.util.Collections; 8 | import java.util.HashMap; 9 | import java.util.Map; 10 | 11 | import static org.hamcrest.MatcherAssert.assertThat; 12 | import static org.hamcrest.Matchers.*; 13 | import static org.junit.jupiter.api.Assertions.assertFalse; 14 | import static org.junit.jupiter.api.Assertions.assertTrue; 15 | 16 | class UserCauseDeterminantTest { 17 | 18 | @Test 19 | void usedCauseClassIsUserCause() { 20 | assertThat(new UserCauseDeterminant().getUsedCauseClass(), equalTo(UserCause.class)); 21 | } 22 | 23 | @Test 24 | void setVarsReturnsFalseWithoutBuildUserVarsOnNullCause() { 25 | Map variables = new HashMap<>(); 26 | assertFalse(new UserCauseDeterminant().setJenkinsUserBuildVars(null, variables)); 27 | assertThat(variables, equalTo(Collections.emptyMap())); 28 | } 29 | 30 | @Test 31 | void setVarsReturnsTrueWithBuildUsersVarsOnValidCause() { 32 | Map variables = new HashMap<>(); 33 | assertTrue(new UserCauseDeterminant().setJenkinsUserBuildVars(mockCause(), variables)); 34 | assertThat(variables, allOf(hasEntry(BuildUserVariable.USERNAME, "John Doe"), 35 | hasEntry(BuildUserVariable.FIRST_NAME, "John"), 36 | hasEntry(BuildUserVariable.LAST_NAME, "Doe") 37 | )); 38 | } 39 | 40 | private static UserCause mockCause() { 41 | return new UserCause() { 42 | @Override 43 | public String getUserName() { 44 | return "John Doe"; 45 | } 46 | }; 47 | } 48 | 49 | } -------------------------------------------------------------------------------- /src/test/java/org/jenkinsci/plugins/builduser/varsetter/impl/UserIdCauseDeterminantEmailTest.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import hudson.model.Cause.UserIdCause; 4 | import hudson.model.User; 5 | import hudson.tasks.MailAddressResolver; 6 | import hudson.tasks.Mailer.UserProperty; 7 | import org.jenkinsci.plugins.builduser.utils.BuildUserVariable; 8 | import org.junit.Rule; 9 | import org.junit.Test; 10 | import org.jvnet.hudson.test.JenkinsRule; 11 | import org.jvnet.hudson.test.TestExtension; 12 | 13 | import java.io.IOException; 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | 17 | import static org.hamcrest.CoreMatchers.equalTo; 18 | import static org.hamcrest.CoreMatchers.is; 19 | import static org.hamcrest.MatcherAssert.assertThat; 20 | 21 | public class UserIdCauseDeterminantEmailTest { 22 | public static final String TEST_USER = "test_user"; 23 | 24 | @Rule 25 | public JenkinsRule r = new JenkinsRule(); 26 | 27 | @Test 28 | public void testSetJenkinsUserBuildVarsEmailWithResolver() throws IOException { 29 | User user = User.getById(TEST_USER, true); 30 | assert user != null; 31 | user.addProperty(new UserProperty(null)); 32 | 33 | JenkinsRule.DummySecurityRealm realm = r.createDummySecurityRealm(); 34 | r.jenkins.setSecurityRealm(realm); 35 | 36 | Map outputVars = new HashMap<>(); 37 | UserIdCause cause = new UserIdCause(TEST_USER); 38 | UserIdCauseDeterminant determinant = new UserIdCauseDeterminant(); 39 | determinant.setJenkinsUserBuildVars(cause, outputVars); 40 | 41 | assertThat(outputVars.get(BuildUserVariable.EMAIL), is(equalTo("resolveduser@example.com"))); 42 | } 43 | 44 | @TestExtension 45 | public static class TestMailAddressResolver extends MailAddressResolver { 46 | @Override 47 | public String findMailAddressFor(User user) { 48 | return "resolveduser@example.com"; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/test/java/org/jenkinsci/plugins/builduser/varsetter/impl/UserIdCauseDeterminantSamlTest.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import hudson.model.Cause.UserIdCause; 4 | import hudson.security.ChainedServletFilter2; 5 | import hudson.security.SecurityRealm; 6 | import jenkins.model.IdStrategy; 7 | import org.easymock.EasyMock; 8 | import org.jenkinsci.plugins.builduser.utils.BuildUserVariable; 9 | import org.jenkinsci.plugins.saml.SamlSecurityRealm; 10 | import org.junit.jupiter.api.Test; 11 | import org.jvnet.hudson.test.JenkinsRule; 12 | import org.jvnet.hudson.test.junit.jupiter.WithJenkins; 13 | import org.springframework.security.core.GrantedAuthority; 14 | import org.springframework.security.core.userdetails.User; 15 | 16 | import jakarta.servlet.FilterConfig; 17 | import java.util.ArrayList; 18 | import java.util.HashMap; 19 | import java.util.Map; 20 | 21 | import static org.easymock.EasyMock.anyObject; 22 | import static org.hamcrest.CoreMatchers.equalTo; 23 | import static org.hamcrest.CoreMatchers.is; 24 | import static org.hamcrest.MatcherAssert.assertThat; 25 | 26 | @WithJenkins 27 | class UserIdCauseDeterminantSamlTest { 28 | private static final String TEST_USER = "Testuser"; 29 | 30 | private static Map runSamlSecurityRealmTest(JenkinsRule r, String userid, String caseConversion) { 31 | ArrayList grantedAuthorities = new ArrayList<>(); 32 | User user = new User(userid, "password123", true, true, true, true, grantedAuthorities); 33 | SamlSecurityRealm realm = EasyMock.mock(SamlSecurityRealm.class); 34 | 35 | IdStrategy strategy = new IdStrategy.CaseSensitive(); 36 | EasyMock.expect(realm.getUserIdStrategy()).andReturn(strategy).anyTimes(); 37 | EasyMock.expect(realm.getSecurityComponents()).andReturn(new SecurityRealm.SecurityComponents()); 38 | EasyMock.expect(realm.createFilter(anyObject(FilterConfig.class))).andReturn(new ChainedServletFilter2()); 39 | EasyMock.expect(realm.getUsernameCaseConversion()).andReturn(caseConversion); 40 | EasyMock.expect(realm.loadUserByUsername2(userid)).andReturn(user).anyTimes(); 41 | 42 | EasyMock.replay(realm); 43 | 44 | hudson.model.User.getById(userid, true); 45 | r.jenkins.setSecurityRealm(realm); 46 | Map outputVars = new HashMap<>(); 47 | UserIdCause cause = new UserIdCause(userid); 48 | UserIdCauseDeterminant determinant = new UserIdCauseDeterminant(); 49 | determinant.setJenkinsUserBuildVars(cause, outputVars); 50 | return outputVars; 51 | } 52 | 53 | @Test 54 | void testSetJenkinsUserBuildVarsSamlUpperCase(JenkinsRule r) { 55 | Map outputVars = runSamlSecurityRealmTest(r, TEST_USER, "uppercase"); 56 | assertThat(outputVars.get(BuildUserVariable.ID), is(equalTo("TESTUSER"))); 57 | } 58 | 59 | @Test 60 | void testSetJenkinsUserBuildVarsSamlLowerCase(JenkinsRule r) { 61 | Map outputVars = runSamlSecurityRealmTest(r, TEST_USER, "lowercase"); 62 | assertThat(outputVars.get(BuildUserVariable.ID), is(equalTo("testuser"))); 63 | } 64 | 65 | @Test 66 | void testSetJenkinsUserBuildVarsSamlNoCase(JenkinsRule r) { 67 | Map outputVars = runSamlSecurityRealmTest(r, TEST_USER, "none"); 68 | assertThat(outputVars.get(BuildUserVariable.ID), is(equalTo(TEST_USER))); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/test/java/org/jenkinsci/plugins/builduser/varsetter/impl/UserIdCauseDeterminantTest.java: -------------------------------------------------------------------------------- 1 | package org.jenkinsci.plugins.builduser.varsetter.impl; 2 | 3 | import hudson.model.Cause.UserIdCause; 4 | import hudson.model.User; 5 | import hudson.tasks.Mailer.UserProperty; 6 | import org.jenkinsci.plugins.builduser.utils.BuildUserVariable; 7 | import org.junit.jupiter.api.Test; 8 | import org.jvnet.hudson.test.JenkinsRule; 9 | import org.jvnet.hudson.test.junit.jupiter.WithJenkins; 10 | 11 | import java.io.IOException; 12 | import java.util.HashMap; 13 | import java.util.Map; 14 | 15 | import static org.hamcrest.CoreMatchers.equalTo; 16 | import static org.hamcrest.CoreMatchers.is; 17 | import static org.hamcrest.MatcherAssert.assertThat; 18 | 19 | @WithJenkins 20 | class UserIdCauseDeterminantTest { 21 | private static final String TEST_USER = "test_user"; 22 | 23 | @Test 24 | void testSetJenkinsUserBuildVars(JenkinsRule r) { 25 | User.getById(TEST_USER, true); 26 | JenkinsRule.DummySecurityRealm realm = r.createDummySecurityRealm(); 27 | r.jenkins.setSecurityRealm(realm); 28 | realm.addGroups(TEST_USER, "group1", "group2"); 29 | Map outputVars = new HashMap<>(); 30 | UserIdCause cause = new UserIdCause(TEST_USER); 31 | UserIdCauseDeterminant determinant = new UserIdCauseDeterminant(); 32 | determinant.setJenkinsUserBuildVars(cause, outputVars); 33 | assertThat(outputVars.get(BuildUserVariable.GROUPS), is(equalTo("authenticated,group1,group2"))); 34 | } 35 | 36 | @Test 37 | void testSetJenkinsUserBuildVarsInvalidUser(JenkinsRule r) { 38 | JenkinsRule.DummySecurityRealm realm = r.createDummySecurityRealm(); 39 | r.jenkins.setSecurityRealm(realm); 40 | Map outputVars = new HashMap<>(); 41 | UserIdCause cause = new UserIdCause(TEST_USER); 42 | UserIdCauseDeterminant determinant = new UserIdCauseDeterminant(); 43 | determinant.setJenkinsUserBuildVars(cause, outputVars); 44 | assertThat(outputVars.get(BuildUserVariable.GROUPS), is(equalTo(""))); 45 | } 46 | 47 | @Test 48 | void testSetJenkinsUserBuildVarsNoGroups(JenkinsRule r) { 49 | User.getById(TEST_USER, true); 50 | JenkinsRule.DummySecurityRealm realm = r.createDummySecurityRealm(); 51 | r.jenkins.setSecurityRealm(realm); 52 | Map outputVars = new HashMap<>(); 53 | UserIdCause cause = new UserIdCause(TEST_USER); 54 | UserIdCauseDeterminant determinant = new UserIdCauseDeterminant(); 55 | determinant.setJenkinsUserBuildVars(cause, outputVars); 56 | assertThat(outputVars.get(BuildUserVariable.GROUPS), is(equalTo("authenticated"))); 57 | } 58 | 59 | @Test 60 | void testSetJenkinsUserBuildVarsNoSecurityRealm(JenkinsRule r) { 61 | User.getById(TEST_USER, true); 62 | Map outputVars = new HashMap<>(); 63 | UserIdCause cause = new UserIdCause(TEST_USER); 64 | UserIdCauseDeterminant determinant = new UserIdCauseDeterminant(); 65 | determinant.setJenkinsUserBuildVars(cause, outputVars); 66 | assertThat(outputVars.get(BuildUserVariable.GROUPS), is(equalTo(null))); 67 | } 68 | 69 | @Test 70 | void testSetJenkinsUserBuildVarsEmail(JenkinsRule r) throws IOException { 71 | User user = User.getById(TEST_USER, true); 72 | user.addProperty(new UserProperty("testuser@example.com")); 73 | JenkinsRule.DummySecurityRealm realm = r.createDummySecurityRealm(); 74 | r.jenkins.setSecurityRealm(realm); 75 | Map outputVars = new HashMap<>(); 76 | UserIdCause cause = new UserIdCause(TEST_USER); 77 | UserIdCauseDeterminant determinant = new UserIdCauseDeterminant(); 78 | determinant.setJenkinsUserBuildVars(cause, outputVars); 79 | assertThat(outputVars.get(BuildUserVariable.EMAIL), is(equalTo("testuser@example.com"))); 80 | } 81 | 82 | @Test 83 | void testSetJenkinsUserBuildVarsId(JenkinsRule r) { 84 | User.getById(TEST_USER, true); 85 | JenkinsRule.DummySecurityRealm realm = r.createDummySecurityRealm(); 86 | r.jenkins.setSecurityRealm(realm); 87 | Map outputVars = new HashMap<>(); 88 | UserIdCause cause = new UserIdCause(TEST_USER); 89 | UserIdCauseDeterminant determinant = new UserIdCauseDeterminant(); 90 | determinant.setJenkinsUserBuildVars(cause, outputVars); 91 | assertThat(outputVars.get(BuildUserVariable.ID), is(equalTo(TEST_USER))); 92 | } 93 | 94 | @Test 95 | void testSetJenkinsUserBuildVarsKeepsExistingVariables(JenkinsRule r) { 96 | User.getById(TEST_USER, true); 97 | JenkinsRule.DummySecurityRealm realm = r.createDummySecurityRealm(); 98 | r.jenkins.setSecurityRealm(realm); 99 | 100 | Map outputVars = new HashMap<>(); 101 | outputVars.put("EXISTING_VAR", "existing_value"); 102 | 103 | UserIdCause cause = new UserIdCause(TEST_USER); 104 | UserIdCauseDeterminant determinant = new UserIdCauseDeterminant(); 105 | 106 | determinant.setJenkinsUserBuildVars(cause, outputVars); 107 | 108 | assertThat(outputVars.get("EXISTING_VAR"), is(equalTo("existing_value"))); 109 | } 110 | 111 | @Test 112 | void testSetJenkinsUserBuildVarsNoEmail(JenkinsRule r) throws IOException { 113 | User user = User.getById(TEST_USER, true); 114 | user.addProperty(new UserProperty(null)); 115 | JenkinsRule.DummySecurityRealm realm = r.createDummySecurityRealm(); 116 | r.jenkins.setSecurityRealm(realm); 117 | 118 | Map outputVars = new HashMap<>(); 119 | UserIdCause cause = new UserIdCause(TEST_USER); 120 | UserIdCauseDeterminant determinant = new UserIdCauseDeterminant(); 121 | 122 | determinant.setJenkinsUserBuildVars(cause, outputVars); 123 | 124 | assertThat(outputVars.get(BuildUserVariable.EMAIL), is(equalTo(null))); 125 | } 126 | } 127 | --------------------------------------------------------------------------------