Skip to content

Commit

Permalink
feat: updating behavior of secrets get
Browse files Browse the repository at this point in the history
feat: concatenates secrets from multiple vaults
  • Loading branch information
aryanjassal committed Sep 20, 2024
1 parent 8f099a8 commit d777f92
Show file tree
Hide file tree
Showing 4 changed files with 215 additions and 160 deletions.
4 changes: 2 additions & 2 deletions src/client/callers/vaultsSecretsGet.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import type { HandlerTypes } from '@matrixai/rpc';
import type VaultsSecretsGet from '../handlers/VaultsSecretsGet';
import { UnaryCaller } from '@matrixai/rpc';
import { ServerCaller } from '@matrixai/rpc';

type CallerTypes = HandlerTypes<VaultsSecretsGet>;

const vaultsSecretsGet = new UnaryCaller<
const vaultsSecretsGet = new ServerCaller<
CallerTypes['input'],
CallerTypes['output']
>();
Expand Down
57 changes: 30 additions & 27 deletions src/client/handlers/VaultsSecretsGet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,48 +3,51 @@ import type {
ClientRPCRequestParams,
ClientRPCResponseResult,
ContentMessage,
SecretIdentifierMessage,
SecretManyPathMessage,
} from '../types';
import type VaultManager from '../../vaults/VaultManager';
import { UnaryHandler } from '@matrixai/rpc';
import { ServerHandler } from '@matrixai/rpc';
import * as vaultsUtils from '../../vaults/utils';
import * as vaultsErrors from '../../vaults/errors';
import * as vaultOps from '../../vaults/VaultOps';

class VaultsSecretsGet extends UnaryHandler<
class VaultsSecretsGet extends ServerHandler<
{
vaultManager: VaultManager;
db: DB;
},
ClientRPCRequestParams<SecretIdentifierMessage>,
ClientRPCRequestParams<SecretManyPathMessage>,
ClientRPCResponseResult<ContentMessage>
> {
public handle = async (
input: ClientRPCRequestParams<SecretIdentifierMessage>,
): Promise<ClientRPCResponseResult<ContentMessage>> => {
public async *handle(
input: ClientRPCRequestParams<SecretManyPathMessage>,
): AsyncGenerator<ClientRPCResponseResult<ContentMessage>, void, void> {
const { vaultManager, db } = this.container;
return await db.withTransactionF(async (tran) => {
const vaultIdFromName = await vaultManager.getVaultId(
input.nameOrId,
tran,
);
const vaultId =
vaultIdFromName ?? vaultsUtils.decodeVaultId(input.nameOrId);
if (vaultId == null) {
throw new vaultsErrors.ErrorVaultsVaultUndefined();
yield* db.withTransactionG(async function* (tran): AsyncGenerator<
ContentMessage,
void,
void
> {
// As we need to preserve the order of parameters, we need to loop over
// them individually, as grouping them would make them go out of order.
for (const [vaultName, secretName] of input.secretNames) {
const vaultIdFromName = await vaultManager.getVaultId(vaultName, tran);
const vaultId = vaultIdFromName ?? vaultsUtils.decodeVaultId(vaultName);
if (vaultId == null) throw new vaultsErrors.ErrorVaultsVaultUndefined();
yield* vaultManager.withVaultsG(
[vaultId],
async function* (vault): AsyncGenerator<ContentMessage, void, void> {
yield {
secretContent: (
await vaultOps.getSecret(vault, secretName)
).toString('binary'),
};
},
tran,
);
}
const secretContent = await vaultManager.withVaults(
[vaultId],
async (vault) => {
return await vaultOps.getSecret(vault, input.secretName);
},
tran,
);
return {
secretContent: secretContent.toString('binary'),
};
});
};
}
}

export default VaultsSecretsGet;
10 changes: 8 additions & 2 deletions src/client/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -304,10 +304,15 @@ type SecretPathMessage = {
secretName: string;
};

// The secrets must be in a format like:
// [ [vaultName, secretPath], [vaultName, secretPath ] ]
type SecretManyPathMessage = {
secretNames: Array<Array<string>>;
};

type SecretIdentifierMessage = VaultIdentifierMessage & SecretPathMessage;

type SecretRemoveMessage = {
secretNames: Array<Array<string>>;
type SecretRemoveMessage = SecretManyPathMessage & {
options?: {
recursive?: boolean;
};
Expand Down Expand Up @@ -422,6 +427,7 @@ export type {
VaultsVersionMessage,
VaultsLatestVersionMessage,
SecretPathMessage,
SecretManyPathMessage,
SecretIdentifierMessage,
SecretRemoveMessage,
ContentMessage,
Expand Down
Loading

0 comments on commit d777f92

Please sign in to comment.