Skip to content

Commit bcad31f

Browse files
authored
Merge pull request #870 from MatrixAI/feature-eng-527-adding-agent-rpc-handlers-for-getting-sigchain-and-audit-data
feature/ENG-527 Adding agent RPC handlers for getting sigchain and audit data.
2 parents 8e14922 + 802143c commit bcad31f

File tree

12 files changed

+733
-14
lines changed

12 files changed

+733
-14
lines changed

src/PolykeyAgent.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -804,6 +804,7 @@ class PolykeyAgent {
804804
port: optionsDefaulted.agentServicePort,
805805
ipv6Only: optionsDefaulted.ipv6Only,
806806
agentService: agentServerManifest({
807+
audit: this.audit,
807808
acl: this.acl,
808809
db: this.db,
809810
keyRing: this.keyRing,

src/nodes/NodeManager.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import type { Host, Port } from '../network/types';
1717
import type {
1818
Claim,
1919
ClaimId,
20-
ClaimIdEncoded,
20+
// ClaimIdEncoded,
2121
SignedClaim,
2222
} from '../claims/types';
2323
import type { ClaimLinkNode } from '../claims/payloads';
@@ -1257,12 +1257,19 @@ class NodeManager {
12571257
return await this.withConnF(targetNodeId, ctx, async (connection) => {
12581258
const claims: Record<ClaimId, SignedClaim> = {};
12591259
const client = connection.getClient();
1260+
1261+
// Let claimIdEncoded: ClaimIdEncoded | undefined;
1262+
1263+
// if (claimId != null) {
1264+
// claimIdEncoded = claimsUtils.encodeClaimId(claimId);
1265+
// } else {
1266+
// claimIdEncoded = undefined;
1267+
// }
1268+
12601269
for await (const agentClaim of await client.methods.nodesClaimsGet(
12611270
{
1262-
claimIdEncoded:
1263-
claimId != null
1264-
? claimsUtils.encodeClaimId(claimId)
1265-
: ('' as ClaimIdEncoded),
1271+
// Needs to be addressed later - causes test failures in Discovery.test.ts
1272+
// seek: claimIdEncoded,
12661273
},
12671274
ctx,
12681275
)) {

src/nodes/agent/callers/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import nodesAuthenticateConnection from './nodesAuthenticateConnection';
2+
import nodesAuditEventsGet from './nodesAuditEventsGet';
23
import nodesClaimsGet from './nodesClaimsGet';
34
import nodesClosestActiveConnectionsGet from './nodesClosestActiveConnectionsGet';
45
import nodesClosestLocalNodesGet from './nodesClosestLocalNodesGet';
@@ -17,6 +18,7 @@ import vaultsScan from './vaultsScan';
1718
*/
1819
const manifestClient = {
1920
nodesAuthenticateConnection,
21+
nodesAuditEventsGet,
2022
nodesClaimsGet,
2123
nodesClosestActiveConnectionsGet,
2224
nodesClosestLocalNodesGet,
@@ -37,6 +39,7 @@ export default manifestClient;
3739

3840
export {
3941
nodesAuthenticateConnection,
42+
nodesAuditEventsGet,
4043
nodesClaimsGet,
4144
nodesClosestActiveConnectionsGet,
4245
nodesClosestLocalNodesGet,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import type { HandlerTypes } from '@matrixai/rpc';
2+
import type NodesAuditEventsGet from '../handlers/NodesAuditEventsGet';
3+
import { ServerCaller } from '@matrixai/rpc';
4+
5+
type CallerTypes = HandlerTypes<NodesAuditEventsGet>;
6+
7+
const nodesAuditEventsGet = new ServerCaller<
8+
CallerTypes['input'],
9+
CallerTypes['output']
10+
>();
11+
12+
export default nodesAuditEventsGet;
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import type { ContextTimed } from '@matrixai/contexts';
2+
import type { DB } from '@matrixai/db';
3+
import type { JSONValue } from '@matrixai/rpc';
4+
import type {
5+
AgentRPCRequestParams,
6+
AgentRPCResponseResult,
7+
AuditIdMessage,
8+
AgentAuditMessage,
9+
} from '../types';
10+
import type Audit from '../../../audit/Audit';
11+
import type { AuditEvent } from '../../../audit/types';
12+
import type { AuditEventId } from '../../../ids';
13+
import { ServerHandler } from '@matrixai/rpc';
14+
import * as auditUtils from '../../../audit/utils';
15+
16+
/**
17+
* Gets audit events from a node
18+
*/
19+
class NodesAuditEventsGet extends ServerHandler<
20+
{
21+
audit: Audit;
22+
db: DB;
23+
},
24+
AgentRPCRequestParams<AuditIdMessage>,
25+
AgentRPCResponseResult<AgentAuditMessage<AuditEvent>>
26+
> {
27+
public handle = async function* (
28+
input: AgentRPCRequestParams<AuditIdMessage>,
29+
_cancel: (reason?: any) => void,
30+
_meta: Record<string, JSONValue> | undefined,
31+
ctx: ContextTimed,
32+
): AsyncGenerator<AgentRPCResponseResult<AgentAuditMessage<AuditEvent>>> {
33+
let seek_: AuditEventId | number | undefined;
34+
let seekEnd_: AuditEventId | number | undefined;
35+
36+
const { seek, seekEnd, limit } = input;
37+
38+
if (typeof seek !== 'number') {
39+
seek_ = auditUtils.decodeAuditEventId(seek);
40+
}
41+
if (typeof seekEnd !== 'number') {
42+
seekEnd_ = auditUtils.decodeAuditEventId(seekEnd);
43+
}
44+
45+
const { audit, db }: { audit: Audit; db: DB } = this.container;
46+
47+
yield* db.withTransactionG(async function* (tran): AsyncGenerator<
48+
AgentRPCResponseResult<AgentAuditMessage<AuditEvent>>
49+
> {
50+
for await (const auditEvent of audit.getAuditEvents(
51+
[],
52+
{
53+
seek: seek_,
54+
seekEnd: seekEnd_,
55+
limit,
56+
},
57+
tran,
58+
)) {
59+
ctx.signal.throwIfAborted();
60+
yield {
61+
id: auditUtils.encodeAuditEventId(auditEvent.id),
62+
path: auditEvent.path,
63+
data: auditEvent.data,
64+
};
65+
}
66+
});
67+
};
68+
}
69+
70+
export default NodesAuditEventsGet;

src/nodes/agent/handlers/NodesClaimsGet.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ import type Sigchain from '../../../sigchain/Sigchain';
55
import type {
66
AgentRPCRequestParams,
77
AgentRPCResponseResult,
8-
ClaimIdMessage,
98
AgentClaimMessage,
9+
NodesClaimsGetMessage,
1010
} from '../types';
1111
import { ServerHandler } from '@matrixai/rpc';
1212
import * as claimsUtils from '../../../claims/utils';
13+
import * as ids from '../../../ids';
1314

1415
/**
1516
* Gets the sigchain claims of a node
@@ -19,21 +20,32 @@ class NodesClaimsGet extends ServerHandler<
1920
sigchain: Sigchain;
2021
db: DB;
2122
},
22-
AgentRPCRequestParams<ClaimIdMessage>,
23+
AgentRPCRequestParams<NodesClaimsGetMessage>,
2324
AgentRPCResponseResult<AgentClaimMessage>
2425
> {
2526
public handle = async function* (
26-
_input: ClaimIdMessage,
27+
input: NodesClaimsGetMessage,
2728
_cancel: (reason?: any) => void,
2829
_meta: Record<string, JSONValue> | undefined,
2930
ctx: ContextTimed,
3031
): AsyncGenerator<AgentRPCResponseResult<AgentClaimMessage>> {
32+
const { seek, order, limit } = input;
3133
const { sigchain, db }: { sigchain: Sigchain; db: DB } = this.container;
34+
35+
let decodedClaimId = ids.decodeClaimId(seek);
36+
if (decodedClaimId == null) {
37+
decodedClaimId = undefined;
38+
}
39+
3240
yield* db.withTransactionG(async function* (tran): AsyncGenerator<
3341
AgentRPCResponseResult<AgentClaimMessage>
3442
> {
3543
for await (const [claimId, signedClaim] of sigchain.getSignedClaims(
36-
{ order: 'asc' },
44+
{
45+
seek: decodedClaimId,
46+
order: order,
47+
limit: limit,
48+
},
3749
tran,
3850
)) {
3951
ctx.signal.throwIfAborted();

src/nodes/agent/handlers/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { DB } from '@matrixai/db';
22
import type Logger from '@matrixai/logger';
33
import type KeyRing from '../../../keys/KeyRing';
4+
import type Audit from '../../../audit/Audit';
45
import type Sigchain from '../../../sigchain/Sigchain';
56
import type ACL from '../../../acl/ACL';
67
import type NodeGraph from '../../../nodes/NodeGraph';
@@ -9,6 +10,7 @@ import type NodeConnectionManager from '../../../nodes/NodeConnectionManager';
910
import type NotificationsManager from '../../../notifications/NotificationsManager';
1011
import type VaultManager from '../../../vaults/VaultManager';
1112
import NodesAuthenticateConnection from './NodesAuthenticateConnection';
13+
import NodesAuditEventsGet from './NodesAuditEventsGet';
1214
import NodesClaimsGet from './NodesClaimsGet';
1315
import NodesClosestActiveConnectionsGet from './NodesClosestActiveConnectionsGet';
1416
import NodesClosestLocalNodesGet from './NodesClosestLocalNodesGet';
@@ -25,6 +27,7 @@ import VaultsScan from './VaultsScan';
2527
* Server manifest factory.
2628
*/
2729
const manifestServer = (container: {
30+
audit: Audit;
2831
db: DB;
2932
sigchain: Sigchain;
3033
nodeGraph: NodeGraph;
@@ -38,6 +41,7 @@ const manifestServer = (container: {
3841
}) => {
3942
return {
4043
nodesAuthenticateConnection: new NodesAuthenticateConnection(container),
44+
nodesAuditEventsGet: new NodesAuditEventsGet(container),
4145
nodesClaimsGet: new NodesClaimsGet(container),
4246
nodesClosestActiveConnectionsGet: new NodesClosestActiveConnectionsGet(
4347
container,
@@ -60,6 +64,7 @@ export default manifestServer;
6064

6165
export {
6266
NodesAuthenticateConnection,
67+
NodesAuditEventsGet,
6368
NodesClaimsGet,
6469
NodesClosestActiveConnectionsGet,
6570
NodesClosestLocalNodesGet,

src/nodes/agent/types.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,41 @@ import type {
44
JSONRPCResponseResult,
55
} from '@matrixai/rpc';
66
import type { SignedTokenEncoded } from '../../tokens/types';
7-
import type { ClaimIdEncoded, NodeIdEncoded, VaultIdEncoded } from '../../ids';
7+
import type {
8+
AuditEventIdEncoded,
9+
ClaimIdEncoded,
10+
NodeIdEncoded,
11+
VaultIdEncoded,
12+
} from '../../ids';
813
import type { VaultAction, VaultName } from '../../vaults/types';
914
import type { SignedNotification } from '../../notifications/types';
1015
import type { Host, Hostname, Port } from '../../network/types';
1116
import type { NetworkId, NodeContact } from '../../nodes/types';
17+
import type { AuditEvent } from '../../audit/types';
1218

1319
type AgentRPCRequestParams<T extends JSONObject = JSONObject> =
1420
JSONRPCRequestParams<T>;
1521

1622
type AgentRPCResponseResult<T extends JSONObject = JSONObject> =
1723
JSONRPCResponseResult<T>;
1824

25+
type AuditIdMessage = {
26+
seek?: AuditEventIdEncoded | number;
27+
seekEnd?: AuditEventIdEncoded | number;
28+
order?: 'asc' | 'desc';
29+
limit?: number;
30+
};
31+
32+
type AgentAuditMessage<T extends AuditEvent> = Omit<T, 'id'> & {
33+
id: AuditEventIdEncoded;
34+
};
35+
36+
type NodesClaimsGetMessage = {
37+
seek?: ClaimIdEncoded | number;
38+
order?: 'asc' | 'desc';
39+
limit?: number;
40+
};
41+
1942
type ClaimIdMessage = {
2043
claimIdEncoded: ClaimIdEncoded;
2144
};
@@ -97,6 +120,9 @@ type NodesAuthenticateConnectionMessageNone = {
97120
export type {
98121
AgentRPCRequestParams,
99122
AgentRPCResponseResult,
123+
AuditIdMessage,
124+
AgentAuditMessage,
125+
NodesClaimsGetMessage,
100126
ClaimIdMessage,
101127
AgentClaimMessage,
102128
NodeIdMessage,

src/sigchain/Sigchain.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,10 +354,10 @@ class Sigchain {
354354
seekOptions =
355355
order === 'asc'
356356
? {
357-
lte: [seek.toBuffer()],
357+
gte: [seek.toBuffer()],
358358
}
359359
: {
360-
gte: [seek.toBuffer()],
360+
lte: [seek.toBuffer()],
361361
};
362362
}
363363
for await (const [kP, claim] of tran.iterator<Claim>(this.dbClaimsPath, {

0 commit comments

Comments
 (0)