Skip to content

Commit 531daad

Browse files
committed
config: support username impersonation
This commit adds support for username impersonation. This does not implement group, UID, or extra impersonation. Refs: #2355
1 parent ecd208c commit 531daad

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

src/config.ts

+5
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,11 @@ export class KubeConfig implements SecurityAuthentication {
582582
if (key) {
583583
opts.key = key;
584584
}
585+
586+
if (user.impersonateUser != null) {
587+
opts.headers ??= {};
588+
opts.headers['Impersonate-User'] = user.impersonateUser;
589+
}
585590
}
586591

587592
private async applyAuthorizationHeader(

src/config_test.ts

+38
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,23 @@ describe('KubeConfig', () => {
643643
strictEqual(username, users[0].username);
644644
strictEqual(name, users[0].name);
645645
});
646+
it('should load impersonation information', () => {
647+
const users = newUsers([
648+
{
649+
name: 'some-name-1',
650+
as: 'impersonated-user',
651+
user: {},
652+
},
653+
{
654+
name: 'some-name-2',
655+
user: {},
656+
},
657+
]);
658+
strictEqual('some-name-1', users[0].name);
659+
strictEqual('impersonated-user', users[0].impersonateUser);
660+
strictEqual('some-name-2', users[1].name);
661+
strictEqual(undefined, users[1].impersonateUser);
662+
});
646663
});
647664

648665
describe('findHome', () => {
@@ -1787,4 +1804,25 @@ describe('KubeConfig', () => {
17871804
strictEqual(opts.headers!.Authorization, 'Bearer test-token');
17881805
});
17891806
});
1807+
1808+
describe('Impersonation', () => {
1809+
it('injects Impersonate-User header', async () => {
1810+
const kc = new KubeConfig();
1811+
const cluster: Cluster = {
1812+
name: 'test-cluster',
1813+
server: 'https://localhost:6443',
1814+
skipTLSVerify: false,
1815+
};
1816+
const user: User = {
1817+
name: 'test-user',
1818+
authProvider: 'custom',
1819+
impersonateUser: 'impersonate-user',
1820+
};
1821+
1822+
kc.loadFromClusterAndUser(cluster, user);
1823+
const opts: RequestOptions = {};
1824+
await kc.applyToHTTPSOptions(opts);
1825+
strictEqual(opts.headers!['Impersonate-User'], 'impersonate-user');
1826+
});
1827+
});
17901828
});

src/config_types.ts

+3
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ export interface User {
9797
readonly token?: string;
9898
readonly username?: string;
9999
readonly password?: string;
100+
readonly impersonateUser?: string;
100101
}
101102

102103
export function newUsers(a: any, opts?: Partial<ConfigOptions>): User[] {
@@ -112,6 +113,7 @@ export function newUsers(a: any, opts?: Partial<ConfigOptions>): User[] {
112113
export function exportUser(user: User): any {
113114
return {
114115
name: user.name,
116+
as: user.impersonateUser,
115117
user: {
116118
'auth-provider': user.authProvider,
117119
'client-certificate-data': user.certData,
@@ -143,6 +145,7 @@ function userIterator(onInvalidEntry: ActionOnInvalid): (elt: any, i: number, li
143145
token: findToken(elt.user),
144146
password: elt.user ? elt.user.password : null,
145147
username: elt.user ? elt.user.username : null,
148+
impersonateUser: elt.as,
146149
};
147150
} catch (err) {
148151
switch (onInvalidEntry) {

0 commit comments

Comments
 (0)