Skip to content

Commit 8fc2f57

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 8fc2f57

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-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

+39
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,24 @@ 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+
user: {
651+
as: 'impersonated-user',
652+
},
653+
},
654+
{
655+
name: 'some-name-2',
656+
user: {},
657+
},
658+
]);
659+
strictEqual('some-name-1', users[0].name);
660+
strictEqual('impersonated-user', users[0].impersonateUser);
661+
strictEqual('some-name-2', users[1].name);
662+
strictEqual(undefined, users[1].impersonateUser);
663+
});
646664
});
647665

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

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[] {
@@ -113,6 +114,7 @@ export function exportUser(user: User): any {
113114
return {
114115
name: user.name,
115116
user: {
117+
as: user.impersonateUser,
116118
'auth-provider': user.authProvider,
117119
'client-certificate-data': user.certData,
118120
'client-certificate': user.certFile,
@@ -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.user ? elt.user.as : null,
146149
};
147150
} catch (err) {
148151
switch (onInvalidEntry) {

0 commit comments

Comments
 (0)