diff --git a/lib/start-proxy-action.js b/lib/start-proxy-action.js index ad1558e75..66b5fbf35 100644 --- a/lib/start-proxy-action.js +++ b/lib/start-proxy-action.js @@ -122045,10 +122045,19 @@ var jfrogConfigSchema = { function isJFrogConfig(config) { return validateSchema(jfrogConfigSchema, config); } +var cloudsmithConfigSchema = { + namespace: string, + "service-slug": string, + "api-host": string +}; +function isCloudsmithConfig(config) { + return validateSchema(cloudsmithConfigSchema, config); +} var oidcSchemas = [ { schema: azureConfigSchema, name: "Azure" }, { schema: awsConfigSchema, name: "AWS" }, - { schema: jfrogConfigSchema, name: "JFrog" } + { schema: jfrogConfigSchema, name: "JFrog" }, + { schema: cloudsmithConfigSchema, name: "Cloudsmith" } ]; function credentialToStr(credential) { let result = `Type: ${credential.type};`; @@ -122088,6 +122097,10 @@ function credentialToStr(credential) { credential["identity-mapping-name"] ); appendIfDefined("JFrog Audience", credential.audience); + } else if (isCloudsmithConfig(credential)) { + appendIfDefined("Cloudsmith Namespace", credential.namespace); + appendIfDefined("Cloudsmith Service Slug", credential["service-slug"]); + appendIfDefined("Cloudsmith API Host", credential["api-host"]); } return result; } diff --git a/src/start-proxy.test.ts b/src/start-proxy.test.ts index babbfb43c..20f2e0bd3 100644 --- a/src/start-proxy.test.ts +++ b/src/start-proxy.test.ts @@ -8,6 +8,7 @@ import sinon from "sinon"; import * as apiClient from "./api-client"; import * as defaults from "./defaults.json"; import { setUpFeatureFlagTests } from "./feature-flags/testing-util"; +import { UnvalidatedObject, validateSchema } from "./json"; import { makeFromSchema } from "./json/testing-util"; import { BuiltInLanguage } from "./languages"; import { getRunnerLogger, Logger } from "./logging"; @@ -472,12 +473,20 @@ test("getCredentials accepts OIDC configurations", (t) => { toEncodedJSON(oidcConfigurations), BuiltInLanguage.csharp, ); - t.is(credentials.length, 3); + t.is(credentials.length, startProxyExports.oidcSchemas.length); t.assert(credentials.every((c) => c.type === "nuget_feed")); - t.assert(credentials.some((c) => startProxyExports.isAzureConfig(c))); - t.assert(credentials.some((c) => startProxyExports.isAWSConfig(c))); - t.assert(credentials.some((c) => startProxyExports.isJFrogConfig(c))); + + for (const oidcSchemaInfo of startProxyExports.oidcSchemas) { + t.assert( + credentials.some((c) => + validateSchema( + oidcSchemaInfo.schema, + c as unknown as UnvalidatedObject, + ), + ), + ); + } }); const getCredentialsMacro = test.macro({ diff --git a/src/start-proxy/types.test.ts b/src/start-proxy/types.test.ts index 3869a4572..c89d42fe3 100644 --- a/src/start-proxy/types.test.ts +++ b/src/start-proxy/types.test.ts @@ -1,5 +1,6 @@ import test from "ava"; +import { makeFromSchema } from "../json/testing-util"; import { setupTests } from "../testing-utils"; import * as types from "./types"; @@ -107,6 +108,24 @@ test("credentialToStr - pretty-prints valid JFrog OIDC configurations", (t) => { ); }); +test("credentialToStr - pretty-prints valid Cloudsmith OIDC configurations", (t) => { + const credential: types.Credential = { + type: "maven_credential", + url: "https://localhost", + ...(makeFromSchema( + true, + types.cloudsmithConfigSchema, + ) as types.CloudsmithConfig), + }; + + const str = types.credentialToStr(credential); + + t.is( + "Type: maven_credential; Url: https://localhost; Cloudsmith Namespace: value-for-namespace; Cloudsmith Service Slug: value-for-service-slug; Cloudsmith API Host: value-for-api-host;", + str, + ); +}); + test("credentialToStr - hides passwords", (t) => { const secret = "password123"; const credential = { diff --git a/src/start-proxy/types.ts b/src/start-proxy/types.ts index ddc4e6d79..e35b77acb 100644 --- a/src/start-proxy/types.ts +++ b/src/start-proxy/types.ts @@ -118,15 +118,33 @@ export function isJFrogConfig( return json.validateSchema(jfrogConfigSchema, config); } +/** A schema for Cloudsmith OIDC configurations. */ +export const cloudsmithConfigSchema = { + namespace: json.string, + "service-slug": json.string, + "api-host": json.string, +} as const satisfies json.Schema; + +/** Configuration for Cloudsmith OIDC. */ +export type CloudsmithConfig = json.FromSchema; + +/** Decides whether `config` is a Cloudsmith OIDC configuration. */ +export function isCloudsmithConfig( + config: UnvalidatedObject, +): config is CloudsmithConfig { + return json.validateSchema(cloudsmithConfigSchema, config); +} + /** An array of all OIDC configuration schemas along with output-friendly names. */ export const oidcSchemas = [ { schema: azureConfigSchema, name: "Azure" }, { schema: awsConfigSchema, name: "AWS" }, { schema: jfrogConfigSchema, name: "JFrog" }, + { schema: cloudsmithConfigSchema, name: "Cloudsmith" }, ]; /** Represents all supported OIDC configurations. */ -export type OIDC = AzureConfig | AWSConfig | JFrogConfig; +export type OIDC = AzureConfig | AWSConfig | JFrogConfig | CloudsmithConfig; /** All authentication-related fields. */ export type AuthConfig = UsernamePassword | Token | OIDC; @@ -185,6 +203,10 @@ export function credentialToStr(credential: Credential): string { credential["identity-mapping-name"], ); appendIfDefined("JFrog Audience", credential.audience); + } else if (isCloudsmithConfig(credential)) { + appendIfDefined("Cloudsmith Namespace", credential.namespace); + appendIfDefined("Cloudsmith Service Slug", credential["service-slug"]); + appendIfDefined("Cloudsmith API Host", credential["api-host"]); } return result;