Skip to content

Commit 6d866cf

Browse files
committed
Ensure the same homedir as would be resolved by the CLI is used
1 parent fc7af7d commit 6d866cf

File tree

2 files changed

+216
-5
lines changed

2 files changed

+216
-5
lines changed

packages/credential-provider/__tests__/fromIni.ts

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ const envAtLoadTime: {[key: string]: string} = [
3131
ENV_CONFIG_PATH,
3232
ENV_CREDENTIALS_PATH,
3333
ENV_PROFILE,
34+
'HOME',
35+
'USERPROFILE',
36+
'HOMEPATH',
37+
'HOMEDRIVE',
3438
].reduce((envState, varName) => Object.assign(
3539
envState,
3640
{[varName]: process.env[varName]}
@@ -126,6 +130,102 @@ aws_session_token = ${FOO_CREDS.sessionToken}`.trim());
126130
.toEqual(DEFAULT_CREDS);
127131
}
128132
);
133+
134+
it('should use $HOME when available', async () => {
135+
process.env.HOME = '/foo/bar';
136+
__addMatcher(
137+
/\/foo\/bar[\/\\].aws[\/\\]credentials/,
138+
SIMPLE_CREDS_FILE
139+
);
140+
141+
expect(await fromIni()()).toEqual(DEFAULT_CREDS);
142+
});
143+
144+
it('should use $USERPROFILE when available', async () => {
145+
process.env.USERPROFILE = 'C:\\Users\\user';
146+
__addMatcher(
147+
/C:\\Users\\user[\/\\].aws[\/\\]credentials/,
148+
SIMPLE_CREDS_FILE
149+
);
150+
151+
expect(await fromIni()()).toEqual(DEFAULT_CREDS);
152+
});
153+
154+
it('should use $HOMEPATH/$HOMEDRIVE when available', async () => {
155+
process.env.HOMEDRIVE = 'D:\\';
156+
process.env.HOMEPATH = 'Users\\user';
157+
__addMatcher(
158+
/D:\\Users\\user[\/\\].aws[\/\\]credentials/,
159+
SIMPLE_CREDS_FILE
160+
);
161+
162+
expect(await fromIni()()).toEqual(DEFAULT_CREDS);
163+
});
164+
165+
it('should prefer $HOME to $USERPROFILE', async () => {
166+
process.env.HOME = '/foo/bar';
167+
process.env.USERPROFILE = 'C:\\Users\\user';
168+
169+
__addMatcher(/\/foo\/bar[\/\\].aws[\/\\]credentials/, `
170+
[default]
171+
aws_access_key_id = ${DEFAULT_CREDS.accessKeyId}
172+
aws_secret_access_key = ${DEFAULT_CREDS.secretKey}
173+
aws_session_token = ${DEFAULT_CREDS.sessionToken}`.trim()
174+
);
175+
176+
__addMatcher(/C:\\Users\\user[\/\\].aws[\/\\]credentials/, `
177+
[default]
178+
aws_access_key_id = ${FOO_CREDS.accessKeyId}
179+
aws_secret_access_key = ${FOO_CREDS.secretKey}
180+
aws_session_token = ${FOO_CREDS.sessionToken}`.trim()
181+
);
182+
183+
expect(await fromIni()()).toEqual(DEFAULT_CREDS);
184+
});
185+
186+
it('should prefer $USERPROFILE to $HOMEDRIVE+$HOMEPATH', async () => {
187+
process.env.USERPROFILE = 'C:\\Users\\user';
188+
process.env.HOMEDRIVE = 'D:\\';
189+
process.env.HOMEPATH = 'Users\\user2';
190+
191+
__addMatcher(/C:\\Users\\user[\/\\].aws[\/\\]credentials/, `
192+
[default]
193+
aws_access_key_id = ${DEFAULT_CREDS.accessKeyId}
194+
aws_secret_access_key = ${DEFAULT_CREDS.secretKey}
195+
aws_session_token = ${DEFAULT_CREDS.sessionToken}`.trim()
196+
);
197+
198+
__addMatcher(/D:\\Users\\user2[\/\\].aws[\/\\]credentials/, `
199+
[default]
200+
aws_access_key_id = ${FOO_CREDS.accessKeyId}
201+
aws_secret_access_key = ${FOO_CREDS.secretKey}
202+
aws_session_token = ${FOO_CREDS.sessionToken}`.trim()
203+
);
204+
205+
expect(await fromIni()()).toEqual(DEFAULT_CREDS);
206+
});
207+
208+
it('should prefer $HOME to $HOMEDRIVE+$HOMEPATH', async () => {
209+
process.env.HOME = '/foo/bar';
210+
process.env.HOMEDRIVE = 'D:\\';
211+
process.env.HOMEPATH = 'Users\\user2';
212+
213+
__addMatcher(/\/foo\/bar[\/\\].aws[\/\\]credentials/, `
214+
[default]
215+
aws_access_key_id = ${DEFAULT_CREDS.accessKeyId}
216+
aws_secret_access_key = ${DEFAULT_CREDS.secretKey}
217+
aws_session_token = ${DEFAULT_CREDS.sessionToken}`.trim()
218+
);
219+
220+
__addMatcher(/D:\\Users\\user2[\/\\].aws[\/\\]credentials/, `
221+
[default]
222+
aws_access_key_id = ${FOO_CREDS.accessKeyId}
223+
aws_secret_access_key = ${FOO_CREDS.secretKey}
224+
aws_session_token = ${FOO_CREDS.sessionToken}`.trim()
225+
);
226+
227+
expect(await fromIni()()).toEqual(DEFAULT_CREDS);
228+
});
129229
});
130230

131231
describe('shared config file', () => {
@@ -203,6 +303,102 @@ aws_session_token = ${FOO_CREDS.sessionToken}`.trim());
203303
.toEqual(DEFAULT_CREDS);
204304
}
205305
);
306+
307+
it('should use $HOME when available', async () => {
308+
process.env.HOME = '/foo/bar';
309+
__addMatcher(
310+
/\/foo\/bar[\/\\].aws[\/\\]config/,
311+
SIMPLE_CONFIG_FILE
312+
);
313+
314+
expect(await fromIni()()).toEqual(DEFAULT_CREDS);
315+
});
316+
317+
it('should use $USERPROFILE when available', async () => {
318+
process.env.USERPROFILE = 'C:\\Users\\user';
319+
__addMatcher(
320+
/C:\\Users\\user[\/\\].aws[\/\\]config/,
321+
SIMPLE_CONFIG_FILE
322+
);
323+
324+
expect(await fromIni()()).toEqual(DEFAULT_CREDS);
325+
});
326+
327+
it('should use $HOMEPATH/$HOMEDRIVE when available', async () => {
328+
process.env.HOMEDRIVE = 'D:\\';
329+
process.env.HOMEPATH = 'Users\\user';
330+
__addMatcher(
331+
/D:\\Users\\user[\/\\].aws[\/\\]config/,
332+
SIMPLE_CONFIG_FILE
333+
);
334+
335+
expect(await fromIni()()).toEqual(DEFAULT_CREDS);
336+
});
337+
338+
it('should prefer $HOME to $USERPROFILE', async () => {
339+
process.env.HOME = '/foo/bar';
340+
process.env.USERPROFILE = 'C:\\Users\\user';
341+
342+
__addMatcher(/\/foo\/bar[\/\\].aws[\/\\]config/, `
343+
[default]
344+
aws_access_key_id = ${DEFAULT_CREDS.accessKeyId}
345+
aws_secret_access_key = ${DEFAULT_CREDS.secretKey}
346+
aws_session_token = ${DEFAULT_CREDS.sessionToken}`.trim()
347+
);
348+
349+
__addMatcher(/C:\\Users\\user[\/\\].aws[\/\\]config/, `
350+
[default]
351+
aws_access_key_id = ${FOO_CREDS.accessKeyId}
352+
aws_secret_access_key = ${FOO_CREDS.secretKey}
353+
aws_session_token = ${FOO_CREDS.sessionToken}`.trim()
354+
);
355+
356+
expect(await fromIni()()).toEqual(DEFAULT_CREDS);
357+
});
358+
359+
it('should prefer $USERPROFILE to $HOMEDRIVE+$HOMEPATH', async () => {
360+
process.env.USERPROFILE = 'C:\\Users\\user';
361+
process.env.HOMEDRIVE = 'D:\\';
362+
process.env.HOMEPATH = 'Users\\user2';
363+
364+
__addMatcher(/C:\\Users\\user[\/\\].aws[\/\\]config/, `
365+
[default]
366+
aws_access_key_id = ${DEFAULT_CREDS.accessKeyId}
367+
aws_secret_access_key = ${DEFAULT_CREDS.secretKey}
368+
aws_session_token = ${DEFAULT_CREDS.sessionToken}`.trim()
369+
);
370+
371+
__addMatcher(/D:\\Users\\user2[\/\\].aws[\/\\]config/, `
372+
[default]
373+
aws_access_key_id = ${FOO_CREDS.accessKeyId}
374+
aws_secret_access_key = ${FOO_CREDS.secretKey}
375+
aws_session_token = ${FOO_CREDS.sessionToken}`.trim()
376+
);
377+
378+
expect(await fromIni()()).toEqual(DEFAULT_CREDS);
379+
});
380+
381+
it('should prefer $HOME to $HOMEDRIVE+$HOMEPATH', async () => {
382+
process.env.HOME = '/foo/bar';
383+
process.env.HOMEDRIVE = 'D:\\';
384+
process.env.HOMEPATH = 'Users\\user2';
385+
386+
__addMatcher(/\/foo\/bar[\/\\].aws[\/\\]config/, `
387+
[default]
388+
aws_access_key_id = ${DEFAULT_CREDS.accessKeyId}
389+
aws_secret_access_key = ${DEFAULT_CREDS.secretKey}
390+
aws_session_token = ${DEFAULT_CREDS.sessionToken}`.trim()
391+
);
392+
393+
__addMatcher(/D:\\Users\\user2[\/\\].aws[\/\\]config/, `
394+
[default]
395+
aws_access_key_id = ${FOO_CREDS.accessKeyId}
396+
aws_secret_access_key = ${FOO_CREDS.secretKey}
397+
aws_session_token = ${FOO_CREDS.sessionToken}`.trim()
398+
);
399+
400+
expect(await fromIni()()).toEqual(DEFAULT_CREDS);
401+
});
206402
});
207403

208404
describe('assume role', () => {

packages/credential-provider/lib/fromIni.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import {CredentialProvider} from './CredentialProvider';
22
import {Credentials} from "./Credentials";
33
import {homedir} from 'os';
4-
import {join} from 'path';
4+
import {join, sep} from 'path';
55
import {readFile} from 'fs';
66

77
const DEFAULT_PROFILE = 'default';
88
export const ENV_PROFILE = 'AWS_PROFILE';
9-
const DEFAULT_CREDENTIALS_PATH = join(homedir(), '.aws', 'credentials');
109
export const ENV_CREDENTIALS_PATH = 'AWS_SHARED_CREDENTIALS_FILE';
11-
const DEFAULT_CONFIG_PATH = join(homedir(), '.aws', 'config');
1210
export const ENV_CONFIG_PATH = 'AWS_CONFIG_FILE';
1311

1412
export interface AssumeRoleParams {
@@ -71,8 +69,10 @@ function isAssumeRoleProfile(arg: any): arg is AssumeRoleProfile {
7169
export function fromIni(init: FromIniInit = {}): CredentialProvider {
7270
return (): Promise<Credentials> => {
7371
const {
74-
filepath = process.env[ENV_CREDENTIALS_PATH] || DEFAULT_CREDENTIALS_PATH,
75-
configFilepath = process.env[ENV_CONFIG_PATH] || DEFAULT_CONFIG_PATH,
72+
filepath = process.env[ENV_CREDENTIALS_PATH]
73+
|| join(getHomeDir(), '.aws', 'credentials'),
74+
configFilepath = process.env[ENV_CONFIG_PATH]
75+
|| join(getHomeDir(), '.aws', 'config'),
7676
profile = process.env[ENV_PROFILE] || DEFAULT_PROFILE,
7777
} = init;
7878

@@ -169,3 +169,18 @@ function slurpFile(path: string): Promise<string> {
169169
});
170170
});
171171
}
172+
173+
function getHomeDir(): string {
174+
const {
175+
HOME,
176+
USERPROFILE,
177+
HOMEPATH,
178+
HOMEDRIVE = `C:${sep}`,
179+
} = process.env;
180+
181+
if (HOME) return HOME;
182+
if (USERPROFILE) return USERPROFILE;
183+
if (HOMEPATH) return `${HOMEDRIVE}${HOMEPATH}`;
184+
185+
return homedir();
186+
}

0 commit comments

Comments
 (0)