Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/css #11

Merged
merged 4 commits into from
Dec 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,12 @@ See: [Confluence Documentation](https://apps.nrs.gov.bc.ca/int/confluence/x/m4Fv

The following will start up vault in docker. The Vault Sync Tool defaults for the address and token should work with it.

`docker run --rm --cap-add=IPC_LOCK -e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200' --name=dev-vault -p 8200:8200 vault`
`podman run --rm -e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' -e 'VAULT_DEV_LISTEN_ADDRESS=0.0.0.0:8200' --name=dev-vault -p 8200:8200 vault`

You will need to add an OIDC authentication method to do local testing of group syncs.

```
source setenv-local.sh
vault auth enable oidc
vault auth enable -path=vs_apps_approle approle
vault secrets enable -path=apps -version=2 kv
Expand Down
13,803 changes: 4,920 additions & 8,883 deletions package-lock.json

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,18 @@
},
"devDependencies": {
"@oclif/dev-cli": "^1.26.10",
"@types/jest": "^28.1.1",
"@types/jest": "^29.2.3",
"@types/merge-deep": "^3.0.0",
"@types/node": "^16.11.41",
"@types/request": "^2.48.8",
"@typescript-eslint/eslint-plugin": "^5.28.0",
"@typescript-eslint/parser": "^5.28.0",
"eslint": "^8.17.0",
"eslint-config-google": "^0.14.0",
"eslint-plugin-jest": "^26.5.3",
"jest": "^28.1.1",
"eslint-plugin-jest": "^27.1.5",
"jest": "^29.3.1",
"rimraf": "^3.0.2",
"ts-jest": "^28.0.5",
"ts-jest": "^29.0.3",
"ts-node": "^10.8.1",
"typescript": "^4.7.3"
},
Expand Down
2 changes: 1 addition & 1 deletion setenv-local.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
export VAULT_ADDR="http://127.0.0.1:8200"
export VAULT_TOKEN=""
export VAULT_TOKEN="myroot"
4 changes: 2 additions & 2 deletions src/commands/approle-sync.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ describe('approle sync command', () => {
// Test command
await ApproleSync.run(['--vault-addr', 'addr', '--vault-token', 'token']);

expect(mockBindVault).toBeCalledTimes(1);
expect(mockBindVault).toBeCalledWith('addr', 'token');
expect(mockBindVault).toHaveBeenCalledTimes(1);
expect(mockBindVault).toHaveBeenCalledWith('addr', 'token');
expect(mockVgcInstance.sync).toHaveBeenCalled();
expect(stdoutSpy).toHaveBeenCalledWith('Vault Approle Sync\n');
});
Expand Down
4 changes: 2 additions & 2 deletions src/commands/group-sync.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ describe('group sync command', () => {
// Test command
await GroupSync.run(['--vault-addr', 'addr', '--vault-token', 'token']);

expect(mockBindVault).toBeCalledTimes(1);
expect(mockBindVault).toBeCalledWith('addr', 'token');
expect(mockBindVault).toHaveBeenCalledTimes(1);
expect(mockBindVault).toHaveBeenCalledWith('addr', 'token');
expect(mockVgcInstance.sync).toHaveBeenCalled();
expect(stdoutSpy).toHaveBeenCalledWith('Vault Group Sync\n');
});
Expand Down
4 changes: 2 additions & 2 deletions src/commands/health.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ describe('health command', () => {
// Test command
await Health.run(['--vault-addr', 'addr', '--vault-token', 'token']);

expect(vaultFactory).toBeCalledTimes(1);
expect(vaultFactory).toBeCalledWith('addr', 'token');
expect(vaultFactory).toHaveBeenCalledTimes(1);
expect(vaultFactory).toHaveBeenCalledWith('addr', 'token');
expect(stdoutSpy).toHaveBeenCalledWith('Vault health - endpoint\n');
expect(stdoutSpy).toHaveBeenCalledWith('{}\n');
});
Expand Down
4 changes: 2 additions & 2 deletions src/commands/init.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ describe('init command', () => {
// Test command
await Init.run(['--vault-addr', 'addr', '--vault-token', 'token']);

expect(vaultFactory).toBeCalledTimes(1);
expect(vaultFactory).toBeCalledWith('addr', 'token');
expect(vaultFactory).toHaveBeenCalledTimes(1);
expect(vaultFactory).toHaveBeenCalledWith('addr', 'token');
expect(stdoutSpy).toHaveBeenCalledWith('Init vault - endpoint (best)\n');
expect(stdoutSpy).toHaveBeenCalledWith('Already initialized. No action taken.\n');
});
Expand Down
4 changes: 2 additions & 2 deletions src/commands/policy-sync.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ describe('policy sync command', () => {
// Test command
await PolicySync.run(['--vault-addr', 'addr', '--vault-token', 'token']);

expect(mockBindVault).toBeCalledTimes(1);
expect(mockBindVault).toBeCalledWith('addr', 'token');
expect(mockBindVault).toHaveBeenCalledTimes(1);
expect(mockBindVault).toHaveBeenCalledWith('addr', 'token');
expect(mockVpcInstance.sync).toHaveBeenCalled();
expect(mockVpcInstance.sync).toHaveBeenCalledWith([]);
expect(stdoutSpy).toHaveBeenCalledWith('Vault Policy Sync\n');
Expand Down
8 changes: 4 additions & 4 deletions src/services/impl/app-file.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ describe('app-file.service', () => {
it('reads file once', () => {
new AppFileService(cs);
new AppFileService(cs);
expect(mockFs.readFileSync).toBeCalledWith(
expect(mockFs.readFileSync).toHaveBeenCalledWith(
expect.stringContaining('applications.json'), {encoding: 'utf8'});
expect(mockFs.readFileSync).toBeCalledTimes(1);
expect(mockFs.readFileSync).toHaveBeenCalledTimes(1);
});

it('getAllApps', async () => {
Expand All @@ -68,7 +68,7 @@ describe('app-file.service', () => {
'name': 'APP-TUS',
}},
]);
expect(cs.getApps).toBeCalled();
expect(cs.getApps).toHaveBeenCalled();
});

it('getAllApps - config error', async () => {
Expand All @@ -82,7 +82,7 @@ describe('app-file.service', () => {
.rejects
.toThrow();

expect(cs.getApps).toBeCalled();
expect(cs.getApps).toHaveBeenCalled();
});

it('getApp - exists', async () => {
Expand Down
4 changes: 2 additions & 2 deletions src/services/impl/config-file.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,9 @@ describe('config-file.service', () => {
it('reads file once', () => {
new ConfigFileService();
new ConfigFileService();
expect(mockFs.readFileSync).toBeCalledWith(
expect(mockFs.readFileSync).toHaveBeenCalledWith(
expect.stringContaining('config.json'), {encoding: 'utf8'});
expect(mockFs.readFileSync).toBeCalledTimes(1);
expect(mockFs.readFileSync).toHaveBeenCalledTimes(1);
});


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ describe('policy-registration-memory.service', () => {
await expect(prms.filterPoliciesForUnregistered([], true))
.rejects
.toThrow();
expect(logger.error).toBeCalled();
expect(logger.error).toHaveBeenCalled();
});
});
26 changes: 13 additions & 13 deletions src/util/hcl.util.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ describe('hcl util', () => {
const filePath = path.join('group', 'cool-temp.hcl.tpl');

expect(rVal).toBe('rendered!');
expect(mockFs.readFileSync).toBeCalledTimes(1);
expect(mockFs.readFileSync).toBeCalledWith(expect.stringContaining(filePath), {encoding: 'utf8'});
expect(mockFs.readFileSync).toHaveBeenCalledTimes(1);
expect(mockFs.readFileSync).toHaveBeenCalledWith(expect.stringContaining(filePath), {encoding: 'utf8'});

expect(mockEjs.render).toBeCalledTimes(1);
expect(mockEjs.render).toBeCalledWith('template', {data: 'data'});
expect(mockEjs.render).toHaveBeenCalledTimes(1);
expect(mockEjs.render).toHaveBeenCalledWith('template', {data: 'data'});
});

it('renderName - renders a name with template', () => {
Expand All @@ -40,13 +40,13 @@ describe('hcl util', () => {
const filePath = path.join('group', 'cool-temp.name.tpl');

expect(rVal).toBe('group/rendered!');
expect(mockFs.existsSync).toBeCalledTimes(1);
expect(mockFs.existsSync).toBeCalledWith(expect.stringContaining(filePath));
expect(mockFs.readFileSync).toBeCalledTimes(1);
expect(mockFs.readFileSync).toBeCalledWith(expect.stringContaining(filePath), {encoding: 'utf8'});
expect(mockFs.existsSync).toHaveBeenCalledTimes(1);
expect(mockFs.existsSync).toHaveBeenCalledWith(expect.stringContaining(filePath));
expect(mockFs.readFileSync).toHaveBeenCalledTimes(1);
expect(mockFs.readFileSync).toHaveBeenCalledWith(expect.stringContaining(filePath), {encoding: 'utf8'});

expect(mockEjs.render).toBeCalledTimes(1);
expect(mockEjs.render).toBeCalledWith('template', {data: 'data'});
expect(mockEjs.render).toHaveBeenCalledTimes(1);
expect(mockEjs.render).toHaveBeenCalledWith('template', {data: 'data'});
});

it('renderName - renders a name without a template', () => {
Expand All @@ -57,10 +57,10 @@ describe('hcl util', () => {
const filePath = path.join('cool-temp.name.tpl');

expect(rVal).toBe('cool-temp');
expect(mockFs.existsSync).toBeCalledTimes(1);
expect(mockFs.existsSync).toBeCalledWith(expect.stringContaining(filePath));
expect(mockFs.existsSync).toHaveBeenCalledTimes(1);
expect(mockFs.existsSync).toHaveBeenCalledWith(expect.stringContaining(filePath));

expect(mockEjs.render).not.toBeCalled();
expect(mockEjs.render).not.toHaveBeenCalled();
});

it('renderApproleName - renders approles', () => {
Expand Down
4 changes: 2 additions & 2 deletions src/vault/policy-roots/deduplicate.deco.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ describe('deduplicate.deco', () => {

// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment
const rval = await descriptor.value('myargs');
expect(value).toBeCalledTimes(1);
expect(value).toBeCalledWith('myargs');
expect(value).toHaveBeenCalledTimes(1);
expect(value).toHaveBeenCalledWith('myargs');

expect(rval).toEqual([{foo: 'bar'}]);
});
Expand Down
4 changes: 2 additions & 2 deletions src/vault/policy-roots/impl/app-policy.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,8 @@ describe('app-policy.service', () => {
jest.spyOn(aps, 'buildApplications').mockReturnValue(Promise.resolve([]));
await aps.build();

expect(aps.buildApplication).toBeCalledTimes(0);
expect(aps.buildApplications).toBeCalledTimes(1);
expect(aps.buildApplication).toHaveBeenCalledTimes(0);
expect(aps.buildApplications).toHaveBeenCalledTimes(1);
});

test('sync: buildApplication', async () => {
Expand Down
4 changes: 2 additions & 2 deletions src/vault/policy-roots/impl/group-policy.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ describe('group-policy.service', () => {
jest.spyOn(gps, 'buildGroups').mockReturnValue(Promise.resolve([]));
await gps.build();

expect(gps.buildGroup).toBeCalledTimes(0);
expect(gps.buildGroups).toBeCalledTimes(1);
expect(gps.buildGroup).toHaveBeenCalledTimes(0);
expect(gps.buildGroups).toHaveBeenCalledTimes(1);
});
});
4 changes: 2 additions & 2 deletions src/vault/policy-roots/impl/system-policy.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ describe('system-policy.service', () => {
jest.spyOn(sps, 'buildKvSecretEngines').mockReturnValue(Promise.resolve([]));
await sps.build();

expect(sps.buildSystem).toBeCalledTimes(1);
expect(sps.buildKvSecretEngines).toBeCalledTimes(1);
expect(sps.buildSystem).toHaveBeenCalledTimes(1);
expect(sps.buildKvSecretEngines).toHaveBeenCalledTimes(1);
});
});
6 changes: 3 additions & 3 deletions src/vault/policy-roots/oidc-data.deco.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ describe('oidc-data.deco', () => {
test('adds OIDC info to the HlcRenderSpec', async () => {
const mockVaultApi = {
// Simple test for now. Only the first value should go through
getOidcAccessor: jest.fn().mockResolvedValue('accessorId'),
getOidcAccessors: jest.fn().mockResolvedValue(['accessorId']),
};
const mockVsContainer = jest.mocked(vsContainer);
mockVsContainer.get.mockReturnValue(mockVaultApi);
Expand All @@ -26,8 +26,8 @@ describe('oidc-data.deco', () => {

// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment
const rval = await descriptor.value('myargs');
expect(value).toBeCalledTimes(1);
expect(value).toBeCalledWith('myargs');
expect(value).toHaveBeenCalledTimes(1);
expect(value).toHaveBeenCalledWith('myargs');

expect(rval).toEqual([
{foo: 'bar', data: {global_oidc_accessor: 'accessorId'}},
Expand Down
2 changes: 1 addition & 1 deletion src/vault/policy-roots/oidc-data.deco.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export default function oidcData(target: unknown, propertyName: string, descript
const vaultApi = vsContainer.get<VaultApi>(TYPES.VaultApi);

if (!oidcDecoData) {
const accessor = await vaultApi.getOidcAccessor();
const accessor = (await vaultApi.getOidcAccessors())[0];
oidcDecoData = {
global_oidc_accessor: accessor,
};
Expand Down
24 changes: 12 additions & 12 deletions src/vault/templates/system/user-generic.hcl.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -7,41 +7,41 @@ path "sys/policy/*" {
}

# Grant permissions on user specific paths (data, destroy, metadata)
path "user/data/{{identity.entity.aliases.<%= global_oidc_accessor %>.name}}" {
path "user/data/{{identity.entity.aliases.<%= global_oidc_accessor %>.email}}" {
capabilities = [ "create", "update", "read", "delete" ]
}
path "user/data/{{identity.entity.aliases.<%= global_oidc_accessor %>.name}}/*" {
path "user/data/{{identity.entity.aliases.<%= global_oidc_accessor %>.email}}/*" {
capabilities = [ "create", "update", "read", "delete" ]
}
path "user/delete/{{identity.entity.aliases.<%= global_oidc_accessor %>.name}}" {
path "user/delete/{{identity.entity.aliases.<%= global_oidc_accessor %>.email}}" {
capabilities = [ "create", "update" ]
}
path "user/delete/{{identity.entity.aliases.<%= global_oidc_accessor %>.name}}/*" {
path "user/delete/{{identity.entity.aliases.<%= global_oidc_accessor %>.email}}/*" {
capabilities = [ "create", "update" ]
}
path "user/undelete/{{identity.entity.aliases.<%= global_oidc_accessor %>.name}}" {
path "user/undelete/{{identity.entity.aliases.<%= global_oidc_accessor %>.email}}" {
capabilities = [ "create", "update" ]
}
path "user/undelete/{{identity.entity.aliases.<%= global_oidc_accessor %>.name}}/*" {
path "user/undelete/{{identity.entity.aliases.<%= global_oidc_accessor %>.email}}/*" {
capabilities = [ "create", "update" ]
}
path "user/destroy/{{identity.entity.aliases.<%= global_oidc_accessor %>.name}}" {
path "user/destroy/{{identity.entity.aliases.<%= global_oidc_accessor %>.email}}" {
capabilities = [ "create", "update" ]
}
path "user/destroy/{{identity.entity.aliases.<%= global_oidc_accessor %>.name}}/*" {
path "user/destroy/{{identity.entity.aliases.<%= global_oidc_accessor %>.email}}/*" {
capabilities = [ "create", "update" ]
}
path "user/metadata/{{identity.entity.aliases.<%= global_oidc_accessor %>.name}}" {
path "user/metadata/{{identity.entity.aliases.<%= global_oidc_accessor %>.email}}" {
capabilities = [ "create", "update", "read", "delete", "list" ]
}
path "user/metadata/{{identity.entity.aliases.<%= global_oidc_accessor %>.name}}/*" {
path "user/metadata/{{identity.entity.aliases.<%= global_oidc_accessor %>.email}}/*" {
capabilities = [ "create", "update", "read", "delete", "list" ]
}

// path "user/+/{{identity.entity.aliases.<%= global_oidc_accessor %>.name}}" {
// path "user/+/{{identity.entity.aliases.<%= global_oidc_accessor %>.email}}" {
// capabilities = [ "create", "update", "read", "delete", "list" ]
// }
// path "user/+/{{identity.entity.aliases.<%= global_oidc_accessor %>.name}}/*" {
// path "user/+/{{identity.entity.aliases.<%= global_oidc_accessor %>.email}}/*" {
// capabilities = [ "create", "update", "read", "delete", "list" ]
// }

Expand Down
36 changes: 18 additions & 18 deletions src/vault/vault-approle.controller.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,26 +88,26 @@ describe('vault-approle.controller', () => {

await va.sync();

expect(va.buildApproleDict).toBeCalledTimes(1);
expect(va.createUpdateRoles).toBeCalledTimes(1);
expect(va.createUpdateRoles).toBeCalledWith(mockDict);
expect(va.removeUnusedRoles).toBeCalledTimes(1);
expect(va.removeUnusedRoles).toBeCalledWith(expect.any(Set));
expect(va.buildApproleDict).toHaveBeenCalledTimes(1);
expect(va.createUpdateRoles).toHaveBeenCalledTimes(1);
expect(va.createUpdateRoles).toHaveBeenCalledWith(mockDict);
expect(va.removeUnusedRoles).toHaveBeenCalledTimes(1);
expect(va.removeUnusedRoles).toHaveBeenCalledWith(expect.any(Set));
});

test('buildApproleDict', async () => {
const va = vgcFactory();

const rval = await va.buildApproleDict();

expect(mockAppService.getAllApps).toBeCalledTimes(1);
expect(mockHclUtil.renderApproleName).toBeCalledTimes(1);
expect(mockHclUtil.renderApproleName).toBeCalledWith(mockApps[0], 'PRODUCTION');
expect(mockAppService.getAllApps).toHaveBeenCalledTimes(1);
expect(mockHclUtil.renderApproleName).toHaveBeenCalledTimes(1);
expect(mockHclUtil.renderApproleName).toHaveBeenCalledWith(mockApps[0], 'PRODUCTION');

expect(mockAppRootService.buildApplicationForEnv).toBeCalledTimes(1);
expect(mockAppRootService.buildApplicationForEnv).toBeCalledWith(mockApps[0], 'PRODUCTION');
expect(mockAppRootService.buildApplicationForEnv).toHaveBeenCalledTimes(1);
expect(mockAppRootService.buildApplicationForEnv).toHaveBeenCalledWith(mockApps[0], 'PRODUCTION');

expect(mockHclUtil.renderName).toBeCalledTimes(1);
expect(mockHclUtil.renderName).toHaveBeenCalledTimes(1);

expect(rval).toEqual({
name: {
Expand Down Expand Up @@ -141,8 +141,8 @@ describe('vault-approle.controller', () => {
},
});

expect(vault.addApproleRole).toBeCalledTimes(1);
expect(vault.addApproleRole).toBeCalledWith({
expect(vault.addApproleRole).toHaveBeenCalledTimes(1);
expect(vault.addApproleRole).toHaveBeenCalledWith({
'bind_secret_id': true,
'bound_cidr_list': '',
'mount_point': 'vs_apps_approle',
Expand All @@ -163,11 +163,11 @@ describe('vault-approle.controller', () => {

await va.removeUnusedRoles(regSet);

expect(vault.approleRoles).toBeCalledTimes(1);
expect(vault.approleRoles).toBeCalledWith({mount_point: VAULT_APPROLE_MOUNT_POINT});
expect(vault.approleRoles).toHaveBeenCalledTimes(1);
expect(vault.approleRoles).toHaveBeenCalledWith({mount_point: VAULT_APPROLE_MOUNT_POINT});

expect(vault.deleteApproleRole).toBeCalledTimes(2);
expect(vault.deleteApproleRole).toBeCalledWith({mount_point: VAULT_APPROLE_MOUNT_POINT, role_name: 'c'});
expect(vault.deleteApproleRole).toBeCalledWith({mount_point: VAULT_APPROLE_MOUNT_POINT, role_name: 'd'});
expect(vault.deleteApproleRole).toHaveBeenCalledTimes(2);
expect(vault.deleteApproleRole).toHaveBeenCalledWith({mount_point: VAULT_APPROLE_MOUNT_POINT, role_name: 'c'});
expect(vault.deleteApproleRole).toHaveBeenCalledWith({mount_point: VAULT_APPROLE_MOUNT_POINT, role_name: 'd'});
});
});
Loading