1
1
import type { VaultName } from '../../vaults/types' ;
2
2
import type { VaultManager } from '../../vaults' ;
3
3
import type { ACL } from '../../acl' ;
4
+ import type { ConnectionInfoGetter } from '../../agent/types' ;
4
5
import * as grpc from '@grpc/grpc-js' ;
5
- import { utils as idUtils } from '@matrixai/id' ;
6
6
import { utils as grpcUtils } from '../../grpc' ;
7
7
import { utils as vaultsUtils , errors as vaultsErrors } from '../../vaults' ;
8
8
import * as vaultsPB from '../../proto/js/polykey/v1/vaults/vaults_pb' ;
9
9
import * as validationUtils from '../../validation/utils' ;
10
+ import * as nodesUtils from '../../nodes/utils' ;
11
+ import { never } from '../../utils/utils' ;
10
12
11
13
function vaultsGitInfoGet ( {
12
14
vaultManager,
13
15
acl,
16
+ connectionInfoGetter,
14
17
} : {
15
18
vaultManager : VaultManager ;
16
19
acl : ACL ;
20
+ connectionInfoGetter : ConnectionInfoGetter ;
17
21
} ) {
18
22
return async (
19
23
call : grpc . ServerWritableStream < vaultsPB . InfoRequest , vaultsPB . PackChunk > ,
@@ -25,42 +29,46 @@ function vaultsGitInfoGet({
25
29
await genWritable . throw ( { code : grpc . status . NOT_FOUND } ) ;
26
30
return ;
27
31
}
28
- const nodeMessage = request . getNode ( ) ;
29
- if ( nodeMessage == null ) {
30
- await genWritable . throw ( { code : grpc . status . NOT_FOUND } ) ;
31
- return ;
32
- }
33
32
let vaultName ;
34
33
const vaultNameOrId = vaultMessage . getNameOrId ( ) ;
35
34
let vaultId = await vaultManager . getVaultId ( vaultNameOrId as VaultName ) ;
36
35
vaultName = vaultNameOrId ;
37
36
if ( ! vaultId ) {
38
37
try {
39
38
vaultId = validationUtils . parseVaultId ( vaultNameOrId ) ;
40
- vaultName = ( await vaultManager . getVaultMeta ( vaultId ) ) . name ;
39
+ vaultName = ( await vaultManager . getVaultMeta ( vaultId ) ) ?. vaultName ;
41
40
} catch ( err ) {
42
41
await genWritable . throw ( new vaultsErrors . ErrorVaultsVaultUndefined ( ) ) ;
43
42
return ;
44
43
}
45
44
}
46
- const nodeId = validationUtils . parseNodeId ( nodeMessage . getNodeId ( ) ) ;
47
- const actionType = request . getAction ( ) ;
48
- const perms = await acl . getNodePerm ( nodeId ) ;
49
- if ( ! perms ) {
50
- await genWritable . throw ( new vaultsErrors . ErrorVaultsPermissionDenied ( ) ) ;
45
+ // Getting the NodeId from the ReverseProxy connection info
46
+ const connectionInfo = connectionInfoGetter ( call . getPeer ( ) ) ;
47
+ // If this is getting run the connection exists
48
+ // It SHOULD exist here
49
+ if ( connectionInfo == null ) never ( ) ;
50
+ const nodeId = connectionInfo . nodeId ;
51
+ const nodeIdEncoded = nodesUtils . encodeNodeId ( nodeId ) ;
52
+ const actionType = validationUtils . parseVaultAction ( request . getAction ( ) ) ;
53
+ const permissions = await acl . getNodePerm ( nodeId ) ;
54
+ if ( permissions == null ) {
55
+ await genWritable . throw (
56
+ new vaultsErrors . ErrorVaultsPermissionDenied (
57
+ `No permissions found for ${ nodeIdEncoded } ` ,
58
+ ) ,
59
+ ) ;
51
60
return ;
52
61
}
53
- const vaultPerms = perms . vaults [ idUtils . toString ( vaultId ) ] ;
54
- try {
55
- if ( vaultPerms [ actionType ] !== null ) {
56
- await genWritable . throw ( new vaultsErrors . ErrorVaultsPermissionDenied ( ) ) ;
57
- return ;
58
- }
59
- } catch ( err ) {
60
- if ( err instanceof TypeError ) {
61
- await genWritable . throw ( new vaultsErrors . ErrorVaultsPermissionDenied ( ) ) ;
62
- return ;
63
- }
62
+ const vaultPerms = permissions . vaults [ vaultId ] ;
63
+ if ( vaultPerms [ actionType ] !== null ) {
64
+ await genWritable . throw (
65
+ new vaultsErrors . ErrorVaultsPermissionDenied (
66
+ `${ nodeIdEncoded } does not have permission to ${ actionType } from vault ${ vaultsUtils . encodeVaultId (
67
+ vaultId ,
68
+ ) } `,
69
+ ) ,
70
+ ) ;
71
+ return ;
64
72
}
65
73
const meta = new grpc . Metadata ( ) ;
66
74
meta . set ( 'vaultName' , vaultName ) ;
0 commit comments