Skip to content

Commit 347b8a4

Browse files
authored
Merge pull request #320 from MatrixAI/identitiesInfoGetConnected
Growing the Gestalt Graph and Implementing Social Discovery
2 parents 4aacfb8 + 3bdaaf1 commit 347b8a4

42 files changed

Lines changed: 4425 additions & 862 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/PolykeyAgent.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import type { FileSystem } from './types';
22
import type { PolykeyWorkerManagerInterface } from './workers/types';
33
import type { Host, Port } from './network/types';
44
import type { SeedNodes } from './nodes/types';
5-
65
import type { RootKeyPairChangeData } from './keys/types';
76
import path from 'path';
87
import process from 'process';
@@ -303,6 +302,7 @@ class PolykeyAgent {
303302
discovery =
304303
discovery ??
305304
(await Discovery.createDiscovery({
305+
db,
306306
keyManager,
307307
gestaltGraph,
308308
identitiesManager,
@@ -358,7 +358,7 @@ class PolykeyAgent {
358358
await sessionManager?.stop();
359359
await notificationsManager?.stop();
360360
await vaultManager?.stop();
361-
await discovery?.destroy();
361+
await discovery?.stop();
362362
await revProxy?.stop();
363363
await fwdProxy?.stop();
364364
await gestaltGraph?.stop();
@@ -626,6 +626,7 @@ class PolykeyAgent {
626626
await this.nodeConnectionManager.start();
627627
await this.nodeGraph.start({ fresh });
628628
await this.nodeConnectionManager.syncNodeGraph();
629+
await this.discovery.start({ fresh });
629630
await this.vaultManager.start({ fresh });
630631
await this.notificationsManager.start({ fresh });
631632
await this.sessionManager.start({ fresh });
@@ -644,7 +645,7 @@ class PolykeyAgent {
644645
await this.sessionManager?.stop();
645646
await this.notificationsManager?.stop();
646647
await this.vaultManager?.stop();
647-
await this.discovery?.destroy();
648+
await this.discovery?.stop();
648649
await this.revProxy?.stop();
649650
await this.fwdProxy?.stop();
650651
await this.grpcServerAgent?.stop();
@@ -671,9 +672,9 @@ class PolykeyAgent {
671672
await this.sessionManager.stop();
672673
await this.notificationsManager.stop();
673674
await this.vaultManager.stop();
674-
await this.discovery.destroy();
675675
await this.nodeConnectionManager.stop();
676676
await this.nodeGraph.stop();
677+
await this.discovery.stop();
677678
await this.revProxy.stop();
678679
await this.fwdProxy.stop();
679680
await this.grpcServerAgent.stop();
@@ -698,6 +699,7 @@ class PolykeyAgent {
698699
await this.notificationsManager.destroy();
699700
await this.vaultManager.destroy();
700701
await this.nodeGraph.destroy();
702+
await this.discovery.destroy();
701703
await this.gestaltGraph.destroy();
702704
await this.acl.destroy();
703705
await this.sigchain.destroy();
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import type PolykeyClient from '../../PolykeyClient';
2+
import type { IdentityId, ProviderId } from '../../identities/types';
3+
import CommandPolykey from '../CommandPolykey';
4+
import * as binOptions from '../utils/options';
5+
import * as binUtils from '../utils';
6+
import * as parsers from '../utils/parsers';
7+
import * as binProcessors from '../utils/processors';
8+
9+
class CommandAuthenticated extends CommandPolykey {
10+
constructor(...args: ConstructorParameters<typeof CommandPolykey>) {
11+
super(...args);
12+
this.name('authenticated');
13+
this.description('Lists all authenticated identities across all providers');
14+
this.option(
15+
'-pi, --provider-id [providerId]',
16+
'Digital identity provider to retrieve tokens from',
17+
parsers.parseProviderId,
18+
);
19+
this.addOption(binOptions.nodeId);
20+
this.addOption(binOptions.clientHost);
21+
this.addOption(binOptions.clientPort);
22+
this.action(async (options) => {
23+
const { default: PolykeyClient } = await import('../../PolykeyClient');
24+
const identitiesPB = await import(
25+
'../../proto/js/polykey/v1/identities/identities_pb'
26+
);
27+
const clientOptions = await binProcessors.processClientOptions(
28+
options.nodePath,
29+
options.nodeId,
30+
options.clientHost,
31+
options.clientPort,
32+
this.fs,
33+
this.logger.getChild(binProcessors.processClientOptions.name),
34+
);
35+
const meta = await binProcessors.processAuthentication(
36+
options.passwordFile,
37+
this.fs,
38+
);
39+
let pkClient: PolykeyClient;
40+
let genReadable: ReturnType<
41+
typeof pkClient.grpcClient.identitiesAuthenticatedGet
42+
>;
43+
this.exitHandlers.handlers.push(async () => {
44+
if (genReadable != null) genReadable.stream.cancel();
45+
if (pkClient != null) await pkClient.stop();
46+
});
47+
try {
48+
pkClient = await PolykeyClient.createPolykeyClient({
49+
nodePath: options.nodePath,
50+
nodeId: clientOptions.nodeId,
51+
host: clientOptions.clientHost,
52+
port: clientOptions.clientPort,
53+
logger: this.logger.getChild(PolykeyClient.name),
54+
});
55+
const optionalProviderMessage = new identitiesPB.OptionalProvider();
56+
if (options.providerId) {
57+
optionalProviderMessage.setProviderId(options.providerId);
58+
}
59+
await binUtils.retryAuthentication(async (auth) => {
60+
const genReadable = pkClient.grpcClient.identitiesAuthenticatedGet(
61+
optionalProviderMessage,
62+
auth,
63+
);
64+
for await (const val of genReadable) {
65+
const output = {
66+
providerId: val.getProviderId() as ProviderId,
67+
identityId: val.getIdentityId() as IdentityId,
68+
};
69+
process.stdout.write(
70+
binUtils.outputFormatter({
71+
type: options.format === 'json' ? 'json' : 'dict',
72+
data: output,
73+
}),
74+
);
75+
}
76+
}, meta);
77+
} finally {
78+
if (pkClient! != null) await pkClient.stop();
79+
}
80+
});
81+
}
82+
}
83+
84+
export default CommandAuthenticated;

src/bin/identities/CommandDiscover.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@ class CommandDiscover extends CommandPolykey {
1010
constructor(...args: ConstructorParameters<typeof CommandPolykey>) {
1111
super(...args);
1212
this.name('discover');
13-
this.description(
14-
'Starts Discovery Process using Node or Identity as a Starting Point',
15-
);
13+
this.description('Adds a Node or Identity to the Discovery Queue');
1614
this.argument(
1715
'<gestaltId>',
1816
'Node ID or `Provider ID:Identity ID`',

src/bin/identities/CommandIdentities.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import CommandAllow from './CommandAllow';
22
import CommandAuthenticate from './CommandAuthenticate';
3+
import CommandAuthenticated from './CommandAuthenticated';
34
import CommandClaim from './CommandClaim';
45
import CommandDisallow from './CommandDisallow';
56
import CommandDiscover from './CommandDiscover';
@@ -18,6 +19,7 @@ class CommandIdentities extends CommandPolykey {
1819
this.description('Identities Operations');
1920
this.addCommand(new CommandAllow(...args));
2021
this.addCommand(new CommandAuthenticate(...args));
22+
this.addCommand(new CommandAuthenticated(...args));
2123
this.addCommand(new CommandClaim(...args));
2224
this.addCommand(new CommandDisallow(...args));
2325
this.addCommand(new CommandDiscover(...args));

src/bin/identities/CommandSearch.ts

Lines changed: 75 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import type PolykeyClient from '../../PolykeyClient';
2+
import type { IdentityId, ProviderId } from '../../identities/types';
23
import CommandPolykey from '../CommandPolykey';
34
import * as binOptions from '../utils/options';
45
import * as binUtils from '../utils';
6+
import * as parsers from '../utils/parsers';
57
import * as binProcessors from '../utils/processors';
68

79
class CommandSearch extends CommandPolykey {
@@ -10,13 +12,37 @@ class CommandSearch extends CommandPolykey {
1012
this.name('search');
1113
this.description('Searches a Provider for any Connected Identities');
1214
this.argument(
13-
'<providerId>',
14-
'Name of the digital identity provider to search on',
15+
'[searchTerms...]',
16+
'Search parameters to apply to connected identities',
17+
);
18+
this.option(
19+
'-pi, --provider-id [providerId...]',
20+
'Digital identity provider(s) to search on',
21+
parsers.parseProviderIdList,
22+
);
23+
this.option(
24+
'-aii, --auth-identity-id, [authIdentityId]',
25+
'Name of your own authenticated identity to find connected identities of',
26+
parsers.parseIdentityId,
27+
);
28+
this.option(
29+
'-ii, --identity-id [identityId]',
30+
'Name of the digital identity to search for',
31+
parsers.parseIdentityId,
32+
);
33+
this.option(
34+
'-d, --disconnected',
35+
'Include disconnected identities in search',
36+
);
37+
this.option(
38+
'-l, --limit [number]',
39+
'Limit the number of search results to display to a specific number',
40+
parsers.parseInteger,
1541
);
1642
this.addOption(binOptions.nodeId);
1743
this.addOption(binOptions.clientHost);
1844
this.addOption(binOptions.clientPort);
19-
this.action(async (providerId, options) => {
45+
this.action(async (searchTerms, options) => {
2046
const { default: PolykeyClient } = await import('../../PolykeyClient');
2147
const identitiesPB = await import(
2248
'../../proto/js/polykey/v1/identities/identities_pb'
@@ -34,7 +60,11 @@ class CommandSearch extends CommandPolykey {
3460
this.fs,
3561
);
3662
let pkClient: PolykeyClient;
63+
let genReadable: ReturnType<
64+
typeof pkClient.grpcClient.identitiesInfoConnectedGet
65+
>;
3766
this.exitHandlers.handlers.push(async () => {
67+
if (genReadable != null) genReadable.stream.cancel();
3868
if (pkClient != null) await pkClient.stop();
3969
});
4070
try {
@@ -45,25 +75,49 @@ class CommandSearch extends CommandPolykey {
4575
port: clientOptions.clientPort,
4676
logger: this.logger.getChild(PolykeyClient.name),
4777
});
48-
const providerMessage = new identitiesPB.Provider();
49-
providerMessage.setProviderId(providerId);
50-
const res = await binUtils.retryAuthentication(
51-
(auth) =>
52-
pkClient.grpcClient.identitiesInfoGet(providerMessage, auth),
53-
meta,
54-
);
55-
let output = '';
56-
if (res.getIdentityId() && res.getProviderId()) {
57-
output = `${res.getProviderId()}:${res.getIdentityId()}`;
58-
} else {
59-
this.logger.info('No Connected Identities found for Provider');
78+
const providerSearchMessage = new identitiesPB.ProviderSearch();
79+
providerSearchMessage.setSearchTermList(searchTerms);
80+
if (options.providerId) {
81+
providerSearchMessage.setProviderIdList(options.providerId);
82+
}
83+
if (options.authIdentityId) {
84+
providerSearchMessage.setAuthIdentityId(options.authIdentityId);
85+
}
86+
if (options.disconnected) {
87+
providerSearchMessage.setDisconnected(true);
88+
}
89+
if (options.limit) {
90+
providerSearchMessage.setLimit(options.limit);
6091
}
61-
process.stdout.write(
62-
binUtils.outputFormatter({
63-
type: options.format === 'json' ? 'json' : 'list',
64-
data: [output],
65-
}),
66-
);
92+
await binUtils.retryAuthentication(async (auth) => {
93+
if (options.identity) {
94+
providerSearchMessage.setIdentityId(options.identity);
95+
genReadable = pkClient.grpcClient.identitiesInfoGet(
96+
providerSearchMessage,
97+
auth,
98+
);
99+
} else {
100+
genReadable = pkClient.grpcClient.identitiesInfoConnectedGet(
101+
providerSearchMessage,
102+
auth,
103+
);
104+
}
105+
for await (const val of genReadable) {
106+
const output = {
107+
providerId: val.getProvider()!.getProviderId() as ProviderId,
108+
identityId: val.getProvider()!.getIdentityId() as IdentityId,
109+
name: val.getName(),
110+
email: val.getEmail(),
111+
url: val.getUrl(),
112+
};
113+
process.stdout.write(
114+
binUtils.outputFormatter({
115+
type: options.format === 'json' ? 'json' : 'dict',
116+
data: output,
117+
}),
118+
);
119+
}
120+
}, meta);
67121
} finally {
68122
if (pkClient! != null) await pkClient.stop();
69123
}

src/bin/identities/CommandTrust.ts

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@ class CommandTrust extends CommandPolykey {
2424
const identitiesPB = await import(
2525
'../../proto/js/polykey/v1/identities/identities_pb'
2626
);
27-
const permissionsPB = await import(
28-
'../../proto/js/polykey/v1/permissions/permissions_pb'
29-
);
3027
const nodesPB = await import('../../proto/js/polykey/v1/nodes/nodes_pb');
3128
const clientOptions = await binProcessors.processClientOptions(
3229
options.nodePath,
@@ -52,32 +49,24 @@ class CommandTrust extends CommandPolykey {
5249
port: clientOptions.clientPort,
5350
logger: this.logger.getChild(PolykeyClient.name),
5451
});
55-
const action = 'notify';
56-
const setActionMessage = new permissionsPB.ActionSet();
57-
setActionMessage.setAction(action);
5852
if (gestaltId.type === 'node') {
59-
// Setting by Node
53+
// Setting by Node.
6054
const nodeMessage = new nodesPB.Node();
6155
nodeMessage.setNodeId(gestaltId.nodeId);
62-
setActionMessage.setNode(nodeMessage);
6356
await binUtils.retryAuthentication(
6457
(auth) =>
65-
pkClient.grpcClient.gestaltsActionsSetByNode(
66-
setActionMessage,
67-
auth,
68-
),
58+
pkClient.grpcClient.gestaltsGestaltTrustByNode(nodeMessage, auth),
6959
meta,
7060
);
7161
} else {
7262
// Setting by Identity
7363
const providerMessage = new identitiesPB.Provider();
74-
providerMessage.setProviderId(gestaltId.providerId!);
75-
providerMessage.setIdentityId(gestaltId.identityId!);
76-
setActionMessage.setIdentity(providerMessage);
64+
providerMessage.setProviderId(gestaltId.providerId);
65+
providerMessage.setIdentityId(gestaltId.identityId);
7766
await binUtils.retryAuthentication(
7867
(auth) =>
79-
pkClient.grpcClient.gestaltsActionsSetByIdentity(
80-
setActionMessage,
68+
pkClient.grpcClient.gestaltsGestaltTrustByIdentity(
69+
providerMessage,
8170
auth,
8271
),
8372
meta,

0 commit comments

Comments
 (0)