playwright-ms-auth 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +525 -0
- package/bin/ms-auth +2 -0
- package/lib/authenticate.d.ts +10 -0
- package/lib/authenticate.d.ts.map +1 -0
- package/lib/authenticate.js +213 -0
- package/lib/authenticate.js.map +1 -0
- package/lib/certAuth.d.ts +21 -0
- package/lib/certAuth.d.ts.map +1 -0
- package/lib/certAuth.js +82 -0
- package/lib/certAuth.js.map +1 -0
- package/lib/cli.d.ts +3 -0
- package/lib/cli.d.ts.map +1 -0
- package/lib/cli.js +109 -0
- package/lib/cli.js.map +1 -0
- package/lib/config.d.ts +10 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +115 -0
- package/lib/config.js.map +1 -0
- package/lib/index.d.ts +16 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +17 -0
- package/lib/index.js.map +1 -0
- package/lib/providers/AzureKeyVaultProvider.d.ts +17 -0
- package/lib/providers/AzureKeyVaultProvider.d.ts.map +1 -0
- package/lib/providers/AzureKeyVaultProvider.js +105 -0
- package/lib/providers/AzureKeyVaultProvider.js.map +1 -0
- package/lib/providers/CredentialProvider.d.ts +24 -0
- package/lib/providers/CredentialProvider.d.ts.map +1 -0
- package/lib/providers/CredentialProvider.js +10 -0
- package/lib/providers/CredentialProvider.js.map +1 -0
- package/lib/providers/CredentialProviderFactory.d.ts +20 -0
- package/lib/providers/CredentialProviderFactory.d.ts.map +1 -0
- package/lib/providers/CredentialProviderFactory.js +37 -0
- package/lib/providers/CredentialProviderFactory.js.map +1 -0
- package/lib/providers/EnvironmentProvider.d.ts +13 -0
- package/lib/providers/EnvironmentProvider.d.ts.map +1 -0
- package/lib/providers/EnvironmentProvider.js +52 -0
- package/lib/providers/EnvironmentProvider.js.map +1 -0
- package/lib/providers/GitHubSecretsProvider.d.ts +13 -0
- package/lib/providers/GitHubSecretsProvider.d.ts.map +1 -0
- package/lib/providers/GitHubSecretsProvider.js +59 -0
- package/lib/providers/GitHubSecretsProvider.js.map +1 -0
- package/lib/providers/LocalFileProvider.d.ts +13 -0
- package/lib/providers/LocalFileProvider.d.ts.map +1 -0
- package/lib/providers/LocalFileProvider.js +77 -0
- package/lib/providers/LocalFileProvider.js.map +1 -0
- package/lib/providers/index.d.ts +7 -0
- package/lib/providers/index.d.ts.map +1 -0
- package/lib/providers/index.js +7 -0
- package/lib/providers/index.js.map +1 -0
- package/lib/types.d.ts +111 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +37 -0
- package/lib/types.js.map +1 -0
- package/lib/utils.d.ts +30 -0
- package/lib/utils.d.ts.map +1 -0
- package/lib/utils.js +75 -0
- package/lib/utils.js.map +1 -0
- package/package.json +68 -0
package/lib/index.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @paeng/playwright-ms-auth
|
|
3
|
+
*
|
|
4
|
+
* Flexible authentication framework for Playwright tests supporting
|
|
5
|
+
* password and certificate authentication with multiple credential providers.
|
|
6
|
+
*/
|
|
7
|
+
export * from "./types";
|
|
8
|
+
export * from "./config";
|
|
9
|
+
export * from "./authenticate";
|
|
10
|
+
export * from "./certAuth";
|
|
11
|
+
export * from "./utils";
|
|
12
|
+
export * from "./providers";
|
|
13
|
+
// Re-export commonly used functions
|
|
14
|
+
export { authenticate, loadStorageState } from "./authenticate";
|
|
15
|
+
export { loadConfigFromEnv, validateConfig } from "./config";
|
|
16
|
+
export { CredentialProviderFactory } from "./providers";
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAE5B,oCAAoC;AACpC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { CredentialProvider } from "./CredentialProvider";
|
|
2
|
+
import type { AzureKeyVaultConfig, CredentialResult } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* Azure KeyVault credential provider
|
|
5
|
+
* Retrieves passwords or certificates from Azure KeyVault
|
|
6
|
+
*/
|
|
7
|
+
export declare class AzureKeyVaultProvider extends CredentialProvider {
|
|
8
|
+
private client;
|
|
9
|
+
private credential;
|
|
10
|
+
constructor(config: AzureKeyVaultConfig);
|
|
11
|
+
getProviderName(): string;
|
|
12
|
+
validateConfig(): void;
|
|
13
|
+
private getTokenCredential;
|
|
14
|
+
private getClient;
|
|
15
|
+
getCredential(): Promise<CredentialResult>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=AzureKeyVaultProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AzureKeyVaultProvider.d.ts","sourceRoot":"","sources":["../../src/providers/AzureKeyVaultProvider.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGtE;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,kBAAkB;IAC3D,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,UAAU,CAAgC;gBAEtC,MAAM,EAAE,mBAAmB;IAKvC,eAAe,IAAI,MAAM;IAIzB,cAAc,IAAI,IAAI;IAiBtB,OAAO,CAAC,kBAAkB;IAsB1B,OAAO,CAAC,SAAS;IAWX,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAqEjD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { AzureCliCredential, AzurePowerShellCredential, ChainedTokenCredential, InteractiveBrowserCredential, AzureDeveloperCliCredential, } from "@azure/identity";
|
|
2
|
+
import { SecretClient } from "@azure/keyvault-secrets";
|
|
3
|
+
import { CredentialProvider } from "./CredentialProvider";
|
|
4
|
+
import { log } from "../utils";
|
|
5
|
+
/**
|
|
6
|
+
* Azure KeyVault credential provider
|
|
7
|
+
* Retrieves passwords or certificates from Azure KeyVault
|
|
8
|
+
*/
|
|
9
|
+
export class AzureKeyVaultProvider extends CredentialProvider {
|
|
10
|
+
constructor(config) {
|
|
11
|
+
super(config);
|
|
12
|
+
this.client = null;
|
|
13
|
+
this.credential = null;
|
|
14
|
+
this.validateConfig();
|
|
15
|
+
}
|
|
16
|
+
getProviderName() {
|
|
17
|
+
return "Azure KeyVault";
|
|
18
|
+
}
|
|
19
|
+
validateConfig() {
|
|
20
|
+
const config = this.config;
|
|
21
|
+
if (!config.keyVaultEndpoint) {
|
|
22
|
+
throw new Error("KeyVault endpoint is required");
|
|
23
|
+
}
|
|
24
|
+
if (!config.secretName) {
|
|
25
|
+
throw new Error("Secret name is required");
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
new URL(config.keyVaultEndpoint);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
throw new Error(`Invalid KeyVault endpoint URL: ${config.keyVaultEndpoint}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
getTokenCredential() {
|
|
35
|
+
if (!this.credential) {
|
|
36
|
+
const credentials = [
|
|
37
|
+
new AzureCliCredential(),
|
|
38
|
+
new AzurePowerShellCredential(),
|
|
39
|
+
new AzureDeveloperCliCredential(),
|
|
40
|
+
];
|
|
41
|
+
// Only add interactive browser credential if not in CI/CD
|
|
42
|
+
if (!process.env.TF_BUILD && !process.env.CI) {
|
|
43
|
+
credentials.push(new InteractiveBrowserCredential({
|
|
44
|
+
redirectUri: "http://localhost:8080/",
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
this.credential = new ChainedTokenCredential(...credentials);
|
|
48
|
+
}
|
|
49
|
+
return this.credential;
|
|
50
|
+
}
|
|
51
|
+
getClient() {
|
|
52
|
+
if (!this.client) {
|
|
53
|
+
const config = this.config;
|
|
54
|
+
this.client = new SecretClient(config.keyVaultEndpoint, this.getTokenCredential());
|
|
55
|
+
}
|
|
56
|
+
return this.client;
|
|
57
|
+
}
|
|
58
|
+
async getCredential() {
|
|
59
|
+
const config = this.config;
|
|
60
|
+
log(`[AzureKeyVaultProvider] Retrieving secret '${config.secretName}' from '${config.keyVaultEndpoint}'`);
|
|
61
|
+
const client = this.getClient();
|
|
62
|
+
const secret = await client.getSecret(config.secretName, {
|
|
63
|
+
version: config.secretVersion,
|
|
64
|
+
});
|
|
65
|
+
if (!secret.value) {
|
|
66
|
+
throw new Error(`Unable to retrieve secret '${config.secretName}' from KeyVault. ` +
|
|
67
|
+
`Please check permissions and ensure the secret exists.`);
|
|
68
|
+
}
|
|
69
|
+
const { expiresOn, notBefore, enabled, contentType } = secret.properties;
|
|
70
|
+
log(`[AzureKeyVaultProvider] Secret metadata: ` +
|
|
71
|
+
`enabled=${enabled ?? "unknown"}, ` +
|
|
72
|
+
`notBefore=${notBefore?.toISOString() ?? "none"}, ` +
|
|
73
|
+
`expiresOn=${expiresOn?.toISOString() ?? "none"}, ` +
|
|
74
|
+
`contentType=${contentType ?? "unknown"}`);
|
|
75
|
+
// Validate secret properties
|
|
76
|
+
if (!enabled) {
|
|
77
|
+
throw new Error(`Secret '${config.secretName}' is disabled`);
|
|
78
|
+
}
|
|
79
|
+
if (expiresOn && expiresOn.getTime() < Date.now()) {
|
|
80
|
+
throw new Error(`Secret '${config.secretName}' expired on ${expiresOn.toISOString()}`);
|
|
81
|
+
}
|
|
82
|
+
if (notBefore && notBefore.getTime() > Date.now()) {
|
|
83
|
+
throw new Error(`Secret '${config.secretName}' is not valid before ${notBefore.toISOString()}`);
|
|
84
|
+
}
|
|
85
|
+
// Determine credential type based on content type
|
|
86
|
+
if (contentType === "application/x-pkcs12") {
|
|
87
|
+
// Certificate (PFX format, base64 encoded)
|
|
88
|
+
const certificate = Buffer.from(secret.value, "base64");
|
|
89
|
+
log(`[AzureKeyVaultProvider] Retrieved certificate (${certificate.byteLength} bytes)`);
|
|
90
|
+
return {
|
|
91
|
+
type: "certificate",
|
|
92
|
+
value: certificate,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// Password (plain text)
|
|
97
|
+
log(`[AzureKeyVaultProvider] Retrieved password (${secret.value.length} characters)`);
|
|
98
|
+
return {
|
|
99
|
+
type: "password",
|
|
100
|
+
value: secret.value,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=AzureKeyVaultProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AzureKeyVaultProvider.js","sourceRoot":"","sources":["../../src/providers/AzureKeyVaultProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CredentialResult, ProviderConfig } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Abstract base class for credential providers
|
|
4
|
+
* Implements Factory pattern for extensibility
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class CredentialProvider {
|
|
7
|
+
protected config: ProviderConfig;
|
|
8
|
+
constructor(config: ProviderConfig);
|
|
9
|
+
/**
|
|
10
|
+
* Retrieve the credential from the provider
|
|
11
|
+
* @returns Promise resolving to the credential
|
|
12
|
+
*/
|
|
13
|
+
abstract getCredential(): Promise<CredentialResult>;
|
|
14
|
+
/**
|
|
15
|
+
* Validate the provider configuration
|
|
16
|
+
* @throws Error if configuration is invalid
|
|
17
|
+
*/
|
|
18
|
+
abstract validateConfig(): void;
|
|
19
|
+
/**
|
|
20
|
+
* Get a human-readable name for logging
|
|
21
|
+
*/
|
|
22
|
+
abstract getProviderName(): string;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=CredentialProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CredentialProvider.d.ts","sourceRoot":"","sources":["../../src/providers/CredentialProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEjE;;;GAGG;AACH,8BAAsB,kBAAkB;IAC1B,SAAS,CAAC,MAAM,EAAE,cAAc;gBAAtB,MAAM,EAAE,cAAc;IAE5C;;;OAGG;IACH,QAAQ,CAAC,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAEnD;;;OAGG;IACH,QAAQ,CAAC,cAAc,IAAI,IAAI;IAE/B;;OAEG;IACH,QAAQ,CAAC,eAAe,IAAI,MAAM;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CredentialProvider.js","sourceRoot":"","sources":["../../src/providers/CredentialProvider.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAgB,kBAAkB;IACtC,YAAsB,MAAsB;QAAtB,WAAM,GAAN,MAAM,CAAgB;IAAG,CAAC;CAkBjD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CredentialProvider } from "./CredentialProvider";
|
|
2
|
+
import type { CredentialProviderType, ProviderConfig } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* Factory for creating credential providers
|
|
5
|
+
* Implements Abstract Factory pattern for extensibility
|
|
6
|
+
*/
|
|
7
|
+
export declare class CredentialProviderFactory {
|
|
8
|
+
/**
|
|
9
|
+
* Create a credential provider based on type and configuration
|
|
10
|
+
* @param type Provider type
|
|
11
|
+
* @param config Provider-specific configuration
|
|
12
|
+
* @returns CredentialProvider instance
|
|
13
|
+
*/
|
|
14
|
+
static createProvider(type: CredentialProviderType, config: ProviderConfig): CredentialProvider;
|
|
15
|
+
/**
|
|
16
|
+
* Get list of supported provider types
|
|
17
|
+
*/
|
|
18
|
+
static getSupportedProviders(): CredentialProviderType[];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=CredentialProviderFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CredentialProviderFactory.d.ts","sourceRoot":"","sources":["../../src/providers/CredentialProviderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAK1D,OAAO,KAAK,EACV,sBAAsB,EACtB,cAAc,EAKf,MAAM,UAAU,CAAC;AAElB;;;GAGG;AACH,qBAAa,yBAAyB;IACpC;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CACnB,IAAI,EAAE,sBAAsB,EAC5B,MAAM,EAAE,cAAc,GACrB,kBAAkB;IAmBrB;;OAEG;IACH,MAAM,CAAC,qBAAqB,IAAI,sBAAsB,EAAE;CAGzD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { AzureKeyVaultProvider } from "./AzureKeyVaultProvider";
|
|
2
|
+
import { LocalFileProvider } from "./LocalFileProvider";
|
|
3
|
+
import { EnvironmentProvider } from "./EnvironmentProvider";
|
|
4
|
+
import { GitHubSecretsProvider } from "./GitHubSecretsProvider";
|
|
5
|
+
/**
|
|
6
|
+
* Factory for creating credential providers
|
|
7
|
+
* Implements Abstract Factory pattern for extensibility
|
|
8
|
+
*/
|
|
9
|
+
export class CredentialProviderFactory {
|
|
10
|
+
/**
|
|
11
|
+
* Create a credential provider based on type and configuration
|
|
12
|
+
* @param type Provider type
|
|
13
|
+
* @param config Provider-specific configuration
|
|
14
|
+
* @returns CredentialProvider instance
|
|
15
|
+
*/
|
|
16
|
+
static createProvider(type, config) {
|
|
17
|
+
switch (type) {
|
|
18
|
+
case "azure-keyvault":
|
|
19
|
+
return new AzureKeyVaultProvider(config);
|
|
20
|
+
case "local-file":
|
|
21
|
+
return new LocalFileProvider(config);
|
|
22
|
+
case "environment":
|
|
23
|
+
return new EnvironmentProvider(config);
|
|
24
|
+
case "github-secrets":
|
|
25
|
+
return new GitHubSecretsProvider(config);
|
|
26
|
+
default:
|
|
27
|
+
throw new Error(`Unsupported credential provider type: ${type}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get list of supported provider types
|
|
32
|
+
*/
|
|
33
|
+
static getSupportedProviders() {
|
|
34
|
+
return ["azure-keyvault", "local-file", "environment", "github-secrets"];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=CredentialProviderFactory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CredentialProviderFactory.js","sourceRoot":"","sources":["../../src/providers/CredentialProviderFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAUhE;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IACpC;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CACnB,IAA4B,EAC5B,MAAsB;QAEtB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,gBAAgB;gBACnB,OAAO,IAAI,qBAAqB,CAAC,MAA6B,CAAC,CAAC;YAElE,KAAK,YAAY;gBACf,OAAO,IAAI,iBAAiB,CAAC,MAAyB,CAAC,CAAC;YAE1D,KAAK,aAAa;gBAChB,OAAO,IAAI,mBAAmB,CAAC,MAA2B,CAAC,CAAC;YAE9D,KAAK,gBAAgB;gBACnB,OAAO,IAAI,qBAAqB,CAAC,MAA6B,CAAC,CAAC;YAElE;gBACE,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,qBAAqB;QAC1B,OAAO,CAAC,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC;IAC3E,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CredentialProvider } from "./CredentialProvider";
|
|
2
|
+
import type { EnvironmentConfig, CredentialResult } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* Environment variable credential provider
|
|
5
|
+
* Retrieves passwords or certificates from environment variables
|
|
6
|
+
*/
|
|
7
|
+
export declare class EnvironmentProvider extends CredentialProvider {
|
|
8
|
+
constructor(config: EnvironmentConfig);
|
|
9
|
+
getProviderName(): string;
|
|
10
|
+
validateConfig(): void;
|
|
11
|
+
getCredential(): Promise<CredentialResult>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=EnvironmentProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnvironmentProvider.d.ts","sourceRoot":"","sources":["../../src/providers/EnvironmentProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGpE;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,kBAAkB;gBAC7C,MAAM,EAAE,iBAAiB;IAKrC,eAAe,IAAI,MAAM;IAIzB,cAAc,IAAI,IAAI;IAOhB,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAwCjD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { CredentialProvider } from "./CredentialProvider";
|
|
2
|
+
import { log } from "../utils";
|
|
3
|
+
/**
|
|
4
|
+
* Environment variable credential provider
|
|
5
|
+
* Retrieves passwords or certificates from environment variables
|
|
6
|
+
*/
|
|
7
|
+
export class EnvironmentProvider extends CredentialProvider {
|
|
8
|
+
constructor(config) {
|
|
9
|
+
super(config);
|
|
10
|
+
this.validateConfig();
|
|
11
|
+
}
|
|
12
|
+
getProviderName() {
|
|
13
|
+
return "Environment Variable";
|
|
14
|
+
}
|
|
15
|
+
validateConfig() {
|
|
16
|
+
const config = this.config;
|
|
17
|
+
if (!config.variableName) {
|
|
18
|
+
throw new Error("Environment variable name is required");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async getCredential() {
|
|
22
|
+
const config = this.config;
|
|
23
|
+
log(`[EnvironmentProvider] Reading credential from environment variable '${config.variableName}'`);
|
|
24
|
+
const value = process.env[config.variableName];
|
|
25
|
+
if (!value) {
|
|
26
|
+
throw new Error(`Environment variable '${config.variableName}' is not set or empty. ` +
|
|
27
|
+
`Please set this variable with the credential value.`);
|
|
28
|
+
}
|
|
29
|
+
// Try to detect if it's a base64 encoded certificate
|
|
30
|
+
try {
|
|
31
|
+
const decoded = Buffer.from(value, "base64");
|
|
32
|
+
// Check if it's a valid DER/PFX certificate (starts with 0x30)
|
|
33
|
+
if (decoded.length > 100 && decoded[0] === 0x30) {
|
|
34
|
+
log(`[EnvironmentProvider] Retrieved base64-encoded certificate (${decoded.byteLength} bytes)`);
|
|
35
|
+
return {
|
|
36
|
+
type: "certificate",
|
|
37
|
+
value: decoded,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Not base64 or not a certificate
|
|
43
|
+
}
|
|
44
|
+
// Default to password
|
|
45
|
+
log(`[EnvironmentProvider] Retrieved password (${value.length} characters)`);
|
|
46
|
+
return {
|
|
47
|
+
type: "password",
|
|
48
|
+
value: value,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=EnvironmentProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnvironmentProvider.js","sourceRoot":"","sources":["../../src/providers/EnvironmentProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,kBAAkB;IACzD,YAAY,MAAyB;QACnC,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,eAAe;QACb,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED,cAAc;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,MAA2B,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,MAAM,GAAG,IAAI,CAAC,MAA2B,CAAC;QAChD,GAAG,CACD,uEAAuE,MAAM,CAAC,YAAY,GAAG,CAC9F,CAAC;QAEF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,yBAAyB,MAAM,CAAC,YAAY,yBAAyB;gBACnE,qDAAqD,CACxD,CAAC;QACJ,CAAC;QAED,qDAAqD;QACrD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC7C,+DAA+D;YAC/D,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAChD,GAAG,CACD,+DAA+D,OAAO,CAAC,UAAU,SAAS,CAC3F,CAAC;gBACF,OAAO;oBACL,IAAI,EAAE,aAAa;oBACnB,KAAK,EAAE,OAAO;iBACf,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;QAED,sBAAsB;QACtB,GAAG,CACD,6CAA6C,KAAK,CAAC,MAAM,cAAc,CACxE,CAAC;QACF,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,KAAK;SACb,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CredentialProvider } from "./CredentialProvider";
|
|
2
|
+
import type { GitHubSecretsConfig, CredentialResult } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* GitHub Secrets credential provider
|
|
5
|
+
* Placeholder for future implementation
|
|
6
|
+
*/
|
|
7
|
+
export declare class GitHubSecretsProvider extends CredentialProvider {
|
|
8
|
+
constructor(config: GitHubSecretsConfig);
|
|
9
|
+
getProviderName(): string;
|
|
10
|
+
validateConfig(): void;
|
|
11
|
+
getCredential(): Promise<CredentialResult>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=GitHubSecretsProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubSecretsProvider.d.ts","sourceRoot":"","sources":["../../src/providers/GitHubSecretsProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGtE;;;GAGG;AACH,qBAAa,qBAAsB,SAAQ,kBAAkB;gBAC/C,MAAM,EAAE,mBAAmB;IAKvC,eAAe,IAAI,MAAM;IAIzB,cAAc,IAAI,IAAI;IAUhB,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC;CA8CjD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { CredentialProvider } from "./CredentialProvider";
|
|
2
|
+
import { log } from "../utils";
|
|
3
|
+
/**
|
|
4
|
+
* GitHub Secrets credential provider
|
|
5
|
+
* Placeholder for future implementation
|
|
6
|
+
*/
|
|
7
|
+
export class GitHubSecretsProvider extends CredentialProvider {
|
|
8
|
+
constructor(config) {
|
|
9
|
+
super(config);
|
|
10
|
+
this.validateConfig();
|
|
11
|
+
}
|
|
12
|
+
getProviderName() {
|
|
13
|
+
return "GitHub Secrets";
|
|
14
|
+
}
|
|
15
|
+
validateConfig() {
|
|
16
|
+
const config = this.config;
|
|
17
|
+
if (!config.repository) {
|
|
18
|
+
throw new Error("GitHub repository is required (format: owner/repo)");
|
|
19
|
+
}
|
|
20
|
+
if (!config.secretName) {
|
|
21
|
+
throw new Error("GitHub secret name is required");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async getCredential() {
|
|
25
|
+
// This is a placeholder for future GitHub Secrets API integration
|
|
26
|
+
// For now, we'll check if the secret is available via environment variable
|
|
27
|
+
// (GitHub Actions automatically exposes secrets as env vars)
|
|
28
|
+
const config = this.config;
|
|
29
|
+
const envVarName = config.secretName
|
|
30
|
+
.toUpperCase()
|
|
31
|
+
.replace(/[^A-Z0-9_]/g, "_");
|
|
32
|
+
log(`[GitHubSecretsProvider] Looking for secret '${config.secretName}' in environment`);
|
|
33
|
+
const value = process.env[envVarName];
|
|
34
|
+
if (!value) {
|
|
35
|
+
throw new Error(`GitHub secret '${config.secretName}' not found in environment. ` +
|
|
36
|
+
`In GitHub Actions, secrets are exposed as environment variables.`);
|
|
37
|
+
}
|
|
38
|
+
// Try to detect if it's a base64 encoded certificate
|
|
39
|
+
try {
|
|
40
|
+
const decoded = Buffer.from(value, "base64");
|
|
41
|
+
if (decoded.length > 100 && decoded[0] === 0x30) {
|
|
42
|
+
log(`[GitHubSecretsProvider] Retrieved certificate (${decoded.byteLength} bytes)`);
|
|
43
|
+
return {
|
|
44
|
+
type: "certificate",
|
|
45
|
+
value: decoded,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Not base64
|
|
51
|
+
}
|
|
52
|
+
log(`[GitHubSecretsProvider] Retrieved password (${value.length} characters)`);
|
|
53
|
+
return {
|
|
54
|
+
type: "password",
|
|
55
|
+
value: value,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=GitHubSecretsProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubSecretsProvider.js","sourceRoot":"","sources":["../../src/providers/GitHubSecretsProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B;;;GAGG;AACH,MAAM,OAAO,qBAAsB,SAAQ,kBAAkB;IAC3D,YAAY,MAA2B;QACrC,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,eAAe;QACb,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,cAAc;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,MAA6B,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,kEAAkE;QAClE,2EAA2E;QAC3E,6DAA6D;QAE7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAA6B,CAAC;QAClD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU;aACjC,WAAW,EAAE;aACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAE/B,GAAG,CACD,+CAA+C,MAAM,CAAC,UAAU,kBAAkB,CACnF,CAAC;QAEF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,kBAAkB,MAAM,CAAC,UAAU,8BAA8B;gBAC/D,kEAAkE,CACrE,CAAC;QACJ,CAAC;QAED,qDAAqD;QACrD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC7C,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAChD,GAAG,CACD,kDAAkD,OAAO,CAAC,UAAU,SAAS,CAC9E,CAAC;gBACF,OAAO;oBACL,IAAI,EAAE,aAAa;oBACnB,KAAK,EAAE,OAAO;iBACf,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;QAED,GAAG,CACD,+CAA+C,KAAK,CAAC,MAAM,cAAc,CAC1E,CAAC;QACF,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,KAAK;SACb,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CredentialProvider } from "./CredentialProvider";
|
|
2
|
+
import type { LocalFileConfig, CredentialResult } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* Local file credential provider
|
|
5
|
+
* Retrieves passwords or certificates from local file system
|
|
6
|
+
*/
|
|
7
|
+
export declare class LocalFileProvider extends CredentialProvider {
|
|
8
|
+
constructor(config: LocalFileConfig);
|
|
9
|
+
getProviderName(): string;
|
|
10
|
+
validateConfig(): void;
|
|
11
|
+
getCredential(): Promise<CredentialResult>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=LocalFileProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalFileProvider.d.ts","sourceRoot":"","sources":["../../src/providers/LocalFileProvider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGlE;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,kBAAkB;gBAC3C,MAAM,EAAE,eAAe;IAKnC,eAAe,IAAI,MAAM;IAIzB,cAAc,IAAI,IAAI;IAOhB,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAmEjD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { CredentialProvider } from "./CredentialProvider";
|
|
3
|
+
import { log } from "../utils";
|
|
4
|
+
/**
|
|
5
|
+
* Local file credential provider
|
|
6
|
+
* Retrieves passwords or certificates from local file system
|
|
7
|
+
*/
|
|
8
|
+
export class LocalFileProvider extends CredentialProvider {
|
|
9
|
+
constructor(config) {
|
|
10
|
+
super(config);
|
|
11
|
+
this.validateConfig();
|
|
12
|
+
}
|
|
13
|
+
getProviderName() {
|
|
14
|
+
return "Local File";
|
|
15
|
+
}
|
|
16
|
+
validateConfig() {
|
|
17
|
+
const config = this.config;
|
|
18
|
+
if (!config.filePath) {
|
|
19
|
+
throw new Error("File path is required for local file provider");
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async getCredential() {
|
|
23
|
+
const config = this.config;
|
|
24
|
+
log(`[LocalFileProvider] Reading credential from '${config.filePath}'`);
|
|
25
|
+
try {
|
|
26
|
+
const fileContent = await readFile(config.filePath);
|
|
27
|
+
// Detect file type based on extension or content
|
|
28
|
+
const isTextFile = config.filePath.match(/\.(txt|pwd|password)$/i);
|
|
29
|
+
const isCertFile = config.filePath.match(/\.(pfx|p12|cer|crt|pem)$/i);
|
|
30
|
+
if (isTextFile) {
|
|
31
|
+
// Text file containing password
|
|
32
|
+
const password = fileContent.toString("utf-8").trim();
|
|
33
|
+
log(`[LocalFileProvider] Retrieved password (${password.length} characters)`);
|
|
34
|
+
return {
|
|
35
|
+
type: "password",
|
|
36
|
+
value: password,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
else if (isCertFile || fileContent[0] === 0x30) {
|
|
40
|
+
// Certificate file (PFX/P12) or binary content starting with 0x30 (DER encoded)
|
|
41
|
+
log(`[LocalFileProvider] Retrieved certificate (${fileContent.byteLength} bytes)`);
|
|
42
|
+
return {
|
|
43
|
+
type: "certificate",
|
|
44
|
+
value: fileContent,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// Try to detect if it's base64 encoded certificate
|
|
49
|
+
try {
|
|
50
|
+
const decoded = Buffer.from(fileContent.toString("utf-8").trim(), "base64");
|
|
51
|
+
if (decoded.length > 0 && decoded[0] === 0x30) {
|
|
52
|
+
log(`[LocalFileProvider] Retrieved base64-encoded certificate (${decoded.byteLength} bytes)`);
|
|
53
|
+
return {
|
|
54
|
+
type: "certificate",
|
|
55
|
+
value: decoded,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Not base64
|
|
61
|
+
}
|
|
62
|
+
// Default to password
|
|
63
|
+
const password = fileContent.toString("utf-8").trim();
|
|
64
|
+
log(`[LocalFileProvider] Retrieved password (${password.length} characters)`);
|
|
65
|
+
return {
|
|
66
|
+
type: "password",
|
|
67
|
+
value: password,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
73
|
+
throw new Error(`Failed to read credential file '${config.filePath}': ${message}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=LocalFileProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LocalFileProvider.js","sourceRoot":"","sources":["../../src/providers/LocalFileProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./CredentialProvider";
|
|
2
|
+
export * from "./CredentialProviderFactory";
|
|
3
|
+
export * from "./AzureKeyVaultProvider";
|
|
4
|
+
export * from "./LocalFileProvider";
|
|
5
|
+
export * from "./EnvironmentProvider";
|
|
6
|
+
export * from "./GitHubSecretsProvider";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from "./CredentialProvider";
|
|
2
|
+
export * from "./CredentialProviderFactory";
|
|
3
|
+
export * from "./AzureKeyVaultProvider";
|
|
4
|
+
export * from "./LocalFileProvider";
|
|
5
|
+
export * from "./EnvironmentProvider";
|
|
6
|
+
export * from "./GitHubSecretsProvider";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
|