Skip to content

Commit

Permalink
Fixed identities search command to search connected identities
Browse files Browse the repository at this point in the history
Unattended background discovery for Discovery domain
Adding trusted nodes/identities to the Gestalt Graph
  • Loading branch information
emmacasolin committed Feb 10, 2022
1 parent a54598e commit 69747e1
Show file tree
Hide file tree
Showing 38 changed files with 3,348 additions and 769 deletions.
12 changes: 6 additions & 6 deletions src/PolykeyAgent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import type { FileSystem } from './types';
import type { PolykeyWorkerManagerInterface } from './workers/types';
import type { Host, Port } from './network/types';
import type { NodeMapping } from './nodes/types';

import type { RootKeyPairChangeData } from './keys/types';
import path from 'path';
import process from 'process';
Expand Down Expand Up @@ -266,11 +265,10 @@ class PolykeyAgent {
logger: logger.getChild(NodeManager.name),
fresh,
}));
// Discovery uses in-memory CreateDestroy pattern
// Therefore it should be destroyed during stop
discovery =
discovery ??
(await Discovery.createDiscovery({
db,
gestaltGraph,
identitiesManager,
nodeManager,
Expand Down Expand Up @@ -323,7 +321,7 @@ class PolykeyAgent {
await sessionManager?.stop();
await notificationsManager?.stop();
await vaultManager?.stop();
await discovery?.destroy();
await discovery?.stop();
await nodeManager?.stop();
await revProxy?.stop();
await fwdProxy?.stop();
Expand Down Expand Up @@ -578,6 +576,7 @@ class PolykeyAgent {
await this.nodeManager.start({ fresh });
await this.nodeManager.getConnectionsToSeedNodes();
await this.nodeManager.syncNodeGraph();
await this.discovery.start({ fresh });
await this.vaultManager.start({ fresh });
await this.notificationsManager.start({ fresh });
await this.sessionManager.start({ fresh });
Expand All @@ -596,7 +595,7 @@ class PolykeyAgent {
await this.sessionManager?.stop();
await this.notificationsManager?.stop();
await this.vaultManager?.stop();
await this.discovery?.destroy();
await this.discovery?.stop();
await this.nodeManager?.stop();
await this.revProxy?.stop();
await this.fwdProxy?.stop();
Expand Down Expand Up @@ -624,7 +623,7 @@ class PolykeyAgent {
await this.sessionManager.stop();
await this.notificationsManager.stop();
await this.vaultManager.stop();
await this.discovery.destroy();
await this.discovery.stop();
await this.nodeManager.stop();
await this.revProxy.stop();
await this.fwdProxy.stop();
Expand All @@ -649,6 +648,7 @@ class PolykeyAgent {
await this.sessionManager.destroy();
await this.notificationsManager.destroy();
await this.vaultManager.destroy();
await this.discovery.destroy();
await this.nodeManager.destroy();
await this.gestaltGraph.destroy();
await this.acl.destroy();
Expand Down
4 changes: 1 addition & 3 deletions src/bin/identities/CommandDiscover.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@ class CommandDiscover extends CommandPolykey {
constructor(...args: ConstructorParameters<typeof CommandPolykey>) {
super(...args);
this.name('discover');
this.description(
'Starts Discovery Process using Node or Identity as a Starting Point',
);
this.description('Adds a Node or Identity to the Discovery Queue');
this.argument(
'<gestaltId>',
'Node ID or `Provider ID:Identity ID`',
Expand Down
88 changes: 68 additions & 20 deletions src/bin/identities/CommandSearch.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import type PolykeyClient from '../../PolykeyClient';
import type { IdentityId, ProviderId } from '../../identities/types';
import CommandPolykey from '../CommandPolykey';
import * as binOptions from '../utils/options';
import * as binUtils from '../utils';
import * as parsers from '../utils/parsers';
import * as binProcessors from '../utils/processors';

class CommandSearch extends CommandPolykey {
Expand All @@ -10,13 +12,32 @@ class CommandSearch extends CommandPolykey {
this.name('search');
this.description('Searches a Provider for any Connected Identities');
this.argument(
'<providerId>',
'Name of the digital identity provider to search on',
'[searchTerms...]',
'Search parameters to apply to connected identities',
);
this.option(
'-pi, --provider-id [providerId...]',
'Digital identity provider(s) to search on',
parsers.parseProviderIdList,
);
this.option(
'-ii, --identity-id [identityId]',
'Name of the digital identity to search for',
parsers.parseIdentityId,
);
this.option(
'-d, --disconnected',
'Include disconnected identities in search',
);
this.option(
'-l, --limit [number]',
'Limit the number of search results to display to a specific number',
parsers.parseInteger,
);
this.addOption(binOptions.nodeId);
this.addOption(binOptions.clientHost);
this.addOption(binOptions.clientPort);
this.action(async (providerId, options) => {
this.action(async (searchTerms, options) => {
const { default: PolykeyClient } = await import('../../PolykeyClient');
const identitiesPB = await import(
'../../proto/js/polykey/v1/identities/identities_pb'
Expand All @@ -34,7 +55,11 @@ class CommandSearch extends CommandPolykey {
this.fs,
);
let pkClient: PolykeyClient;
let genReadable: ReturnType<
typeof pkClient.grpcClient.identitiesInfoConnectedGet
>;
this.exitHandlers.handlers.push(async () => {
if (genReadable != null) genReadable.stream.cancel();
if (pkClient != null) await pkClient.stop();
});
try {
Expand All @@ -45,25 +70,48 @@ class CommandSearch extends CommandPolykey {
port: clientOptions.clientPort,
logger: this.logger.getChild(PolykeyClient.name),
});
const providerMessage = new identitiesPB.Provider();
providerMessage.setProviderId(providerId);
const res = await binUtils.retryAuthentication(
(auth) =>
pkClient.grpcClient.identitiesInfoGet(providerMessage, auth),
meta,
);
let output = '';
if (res.getIdentityId() && res.getProviderId()) {
output = `${res.getProviderId()}:${res.getIdentityId()}`;
const providerSearchMessage = new identitiesPB.ProviderSearch();
providerSearchMessage.setSearchTermList(searchTerms);
if (options.providerId) {
providerSearchMessage.setProviderIdList(options.providerId);
}
if (options.disconnected) {
providerSearchMessage.setDisconnected(true);
} else {
this.logger.info('No Connected Identities found for Provider');
providerSearchMessage.setDisconnected(false);
}
if (options.limit) {
providerSearchMessage.setLimit(options.limit);
}
process.stdout.write(
binUtils.outputFormatter({
type: options.format === 'json' ? 'json' : 'list',
data: [output],
}),
);
await binUtils.retryAuthentication(async (auth) => {
if (options.identity) {
providerSearchMessage.setIdentityId(options.identity);
genReadable = pkClient.grpcClient.identitiesInfoGet(
providerSearchMessage,
auth,
);
} else {
genReadable = pkClient.grpcClient.identitiesInfoConnectedGet(
providerSearchMessage,
auth,
);
}
for await (const val of genReadable) {
const output = {
providerId: val.getProvider()!.getProviderId() as ProviderId,
identityId: val.getProvider()!.getIdentityId() as IdentityId,
name: val.getName(),
email: val.getEmail(),
url: val.getUrl(),
};
process.stdout.write(
binUtils.outputFormatter({
type: options.format === 'json' ? 'json' : 'dict',
data: output,
}),
);
}
}, meta);
} finally {
if (pkClient! != null) await pkClient.stop();
}
Expand Down
23 changes: 6 additions & 17 deletions src/bin/identities/CommandTrust.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,6 @@ class CommandTrust extends CommandPolykey {
const identitiesPB = await import(
'../../proto/js/polykey/v1/identities/identities_pb'
);
const permissionsPB = await import(
'../../proto/js/polykey/v1/permissions/permissions_pb'
);
const nodesPB = await import('../../proto/js/polykey/v1/nodes/nodes_pb');
const clientOptions = await binProcessors.processClientOptions(
options.nodePath,
Expand All @@ -52,32 +49,24 @@ class CommandTrust extends CommandPolykey {
port: clientOptions.clientPort,
logger: this.logger.getChild(PolykeyClient.name),
});
const action = 'notify';
const setActionMessage = new permissionsPB.ActionSet();
setActionMessage.setAction(action);
if (gestaltId.type === 'node') {
// Setting by Node
// Setting by Node.
const nodeMessage = new nodesPB.Node();
nodeMessage.setNodeId(gestaltId.nodeId);
setActionMessage.setNode(nodeMessage);
await binUtils.retryAuthentication(
(auth) =>
pkClient.grpcClient.gestaltsActionsSetByNode(
setActionMessage,
auth,
),
pkClient.grpcClient.gestaltsGestaltTrustByNode(nodeMessage, auth),
meta,
);
} else {
// Setting by Identity
const providerMessage = new identitiesPB.Provider();
providerMessage.setProviderId(gestaltId.providerId!);
providerMessage.setIdentityId(gestaltId.identityId!);
setActionMessage.setIdentity(providerMessage);
providerMessage.setProviderId(gestaltId.providerId);
providerMessage.setIdentityId(gestaltId.identityId);
await binUtils.retryAuthentication(
(auth) =>
pkClient.grpcClient.gestaltsActionsSetByIdentity(
setActionMessage,
pkClient.grpcClient.gestaltsGestaltTrustByIdentity(
providerMessage,
auth,
),
meta,
Expand Down
28 changes: 28 additions & 0 deletions src/bin/utils/parsers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,25 @@ function validateParserToArgParser<T>(
};
}

/**
* Converts a validation parser to commander variadic argument parser
*/
function validateParserToArgListParser<T>(
validate: (data: string) => T,
): (data: string) => Array<T> {
return (data: string) => {
try {
return data.split(' ').map(validate);
} catch (e) {
if (e instanceof validationErrors.ErrorParse) {
throw new commander.InvalidArgumentError(e.message);
} else {
throw e;
}
}
};
}

const parseInteger = validateParserToArgParser(validationUtils.parseInteger);
const parseNumber = validateParserToArgParser(validationUtils.parseNumber);
const parseNodeId = validateParserToArgParser(validationUtils.parseNodeId);
Expand All @@ -40,6 +59,13 @@ const parseHostOrHostname = validateParserToArgParser(
validationUtils.parseHostOrHostname,
);
const parsePort = validateParserToArgParser(validationUtils.parsePort);
const parseIdentityId = validateParserToArgParser(
validationUtils.parseIdentityId,
);

const parseProviderIdList = validateParserToArgListParser(
validationUtils.parseProviderId,
);

function parseCoreCount(v: string): number | undefined {
if (v === 'all') {
Expand Down Expand Up @@ -159,4 +185,6 @@ export {
getDefaultSeedNodes,
parseSeedNodes,
parseNetwork,
parseProviderIdList,
parseIdentityId,
};
25 changes: 21 additions & 4 deletions src/client/GRPCClientClient.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@ import Logger from '@matrixai/logger';
import * as clientErrors from './errors';
import * as clientUtils from './utils';
import { ClientServiceClient } from '../proto/js/polykey/v1/client_service_grpc_pb';
import { GRPCClient, utils as grpcUtils } from '../grpc';
import { GRPCClient } from '../grpc';
import * as grpcUtils from '../grpc/utils';

interface GRPCClientClient extends CreateDestroy {}
@CreateDestroy()
Expand Down Expand Up @@ -486,6 +487,22 @@ class GRPCClientClient extends GRPCClient<ClientServiceClient> {
)(...args);
}

@ready(new clientErrors.ErrorClientClientDestroyed())
public gestaltsGestaltTrustByNode(...args) {
return grpcUtils.promisifyUnaryCall<utilsPB.EmptyMessage>(
this.client,
this.client.gestaltsGestaltTrustByNode,
)(...args);
}

@ready(new clientErrors.ErrorClientClientDestroyed())
public gestaltsGestaltTrustByIdentity(...args) {
return grpcUtils.promisifyUnaryCall<utilsPB.EmptyMessage>(
this.client,
this.client.gestaltsGestaltTrustByIdentity,
)(...args);
}

@ready(new clientErrors.ErrorClientClientDestroyed())
public identitiesTokenPut(...args) {
return grpcUtils.promisifyUnaryCall<utilsPB.EmptyMessage>(
Expand Down Expand Up @@ -559,16 +576,16 @@ class GRPCClientClient extends GRPCClient<ClientServiceClient> {
}

@ready(new clientErrors.ErrorClientClientDestroyed())
public identitiesInfoGetConnected(...args) {
public identitiesInfoConnectedGet(...args) {
return grpcUtils.promisifyReadableStreamCall<identitiesPB.Info>(
this.client,
this.client.identitiesInfoGetConnected,
this.client.identitiesInfoConnectedGet,
)(...args);
}

@ready(new clientErrors.ErrorClientClientDestroyed())
public identitiesInfoGet(...args) {
return grpcUtils.promisifyUnaryCall<identitiesPB.Provider>(
return grpcUtils.promisifyReadableStreamCall<identitiesPB.Info>(
this.client,
this.client.identitiesInfoGet,
)(...args);
Expand Down
10 changes: 4 additions & 6 deletions src/client/service/gestaltsDiscoveryByIdentity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ import type { Authenticate } from '../types';
import type { Discovery } from '../../discovery';
import type { IdentityId, ProviderId } from '../../identities/types';
import type * as identitiesPB from '../../proto/js/polykey/v1/identities/identities_pb';
import { utils as grpcUtils } from '../../grpc';
import { validateSync, utils as validationUtils } from '../../validation';
import { validateSync } from '../../validation';
import { matchSync } from '../../utils';
import * as grpcUtils from '../../grpc/utils';
import * as validationUtils from '../../validation/utils';
import * as utilsPB from '../../proto/js/polykey/v1/utils/utils_pb';

function gestaltsDiscoveryByIdentity({
Expand Down Expand Up @@ -42,10 +43,7 @@ function gestaltsDiscoveryByIdentity({
identityId: call.request.getIdentityId(),
},
);
const gen = discovery.discoverGestaltByIdentity(providerId, identityId);
for await (const _ of gen) {
// Empty
}
await discovery.queueDiscoveryByIdentity(providerId, identityId);
callback(null, response);
return;
} catch (e) {
Expand Down
10 changes: 4 additions & 6 deletions src/client/service/gestaltsDiscoveryByNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ import type { Authenticate } from '../types';
import type { Discovery } from '../../discovery';
import type { NodeId } from '../../nodes/types';
import type * as nodesPB from '../../proto/js/polykey/v1/nodes/nodes_pb';
import { utils as grpcUtils } from '../../grpc';
import { validateSync, utils as validationUtils } from '../../validation';
import { validateSync } from '../../validation';
import { matchSync } from '../../utils';
import * as grpcUtils from '../../grpc/utils';
import * as validationUtils from '../../validation/utils';
import * as utilsPB from '../../proto/js/polykey/v1/utils/utils_pb';

function gestaltsDiscoveryByNode({
Expand Down Expand Up @@ -38,10 +39,7 @@ function gestaltsDiscoveryByNode({
nodeId: call.request.getNodeId(),
},
);
const gen = discovery.discoverGestaltByNode(nodeId);
for await (const _ of gen) {
// Empty
}
await discovery.queueDiscoveryByNode(nodeId);
callback(null, response);
return;
} catch (e) {
Expand Down
Loading

0 comments on commit 69747e1

Please sign in to comment.