Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@ authClient
### Methods
```typescript
// Is
// (method) Authorizer.Is(params: IsRequest, options?: CallOptions): Promise<boolean>
// (method) Authorizer.Is(params: IsRequest, options?: CallOptions): Promise<IsResponse>
await authClient
.Is({
identityContext: {
Expand Down
47 changes: 42 additions & 5 deletions src/authorizer/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,27 @@ import { readFileSync } from "fs";
import {
Authorizer as AuthorizerClient,
DecisionTreeRequestSchema,
file_aserto_authorizer_v2_authorizer,
IsRequestSchema,
IsResponse,
QueryRequestSchema,
} from "@aserto/node-authorizer/src/gen/cjs/aserto/authorizer/v2/authorizer_pb";
import {
DecisionTreeRequest as DecisionTreeRequest$,
IsRequest as IsRequest$,
QueryRequest as QueryRequest$,
} from "@aserto/node-authorizer/src/gen/cjs/aserto/authorizer/v2/authorizer_pb";
import { create, JsonObject } from "@bufbuild/protobuf";
import {
create,
DescEnum,
DescExtension,
DescFile,
DescMessage,
DescService,
JsonObject,
Registry,
} from "@bufbuild/protobuf";
import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
import {
CallOptions,
Client,
Expand All @@ -21,15 +33,30 @@ import {
import { createGrpcTransport } from "@connectrpc/connect-node";

import { handleError, setHeader, traceMessage } from "../util/connect";
import { TopazRegistry } from "../util/serializer";
import {
DecisionTreeRequest,
file_aserto_authorizer_v2_api_decision_logs,
file_aserto_authorizer_v2_api_identity_context,
file_aserto_authorizer_v2_api_module,
file_aserto_authorizer_v2_api_policy_context,
file_aserto_authorizer_v2_api_policy_instance,
IsRequest,
ListPoliciesRequest,
Module,
QueryRequest,
} from "./types";

type AuthorizerConfig = {
additionalDescriptors?: (
| DescEnum
| DescExtension
| DescFile
| DescMessage
| DescService
| Registry
)[];
} & {
authorizerServiceUrl?: string;
tenantId?: string;
authorizerApiKey?: string;
Expand All @@ -47,6 +74,7 @@ type Path = {
};
export class Authorizer {
AuthClient: Client<typeof AuthorizerClient>;
registry: TopazRegistry;
constructor(config: AuthorizerConfig) {
const baseServiceHeaders: Interceptor = (next) => async (req) => {
config.token && setHeader(req, "authorization", `${config.token}`);
Expand Down Expand Up @@ -79,9 +107,19 @@ export class Authorizer {
});

this.AuthClient = createClient(AuthorizerClient, baseGrpcTransport);
this.registry = new TopazRegistry(
file_aserto_authorizer_v2_api_decision_logs,
file_aserto_authorizer_v2_api_identity_context,
file_aserto_authorizer_v2_api_module,
file_aserto_authorizer_v2_api_policy_instance,
file_aserto_authorizer_v2_api_policy_context,
file_aserto_authorizer_v2_authorizer,
file_google_protobuf_timestamp,
...(config.additionalDescriptors || []),
);
}

async Is(params: IsRequest, options?: CallOptions): Promise<boolean> {
async Is(params: IsRequest, options?: CallOptions): Promise<IsResponse> {
try {
const request: IsRequest$ = create(IsRequestSchema, {
...params,
Expand All @@ -90,10 +128,9 @@ export class Authorizer {
instanceLabel: params.policyInstance?.name,
},
});
const response = await this.AuthClient.is(request, options);

const allowed = response.decisions[0]?.is;
return !!allowed;
const response = await this.AuthClient.is(request, options);
return this.registry.serializeResponse(response);
} catch (error) {
throw handleError(error, "Is");
}
Expand Down
3 changes: 2 additions & 1 deletion src/authorizer/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { IdentityContext as IdentityContext$ } from "@aserto/node-authorizer/src/gen/cjs/aserto/authorizer/v2/api/identity_context_pb";
import { Module as Module$ } from "@aserto/node-authorizer/src/gen/cjs/aserto/authorizer/v2/api/module_pb";
import { PolicyContext as PolicyContext$ } from "@aserto/node-authorizer/src/gen/cjs/aserto/authorizer/v2/api/policy_context_pb";
import { PolicyInstance as PolicyInstance$ } from "@aserto/node-authorizer/src/gen/cjs/aserto/authorizer/v2/api/policy_instance_pb";
import {
Expand All @@ -20,12 +21,12 @@ export {
DecisionPolicySchema,
DecisionUser,
DecisionUserSchema,
file_aserto_authorizer_v2_api_decision_logs,
} from "@aserto/node-authorizer/src/gen/cjs/aserto/authorizer/v2/api/decision_logs_pb";
export * from "@aserto/node-authorizer/src/gen/cjs/aserto/authorizer/v2/api/identity_context_pb";
export * from "@aserto/node-authorizer/src/gen/cjs/aserto/authorizer/v2/api/module_pb";
export * from "@aserto/node-authorizer/src/gen/cjs/aserto/authorizer/v2/api/policy_context_pb";
export * from "@aserto/node-authorizer/src/gen/cjs/aserto/authorizer/v2/api/policy_instance_pb";
import { Module as Module$ } from "@aserto/node-authorizer/src/gen/cjs/aserto/authorizer/v2/api/module_pb";
export * from "@aserto/node-authorizer/src/gen/cjs/aserto/authorizer/v2/authorizer_pb";

export type DecisionTreeRequest = Omit<
Expand Down
32 changes: 28 additions & 4 deletions src/directory/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@ import { readFileSync } from "fs";
import {
Exporter,
ExportRequestSchema,
file_aserto_directory_exporter_v3_exporter,
} from "@aserto/node-directory/src/gen/cjs/aserto/directory/exporter/v3/exporter_pb";
import {
file_aserto_directory_importer_v3_importer,
Importer,
ImportRequest,
ImportRequestSchema,
} from "@aserto/node-directory/src/gen/cjs/aserto/directory/importer/v3/importer_pb";
import {
file_aserto_directory_model_v3_model,
MetadataSchema,
Model,
SetManifestRequestSchema,
Expand All @@ -22,6 +25,7 @@ import {
import {
CheckRequestSchema,
ChecksRequestSchema,
file_aserto_directory_reader_v3_reader,
GetGraphRequestSchema,
GetObjectManyRequestSchema,
GetObjectRequestSchema,
Expand All @@ -32,11 +36,13 @@ import {
import {
DeleteObjectRequestSchema,
DeleteRelationRequestSchema,
file_aserto_directory_writer_v3_writer,
SetObjectRequestSchema,
SetRelationRequestSchema,
Writer,
} from "@aserto/node-directory/src/gen/cjs/aserto/directory/writer/v3/writer_pb";
import { create, JsonObject, Message } from "@bufbuild/protobuf";
import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
import {
CallOptions,
Client,
Expand All @@ -53,14 +59,14 @@ import {
setHeader,
traceMessage,
} from "../util/connect";
import { TopazRegistry } from "../util/serializer";
import {
nullExporterProxy,
nullImporterProxy,
nullModelProxy,
nullReaderProxy,
nullWriterProxy,
} from "./null";
import { DsRegistry } from "./serializer";
import {
CheckRequest,
CheckResponse,
Expand All @@ -74,6 +80,7 @@ import {
DirectoryConfig,
ExportOptions,
ExportResponse,
file_aserto_directory_common_v3_common,
GetGraphRequest,
GetGraphResponse,
GetManifestRequest,
Expand Down Expand Up @@ -137,7 +144,7 @@ export class Directory {
ImporterClient: Client<typeof Importer>;
ExporterClient: Client<typeof Exporter>;
ModelClient: Client<typeof Model>;
registry: DsRegistry;
registry: TopazRegistry;

CreateTransport: (
config: ServiceConfig | undefined,
Expand Down Expand Up @@ -282,7 +289,16 @@ export class Directory {
: nullModelProxy();

this.CreateTransport = createTransport;
this.registry = new DsRegistry(...(config.additionalDescriptors || []));
this.registry = new TopazRegistry(
file_aserto_directory_common_v3_common,
file_aserto_directory_reader_v3_reader,
file_aserto_directory_writer_v3_writer,
file_aserto_directory_exporter_v3_exporter,
file_aserto_directory_importer_v3_importer,
file_aserto_directory_model_v3_model,
file_google_protobuf_timestamp,
...(config.additionalDescriptors || []),
);
}

async check(
Expand Down Expand Up @@ -653,7 +669,15 @@ export async function readAsyncIterable<T>(
export async function serializeAsyncIterable<T extends Message>(
gen: AsyncIterable<T>,
): Promise<T[]> {
const registry = new DsRegistry();
const registry = new TopazRegistry(
file_aserto_directory_common_v3_common,
file_aserto_directory_reader_v3_reader,
file_aserto_directory_writer_v3_writer,
file_aserto_directory_exporter_v3_exporter,
file_aserto_directory_importer_v3_importer,
file_aserto_directory_model_v3_model,
file_google_protobuf_timestamp,
);
const out: T[] = [];
for await (const x of gen) {
out.push(registry.serializeResponse<T>(x));
Expand Down
68 changes: 0 additions & 68 deletions src/directory/serializer.ts

This file was deleted.

4 changes: 2 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import {
readAsyncIterable,
serializeAsyncIterable,
} from "./directory";
import { DsRegistry } from "./directory/serializer";
import { Opcode } from "./directory/types";
import { handleError } from "./util/connect";
import {
Expand All @@ -15,12 +14,12 @@ import {
LOG_LEVELS,
setLogEventEmitter,
} from "./util/log";
import { TopazRegistry } from "./util/serializer";

export {
Authorizer,
createImportRequest,
Directory,
DsRegistry,
getLogEventEmitter,
handleError,
ImportMsgCase,
Expand All @@ -30,6 +29,7 @@ export {
readAsyncIterable,
serializeAsyncIterable,
setLogEventEmitter,
TopazRegistry,
};

export * from "./authorizer/types";
Expand Down
49 changes: 49 additions & 0 deletions src/util/serializer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import {
createRegistry,
DescEnum,
DescExtension,
DescFile,
DescMessage,
DescService,
Message,
MessageShape,
Registry,
toJson,
} from "@bufbuild/protobuf";
import { GenMessage } from "@bufbuild/protobuf/codegenv1";

import { InvalidSchemaError } from "../util/errors";

class TopazRegistry {
registry: Registry;

constructor(
...input: (
| DescEnum
| DescExtension
| DescFile
| DescMessage
| DescService
| Registry
)[]
) {
this.registry = createRegistry(...input);
}

serializeResponse<T extends Message>(
response: MessageShape<GenMessage<T>>,
): T {
const schema = this.registry.getMessage(response.$typeName);
if (!schema) {
throw new InvalidSchemaError(
`schema not registered for type: [${response.$typeName}]`,
);
}
return toJson(schema, response, {
alwaysEmitImplicit: true,
registry: this.registry,
}) as unknown as T;
}
}

export { TopazRegistry };
Loading