@padua/cli 1.2.0 → 1.3.0
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/dist/commands/init/aws-profile.d.ts +21 -0
- package/dist/commands/init/aws-profile.d.ts.map +1 -1
- package/dist/commands/init/aws-profile.js +91 -0
- package/dist/commands/init/aws-profile.js.map +1 -1
- package/dist/commands/init/index.d.ts +21 -17
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +280 -181
- package/dist/commands/init/index.js.map +1 -1
- package/dist/commands/init/init.d.ts +24 -0
- package/dist/commands/init/init.d.ts.map +1 -1
- package/dist/commands/init/init.js +78 -0
- package/dist/commands/init/init.js.map +1 -1
- package/dist/commands/init/sso-discovery.d.ts +114 -0
- package/dist/commands/init/sso-discovery.d.ts.map +1 -0
- package/dist/commands/init/sso-discovery.js +363 -0
- package/dist/commands/init/sso-discovery.js.map +1 -0
- package/dist/commands/status/checks.d.ts.map +1 -1
- package/dist/commands/status/checks.js +21 -5
- package/dist/commands/status/checks.js.map +1 -1
- package/package.json +1 -1
|
@@ -39,8 +39,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
exports.initializeConfig = initializeConfig;
|
|
40
40
|
exports.formatConfigJson = formatConfigJson;
|
|
41
41
|
exports.displayNextSteps = displayNextSteps;
|
|
42
|
+
exports.getPaduaConfigDir = getPaduaConfigDir;
|
|
43
|
+
exports.getPaduaConfigPath = getPaduaConfigPath;
|
|
44
|
+
exports.initializeGlobalConfig = initializeGlobalConfig;
|
|
45
|
+
exports.displayGlobalNextSteps = displayGlobalNextSteps;
|
|
42
46
|
const fs = __importStar(require("fs"));
|
|
43
47
|
const path = __importStar(require("path"));
|
|
48
|
+
const os = __importStar(require("os"));
|
|
44
49
|
const chalk_1 = __importDefault(require("chalk"));
|
|
45
50
|
/**
|
|
46
51
|
* Initialize config by writing to padua.config.json
|
|
@@ -120,4 +125,77 @@ function displayNextSteps(config, noColor = false) {
|
|
|
120
125
|
}
|
|
121
126
|
console.log('');
|
|
122
127
|
}
|
|
128
|
+
/**
|
|
129
|
+
* Get the padua config directory path (cross-platform)
|
|
130
|
+
* ~/.padua on Unix, %USERPROFILE%\.padua on Windows
|
|
131
|
+
*/
|
|
132
|
+
function getPaduaConfigDir() {
|
|
133
|
+
return path.join(os.homedir(), '.padua');
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get the padua config file path
|
|
137
|
+
*/
|
|
138
|
+
function getPaduaConfigPath() {
|
|
139
|
+
return path.join(getPaduaConfigDir(), 'padua.config.json');
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Initialize config by writing to ~/.padua/padua.config.json (global config)
|
|
143
|
+
*
|
|
144
|
+
* @param config - Configuration object to write
|
|
145
|
+
* @returns Path to the config file
|
|
146
|
+
* @throws Error if file write fails
|
|
147
|
+
*/
|
|
148
|
+
async function initializeGlobalConfig(config) {
|
|
149
|
+
const configDir = getPaduaConfigDir();
|
|
150
|
+
const configPath = getPaduaConfigPath();
|
|
151
|
+
// Ensure ~/.padua directory exists
|
|
152
|
+
if (!fs.existsSync(configDir)) {
|
|
153
|
+
fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });
|
|
154
|
+
}
|
|
155
|
+
try {
|
|
156
|
+
const formatted = formatConfigJson(config);
|
|
157
|
+
fs.writeFileSync(configPath, formatted, 'utf-8');
|
|
158
|
+
fs.chmodSync(configPath, 0o644);
|
|
159
|
+
return configPath;
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
const err = error;
|
|
163
|
+
if (err.code === 'EACCES') {
|
|
164
|
+
throw new Error('Permission denied. Check directory write permissions.');
|
|
165
|
+
}
|
|
166
|
+
else if (err.code === 'ENOSPC') {
|
|
167
|
+
throw new Error('No disk space available.');
|
|
168
|
+
}
|
|
169
|
+
else if (err.code === 'EROFS') {
|
|
170
|
+
throw new Error('File system is read-only.');
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
throw new Error(`Failed to write config file: ${err.message}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Display next steps for global config
|
|
179
|
+
*
|
|
180
|
+
* @param configPath - Path where config was saved
|
|
181
|
+
* @param noColor - Whether to disable colored output
|
|
182
|
+
*/
|
|
183
|
+
function displayGlobalNextSteps(configPath, noColor = false) {
|
|
184
|
+
console.log('');
|
|
185
|
+
if (!noColor) {
|
|
186
|
+
console.log(chalk_1.default.cyan.bold('Next steps:'));
|
|
187
|
+
console.log(chalk_1.default.gray(` 1. Review configuration: cat ${configPath}`));
|
|
188
|
+
console.log(chalk_1.default.gray(' 2. Authenticate: padua login'));
|
|
189
|
+
console.log(chalk_1.default.gray(' 3. Check status: padua status'));
|
|
190
|
+
console.log(chalk_1.default.gray(' 4. View help: padua --help'));
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
console.log('Next steps:');
|
|
194
|
+
console.log(` 1. Review configuration: cat ${configPath}`);
|
|
195
|
+
console.log(' 2. Authenticate: padua login');
|
|
196
|
+
console.log(' 3. Check status: padua status');
|
|
197
|
+
console.log(' 4. View help: padua --help');
|
|
198
|
+
}
|
|
199
|
+
console.log('');
|
|
200
|
+
}
|
|
123
201
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/init/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,4CA0BC;AAQD,4CAkBC;AAQD,4CAgBC;AAMD,8CAEC;AAKD,gDAEC;AASD,wDA0BC;AAQD,wDAkBC;AArKD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,kDAA0B;AAG1B;;;;;;GAMG;AACI,KAAK,UAAU,gBAAgB,CAAC,MAAmB,EAAE,UAAmB;IAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAEjE,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAE3C,gBAAgB;QAChB,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAEjD,kCAAkC;QAClC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,+DAA+D;QAC/D,MAAM,GAAG,GAAG,KAA8B,CAAC;QAE3C,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,MAAmB;IAClD,4DAA4D;IAC5D,MAAM,OAAO,GAAgB;QAC3B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;IAEF,gDAAgD;IAChD,IAAI,MAAM,CAAC,YAAY,EAAE,MAAM,IAAI,MAAM,CAAC,YAAY,EAAE,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,UAAU,EAAE,CAAC;QACvG,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAC7C,CAAC;IAED,uCAAuC;IACvC,IAAI,MAAM,CAAC,GAAG,EAAE,SAAS,IAAI,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IAC3B,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AACjD,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,MAAmB,EAAE,UAAmB,KAAK;IAC5E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,mBAAmB,CAAC,CAAC;AAC7D,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,sBAAsB,CAAC,MAAmB;IAC9D,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,kBAAkB,EAAE,CAAC;IAExC,mCAAmC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC3C,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAChC,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,sBAAsB,CAAC,UAAkB,EAAE,UAAmB,KAAK;IACjF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACtE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,mCAAmC,UAAU,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSO Session configuration for ~/.aws/config
|
|
3
|
+
*/
|
|
4
|
+
export interface SSOSessionConfig {
|
|
5
|
+
sessionName: string;
|
|
6
|
+
startUrl: string;
|
|
7
|
+
region: string;
|
|
8
|
+
registrationScopes: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* AWS Account information from SSO
|
|
12
|
+
*/
|
|
13
|
+
export interface SSOAccount {
|
|
14
|
+
accountId: string;
|
|
15
|
+
accountName: string;
|
|
16
|
+
emailAddress?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* AWS Role information from SSO
|
|
20
|
+
*/
|
|
21
|
+
export interface SSORole {
|
|
22
|
+
roleName: string;
|
|
23
|
+
accountId: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Combined account with roles
|
|
27
|
+
*/
|
|
28
|
+
export interface AccountWithRoles {
|
|
29
|
+
account: SSOAccount;
|
|
30
|
+
roles: SSORole[];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Profile to be created
|
|
34
|
+
*/
|
|
35
|
+
export interface ProfileConfig {
|
|
36
|
+
name: string;
|
|
37
|
+
accountId: string;
|
|
38
|
+
roleName: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Padua SSO defaults
|
|
42
|
+
*/
|
|
43
|
+
export declare const PADUA_SSO_DEFAULTS: {
|
|
44
|
+
sessionName: string;
|
|
45
|
+
startUrl: string;
|
|
46
|
+
region: string;
|
|
47
|
+
registrationScopes: string;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Padua CodeArtifact defaults (hardcoded)
|
|
51
|
+
*/
|
|
52
|
+
export declare const PADUA_CODEARTIFACT_DEFAULTS: {
|
|
53
|
+
domain: string;
|
|
54
|
+
domainOwner: string;
|
|
55
|
+
repository: string;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Padua ECR defaults (hardcoded)
|
|
59
|
+
*/
|
|
60
|
+
export declare const PADUA_ECR_DEFAULTS: {
|
|
61
|
+
accountId: string;
|
|
62
|
+
region: string;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Get cached SSO access token if valid
|
|
66
|
+
*/
|
|
67
|
+
export declare function getCachedAccessToken(startUrl: string): string | null;
|
|
68
|
+
/**
|
|
69
|
+
* Register OIDC client with SSO
|
|
70
|
+
*/
|
|
71
|
+
export declare function registerSSOClient(startUrl: string, region: string): Promise<{
|
|
72
|
+
clientId: string;
|
|
73
|
+
clientSecret: string;
|
|
74
|
+
}>;
|
|
75
|
+
/**
|
|
76
|
+
* Start device authorization flow
|
|
77
|
+
*/
|
|
78
|
+
export declare function startDeviceAuthorization(clientId: string, clientSecret: string, startUrl: string, region: string): Promise<{
|
|
79
|
+
deviceCode: string;
|
|
80
|
+
userCode: string;
|
|
81
|
+
verificationUri: string;
|
|
82
|
+
expiresIn: number;
|
|
83
|
+
}>;
|
|
84
|
+
/**
|
|
85
|
+
* Poll for access token after user authorization
|
|
86
|
+
*/
|
|
87
|
+
export declare function pollForToken(clientId: string, clientSecret: string, deviceCode: string, region: string, expiresIn: number): Promise<string>;
|
|
88
|
+
/**
|
|
89
|
+
* Authenticate with SSO and get access token
|
|
90
|
+
* Uses cached token if valid, otherwise initiates device authorization flow
|
|
91
|
+
*/
|
|
92
|
+
export declare function authenticateSSO(startUrl?: string, region?: string, onBrowserOpen?: (url: string, userCode: string) => void): Promise<string>;
|
|
93
|
+
/**
|
|
94
|
+
* List all AWS accounts the user has access to via SSO
|
|
95
|
+
*/
|
|
96
|
+
export declare function listSSOAccounts(accessToken: string, region?: string): Promise<SSOAccount[]>;
|
|
97
|
+
/**
|
|
98
|
+
* List all roles for a specific account
|
|
99
|
+
*/
|
|
100
|
+
export declare function listAccountRoles(accessToken: string, accountId: string, region?: string): Promise<SSORole[]>;
|
|
101
|
+
/**
|
|
102
|
+
* Discover all accounts and roles the user has access to
|
|
103
|
+
*/
|
|
104
|
+
export declare function discoverAccountsAndRoles(accessToken: string, region?: string): Promise<AccountWithRoles[]>;
|
|
105
|
+
/**
|
|
106
|
+
* Generate profile name from account name
|
|
107
|
+
* Converts to lowercase, replaces spaces/special chars with hyphens
|
|
108
|
+
*/
|
|
109
|
+
export declare function generateProfileName(accountName: string): string;
|
|
110
|
+
/**
|
|
111
|
+
* Build profile configurations from discovered accounts and roles
|
|
112
|
+
*/
|
|
113
|
+
export declare function buildProfileConfigs(accountsWithRoles: AccountWithRoles[], selectedRole?: string): ProfileConfig[];
|
|
114
|
+
//# sourceMappingURL=sso-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-discovery.d.ts","sourceRoot":"","sources":["../../../src/commands/init/sso-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PADUA_ECR_DEFAULTS = exports.PADUA_CODEARTIFACT_DEFAULTS = exports.PADUA_SSO_DEFAULTS = void 0;
|
|
37
|
+
exports.getCachedAccessToken = getCachedAccessToken;
|
|
38
|
+
exports.registerSSOClient = registerSSOClient;
|
|
39
|
+
exports.startDeviceAuthorization = startDeviceAuthorization;
|
|
40
|
+
exports.pollForToken = pollForToken;
|
|
41
|
+
exports.authenticateSSO = authenticateSSO;
|
|
42
|
+
exports.listSSOAccounts = listSSOAccounts;
|
|
43
|
+
exports.listAccountRoles = listAccountRoles;
|
|
44
|
+
exports.discoverAccountsAndRoles = discoverAccountsAndRoles;
|
|
45
|
+
exports.generateProfileName = generateProfileName;
|
|
46
|
+
exports.buildProfileConfigs = buildProfileConfigs;
|
|
47
|
+
const child_process_1 = require("child_process");
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const os = __importStar(require("os"));
|
|
51
|
+
/**
|
|
52
|
+
* Padua SSO defaults
|
|
53
|
+
*/
|
|
54
|
+
exports.PADUA_SSO_DEFAULTS = {
|
|
55
|
+
sessionName: 'padua',
|
|
56
|
+
startUrl: 'https://paduasolutions.awsapps.com/start',
|
|
57
|
+
region: 'ap-southeast-2',
|
|
58
|
+
registrationScopes: 'sso:account:access',
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Padua CodeArtifact defaults (hardcoded)
|
|
62
|
+
*/
|
|
63
|
+
exports.PADUA_CODEARTIFACT_DEFAULTS = {
|
|
64
|
+
domain: 'paduafg',
|
|
65
|
+
domainOwner: '361485743373',
|
|
66
|
+
repository: 'paduafg',
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Padua ECR defaults (hardcoded)
|
|
70
|
+
*/
|
|
71
|
+
exports.PADUA_ECR_DEFAULTS = {
|
|
72
|
+
accountId: '361485743373',
|
|
73
|
+
region: 'ap-southeast-2',
|
|
74
|
+
};
|
|
75
|
+
const SSO_CACHE_DIR = path.join(os.homedir(), '.aws', 'sso', 'cache');
|
|
76
|
+
/**
|
|
77
|
+
* Get cached SSO access token if valid
|
|
78
|
+
*/
|
|
79
|
+
function getCachedAccessToken(startUrl) {
|
|
80
|
+
try {
|
|
81
|
+
if (!fs.existsSync(SSO_CACHE_DIR)) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const cacheFiles = fs.readdirSync(SSO_CACHE_DIR).filter(f => f.endsWith('.json'));
|
|
85
|
+
for (const file of cacheFiles) {
|
|
86
|
+
try {
|
|
87
|
+
const filePath = path.join(SSO_CACHE_DIR, file);
|
|
88
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
89
|
+
const cached = JSON.parse(content);
|
|
90
|
+
// Check if this cache is for our SSO start URL
|
|
91
|
+
if (cached.startUrl === startUrl && cached.accessToken) {
|
|
92
|
+
// Check if token is expired
|
|
93
|
+
const expiresAt = new Date(cached.expiresAt);
|
|
94
|
+
if (expiresAt > new Date()) {
|
|
95
|
+
return cached.accessToken;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Skip invalid cache files
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Register OIDC client with SSO
|
|
112
|
+
*/
|
|
113
|
+
async function registerSSOClient(startUrl, region) {
|
|
114
|
+
const result = (0, child_process_1.spawnSync)('aws', [
|
|
115
|
+
'sso-oidc', 'register-client',
|
|
116
|
+
'--client-name', 'padua-cli',
|
|
117
|
+
'--client-type', 'public',
|
|
118
|
+
'--scopes', 'sso:account:access',
|
|
119
|
+
'--region', region,
|
|
120
|
+
'--output', 'json',
|
|
121
|
+
], {
|
|
122
|
+
shell: false,
|
|
123
|
+
timeout: 30000,
|
|
124
|
+
maxBuffer: 1024 * 1024,
|
|
125
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
126
|
+
});
|
|
127
|
+
if (result.error || result.status !== 0) {
|
|
128
|
+
const stderr = result.stderr?.toString() || '';
|
|
129
|
+
if (stderr.includes('ENOENT')) {
|
|
130
|
+
throw new Error('AWS CLI not found. Please install AWS CLI v2: https://aws.amazon.com/cli/');
|
|
131
|
+
}
|
|
132
|
+
throw new Error(`Failed to register SSO client: ${stderr}`);
|
|
133
|
+
}
|
|
134
|
+
const output = JSON.parse(result.stdout.toString());
|
|
135
|
+
return {
|
|
136
|
+
clientId: output.clientId,
|
|
137
|
+
clientSecret: output.clientSecret,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Start device authorization flow
|
|
142
|
+
*/
|
|
143
|
+
async function startDeviceAuthorization(clientId, clientSecret, startUrl, region) {
|
|
144
|
+
const result = (0, child_process_1.spawnSync)('aws', [
|
|
145
|
+
'sso-oidc', 'start-device-authorization',
|
|
146
|
+
'--client-id', clientId,
|
|
147
|
+
'--client-secret', clientSecret,
|
|
148
|
+
'--start-url', startUrl,
|
|
149
|
+
'--region', region,
|
|
150
|
+
'--output', 'json',
|
|
151
|
+
], {
|
|
152
|
+
shell: false,
|
|
153
|
+
timeout: 30000,
|
|
154
|
+
maxBuffer: 1024 * 1024,
|
|
155
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
156
|
+
});
|
|
157
|
+
if (result.error || result.status !== 0) {
|
|
158
|
+
const stderr = result.stderr?.toString() || '';
|
|
159
|
+
throw new Error(`Failed to start device authorization: ${stderr}`);
|
|
160
|
+
}
|
|
161
|
+
const output = JSON.parse(result.stdout.toString());
|
|
162
|
+
return {
|
|
163
|
+
deviceCode: output.deviceCode,
|
|
164
|
+
userCode: output.userCode,
|
|
165
|
+
verificationUri: output.verificationUriComplete || output.verificationUri,
|
|
166
|
+
expiresIn: output.expiresIn,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Sleep helper
|
|
171
|
+
*/
|
|
172
|
+
function sleep(ms) {
|
|
173
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Poll for access token after user authorization
|
|
177
|
+
*/
|
|
178
|
+
async function pollForToken(clientId, clientSecret, deviceCode, region, expiresIn) {
|
|
179
|
+
const pollInterval = 5000; // 5 seconds
|
|
180
|
+
const maxAttempts = Math.floor((expiresIn * 1000) / pollInterval);
|
|
181
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
182
|
+
const result = (0, child_process_1.spawnSync)('aws', [
|
|
183
|
+
'sso-oidc', 'create-token',
|
|
184
|
+
'--client-id', clientId,
|
|
185
|
+
'--client-secret', clientSecret,
|
|
186
|
+
'--grant-type', 'urn:ietf:params:oauth:grant-type:device_code',
|
|
187
|
+
'--device-code', deviceCode,
|
|
188
|
+
'--region', region,
|
|
189
|
+
'--output', 'json',
|
|
190
|
+
], {
|
|
191
|
+
shell: false,
|
|
192
|
+
timeout: 30000,
|
|
193
|
+
maxBuffer: 1024 * 1024,
|
|
194
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
195
|
+
});
|
|
196
|
+
if (result.status === 0) {
|
|
197
|
+
const output = JSON.parse(result.stdout.toString());
|
|
198
|
+
return output.accessToken;
|
|
199
|
+
}
|
|
200
|
+
const stderr = result.stderr?.toString() || '';
|
|
201
|
+
if (stderr.includes('AuthorizationPendingException') || stderr.includes('authorization_pending')) {
|
|
202
|
+
// User hasn't authorized yet, wait and retry
|
|
203
|
+
await sleep(pollInterval);
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
if (stderr.includes('SlowDownException') || stderr.includes('slow_down')) {
|
|
207
|
+
// Rate limited, wait longer
|
|
208
|
+
await sleep(pollInterval * 2);
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (stderr.includes('ExpiredTokenException') || stderr.includes('expired_token')) {
|
|
212
|
+
throw new Error('Authorization expired. Please try again.');
|
|
213
|
+
}
|
|
214
|
+
throw new Error(`Failed to get access token: ${stderr}`);
|
|
215
|
+
}
|
|
216
|
+
throw new Error('Authorization timed out. Please try again.');
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Authenticate with SSO and get access token
|
|
220
|
+
* Uses cached token if valid, otherwise initiates device authorization flow
|
|
221
|
+
*/
|
|
222
|
+
async function authenticateSSO(startUrl = exports.PADUA_SSO_DEFAULTS.startUrl, region = exports.PADUA_SSO_DEFAULTS.region, onBrowserOpen) {
|
|
223
|
+
// Check for cached valid token first
|
|
224
|
+
const cachedToken = getCachedAccessToken(startUrl);
|
|
225
|
+
if (cachedToken) {
|
|
226
|
+
return cachedToken;
|
|
227
|
+
}
|
|
228
|
+
// No valid cached token, start device authorization flow
|
|
229
|
+
const client = await registerSSOClient(startUrl, region);
|
|
230
|
+
const auth = await startDeviceAuthorization(client.clientId, client.clientSecret, startUrl, region);
|
|
231
|
+
// Notify caller to open browser
|
|
232
|
+
if (onBrowserOpen) {
|
|
233
|
+
onBrowserOpen(auth.verificationUri, auth.userCode);
|
|
234
|
+
}
|
|
235
|
+
// Poll for token
|
|
236
|
+
return pollForToken(client.clientId, client.clientSecret, auth.deviceCode, region, auth.expiresIn);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* List all AWS accounts the user has access to via SSO
|
|
240
|
+
*/
|
|
241
|
+
async function listSSOAccounts(accessToken, region = exports.PADUA_SSO_DEFAULTS.region) {
|
|
242
|
+
const accounts = [];
|
|
243
|
+
let nextToken;
|
|
244
|
+
do {
|
|
245
|
+
const args = [
|
|
246
|
+
'sso', 'list-accounts',
|
|
247
|
+
'--access-token', accessToken,
|
|
248
|
+
'--region', region,
|
|
249
|
+
'--output', 'json',
|
|
250
|
+
];
|
|
251
|
+
if (nextToken) {
|
|
252
|
+
args.push('--starting-token', nextToken);
|
|
253
|
+
}
|
|
254
|
+
const result = (0, child_process_1.spawnSync)('aws', args, {
|
|
255
|
+
shell: false,
|
|
256
|
+
timeout: 30000,
|
|
257
|
+
maxBuffer: 1024 * 1024,
|
|
258
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
259
|
+
});
|
|
260
|
+
if (result.error || result.status !== 0) {
|
|
261
|
+
const stderr = result.stderr?.toString() || '';
|
|
262
|
+
if (stderr.includes('UnauthorizedException') || stderr.includes('Token is invalid')) {
|
|
263
|
+
throw new Error('SSO session expired. Please authenticate again.');
|
|
264
|
+
}
|
|
265
|
+
throw new Error(`Failed to list SSO accounts: ${stderr}`);
|
|
266
|
+
}
|
|
267
|
+
const output = JSON.parse(result.stdout.toString());
|
|
268
|
+
for (const account of output.accountList || []) {
|
|
269
|
+
accounts.push({
|
|
270
|
+
accountId: account.accountId,
|
|
271
|
+
accountName: account.accountName,
|
|
272
|
+
emailAddress: account.emailAddress,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
nextToken = output.nextToken;
|
|
276
|
+
} while (nextToken);
|
|
277
|
+
return accounts;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* List all roles for a specific account
|
|
281
|
+
*/
|
|
282
|
+
async function listAccountRoles(accessToken, accountId, region = exports.PADUA_SSO_DEFAULTS.region) {
|
|
283
|
+
const roles = [];
|
|
284
|
+
let nextToken;
|
|
285
|
+
do {
|
|
286
|
+
const args = [
|
|
287
|
+
'sso', 'list-account-roles',
|
|
288
|
+
'--access-token', accessToken,
|
|
289
|
+
'--account-id', accountId,
|
|
290
|
+
'--region', region,
|
|
291
|
+
'--output', 'json',
|
|
292
|
+
];
|
|
293
|
+
if (nextToken) {
|
|
294
|
+
args.push('--starting-token', nextToken);
|
|
295
|
+
}
|
|
296
|
+
const result = (0, child_process_1.spawnSync)('aws', args, {
|
|
297
|
+
shell: false,
|
|
298
|
+
timeout: 30000,
|
|
299
|
+
maxBuffer: 1024 * 1024,
|
|
300
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
301
|
+
});
|
|
302
|
+
if (result.error || result.status !== 0) {
|
|
303
|
+
const stderr = result.stderr?.toString() || '';
|
|
304
|
+
throw new Error(`Failed to list account roles: ${stderr}`);
|
|
305
|
+
}
|
|
306
|
+
const output = JSON.parse(result.stdout.toString());
|
|
307
|
+
for (const role of output.roleList || []) {
|
|
308
|
+
roles.push({
|
|
309
|
+
roleName: role.roleName,
|
|
310
|
+
accountId: accountId,
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
nextToken = output.nextToken;
|
|
314
|
+
} while (nextToken);
|
|
315
|
+
return roles;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Discover all accounts and roles the user has access to
|
|
319
|
+
*/
|
|
320
|
+
async function discoverAccountsAndRoles(accessToken, region = exports.PADUA_SSO_DEFAULTS.region) {
|
|
321
|
+
const accounts = await listSSOAccounts(accessToken, region);
|
|
322
|
+
const result = [];
|
|
323
|
+
for (const account of accounts) {
|
|
324
|
+
const roles = await listAccountRoles(accessToken, account.accountId, region);
|
|
325
|
+
result.push({ account, roles });
|
|
326
|
+
}
|
|
327
|
+
// Sort by account name for consistent output
|
|
328
|
+
result.sort((a, b) => a.account.accountName.localeCompare(b.account.accountName));
|
|
329
|
+
return result;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Generate profile name from account name
|
|
333
|
+
* Converts to lowercase, replaces spaces/special chars with hyphens
|
|
334
|
+
*/
|
|
335
|
+
function generateProfileName(accountName) {
|
|
336
|
+
return accountName
|
|
337
|
+
.toLowerCase()
|
|
338
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
339
|
+
.replace(/^-|-$/g, '')
|
|
340
|
+
.substring(0, 128);
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Build profile configurations from discovered accounts and roles
|
|
344
|
+
*/
|
|
345
|
+
function buildProfileConfigs(accountsWithRoles, selectedRole) {
|
|
346
|
+
const profiles = [];
|
|
347
|
+
for (const { account, roles } of accountsWithRoles) {
|
|
348
|
+
// If a specific role is selected, use only that role
|
|
349
|
+
// Otherwise, use the first available role (usually the highest permission)
|
|
350
|
+
const roleToUse = selectedRole
|
|
351
|
+
? roles.find(r => r.roleName === selectedRole)
|
|
352
|
+
: roles[0];
|
|
353
|
+
if (roleToUse) {
|
|
354
|
+
profiles.push({
|
|
355
|
+
name: generateProfileName(account.accountName),
|
|
356
|
+
accountId: account.accountId,
|
|
357
|
+
roleName: roleToUse.roleName,
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return profiles;
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=sso-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso-discovery.js","sourceRoot":"","sources":["../../../src/commands/init/sso-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../src/commands/status/checks.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAe,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK/D;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAiFxE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuDrG;AA4BD;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../src/commands/status/checks.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAe,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK/D;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAiFxE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAuDrG;AA4BD;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,CAwF1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAmBrD"}
|
|
@@ -211,12 +211,11 @@ async function checkECRStatus(config) {
|
|
|
211
211
|
try {
|
|
212
212
|
const content = fs.readFileSync(dockerConfigPath, 'utf-8');
|
|
213
213
|
const dockerConfig = JSON.parse(content);
|
|
214
|
-
// Check if using credential helper
|
|
214
|
+
// Check if using credential helper for specific registries
|
|
215
215
|
if (dockerConfig.credHelpers) {
|
|
216
216
|
const helperKey = Object.keys(dockerConfig.credHelpers).find(k => k.includes('ecr') && k.includes(config.region));
|
|
217
217
|
if (helperKey) {
|
|
218
218
|
// Credential helper is configured - assume authenticated
|
|
219
|
-
// (we can't easily check helper-stored credentials)
|
|
220
219
|
return {
|
|
221
220
|
authenticated: true,
|
|
222
221
|
registry,
|
|
@@ -233,15 +232,32 @@ async function checkECRStatus(config) {
|
|
|
233
232
|
}
|
|
234
233
|
// Look for ECR registry entry
|
|
235
234
|
const ecrEntry = Object.keys(dockerConfig.auths).find(k => k.includes(config.accountId) && k.includes('ecr') && k.includes(config.region));
|
|
236
|
-
if (!ecrEntry
|
|
235
|
+
if (!ecrEntry) {
|
|
237
236
|
return {
|
|
238
237
|
authenticated: false,
|
|
239
238
|
registry,
|
|
240
239
|
error: 'No ECR credentials found',
|
|
241
240
|
};
|
|
242
241
|
}
|
|
243
|
-
//
|
|
244
|
-
//
|
|
242
|
+
// Check if using global credsStore (e.g., Docker Desktop)
|
|
243
|
+
// When credsStore is set, auths entries may be empty {} but credentials
|
|
244
|
+
// are stored in the system credential store
|
|
245
|
+
if (dockerConfig.credsStore && !dockerConfig.auths[ecrEntry]?.auth) {
|
|
246
|
+
// Registry entry exists + credsStore configured = credentials in external store
|
|
247
|
+
return {
|
|
248
|
+
authenticated: true,
|
|
249
|
+
registry,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
// Check for inline auth token
|
|
253
|
+
if (!dockerConfig.auths[ecrEntry]?.auth) {
|
|
254
|
+
return {
|
|
255
|
+
authenticated: false,
|
|
256
|
+
registry,
|
|
257
|
+
error: 'No ECR credentials found',
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
// ECR auth exists inline
|
|
245
261
|
return {
|
|
246
262
|
authenticated: true,
|
|
247
263
|
registry,
|