@@ -4,6 +4,9 @@ import type {
44 ClaimIdString ,
55} from '../claims/types' ;
66import type { VaultName } from '../vaults/types' ;
7+ import type { ACL } from '../acl' ;
8+ import type { GestaltGraph } from '../gestalts' ;
9+ import type { NodeId } from '../nodes/types' ;
710
811import * as grpc from '@grpc/grpc-js' ;
912import { promisify } from '../utils' ;
@@ -44,12 +47,16 @@ function createAgentService({
4447 nodeManager,
4548 notificationsManager,
4649 sigchain,
50+ acl,
51+ gestaltGraph,
4752} : {
4853 keyManager : KeyManager ;
4954 vaultManager : VaultManager ;
5055 nodeManager : NodeManager ;
5156 sigchain : Sigchain ;
5257 notificationsManager : NotificationsManager ;
58+ acl : ACL ;
59+ gestaltGraph : GestaltGraph ;
5360} ) : IAgentServiceServer {
5461 const agentService : IAgentServiceServer = {
5562 echo : async (
@@ -66,21 +73,44 @@ function createAgentService({
6673 const genWritable = grpcUtils . generatorWritable ( call ) ;
6774 const request = call . request ;
6875 const vaultNameOrId = request . getNameOrId ( ) ;
69- let vaultId , vaultName ;
76+ let vaultName ;
77+ let vaultId = await vaultManager . getVaultId ( vaultNameOrId as VaultName ) ;
78+ if ( ! vaultId ) {
79+ try {
80+ vaultId = makeVaultId ( idUtils . fromString ( vaultNameOrId ) ) ;
81+ vaultName = await vaultManager . getVaultName ( vaultId ) ;
82+ } catch ( err ) {
83+ await genWritable . throw ( new vaultsErrors . ErrorVaultUndefined ( ) ) ;
84+ return ;
85+ }
86+ } else {
87+ vaultName = vaultNameOrId ;
88+ }
89+ await vaultManager . openVault ( vaultId ) ;
90+ const metaIn = call . metadata ;
91+ const nodeId = metaIn . get ( 'nodeId' ) . pop ( ) ! . toString ( ) as NodeId ;
92+ const actionType = metaIn . get ( 'action' ) . pop ( ) ! . toString ( ) ;
93+ const perms = await acl . getNodePerm ( nodeId ) ;
94+ if ( ! perms ) {
95+ await genWritable . throw ( new vaultsErrors . ErrorVaultPermissionDenied ( ) ) ;
96+ return ;
97+ }
98+ const vaultPerms = perms . vaults [ idUtils . toString ( vaultId ) ] ;
7099 try {
71- vaultId = makeVaultId ( idUtils . fromString ( vaultNameOrId ) ) ;
72- await vaultManager . openVault ( vaultId ) ;
73- vaultName = await vaultManager . getVaultName ( vaultId ) ;
100+ if ( vaultPerms [ actionType ] !== null ) {
101+ await genWritable . throw (
102+ new vaultsErrors . ErrorVaultPermissionDenied ( ) ,
103+ ) ;
104+ return ;
105+ }
74106 } catch ( err ) {
75- if ( err instanceof vaultsErrors . ErrorVaultUndefined ) {
76- vaultId = await vaultManager . getVaultId ( vaultNameOrId as VaultName ) ;
77- await vaultManager . openVault ( vaultId ) ;
78- vaultName = vaultNameOrId ;
79- } else {
80- throw err ;
107+ if ( err instanceof TypeError ) {
108+ await genWritable . throw (
109+ new vaultsErrors . ErrorVaultPermissionDenied ( ) ,
110+ ) ;
111+ return ;
81112 }
82113 }
83- // TODO: Check the permissions here
84114 const meta = new grpc . Metadata ( ) ;
85115 meta . set ( 'vaultName' , vaultName ) ;
86116 meta . set ( 'vaultId' , makeVaultIdPretty ( vaultId ) ) ;
@@ -112,22 +142,15 @@ function createAgentService({
112142 const vaultNameOrId = meta . get ( 'vaultNameOrId' ) . pop ( ) ! . toString ( ) ;
113143 if ( vaultNameOrId == null )
114144 throw new ErrorGRPC ( 'vault-name not in metadata.' ) ;
115- let vaultId ;
116- try {
117- vaultId = makeVaultId ( vaultNameOrId ) ;
118- await vaultManager . openVault ( vaultId ) ;
119- } catch ( err ) {
120- if (
121- err instanceof vaultsErrors . ErrorVaultUndefined ||
122- err instanceof SyntaxError
123- ) {
124- vaultId = await vaultManager . getVaultId ( vaultNameOrId as VaultName ) ;
125- await vaultManager . openVault ( vaultId ) ;
126- } else {
127- throw err ;
145+ let vaultId = await vaultManager . getVaultId ( vaultNameOrId as VaultName ) ;
146+ if ( ! vaultId ) {
147+ try {
148+ vaultId = makeVaultId ( vaultNameOrId ) ;
149+ } catch ( err ) {
150+ return ;
128151 }
129152 }
130- // TODO: Check the permissions here
153+ await vaultManager . openVault ( vaultId ) ;
131154 const response = new vaultsPB . PackChunk ( ) ;
132155 const [ sideBand , progressStream ] = await vaultManager . handlePackRequest (
133156 vaultId ,
@@ -154,20 +177,39 @@ function createAgentService({
154177 call . end ( ) ;
155178 } ) ;
156179 } ,
157- vaultsScan : async (
158- call : grpc . ServerWritableStream < nodesPB . Node , vaultsPB . Vault > ,
180+ nodesScan : async (
181+ call : grpc . ServerWritableStream < nodesPB . Node , vaultsPB . List > ,
159182 ) : Promise < void > => {
160183 const genWritable = grpcUtils . generatorWritable ( call ) ;
161- const response = new vaultsPB . Vault ( ) ;
162- const id = makeNodeId ( call . request . getNodeId ( ) ) ;
184+ const response = new vaultsPB . List ( ) ;
185+ const nodeId = makeNodeId ( call . request . getNodeId ( ) ) ;
186+ const perms = await gestaltGraph . getGestaltActionsByNode ( nodeId ) ;
187+ if ( ! perms ) {
188+ await genWritable . throw ( new vaultsErrors . ErrorVaultPermissionDenied ( ) ) ;
189+ return ;
190+ }
163191 try {
164- throw Error ( 'Not implemented' ) ;
165- // FIXME: handleVaultNamesRequest doesn't exist.
166- // const listResponse = vaultManager.handleVaultNamesRequest(id);
167- let listResponse ;
168- for await ( const vault of listResponse ) {
192+ if ( perms [ 'scan' ] !== null ) {
193+ await genWritable . throw (
194+ new vaultsErrors . ErrorVaultPermissionDenied ( ) ,
195+ ) ;
196+ return ;
197+ }
198+ } catch ( err ) {
199+ if ( err instanceof TypeError ) {
200+ await genWritable . throw (
201+ new vaultsErrors . ErrorVaultPermissionDenied ( ) ,
202+ ) ;
203+ return ;
204+ }
205+ throw err ;
206+ }
207+ try {
208+ const listResponse = await vaultManager . listVaults ( ) ;
209+ for ( const vault of listResponse ) {
169210 if ( vault !== null ) {
170- response . setNameOrId ( vault ) ;
211+ response . setVaultName ( vault [ 0 ] ) ;
212+ response . setVaultId ( makeVaultIdPretty ( vault [ 1 ] ) ) ;
171213 await genWritable . next ( response ) ;
172214 } else {
173215 await genWritable . next ( null ) ;
@@ -304,33 +346,6 @@ function createAgentService({
304346 }
305347 callback ( null , response ) ;
306348 } ,
307- vaultsPermisssionsCheck : async (
308- call : grpc . ServerUnaryCall <
309- vaultsPB . NodePermission ,
310- vaultsPB . NodePermissionAllowed
311- > ,
312- callback : grpc . sendUnaryData < vaultsPB . NodePermissionAllowed > ,
313- ) : Promise < void > => {
314- const response = new vaultsPB . NodePermissionAllowed ( ) ;
315- try {
316- const nodeId = makeNodeId ( call . request . getNodeId ( ) ) ;
317- const vaultId = makeVaultId ( call . request . getVaultId ( ) ) ;
318- throw Error ( 'Not Implemented' ) ;
319- // FIXME: getVaultPermissions not implemented.
320- // const result = await vaultManager.getVaultPermissions(vaultId, nodeId);
321- let result ;
322- if ( result [ nodeId ] === undefined ) {
323- response . setPermission ( false ) ;
324- } else if ( result [ nodeId ] [ 'pull' ] === undefined ) {
325- response . setPermission ( false ) ;
326- } else {
327- response . setPermission ( true ) ;
328- }
329- callback ( null , response ) ;
330- } catch ( err ) {
331- callback ( grpcUtils . fromError ( err ) , null ) ;
332- }
333- } ,
334349 nodesCrossSignClaim : async (
335350 call : grpc . ServerDuplexStream < nodesPB . CrossSign , nodesPB . CrossSign > ,
336351 ) => {
0 commit comments