Skip to content

Commit f572fd7

Browse files
committed
Fix OIDC token exchange for Artifactory, Distribution and Xray service connections
1 parent 6be9725 commit f572fd7

15 files changed

Lines changed: 91 additions & 86 deletions

File tree

jfrog-tasks-utils/utils.js

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -393,37 +393,42 @@ function maskSecrets(str) {
393393
.replace(/--access-token='.*?'/g, '--access-token=***');
394394
}
395395

396-
async function configureJfrogCliServer(jfrogService, serverId, cliPath, buildDir) {
397-
let oidcProviderName = tl.getEndpointAuthorizationParameter(jfrogService, 'oidcProviderName', true);
398-
let oidcAccessToken;
399-
400-
if (oidcProviderName) {
401-
let serviceUrl = tl.getEndpointUrl(jfrogService, false);
402-
let platformUrl = '';
403-
try {
404-
platformUrl = tl.getEndpointAuthorizationParameter(jfrogService, 'jfrogPlatformUrl', true);
405-
} catch (error) {
406-
console.warn('Failed to get platform url from field: ' + error + '\nparsing from url instead');
407-
}
408-
if (!platformUrl || !platformUrl.trim()) {
409-
platformUrl = parsePlatformUrlFromServiceUrl(serviceUrl);
410-
}
411-
oidcAccessToken = await exchangeOidcTokenAndSetStepVariables(jfrogService, platformUrl, oidcProviderName, cliPath, buildDir);
396+
async function fetchOidcTokenIfConfigured(service, cliPath, buildDir) {
397+
const oidcProviderName = tl.getEndpointAuthorizationParameter(service, 'oidcProviderName', true);
398+
if (!oidcProviderName) {
399+
return undefined;
412400
}
401+
const serviceUrl = tl.getEndpointUrl(service, false);
402+
let platformUrl = '';
403+
try {
404+
platformUrl = tl.getEndpointAuthorizationParameter(service, 'jfrogPlatformUrl', true);
405+
} catch (error) {
406+
console.warn('Failed to get platform url from field: ' + error + '\nparsing from url instead');
407+
}
408+
if (!platformUrl || !platformUrl.trim()) {
409+
platformUrl = parsePlatformUrlFromServiceUrl(serviceUrl);
410+
}
411+
return exchangeOidcTokenAndSetStepVariables(service, platformUrl, oidcProviderName, cliPath, buildDir);
412+
}
413413

414+
async function configureJfrogCliServer(jfrogService, serverId, cliPath, buildDir) {
415+
const oidcAccessToken = await fetchOidcTokenIfConfigured(jfrogService, cliPath, buildDir);
414416
return configureSpecificCliServer(jfrogService, '--url', serverId, cliPath, buildDir, oidcAccessToken);
415417
}
416418

417-
function configureArtifactoryCliServer(artifactoryService, serverId, cliPath, buildDir) {
418-
return configureSpecificCliServer(artifactoryService, '--artifactory-url', serverId, cliPath, buildDir);
419+
async function configureArtifactoryCliServer(artifactoryService, serverId, cliPath, buildDir) {
420+
const oidcAccessToken = await fetchOidcTokenIfConfigured(artifactoryService, cliPath, buildDir);
421+
return configureSpecificCliServer(artifactoryService, '--artifactory-url', serverId, cliPath, buildDir, oidcAccessToken);
419422
}
420423

421-
function configureDistributionCliServer(distributionService, serverId, cliPath, buildDir) {
422-
return configureSpecificCliServer(distributionService, '--distribution-url', serverId, cliPath, buildDir);
424+
async function configureDistributionCliServer(distributionService, serverId, cliPath, buildDir) {
425+
const oidcAccessToken = await fetchOidcTokenIfConfigured(distributionService, cliPath, buildDir);
426+
return configureSpecificCliServer(distributionService, '--distribution-url', serverId, cliPath, buildDir, oidcAccessToken);
423427
}
424428

425-
function configureXrayCliServer(xrayService, serverId, cliPath, buildDir) {
426-
return configureSpecificCliServer(xrayService, '--xray-url', serverId, cliPath, buildDir);
429+
async function configureXrayCliServer(xrayService, serverId, cliPath, buildDir) {
430+
const oidcAccessToken = await fetchOidcTokenIfConfigured(xrayService, cliPath, buildDir);
431+
return configureSpecificCliServer(xrayService, '--xray-url', serverId, cliPath, buildDir, oidcAccessToken);
427432
}
428433

429434
/**
@@ -738,10 +743,10 @@ async function configureDefaultJfrogServer(serverId, cliPath, workDir) {
738743
* @param cliPath - Path to JFrog CLI executable.
739744
* @param workDir - Working directory.
740745
*/
741-
function configureDefaultArtifactoryServer(usageType, cliPath, workDir) {
746+
async function configureDefaultArtifactoryServer(usageType, cliPath, workDir) {
742747
let artifactoryService = tl.getInput('artifactoryConnection', true);
743748
const serverId = assembleUniqueServerId(usageType);
744-
configureArtifactoryCliServer(artifactoryService, serverId, cliPath, workDir);
749+
await configureArtifactoryCliServer(artifactoryService, serverId, cliPath, workDir);
745750
useCliServer(serverId, cliPath, workDir);
746751
return serverId;
747752
}
@@ -752,10 +757,10 @@ function configureDefaultArtifactoryServer(usageType, cliPath, workDir) {
752757
* @param cliPath - Path to JFrog CLI executable.
753758
* @param workDir - Working directory.
754759
*/
755-
function configureDefaultDistributionServer(usageType, cliPath, workDir) {
760+
async function configureDefaultDistributionServer(usageType, cliPath, workDir) {
756761
let distributionService = tl.getInput('distributionConnection', true);
757762
const serverId = assembleUniqueServerId(usageType);
758-
configureDistributionCliServer(distributionService, serverId, cliPath, workDir);
763+
await configureDistributionCliServer(distributionService, serverId, cliPath, workDir);
759764
useCliServer(serverId, cliPath, workDir);
760765
return serverId;
761766
}
@@ -766,10 +771,10 @@ function configureDefaultDistributionServer(usageType, cliPath, workDir) {
766771
* @param cliPath - Path to JFrog CLI executable.
767772
* @param workDir - Working directory.
768773
*/
769-
function configureDefaultXrayServer(usageType, cliPath, workDir) {
774+
async function configureDefaultXrayServer(usageType, cliPath, workDir) {
770775
let xrayService = tl.getInput('xrayConnection', true);
771776
const serverId = assembleUniqueServerId(usageType);
772-
configureXrayCliServer(xrayService, serverId, cliPath, workDir);
777+
await configureXrayCliServer(xrayService, serverId, cliPath, workDir);
773778
useCliServer(serverId, cliPath, workDir);
774779
return serverId;
775780
}
@@ -1265,14 +1270,14 @@ function assembleUniqueServerId(usageType) {
12651270
* @param repoDeploy - Repository to use for deploying. Pass a falsy value to skip.
12661271
* @returns {string[]}
12671272
*/
1268-
function createBuildToolConfigFile(cliPath, cmd, requiredWorkDir, configCommand, repoResolver, repoDeploy) {
1273+
async function createBuildToolConfigFile(cliPath, cmd, requiredWorkDir, configCommand, repoResolver, repoDeploy) {
12691274
let cliCommand = cliJoin(cliPath, configCommand);
12701275
let serverIdResolve;
12711276
let serverIdDeploy;
12721277
if (repoResolver) {
12731278
// Configure Artifactory resolver server.
12741279
const usageType = cmd + tl.getInput('command', true) + '_resolver';
1275-
serverIdResolve = configureDefaultArtifactoryServer(usageType, cliPath, requiredWorkDir);
1280+
serverIdResolve = await configureDefaultArtifactoryServer(usageType, cliPath, requiredWorkDir);
12761281

12771282
// Add serverId and repo to config command.
12781283
cliCommand = cliJoin(cliCommand, '--server-id-resolve=' + quote(serverIdResolve));
@@ -1281,7 +1286,7 @@ function createBuildToolConfigFile(cliPath, cmd, requiredWorkDir, configCommand,
12811286
if (repoDeploy) {
12821287
// Configure Artifactory deployer server.
12831288
const usageType = cmd + tl.getInput('command', true) + '_deployer';
1284-
serverIdDeploy = configureDefaultArtifactoryServer(usageType, cliPath, requiredWorkDir);
1289+
serverIdDeploy = await configureDefaultArtifactoryServer(usageType, cliPath, requiredWorkDir);
12851290

12861291
// Add serverId and repo to config command.
12871292
cliCommand = cliJoin(cliCommand, '--server-id-deploy=' + quote(serverIdDeploy));

tasks/JFrogAudit/audit.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import * as tl from 'azure-pipelines-task-lib/task';
44
const cliAuditCommand: string = 'audit';
55
let serverId: string;
66

7-
function RunTaskCbk(cliPath: string): void {
7+
async function RunTaskCbk(cliPath: string): Promise<void> {
88
const inputWorkingDirectory: string = tl.getInput('workingDirectory', false) ?? '';
99
const defaultWorkDir: string = tl.getVariable('System.DefaultWorkingDirectory') ?? process.cwd();
1010
const sourcePath: string = utils.determineCliWorkDir(defaultWorkDir, inputWorkingDirectory);
1111

12-
serverId = utils.configureDefaultXrayServer('xray_audit', cliPath, sourcePath);
12+
serverId = await utils.configureDefaultXrayServer('xray_audit', cliPath, sourcePath);
1313

1414
let auditCommand: string = utils.cliJoin(cliPath, cliAuditCommand);
1515
auditCommand = utils.addServerIdOption(auditCommand, serverId);

tasks/JFrogBuildPromotion/buildPromotion.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ const utils = require('@jfrog/tasks-utils/utils.js');
44
const cliPromoteCommand = 'rt bpr';
55
let serverId;
66

7-
function RunTaskCbk(cliPath) {
7+
async function RunTaskCbk(cliPath) {
88
let workDir = tl.getVariable('System.DefaultWorkingDirectory');
99
if (!workDir) {
1010
tl.setResult(tl.TaskResult.Failed, 'Failed getting default working directory.');
1111
return;
1212
}
13-
serverId = utils.configureDefaultArtifactoryServer('build_promotion', cliPath, workDir);
13+
serverId = await utils.configureDefaultArtifactoryServer('build_promotion', cliPath, workDir);
1414

1515
// Get input parameters
1616
let buildName = tl.getInput('buildName', true);

tasks/JFrogBuildScan/buildScan.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const utils = require('@jfrog/tasks-utils/utils.js');
44
const cliXrayBuildScanCommand = 'bs';
55
let serverId;
66

7-
function RunTaskCbk(cliPath) {
7+
async function RunTaskCbk(cliPath) {
88
let workDir = tl.getVariable('System.DefaultWorkingDirectory');
99
if (!workDir) {
1010
tl.setResult(tl.TaskResult.Failed, 'Failed getting default working directory.');
@@ -14,7 +14,7 @@ function RunTaskCbk(cliPath) {
1414
let buildName = tl.getInput('buildName', true);
1515
let buildNumber = tl.getInput('buildNumber', true);
1616

17-
serverId = utils.configureDefaultXrayServer('xray_build_scan', cliPath, workDir);
17+
serverId = await utils.configureDefaultXrayServer('xray_build_scan', cliPath, workDir);
1818

1919
let cliCommand = utils.cliJoin(cliPath, cliXrayBuildScanCommand, utils.quote(buildName), utils.quote(buildNumber));
2020
cliCommand = utils.addBoolParam(cliCommand, 'vuln', 'vuln');

tasks/JFrogCollectIssues/collectIssues.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const fs = require('fs');
66
const cliCollectIssuesCommand = 'rt bag';
77
let serverId;
88

9-
function RunTaskCbk(cliPath) {
9+
async function RunTaskCbk(cliPath) {
1010
let defaultWorkDir = tl.getVariable('System.DefaultWorkingDirectory');
1111
if (!defaultWorkDir) {
1212
tl.setResult(tl.TaskResult.Failed, 'Failed getting default working directory.');
@@ -35,7 +35,7 @@ function RunTaskCbk(cliPath) {
3535
return;
3636
}
3737

38-
serverId = utils.configureDefaultArtifactoryServer('collect_issues', cliPath, requiredWorkDir);
38+
serverId = await utils.configureDefaultArtifactoryServer('collect_issues', cliPath, requiredWorkDir);
3939

4040
let cliCommand = utils.cliJoin(
4141
cliPath,

tasks/JFrogDiscardBuilds/discardBuilds.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ const utils = require('@jfrog/tasks-utils/utils.js');
44
const cliDiscardCommand = 'rt bdi';
55
let serverId;
66

7-
function RunTaskCbk(cliPath) {
7+
async function RunTaskCbk(cliPath) {
88
let workDir = tl.getVariable('System.DefaultWorkingDirectory');
99
if (!workDir) {
1010
tl.setResult(tl.TaskResult.Failed, 'Failed getting default working directory.');
1111
return;
1212
}
13-
serverId = utils.configureDefaultArtifactoryServer('discard_build', cliPath, workDir);
13+
serverId = await utils.configureDefaultArtifactoryServer('discard_build', cliPath, workDir);
1414

1515
let buildName = tl.getInput('buildName', true);
1616

tasks/JFrogDistribution/distribution.ts

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,38 +9,38 @@ const cliRbdCommand: string = 'ds rbd';
99
const cliRbdelCommand: string = 'ds rbdel';
1010
let serverId: string;
1111

12-
function RunTaskCbk(cliPath: string): void {
12+
async function RunTaskCbk(cliPath: string): Promise<void> {
1313
const workDir: string = getWorkDir();
1414
const rbCommand: string = tl.getInput('command', true) ?? '';
1515
switch (rbCommand) {
1616
case 'create':
17-
performRbCreate(cliPath, workDir);
17+
await performRbCreate(cliPath, workDir);
1818
break;
1919
case 'update':
20-
performRbUpdate(cliPath, workDir);
20+
await performRbUpdate(cliPath, workDir);
2121
break;
2222
case 'sign':
23-
performRbSign(cliPath, workDir);
23+
await performRbSign(cliPath, workDir);
2424
break;
2525
case 'distribute':
26-
performRbDistribute(cliPath, workDir);
26+
await performRbDistribute(cliPath, workDir);
2727
break;
2828
case 'delete':
29-
performRbDelete(cliPath, workDir);
29+
await performRbDelete(cliPath, workDir);
3030
break;
3131
}
3232
}
3333

34-
function performRbCreate(cliPath: string, workDir: string): void {
35-
performRbCreateUpdate(cliPath, workDir, cliRbcCommand);
34+
async function performRbCreate(cliPath: string, workDir: string): Promise<void> {
35+
await performRbCreateUpdate(cliPath, workDir, cliRbcCommand);
3636
}
3737

38-
function performRbUpdate(cliPath: string, workDir: string): void {
39-
performRbCreateUpdate(cliPath, workDir, cliRbuCommand);
38+
async function performRbUpdate(cliPath: string, workDir: string): Promise<void> {
39+
await performRbCreateUpdate(cliPath, workDir, cliRbuCommand);
4040
}
4141

42-
function performRbCreateUpdate(cliPath: string, workDir: string, cliCommandName: string): void {
43-
let cliCommand: string = getCliCmdBase(cliPath, cliCommandName, workDir);
42+
async function performRbCreateUpdate(cliPath: string, workDir: string, cliCommandName: string): Promise<void> {
43+
let cliCommand: string = await getCliCmdBase(cliPath, cliCommandName, workDir);
4444

4545
const specPath: string = join(workDir, 'rbSpec' + Date.now() + '.json');
4646
cliCommand = utils.handleSpecFile(cliCommand, specPath);
@@ -66,8 +66,8 @@ function performRbCreateUpdate(cliPath: string, workDir: string, cliCommandName:
6666
execCli(cliPath, workDir, cliCommand, true, true);
6767
}
6868

69-
function performRbSign(cliPath: string, workDir: string): void {
70-
let cliCommand: string = getCliCmdBase(cliPath, cliRbsCommand, workDir);
69+
async function performRbSign(cliPath: string, workDir: string): Promise<void> {
70+
let cliCommand: string = await getCliCmdBase(cliPath, cliRbsCommand, workDir);
7171

7272
cliCommand = utils.addStringParam(cliCommand, 'passphrase', 'passphrase', false);
7373

@@ -78,8 +78,8 @@ function performRbSign(cliPath: string, workDir: string): void {
7878
execCli(cliPath, workDir, cliCommand, false, true);
7979
}
8080

81-
function performRbDistribute(cliPath: string, workDir: string): void {
82-
let cliCommand: string = getCliCmdBase(cliPath, cliRbdCommand, workDir);
81+
async function performRbDistribute(cliPath: string, workDir: string): Promise<void> {
82+
let cliCommand: string = await getCliCmdBase(cliPath, cliRbdCommand, workDir);
8383
try {
8484
const filePath: string = getDistRulesFilePath(workDir);
8585
cliCommand = utils.cliJoin(cliCommand, '--dist-rules=' + utils.quote(filePath));
@@ -96,8 +96,8 @@ function performRbDistribute(cliPath: string, workDir: string): void {
9696
execCli(cliPath, workDir, cliCommand, true, true);
9797
}
9898

99-
function performRbDelete(cliPath: string, workDir: string): void {
100-
let cliCommand: string = getCliCmdBase(cliPath, cliRbdelCommand, workDir);
99+
async function performRbDelete(cliPath: string, workDir: string): Promise<void> {
100+
let cliCommand: string = await getCliCmdBase(cliPath, cliRbdelCommand, workDir);
101101
try {
102102
const filePath: string = getDistRulesFilePath(workDir);
103103
cliCommand = utils.cliJoin(cliCommand, '--dist-rules=' + utils.quote(filePath));
@@ -157,11 +157,11 @@ function getWorkDir(): string {
157157
* @param cliCommandName - Command name to run, including prefix.
158158
* @param workDir - Working directory.
159159
*/
160-
function getCliCmdBase(cliPath: string, cliCommandName: string, workDir: string): string {
160+
async function getCliCmdBase(cliPath: string, cliCommandName: string, workDir: string): Promise<string> {
161161
const rbName: string = tl.getInput('rbName', true) ?? '';
162162
const rbVersion: string = tl.getInput('rbVersion', true) ?? '';
163163
const cliCommand: string = utils.cliJoin(cliPath, cliCommandName, rbName, rbVersion);
164-
serverId = utils.configureDefaultDistributionServer('distribution_' + cliCommandName.replace(' ', '_'), cliPath, workDir);
164+
serverId = await utils.configureDefaultDistributionServer('distribution_' + cliCommandName.replace(' ', '_'), cliPath, workDir);
165165
return utils.addServerIdOption(cliCommand, serverId);
166166
}
167167

tasks/JFrogDocker/docker.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import * as tl from 'azure-pipelines-task-lib/task';
44
const cliDockerCommand: string = 'docker';
55
let serverId: string;
66

7-
function RunTaskCbk(cliPath: string): void {
7+
async function RunTaskCbk(cliPath: string): Promise<void> {
88
// Validate docker exists on agent
99
if (!utils.isToolExists('docker')) {
1010
tl.setResult(tl.TaskResult.Failed, 'Agent is missing required tool: docker.');
@@ -22,12 +22,12 @@ function RunTaskCbk(cliPath: string): void {
2222
switch (command) {
2323
case 'Push':
2424
case 'Pull': {
25-
serverId = utils.configureDefaultArtifactoryServer('docker_' + command, cliPath, defaultWorkDir);
25+
serverId = await utils.configureDefaultArtifactoryServer('docker_' + command, cliPath, defaultWorkDir);
2626
cliCommand = utils.appendBuildFlagsToCliCommand(cliCommand);
2727
break;
2828
}
2929
case 'Scan': {
30-
serverId = utils.configureDefaultXrayServer('xray_docker_scan', cliPath, defaultWorkDir);
30+
serverId = await utils.configureDefaultXrayServer('xray_docker_scan', cliPath, defaultWorkDir);
3131
cliCommand = utils.addBoolParam(cliCommand, 'allowFailBuild', 'fail');
3232

3333
if (tl.getBoolInput('allowBypassArchiveLimits', false)) {

tasks/JFrogDotnet/dotnetBuild.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ const cliUploadCommand = 'rt u';
88
const dotnetConfigCommand = 'dotnetc';
99

1010
// The .NET Core CLI is included in all Azure-hosted agents
11-
function RunTaskCbk(cliPath) {
11+
async function RunTaskCbk(cliPath) {
1212
let dotnetCommand = tl.getInput('command', true);
1313
switch (dotnetCommand) {
1414
case 'restore':
@@ -60,7 +60,7 @@ function performDotnetNugetPush(cliPath) {
6060

6161
let nupkgPath = utils.fixWindowsPaths(tl.getPathInput('pathToNupkg', true, false));
6262
let uploadCommand = utils.cliJoin(cliPath, cliUploadCommand, utils.quote(nupkgPath), utils.quote(targetPath));
63-
let serverId = utils.configureDefaultArtifactoryServer('dotnet_nuget_push', cliPath, buildDir);
63+
let serverId = await utils.configureDefaultArtifactoryServer('dotnet_nuget_push', cliPath, buildDir);
6464
uploadCommand = utils.addServerIdOption(uploadCommand, serverId);
6565
uploadCommand = utils.cliJoin(uploadCommand, '--flat=' + utils.quote('true'));
6666
executeCliCommand(uploadCommand, buildDir, cliPath, [serverId]);
@@ -83,7 +83,7 @@ function performDotnetConfig(cliPath, requiredWorkDir, repoResolve) {
8383
let cliCommand = utils.cliJoin(cliPath, dotnetConfigCommand);
8484

8585
// Create serverId
86-
const resolverServerId = utils.configureDefaultArtifactoryServer('dotnet_resolver', cliPath, requiredWorkDir);
86+
const resolverServerId = await utils.configureDefaultArtifactoryServer('dotnet_resolver', cliPath, requiredWorkDir);
8787

8888
// Add serverId and repo to config command
8989
cliCommand = utils.cliJoin(cliCommand, '--server-id-resolve=' + utils.quote(resolverServerId));

tasks/JFrogGo/goBuild.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const resolutionRepoInputName = 'resolutionRepo';
99
const deploymentRepoInputName = 'targetRepo';
1010
let configuredServerIdsArray;
1111

12-
function RunTaskCbk(cliPath) {
12+
async function RunTaskCbk(cliPath) {
1313
let defaultWorkDir = tl.getVariable('System.DefaultWorkingDirectory');
1414
if (!defaultWorkDir) {
1515
tl.setResult(tl.TaskResult.Failed, 'Failed getting default working directory.');
@@ -72,7 +72,7 @@ function performGoCommand(goCommand, cliPath, requiredWorkDir) {
7272
* @param repoDeploy - Deployment repo input name, null if not needed.
7373
*/
7474
function performGoConfig(cliPath, requiredWorkDir, repoResolve, repoDeploy) {
75-
configuredServerIdsArray = utils.createBuildToolConfigFile(cliPath, 'go', requiredWorkDir, cliGoConfigCommand, repoResolve, repoDeploy);
75+
configuredServerIdsArray = await utils.createBuildToolConfigFile(cliPath, 'go', requiredWorkDir, cliGoConfigCommand, repoResolve, repoDeploy);
7676
}
7777

7878
function performGoPublishCommand(cliPath, requiredWorkDir) {

0 commit comments

Comments
 (0)