From a85c59e3e2ac8d13b66573b68fd19b0e407a4644 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Mon, 22 Apr 2024 22:00:37 +0200 Subject: [PATCH 001/101] Fix: Improve user experience for machine identities --- .../IdentitySection/IdentityTable.tsx | 132 +++++++++++------- 1 file changed, 82 insertions(+), 50 deletions(-) diff --git a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx index 804c2d054..ac1cf31c3 100644 --- a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx +++ b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx @@ -1,9 +1,22 @@ -import { faKey, faLock, faPencil, faServer, faXmark } from "@fortawesome/free-solid-svg-icons"; +import { + faCopy, + faEllipsis, + faKey, + faLock, + faPencil, + faServer, + faXmark +} from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { twMerge } from "tailwind-merge"; import { createNotification } from "@app/components/notifications"; import { OrgPermissionCan } from "@app/components/permissions"; import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, EmptyState, IconButton, Select, @@ -44,7 +57,6 @@ type Props = { }; export const IdentityTable = ({ handlePopUpOpen }: Props) => { - const { currentOrg } = useOrganization(); const orgId = currentOrg?.id || ""; @@ -83,7 +95,6 @@ export const IdentityTable = ({ handlePopUpOpen }: Props) => { Name - ID Role Auth Method @@ -98,7 +109,6 @@ export const IdentityTable = ({ handlePopUpOpen }: Props) => { return ( {name} - {id} { {authMethod ? identityAuthToNameMap[authMethod] : "Not configured"} -
+
{authMethod === IdentityAuthMethod.UNIVERSAL_AUTH && ( { colorSchema="primary" variant="plain" ariaLabel="update" - // isDisabled={!isAllowed} > @@ -168,7 +177,6 @@ export const IdentityTable = ({ handlePopUpOpen }: Props) => { colorSchema="primary" variant="plain" ariaLabel="update" - className="ml-4" isDisabled={!isAllowed} > @@ -176,54 +184,78 @@ export const IdentityTable = ({ handlePopUpOpen }: Props) => { )} - - {(isAllowed) => ( - { - handlePopUpOpen("identity", { - identityId: id, - name, - role, - customRole - }); - }} - size="lg" - colorSchema="primary" - variant="plain" - ariaLabel="update" - className="ml-4" - isDisabled={!isAllowed} + + + +
+ +
+
+
+ + - -
- )} -
- - {(isAllowed) => ( - ( + { + if (!isAllowed) return; + handlePopUpOpen("identity", { + identityId: id, + name, + role, + customRole + }); + }} + disabled={!isAllowed} + icon={} + > + Update identity + + )} + + + {(isAllowed) => ( + { + if (!isAllowed) return; + handlePopUpOpen("deleteIdentity", { + identityId: id, + name + }); + }} + icon={} + > + Delete identity + + )} + + { - handlePopUpOpen("deleteIdentity", { - identityId: id, - name + navigator.clipboard.writeText(id); + createNotification({ + text: "Copied identity internal ID to clipboard", + type: "success" }); }} - size="lg" - colorSchema="danger" - variant="plain" - ariaLabel="update" - className="ml-4" - isDisabled={!isAllowed} + icon={} > - - - )} - + Copy internal ID + + +
From fdf5fcad0a26eb51ca6221044b12baf951b0be84 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Mon, 22 Apr 2024 23:09:46 +0200 Subject: [PATCH 002/101] Update IdentityTable.tsx --- .../components/IdentitySection/IdentityTable.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx index ac1cf31c3..f621e3e18 100644 --- a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx +++ b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx @@ -185,13 +185,13 @@ export const IdentityTable = ({ handlePopUpOpen }: Props) => { )} - - -
+ +
+ -
-
- + +
+
Date: Wed, 8 May 2024 09:20:30 -0700 Subject: [PATCH 003/101] Update IdentityTable.tsx --- .../OrgIdentityTab/components/IdentitySection/IdentityTable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx index f621e3e18..fa8529371 100644 --- a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx +++ b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx @@ -252,7 +252,7 @@ export const IdentityTable = ({ handlePopUpOpen }: Props) => { }} icon={} > - Copy internal ID + Copy Identity ID
From 265932df208b6913003a11cf258e8a6159a02ed5 Mon Sep 17 00:00:00 2001 From: Tuan Dang Date: Wed, 15 May 2024 16:30:42 -0700 Subject: [PATCH 004/101] Finish preliminary azure auth method --- backend/src/@types/fastify.d.ts | 2 + backend/src/@types/knex.d.ts | 8 + .../20240515211432_identity-azure-auth.ts | 29 ++ .../src/db/schemas/identity-azure-auths.ts | 26 ++ backend/src/db/schemas/index.ts | 1 + backend/src/db/schemas/models.ts | 4 +- .../ee/services/audit-log/audit-log-types.ts | 50 +++ backend/src/server/routes/index.ts | 14 +- .../routes/v1/identity-azure-auth-router.ts | 261 +++++++++++++ backend/src/server/routes/v1/index.ts | 2 + .../identity-azure-auth-dal.ts | 10 + .../identity-azure-auth-fns.ts | 34 ++ .../identity-azure-auth-service.ts | 286 ++++++++++++++ .../identity-azure-auth-types.ts | 120 ++++++ .../src/hooks/api/identities/constants.tsx | 3 +- frontend/src/hooks/api/identities/enums.tsx | 3 +- frontend/src/hooks/api/identities/index.tsx | 3 + .../src/hooks/api/identities/mutations.tsx | 78 +++- frontend/src/hooks/api/identities/queries.tsx | 25 +- frontend/src/hooks/api/identities/types.ts | 39 ++ .../IdentityAuthMethodModal.tsx | 13 +- .../IdentitySection/IdentityAzureAuthForm.tsx | 350 ++++++++++++++++++ 22 files changed, 1352 insertions(+), 9 deletions(-) create mode 100644 backend/src/db/migrations/20240515211432_identity-azure-auth.ts create mode 100644 backend/src/db/schemas/identity-azure-auths.ts create mode 100644 backend/src/server/routes/v1/identity-azure-auth-router.ts create mode 100644 backend/src/services/identity-azure-auth/identity-azure-auth-dal.ts create mode 100644 backend/src/services/identity-azure-auth/identity-azure-auth-fns.ts create mode 100644 backend/src/services/identity-azure-auth/identity-azure-auth-service.ts create mode 100644 backend/src/services/identity-azure-auth/identity-azure-auth-types.ts create mode 100644 frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityAzureAuthForm.tsx diff --git a/backend/src/@types/fastify.d.ts b/backend/src/@types/fastify.d.ts index 994b324f6..faeb89c4f 100644 --- a/backend/src/@types/fastify.d.ts +++ b/backend/src/@types/fastify.d.ts @@ -33,6 +33,7 @@ import { TGroupProjectServiceFactory } from "@app/services/group-project/group-p import { TIdentityServiceFactory } from "@app/services/identity/identity-service"; import { TIdentityAccessTokenServiceFactory } from "@app/services/identity-access-token/identity-access-token-service"; import { TIdentityAwsAuthServiceFactory } from "@app/services/identity-aws-auth/identity-aws-auth-service"; +import { TIdentityAzureAuthServiceFactory } from "@app/services/identity-azure-auth/identity-azure-auth-service"; import { TIdentityGcpAuthServiceFactory } from "@app/services/identity-gcp-auth/identity-gcp-auth-service"; import { TIdentityProjectServiceFactory } from "@app/services/identity-project/identity-project-service"; import { TIdentityUaServiceFactory } from "@app/services/identity-ua/identity-ua-service"; @@ -119,6 +120,7 @@ declare module "fastify" { identityUa: TIdentityUaServiceFactory; identityGcpAuth: TIdentityGcpAuthServiceFactory; identityAwsAuth: TIdentityAwsAuthServiceFactory; + identityAzureAuth: TIdentityAzureAuthServiceFactory; accessApprovalPolicy: TAccessApprovalPolicyServiceFactory; accessApprovalRequest: TAccessApprovalRequestServiceFactory; secretApprovalPolicy: TSecretApprovalPolicyServiceFactory; diff --git a/backend/src/@types/knex.d.ts b/backend/src/@types/knex.d.ts index 9e8a2a752..5617539ce 100644 --- a/backend/src/@types/knex.d.ts +++ b/backend/src/@types/knex.d.ts @@ -62,6 +62,9 @@ import { TIdentityAwsAuths, TIdentityAwsAuthsInsert, TIdentityAwsAuthsUpdate, + TIdentityAzureAuths, + TIdentityAzureAuthsInsert, + TIdentityAzureAuthsUpdate, TIdentityGcpAuths, TIdentityGcpAuthsInsert, TIdentityGcpAuthsUpdate, @@ -348,6 +351,11 @@ declare module "knex/types/tables" { TIdentityAwsAuthsInsert, TIdentityAwsAuthsUpdate >; + [TableName.IdentityAzureAuth]: Knex.CompositeTableType< + TIdentityAzureAuths, + TIdentityAzureAuthsInsert, + TIdentityAzureAuthsUpdate + >; [TableName.IdentityUaClientSecret]: Knex.CompositeTableType< TIdentityUaClientSecrets, TIdentityUaClientSecretsInsert, diff --git a/backend/src/db/migrations/20240515211432_identity-azure-auth.ts b/backend/src/db/migrations/20240515211432_identity-azure-auth.ts new file mode 100644 index 000000000..3d91b2f9c --- /dev/null +++ b/backend/src/db/migrations/20240515211432_identity-azure-auth.ts @@ -0,0 +1,29 @@ +import { Knex } from "knex"; + +import { TableName } from "../schemas"; +import { createOnUpdateTrigger, dropOnUpdateTrigger } from "../utils"; + +export async function up(knex: Knex): Promise { + if (!(await knex.schema.hasTable(TableName.IdentityAzureAuth))) { + await knex.schema.createTable(TableName.IdentityAzureAuth, (t) => { + t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid()); + t.bigInteger("accessTokenTTL").defaultTo(7200).notNullable(); + t.bigInteger("accessTokenMaxTTL").defaultTo(7200).notNullable(); + t.bigInteger("accessTokenNumUsesLimit").defaultTo(0).notNullable(); + t.jsonb("accessTokenTrustedIps").notNullable(); + t.timestamps(true, true, true); + t.uuid("identityId").notNullable().unique(); + t.foreign("identityId").references("id").inTable(TableName.Identity).onDelete("CASCADE"); + t.string("tenantId").notNullable(); + t.string("resource").notNullable(); + t.string("allowedServicePrincipalIds").notNullable(); + }); + } + + await createOnUpdateTrigger(knex, TableName.IdentityAzureAuth); +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(TableName.IdentityAzureAuth); + await dropOnUpdateTrigger(knex, TableName.IdentityAzureAuth); +} diff --git a/backend/src/db/schemas/identity-azure-auths.ts b/backend/src/db/schemas/identity-azure-auths.ts new file mode 100644 index 000000000..856f7b8f1 --- /dev/null +++ b/backend/src/db/schemas/identity-azure-auths.ts @@ -0,0 +1,26 @@ +// Code generated by automation script, DO NOT EDIT. +// Automated by pulling database and generating zod schema +// To update. Just run npm run generate:schema +// Written by akhilmhdh. + +import { z } from "zod"; + +import { TImmutableDBKeys } from "./models"; + +export const IdentityAzureAuthsSchema = z.object({ + id: z.string().uuid(), + accessTokenTTL: z.coerce.number().default(7200), + accessTokenMaxTTL: z.coerce.number().default(7200), + accessTokenNumUsesLimit: z.coerce.number().default(0), + accessTokenTrustedIps: z.unknown(), + createdAt: z.date(), + updatedAt: z.date(), + identityId: z.string().uuid(), + tenantId: z.string(), + resource: z.string(), + allowedServicePrincipalIds: z.string() +}); + +export type TIdentityAzureAuths = z.infer; +export type TIdentityAzureAuthsInsert = Omit, TImmutableDBKeys>; +export type TIdentityAzureAuthsUpdate = Partial, TImmutableDBKeys>>; diff --git a/backend/src/db/schemas/index.ts b/backend/src/db/schemas/index.ts index 4993003f9..917f5c1ea 100644 --- a/backend/src/db/schemas/index.ts +++ b/backend/src/db/schemas/index.ts @@ -18,6 +18,7 @@ export * from "./groups"; export * from "./identities"; export * from "./identity-access-tokens"; export * from "./identity-aws-auths"; +export * from "./identity-azure-auths"; export * from "./identity-gcp-auths"; export * from "./identity-org-memberships"; export * from "./identity-project-additional-privilege"; diff --git a/backend/src/db/schemas/models.ts b/backend/src/db/schemas/models.ts index aaaa0ff9a..e4c6f6a91 100644 --- a/backend/src/db/schemas/models.ts +++ b/backend/src/db/schemas/models.ts @@ -46,6 +46,7 @@ export enum TableName { IdentityAccessToken = "identity_access_tokens", IdentityUniversalAuth = "identity_universal_auths", IdentityGcpAuth = "identity_gcp_auths", + IdentityAzureAuth = "identity_azure_auths", IdentityUaClientSecret = "identity_ua_client_secrets", IdentityAwsAuth = "identity_aws_auths", IdentityOrgMembership = "identity_org_memberships", @@ -147,5 +148,6 @@ export enum ProjectUpgradeStatus { export enum IdentityAuthMethod { Univeral = "universal-auth", GCP_AUTH = "gcp-auth", - AWS_AUTH = "aws-auth" + AWS_AUTH = "aws-auth", + AZURE_AUTH = "azure-auth" } diff --git a/backend/src/ee/services/audit-log/audit-log-types.ts b/backend/src/ee/services/audit-log/audit-log-types.ts index 0dc993358..36d236323 100644 --- a/backend/src/ee/services/audit-log/audit-log-types.ts +++ b/backend/src/ee/services/audit-log/audit-log-types.ts @@ -74,6 +74,10 @@ export enum EventType { ADD_IDENTITY_AWS_AUTH = "add-identity-aws-auth", UPDATE_IDENTITY_AWS_AUTH = "update-identity-aws-auth", GET_IDENTITY_AWS_AUTH = "get-identity-aws-auth", + LOGIN_IDENTITY_AZURE_AUTH = "login-identity-azure-auth", + ADD_IDENTITY_AZURE_AUTH = "add-identity-azure-auth", + UPDATE_IDENTITY_AZURE_AUTH = "update-identity-azure-auth", + GET_IDENTITY_AZURE_AUTH = "get-identity-azure-auth", CREATE_ENVIRONMENT = "create-environment", UPDATE_ENVIRONMENT = "update-environment", DELETE_ENVIRONMENT = "delete-environment", @@ -504,6 +508,48 @@ interface GetIdentityAwsAuthEvent { }; } +interface LoginIdentityAzureAuthEvent { + type: EventType.LOGIN_IDENTITY_AZURE_AUTH; + metadata: { + identityId: string; + identityAzureAuthId: string; + identityAccessTokenId: string; + }; +} + +interface AddIdentityAzureAuthEvent { + type: EventType.ADD_IDENTITY_AZURE_AUTH; + metadata: { + identityId: string; + tenantId: string; + resource: string; + accessTokenTTL: number; + accessTokenMaxTTL: number; + accessTokenNumUsesLimit: number; + accessTokenTrustedIps: Array; + }; +} + +interface UpdateIdentityAzureAuthEvent { + type: EventType.UPDATE_IDENTITY_AZURE_AUTH; + metadata: { + identityId: string; + tenantId?: string; + resource?: string; + accessTokenTTL?: number; + accessTokenMaxTTL?: number; + accessTokenNumUsesLimit?: number; + accessTokenTrustedIps?: Array; + }; +} + +interface GetIdentityAzureAuthEvent { + type: EventType.GET_IDENTITY_AZURE_AUTH; + metadata: { + identityId: string; + }; +} + interface CreateEnvironmentEvent { type: EventType.CREATE_ENVIRONMENT; metadata: { @@ -766,6 +812,10 @@ export type Event = | AddIdentityAwsAuthEvent | UpdateIdentityAwsAuthEvent | GetIdentityAwsAuthEvent + | LoginIdentityAzureAuthEvent + | AddIdentityAzureAuthEvent + | UpdateIdentityAzureAuthEvent + | GetIdentityAzureAuthEvent | CreateEnvironmentEvent | UpdateEnvironmentEvent | DeleteEnvironmentEvent diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts index 3a050bcad..ebc572a57 100644 --- a/backend/src/server/routes/index.ts +++ b/backend/src/server/routes/index.ts @@ -80,6 +80,8 @@ import { identityAccessTokenDALFactory } from "@app/services/identity-access-tok import { identityAccessTokenServiceFactory } from "@app/services/identity-access-token/identity-access-token-service"; import { identityAwsAuthDALFactory } from "@app/services/identity-aws-auth/identity-aws-auth-dal"; import { identityAwsAuthServiceFactory } from "@app/services/identity-aws-auth/identity-aws-auth-service"; +import { identityAzureAuthDALFactory } from "@app/services/identity-azure-auth/identity-azure-auth-dal"; +import { identityAzureAuthServiceFactory } from "@app/services/identity-azure-auth/identity-azure-auth-service"; import { identityGcpAuthDALFactory } from "@app/services/identity-gcp-auth/identity-gcp-auth-dal"; import { identityGcpAuthServiceFactory } from "@app/services/identity-gcp-auth/identity-gcp-auth-service"; import { identityProjectDALFactory } from "@app/services/identity-project/identity-project-dal"; @@ -209,8 +211,8 @@ export const registerRoutes = async ( const identityUaDAL = identityUaDALFactory(db); const identityUaClientSecretDAL = identityUaClientSecretDALFactory(db); const identityAwsAuthDAL = identityAwsAuthDALFactory(db); - const identityGcpAuthDAL = identityGcpAuthDALFactory(db); + const identityAzureAuthDAL = identityAzureAuthDALFactory(db); const auditLogDAL = auditLogDALFactory(db); const auditLogStreamDAL = auditLogStreamDALFactory(db); @@ -730,6 +732,15 @@ export const registerRoutes = async ( permissionService }); + const identityAzureAuthService = identityAzureAuthServiceFactory({ + identityAzureAuthDAL, + identityOrgMembershipDAL, + identityAccessTokenDAL, + identityDAL, + permissionService, + licenseService + }); + const dynamicSecretProviders = buildDynamicSecretProviders(); const dynamicSecretQueueService = dynamicSecretLeaseQueueServiceFactory({ queueService, @@ -800,6 +811,7 @@ export const registerRoutes = async ( identityUa: identityUaService, identityGcpAuth: identityGcpAuthService, identityAwsAuth: identityAwsAuthService, + identityAzureAuth: identityAzureAuthService, secretApprovalPolicy: sapService, accessApprovalPolicy: accessApprovalPolicyService, accessApprovalRequest: accessApprovalRequestService, diff --git a/backend/src/server/routes/v1/identity-azure-auth-router.ts b/backend/src/server/routes/v1/identity-azure-auth-router.ts new file mode 100644 index 000000000..9e9e49b56 --- /dev/null +++ b/backend/src/server/routes/v1/identity-azure-auth-router.ts @@ -0,0 +1,261 @@ +import { z } from "zod"; + +import { IdentityAzureAuthsSchema } from "@app/db/schemas"; +import { EventType } from "@app/ee/services/audit-log/audit-log-types"; +import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; +import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; +import { AuthMode } from "@app/services/auth/auth-type"; +import { TIdentityTrustedIp } from "@app/services/identity/identity-types"; + +export const registerIdentityAzureAuthRouter = async (server: FastifyZodProvider) => { + server.route({ + method: "POST", + url: "/azure-auth/login", + config: { + rateLimit: writeLimit + }, + schema: { + description: "Login with Azure Auth", + body: z.object({ + identityId: z.string(), + jwt: z.string() + }), + response: { + 200: z.object({ + accessToken: z.string(), + expiresIn: z.coerce.number(), + accessTokenMaxTTL: z.coerce.number(), + tokenType: z.literal("Bearer") + }) + } + }, + handler: async (req) => { + const { identityAzureAuth, accessToken, identityAccessToken, identityMembershipOrg } = + await server.services.identityAzureAuth.login(req.body); + + await server.services.auditLog.createAuditLog({ + ...req.auditLogInfo, + orgId: identityMembershipOrg.orgId, + event: { + type: EventType.LOGIN_IDENTITY_AZURE_AUTH, + metadata: { + identityId: identityAzureAuth.identityId, + identityAccessTokenId: identityAccessToken.id, + identityAzureAuthId: identityAzureAuth.id + } + } + }); + + return { + accessToken, + tokenType: "Bearer" as const, + expiresIn: identityAzureAuth.accessTokenTTL, + accessTokenMaxTTL: identityAzureAuth.accessTokenMaxTTL + }; + } + }); + + server.route({ + method: "POST", + url: "/azure-auth/identities/:identityId", + config: { + rateLimit: writeLimit + }, + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), + schema: { + description: "Attach Azure Auth configuration onto identity", + security: [ + { + bearerAuth: [] + } + ], + params: z.object({ + identityId: z.string().trim() + }), + body: z.object({ + tenantId: z.string().trim(), + resource: z.string().trim(), + allowedServicePrincipalIds: z.string().trim(), + accessTokenTrustedIps: z + .object({ + ipAddress: z.string().trim() + }) + .array() + .min(1) + .default([{ ipAddress: "0.0.0.0/0" }, { ipAddress: "::/0" }]), + accessTokenTTL: z + .number() + .int() + .min(1) + .refine((value) => value !== 0, { + message: "accessTokenTTL must have a non zero number" + }) + .default(2592000), + accessTokenMaxTTL: z + .number() + .int() + .refine((value) => value !== 0, { + message: "accessTokenMaxTTL must have a non zero number" + }) + .default(2592000), + accessTokenNumUsesLimit: z.number().int().min(0).default(0) + }), + response: { + 200: z.object({ + identityAzureAuth: IdentityAzureAuthsSchema + }) + } + }, + handler: async (req) => { + const identityAzureAuth = await server.services.identityAzureAuth.attachAzureAuth({ + actor: req.permission.type, + actorId: req.permission.id, + actorAuthMethod: req.permission.authMethod, + actorOrgId: req.permission.orgId, + ...req.body, + identityId: req.params.identityId + }); + + await server.services.auditLog.createAuditLog({ + ...req.auditLogInfo, + orgId: identityAzureAuth.orgId, + event: { + type: EventType.ADD_IDENTITY_AZURE_AUTH, + metadata: { + identityId: identityAzureAuth.identityId, + tenantId: identityAzureAuth.tenantId, + resource: identityAzureAuth.resource, + accessTokenTTL: identityAzureAuth.accessTokenTTL, + accessTokenMaxTTL: identityAzureAuth.accessTokenMaxTTL, + accessTokenTrustedIps: identityAzureAuth.accessTokenTrustedIps as TIdentityTrustedIp[], + accessTokenNumUsesLimit: identityAzureAuth.accessTokenNumUsesLimit + } + } + }); + + return { identityAzureAuth }; + } + }); + + server.route({ + method: "PATCH", + url: "/azure-auth/identities/:identityId", + config: { + rateLimit: writeLimit + }, + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), + schema: { + description: "Update Azure Auth configuration on identity", + security: [ + { + bearerAuth: [] + } + ], + params: z.object({ + identityId: z.string().trim() + }), + body: z.object({ + tenantId: z.string().trim().optional(), + resource: z.string().trim().optional(), + allowedServicePrincipalIds: z.string().trim().optional(), + accessTokenTrustedIps: z + .object({ + ipAddress: z.string().trim() + }) + .array() + .min(1) + .optional(), + accessTokenTTL: z.number().int().min(0).optional(), + accessTokenNumUsesLimit: z.number().int().min(0).optional(), + accessTokenMaxTTL: z + .number() + .int() + .refine((value) => value !== 0, { + message: "accessTokenMaxTTL must have a non zero number" + }) + .optional() + }), + response: { + 200: z.object({ + identityAzureAuth: IdentityAzureAuthsSchema + }) + } + }, + handler: async (req) => { + const identityAzureAuth = await server.services.identityAzureAuth.updateAzureAuth({ + actor: req.permission.type, + actorId: req.permission.id, + actorOrgId: req.permission.orgId, + actorAuthMethod: req.permission.authMethod, + ...req.body, + identityId: req.params.identityId + }); + + await server.services.auditLog.createAuditLog({ + ...req.auditLogInfo, + orgId: identityAzureAuth.orgId, + event: { + type: EventType.UPDATE_IDENTITY_AZURE_AUTH, + metadata: { + identityId: identityAzureAuth.identityId, + tenantId: identityAzureAuth.tenantId, + resource: identityAzureAuth.resource, + accessTokenTTL: identityAzureAuth.accessTokenTTL, + accessTokenMaxTTL: identityAzureAuth.accessTokenMaxTTL, + accessTokenTrustedIps: identityAzureAuth.accessTokenTrustedIps as TIdentityTrustedIp[], + accessTokenNumUsesLimit: identityAzureAuth.accessTokenNumUsesLimit + } + } + }); + + return { identityAzureAuth }; + } + }); + + server.route({ + method: "GET", + url: "/azure-auth/identities/:identityId", + config: { + rateLimit: readLimit + }, + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), + schema: { + description: "Retrieve Azure Auth configuration on identity", + security: [ + { + bearerAuth: [] + } + ], + params: z.object({ + identityId: z.string() + }), + response: { + 200: z.object({ + identityAzureAuth: IdentityAzureAuthsSchema + }) + } + }, + handler: async (req) => { + const identityAzureAuth = await server.services.identityAzureAuth.getAzureAuth({ + identityId: req.params.identityId, + actor: req.permission.type, + actorId: req.permission.id, + actorOrgId: req.permission.orgId, + actorAuthMethod: req.permission.authMethod + }); + + await server.services.auditLog.createAuditLog({ + ...req.auditLogInfo, + orgId: identityAzureAuth.orgId, + event: { + type: EventType.GET_IDENTITY_AZURE_AUTH, + metadata: { + identityId: identityAzureAuth.identityId + } + } + }); + + return { identityAzureAuth }; + } + }); +}; diff --git a/backend/src/server/routes/v1/index.ts b/backend/src/server/routes/v1/index.ts index 1a02a4cbf..1302a9469 100644 --- a/backend/src/server/routes/v1/index.ts +++ b/backend/src/server/routes/v1/index.ts @@ -3,6 +3,7 @@ import { registerAuthRoutes } from "./auth-router"; import { registerProjectBotRouter } from "./bot-router"; import { registerIdentityAccessTokenRouter } from "./identity-access-token-router"; import { registerIdentityAwsAuthRouter } from "./identity-aws-iam-auth-router"; +import { registerIdentityAzureAuthRouter } from "./identity-azure-auth-router"; import { registerIdentityGcpAuthRouter } from "./identity-gcp-auth-router"; import { registerIdentityRouter } from "./identity-router"; import { registerIdentityUaRouter } from "./identity-ua"; @@ -32,6 +33,7 @@ export const registerV1Routes = async (server: FastifyZodProvider) => { await authRouter.register(registerIdentityGcpAuthRouter); await authRouter.register(registerIdentityAccessTokenRouter); await authRouter.register(registerIdentityAwsAuthRouter); + await authRouter.register(registerIdentityAzureAuthRouter); }, { prefix: "/auth" } ); diff --git a/backend/src/services/identity-azure-auth/identity-azure-auth-dal.ts b/backend/src/services/identity-azure-auth/identity-azure-auth-dal.ts new file mode 100644 index 000000000..7038e2b9c --- /dev/null +++ b/backend/src/services/identity-azure-auth/identity-azure-auth-dal.ts @@ -0,0 +1,10 @@ +import { TDbClient } from "@app/db"; +import { TableName } from "@app/db/schemas"; +import { ormify } from "@app/lib/knex"; + +export type TIdentityAzureAuthDALFactory = ReturnType; + +export const identityAzureAuthDALFactory = (db: TDbClient) => { + const azureAuthOrm = ormify(db, TableName.IdentityAzureAuth); + return azureAuthOrm; +}; diff --git a/backend/src/services/identity-azure-auth/identity-azure-auth-fns.ts b/backend/src/services/identity-azure-auth/identity-azure-auth-fns.ts new file mode 100644 index 000000000..ad9e6f12d --- /dev/null +++ b/backend/src/services/identity-azure-auth/identity-azure-auth-fns.ts @@ -0,0 +1,34 @@ +import axios from "axios"; +import jwt from "jsonwebtoken"; + +import { UnauthorizedError } from "@app/lib/errors"; + +import { TAzureAuthJwtPayload, TAzureJwksUriResponse, TDecodedAzureAuthJwt } from "./identity-azure-auth-types"; + +export const validateAzureIdentity = async ({ + tenantId, + resource, + jwt: azureJwt +}: { + tenantId: string; + resource: string; + jwt: string; +}) => { + const jwksUri = `https://login.microsoftonline.com/${tenantId}/discovery/keys`; + + const decodedJwt = jwt.decode(azureJwt, { complete: true }) as TDecodedAzureAuthJwt; + const { kid } = decodedJwt.header; + + const { data }: { data: TAzureJwksUriResponse } = await axios.get(jwksUri); + const signingKeys = data.keys; + + const signingKey = signingKeys.find((key) => key.kid === kid); + if (!signingKey) throw new UnauthorizedError(); + + const publicKey = `-----BEGIN CERTIFICATE-----\n${signingKey.x5c[0]}\n-----END CERTIFICATE-----`; + + return jwt.verify(azureJwt, publicKey, { + audience: resource, + issuer: `https://sts.windows.net/${tenantId}/` + }) as TAzureAuthJwtPayload; +}; diff --git a/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts b/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts new file mode 100644 index 000000000..02e3996cf --- /dev/null +++ b/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts @@ -0,0 +1,286 @@ +import { ForbiddenError } from "@casl/ability"; +import jwt from "jsonwebtoken"; + +import { IdentityAuthMethod } from "@app/db/schemas"; +import { TLicenseServiceFactory } from "@app/ee/services/license/license-service"; +import { OrgPermissionActions, OrgPermissionSubjects } from "@app/ee/services/permission/org-permission"; +import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service"; +import { getConfig } from "@app/lib/config/env"; +import { BadRequestError, UnauthorizedError } from "@app/lib/errors"; +import { extractIPDetails, isValidIpOrCidr } from "@app/lib/ip"; + +import { AuthTokenType } from "../auth/auth-type"; +import { TIdentityDALFactory } from "../identity/identity-dal"; +import { TIdentityOrgDALFactory } from "../identity/identity-org-dal"; +import { TIdentityAccessTokenDALFactory } from "../identity-access-token/identity-access-token-dal"; +import { TIdentityAccessTokenJwtPayload } from "../identity-access-token/identity-access-token-types"; +import { TIdentityAzureAuthDALFactory } from "./identity-azure-auth-dal"; +import { validateAzureIdentity } from "./identity-azure-auth-fns"; +import { + TAttachAzureAuthDTO, + TGetAzureAuthDTO, + TLoginAzureAuthDTO, + TUpdateAzureAuthDTO +} from "./identity-azure-auth-types"; + +type TIdentityAzureAuthServiceFactoryDep = { + identityAzureAuthDAL: TIdentityAzureAuthDALFactory; // TODO: Pick + identityOrgMembershipDAL: Pick; + identityAccessTokenDAL: Pick; + identityDAL: Pick; + permissionService: Pick; + licenseService: Pick; +}; + +export type TIdentityAzureAuthServiceFactory = ReturnType; + +export const identityAzureAuthServiceFactory = ({ + identityAzureAuthDAL, + identityOrgMembershipDAL, + identityAccessTokenDAL, + identityDAL, + permissionService, + licenseService +}: TIdentityAzureAuthServiceFactoryDep) => { + const login = async ({ identityId, jwt: azureJwt }: TLoginAzureAuthDTO) => { + const identityAzureAuth = await identityAzureAuthDAL.findOne({ identityId }); + if (!identityAzureAuth) throw new UnauthorizedError(); + + const identityMembershipOrg = await identityOrgMembershipDAL.findOne({ identityId: identityAzureAuth.identityId }); + if (!identityMembershipOrg) throw new UnauthorizedError(); + + const azureIdentity = await validateAzureIdentity({ + tenantId: identityAzureAuth.tenantId, + resource: identityAzureAuth.resource, + jwt: azureJwt + }); + + if (azureIdentity.tid !== identityAzureAuth.tenantId) throw new UnauthorizedError(); + + if (identityAzureAuth.allowedServicePrincipalIds) { + // validate if the service principal id is in the list of allowed service principal ids + + const isServicePrincipalAllowed = identityAzureAuth.allowedServicePrincipalIds + .split(",") + .map((servicePrincipalId) => servicePrincipalId.trim()) + .some((servicePrincipalId) => servicePrincipalId === azureIdentity.appid); + + if (!isServicePrincipalAllowed) throw new UnauthorizedError(); + } + + const identityAccessToken = await identityAzureAuthDAL.transaction(async (tx) => { + const newToken = await identityAccessTokenDAL.create( + { + identityId: identityAzureAuth.identityId, + isAccessTokenRevoked: false, + accessTokenTTL: identityAzureAuth.accessTokenTTL, + accessTokenMaxTTL: identityAzureAuth.accessTokenMaxTTL, + accessTokenNumUses: 0, + accessTokenNumUsesLimit: identityAzureAuth.accessTokenNumUsesLimit + }, + tx + ); + return newToken; + }); + + const appCfg = getConfig(); + const accessToken = jwt.sign( + { + identityId: identityAzureAuth.identityId, + identityAccessTokenId: identityAccessToken.id, + authTokenType: AuthTokenType.IDENTITY_ACCESS_TOKEN + } as TIdentityAccessTokenJwtPayload, + appCfg.AUTH_SECRET, + { + expiresIn: + Number(identityAccessToken.accessTokenMaxTTL) === 0 + ? undefined + : Number(identityAccessToken.accessTokenMaxTTL) + } + ); + + return { accessToken, identityAzureAuth, identityAccessToken, identityMembershipOrg }; + }; + + const attachAzureAuth = async ({ + identityId, + tenantId, + resource, + allowedServicePrincipalIds, + accessTokenTTL, + accessTokenMaxTTL, + accessTokenNumUsesLimit, + accessTokenTrustedIps, + actorId, + actorAuthMethod, + actor, + actorOrgId + }: TAttachAzureAuthDTO) => { + const identityMembershipOrg = await identityOrgMembershipDAL.findOne({ identityId }); + if (!identityMembershipOrg) throw new BadRequestError({ message: "Failed to find identity" }); + if (identityMembershipOrg.identity.authMethod) + throw new BadRequestError({ + message: "Failed to add Azure Auth to already configured identity" + }); + + if (accessTokenMaxTTL > 0 && accessTokenTTL > accessTokenMaxTTL) { + throw new BadRequestError({ message: "Access token TTL cannot be greater than max TTL" }); + } + + const { permission } = await permissionService.getOrgPermission( + actor, + actorId, + identityMembershipOrg.orgId, + actorAuthMethod, + actorOrgId + ); + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Create, OrgPermissionSubjects.Identity); + + const plan = await licenseService.getPlan(identityMembershipOrg.orgId); + const reformattedAccessTokenTrustedIps = accessTokenTrustedIps.map((accessTokenTrustedIp) => { + if ( + !plan.ipAllowlisting && + accessTokenTrustedIp.ipAddress !== "0.0.0.0/0" && + accessTokenTrustedIp.ipAddress !== "::/0" + ) + throw new BadRequestError({ + message: + "Failed to add IP access range to access token due to plan restriction. Upgrade plan to add IP access range." + }); + if (!isValidIpOrCidr(accessTokenTrustedIp.ipAddress)) + throw new BadRequestError({ + message: "The IP is not a valid IPv4, IPv6, or CIDR block" + }); + return extractIPDetails(accessTokenTrustedIp.ipAddress); + }); + + const identityAzureAuth = await identityAzureAuthDAL.transaction(async (tx) => { + const doc = await identityAzureAuthDAL.create( + { + identityId: identityMembershipOrg.identityId, + tenantId, + resource, + allowedServicePrincipalIds, + accessTokenMaxTTL, + accessTokenTTL, + accessTokenNumUsesLimit, + accessTokenTrustedIps: JSON.stringify(reformattedAccessTokenTrustedIps) + }, + tx + ); + await identityDAL.updateById( + identityMembershipOrg.identityId, + { + authMethod: IdentityAuthMethod.AZURE_AUTH + }, + tx + ); + return doc; + }); + return { ...identityAzureAuth, orgId: identityMembershipOrg.orgId }; + }; + + const updateAzureAuth = async ({ + identityId, + tenantId, + resource, + allowedServicePrincipalIds, + accessTokenTTL, + accessTokenMaxTTL, + accessTokenNumUsesLimit, + accessTokenTrustedIps, + actorId, + actorAuthMethod, + actor, + actorOrgId + }: TUpdateAzureAuthDTO) => { + const identityMembershipOrg = await identityOrgMembershipDAL.findOne({ identityId }); + if (!identityMembershipOrg) throw new BadRequestError({ message: "Failed to find identity" }); + if (identityMembershipOrg.identity?.authMethod !== IdentityAuthMethod.AZURE_AUTH) + throw new BadRequestError({ + message: "Failed to update Azure Auth" + }); + + const identityGcpAuth = await identityAzureAuthDAL.findOne({ identityId }); + + if ( + (accessTokenMaxTTL || identityGcpAuth.accessTokenMaxTTL) > 0 && + (accessTokenTTL || identityGcpAuth.accessTokenMaxTTL) > (accessTokenMaxTTL || identityGcpAuth.accessTokenMaxTTL) + ) { + throw new BadRequestError({ message: "Access token TTL cannot be greater than max TTL" }); + } + + const { permission } = await permissionService.getOrgPermission( + actor, + actorId, + identityMembershipOrg.orgId, + actorAuthMethod, + actorOrgId + ); + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Edit, OrgPermissionSubjects.Identity); + + const plan = await licenseService.getPlan(identityMembershipOrg.orgId); + const reformattedAccessTokenTrustedIps = accessTokenTrustedIps?.map((accessTokenTrustedIp) => { + if ( + !plan.ipAllowlisting && + accessTokenTrustedIp.ipAddress !== "0.0.0.0/0" && + accessTokenTrustedIp.ipAddress !== "::/0" + ) + throw new BadRequestError({ + message: + "Failed to add IP access range to access token due to plan restriction. Upgrade plan to add IP access range." + }); + if (!isValidIpOrCidr(accessTokenTrustedIp.ipAddress)) + throw new BadRequestError({ + message: "The IP is not a valid IPv4, IPv6, or CIDR block" + }); + return extractIPDetails(accessTokenTrustedIp.ipAddress); + }); + + const updatedAzureAuth = await identityAzureAuthDAL.updateById(identityGcpAuth.id, { + tenantId, + resource, + allowedServicePrincipalIds, + accessTokenMaxTTL, + accessTokenTTL, + accessTokenNumUsesLimit, + accessTokenTrustedIps: reformattedAccessTokenTrustedIps + ? JSON.stringify(reformattedAccessTokenTrustedIps) + : undefined + }); + + return { + ...updatedAzureAuth, + orgId: identityMembershipOrg.orgId + }; + }; + + const getAzureAuth = async ({ identityId, actorId, actor, actorAuthMethod, actorOrgId }: TGetAzureAuthDTO) => { + const identityMembershipOrg = await identityOrgMembershipDAL.findOne({ identityId }); + if (!identityMembershipOrg) throw new BadRequestError({ message: "Failed to find identity" }); + if (identityMembershipOrg.identity?.authMethod !== IdentityAuthMethod.AZURE_AUTH) + throw new BadRequestError({ + message: "The identity does not have Azure Auth attached" + }); + + const identityAzureAuth = await identityAzureAuthDAL.findOne({ identityId }); + + const { permission } = await permissionService.getOrgPermission( + actor, + actorId, + identityMembershipOrg.orgId, + actorAuthMethod, + actorOrgId + ); + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Read, OrgPermissionSubjects.Identity); + + return { ...identityAzureAuth, orgId: identityMembershipOrg.orgId }; + }; + + return { + login, + attachAzureAuth, + updateAzureAuth, + getAzureAuth + }; +}; diff --git a/backend/src/services/identity-azure-auth/identity-azure-auth-types.ts b/backend/src/services/identity-azure-auth/identity-azure-auth-types.ts new file mode 100644 index 000000000..b8c4b6855 --- /dev/null +++ b/backend/src/services/identity-azure-auth/identity-azure-auth-types.ts @@ -0,0 +1,120 @@ +import { TProjectPermission } from "@app/lib/types"; + +export type TLoginAzureAuthDTO = { + identityId: string; + jwt: string; +}; + +export type TAttachAzureAuthDTO = { + identityId: string; + tenantId: string; + resource: string; + allowedServicePrincipalIds: string; + accessTokenTTL: number; + accessTokenMaxTTL: number; + accessTokenNumUsesLimit: number; + accessTokenTrustedIps: { ipAddress: string }[]; +} & Omit; + +export type TUpdateAzureAuthDTO = { + identityId: string; + tenantId?: string; + resource?: string; + allowedServicePrincipalIds?: string; + accessTokenTTL?: number; + accessTokenMaxTTL?: number; + accessTokenNumUsesLimit?: number; + accessTokenTrustedIps?: { ipAddress: string }[]; +} & Omit; + +export type TGetAzureAuthDTO = { + identityId: string; +} & Omit; + +export type TAzureJwksUriResponse = { + keys: { + kty: string; + use: string; + kid: string; + x5t: string; + n: string; + e: string; + x5c: string[]; + }[]; +}; + +type TUserPayload = { + aud: string; + iss: string; + iat: number; + nbf: number; + exp: number; + acr: string; + aio: string; + amr: string[]; + appid: string; + appidacr: string; + family_name: string; + given_name: string; + groups: string[]; + idtyp: string; + ipaddr: string; + name: string; + oid: string; + puid: string; + rh: string; + scp: string; + sub: string; + tid: string; + unique_name: string; + upn: string; + uti: string; + ver: string; + wids: string[]; + xms_cae: string; + xms_cc: string[]; + xms_filter_index: string[]; + xms_rd: string; + xms_ssm: string; + xms_tcdt: number; +}; + +type TAppRegistrationPayload = { + aud: string; + iss: string; + iat: number; + nbf: number; + exp: number; + aio: string; + appid: string; + appidacr: string; + idp: string; + idtyp: string; + oid: string; + rh: string; + sub: string; + tid: string; + uti: string; + ver: string; + xms_cae: string; + xms_cc: string[]; + xms_rd: string; + xms_ssm: string; + xms_tcdt: number; +}; + +export type TAzureAuthJwtPayload = TUserPayload | TAppRegistrationPayload; + +export type TDecodedAzureAuthJwt = { + header: { + type: string; + alg: string; + x5t: string; + kid: string; + }; + payload: TAzureAuthJwtPayload; + signature: string; + metadata: { + [key: string]: string; + }; +}; diff --git a/frontend/src/hooks/api/identities/constants.tsx b/frontend/src/hooks/api/identities/constants.tsx index d2669a308..57dc5beb6 100644 --- a/frontend/src/hooks/api/identities/constants.tsx +++ b/frontend/src/hooks/api/identities/constants.tsx @@ -3,5 +3,6 @@ import { IdentityAuthMethod } from "./enums"; export const identityAuthToNameMap: { [I in IdentityAuthMethod]: string } = { [IdentityAuthMethod.UNIVERSAL_AUTH]: "Universal Auth", [IdentityAuthMethod.GCP_AUTH]: "GCP Auth", - [IdentityAuthMethod.AWS_AUTH]: "AWS Auth" + [IdentityAuthMethod.AWS_AUTH]: "AWS Auth", + [IdentityAuthMethod.AZURE_AUTH]: "Azure Auth" }; diff --git a/frontend/src/hooks/api/identities/enums.tsx b/frontend/src/hooks/api/identities/enums.tsx index a67776c87..bd51053f1 100644 --- a/frontend/src/hooks/api/identities/enums.tsx +++ b/frontend/src/hooks/api/identities/enums.tsx @@ -1,5 +1,6 @@ export enum IdentityAuthMethod { UNIVERSAL_AUTH = "universal-auth", GCP_AUTH = "gcp-auth", - AWS_AUTH = "aws-auth" + AWS_AUTH = "aws-auth", + AZURE_AUTH = "azure-auth" } diff --git a/frontend/src/hooks/api/identities/index.tsx b/frontend/src/hooks/api/identities/index.tsx index d59e096c0..ce1f099be 100644 --- a/frontend/src/hooks/api/identities/index.tsx +++ b/frontend/src/hooks/api/identities/index.tsx @@ -2,6 +2,7 @@ export { identityAuthToNameMap } from "./constants"; export { IdentityAuthMethod } from "./enums"; export { useAddIdentityAwsAuth, + useAddIdentityAzureAuth, useAddIdentityGcpAuth, useAddIdentityUniversalAuth, useCreateIdentity, @@ -10,10 +11,12 @@ export { useRevokeIdentityUniversalAuthClientSecret, useUpdateIdentity, useUpdateIdentityAwsAuth, + useUpdateIdentityAzureAuth, useUpdateIdentityGcpAuth, useUpdateIdentityUniversalAuth} from "./mutations"; export { useGetIdentityAwsAuth, + useGetIdentityAzureAuth, useGetIdentityGcpAuth, useGetIdentityUniversalAuth, useGetIdentityUniversalAuthClientSecrets diff --git a/frontend/src/hooks/api/identities/mutations.tsx b/frontend/src/hooks/api/identities/mutations.tsx index 5c2e20ff0..615d53336 100644 --- a/frontend/src/hooks/api/identities/mutations.tsx +++ b/frontend/src/hooks/api/identities/mutations.tsx @@ -6,6 +6,7 @@ import { organizationKeys } from "../organization/queries"; import { identitiesKeys } from "./queries"; import { AddIdentityAwsAuthDTO, + AddIdentityAzureAuthDTO, AddIdentityGcpAuthDTO, AddIdentityUniversalAuthDTO, ClientSecretData, @@ -16,13 +17,14 @@ import { DeleteIdentityUniversalAuthClientSecretDTO, Identity, IdentityAwsAuth, + IdentityAzureAuth, IdentityGcpAuth, IdentityUniversalAuth, UpdateIdentityAwsAuthDTO, + UpdateIdentityAzureAuthDTO, UpdateIdentityDTO, UpdateIdentityGcpAuthDTO, - UpdateIdentityUniversalAuthDTO -} from "./types"; + UpdateIdentityUniversalAuthDTO} from "./types"; export const useCreateIdentity = () => { const queryClient = useQueryClient(); @@ -323,3 +325,75 @@ export const useUpdateIdentityAwsAuth = () => { } }); }; + +export const useAddIdentityAzureAuth = () => { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: async ({ + identityId, + tenantId, + resource, + allowedServicePrincipalIds, + accessTokenTTL, + accessTokenMaxTTL, + accessTokenNumUsesLimit, + accessTokenTrustedIps + }) => { + const { + data: { identityAzureAuth } + } = await apiRequest.post<{ identityAzureAuth: IdentityAzureAuth }>( + `/api/v1/auth/azure-auth/identities/${identityId}`, + { + tenantId, + resource, + allowedServicePrincipalIds, + accessTokenTTL, + accessTokenMaxTTL, + accessTokenNumUsesLimit, + accessTokenTrustedIps + } + ); + + return identityAzureAuth; + }, + onSuccess: (_, { organizationId }) => { + queryClient.invalidateQueries(organizationKeys.getOrgIdentityMemberships(organizationId)); + } + }); +}; + +export const useUpdateIdentityAzureAuth = () => { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: async ({ + identityId, + tenantId, + resource, + allowedServicePrincipalIds, + accessTokenTTL, + accessTokenMaxTTL, + accessTokenNumUsesLimit, + accessTokenTrustedIps + }) => { + const { + data: { identityAzureAuth } + } = await apiRequest.patch<{ identityAzureAuth: IdentityAzureAuth }>( + `/api/v1/auth/azure-auth/identities/${identityId}`, + { + tenantId, + resource, + allowedServicePrincipalIds, + accessTokenTTL, + accessTokenMaxTTL, + accessTokenNumUsesLimit, + accessTokenTrustedIps + } + ); + + return identityAzureAuth; + }, + onSuccess: (_, { organizationId }) => { + queryClient.invalidateQueries(organizationKeys.getOrgIdentityMemberships(organizationId)); + } + }); +}; diff --git a/frontend/src/hooks/api/identities/queries.tsx b/frontend/src/hooks/api/identities/queries.tsx index 2996f275f..c5236a86e 100644 --- a/frontend/src/hooks/api/identities/queries.tsx +++ b/frontend/src/hooks/api/identities/queries.tsx @@ -2,7 +2,12 @@ import { useQuery } from "@tanstack/react-query"; import { apiRequest } from "@app/config/request"; -import { ClientSecretData, IdentityAwsAuth, IdentityGcpAuth, IdentityUniversalAuth } from "./types"; +import { + ClientSecretData, + IdentityAwsAuth, + IdentityAzureAuth, + IdentityGcpAuth, + IdentityUniversalAuth} from "./types"; export const identitiesKeys = { getIdentityUniversalAuth: (identityId: string) => @@ -10,7 +15,8 @@ export const identitiesKeys = { getIdentityUniversalAuthClientSecrets: (identityId: string) => [{ identityId }, "identity-universal-auth-client-secrets"] as const, getIdentityGcpAuth: (identityId: string) => [{ identityId }, "identity-gcp-auth"] as const, - getIdentityAwsAuth: (identityId: string) => [{ identityId }, "identity-aws-auth"] as const + getIdentityAwsAuth: (identityId: string) => [{ identityId }, "identity-aws-auth"] as const, + getIdentityAzureAuth: (identityId: string) => [{ identityId }, "identity-azure-auth"] as const }; export const useGetIdentityUniversalAuth = (identityId: string) => { @@ -72,3 +78,18 @@ export const useGetIdentityAwsAuth = (identityId: string) => { } }); }; + +export const useGetIdentityAzureAuth = (identityId: string) => { + return useQuery({ + enabled: Boolean(identityId), + queryKey: identitiesKeys.getIdentityAzureAuth(identityId), + queryFn: async () => { + const { + data: { identityAzureAuth } + } = await apiRequest.get<{ identityAzureAuth: IdentityAzureAuth }>( + `/api/v1/auth/azure-auth/identities/${identityId}` + ); + return identityAzureAuth; + } + }); +}; diff --git a/frontend/src/hooks/api/identities/types.ts b/frontend/src/hooks/api/identities/types.ts index c1d8e09fa..4f756fa60 100644 --- a/frontend/src/hooks/api/identities/types.ts +++ b/frontend/src/hooks/api/identities/types.ts @@ -195,6 +195,45 @@ export type UpdateIdentityAwsAuthDTO = { }[]; }; +export type IdentityAzureAuth = { + identityId: string; + tenantId: string; + resource: string; + allowedServicePrincipalIds: string; + accessTokenTTL: number; + accessTokenMaxTTL: number; + accessTokenNumUsesLimit: number; + accessTokenTrustedIps: IdentityTrustedIp[]; +}; + +export type AddIdentityAzureAuthDTO = { + organizationId: string; + identityId: string; + tenantId: string; + resource: string; + allowedServicePrincipalIds: string; + accessTokenTTL: number; + accessTokenMaxTTL: number; + accessTokenNumUsesLimit: number; + accessTokenTrustedIps: { + ipAddress: string; + }[]; +}; + +export type UpdateIdentityAzureAuthDTO = { + organizationId: string; + identityId: string; + tenantId?: string; + resource?: string; + allowedServicePrincipalIds?: string; + accessTokenTTL?: number; + accessTokenMaxTTL?: number; + accessTokenNumUsesLimit?: number; + accessTokenTrustedIps?: { + ipAddress: string; + }[]; +}; + export type CreateIdentityUniversalAuthClientSecretDTO = { identityId: string; description?: string; diff --git a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityAuthMethodModal.tsx b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityAuthMethodModal.tsx index 74c4c7f6d..b4cbca0a6 100644 --- a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityAuthMethodModal.tsx +++ b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityAuthMethodModal.tsx @@ -15,6 +15,7 @@ import { IdentityAuthMethod } from "@app/hooks/api/identities"; import { UsePopUpState } from "@app/hooks/usePopUp"; import { IdentityAwsAuthForm } from "./IdentityAwsAuthForm"; +import { IdentityAzureAuthForm } from "./IdentityAzureAuthForm"; import { IdentityGcpAuthForm } from "./IdentityGcpAuthForm"; import { IdentityUniversalAuthForm } from "./IdentityUniversalAuthForm"; @@ -30,7 +31,8 @@ type Props = { const identityAuthMethods = [ { label: "Universal Auth", value: IdentityAuthMethod.UNIVERSAL_AUTH }, { label: "GCP Auth", value: IdentityAuthMethod.GCP_AUTH }, - { label: "AWS Auth", value: IdentityAuthMethod.AWS_AUTH } + { label: "AWS Auth", value: IdentityAuthMethod.AWS_AUTH }, + { label: "Azure Auth", value: IdentityAuthMethod.AZURE_AUTH } ]; const schema = yup @@ -86,6 +88,15 @@ export const IdentityAuthMethodModal = ({ popUp, handlePopUpOpen, handlePopUpTog /> ); } + case IdentityAuthMethod.AZURE_AUTH: { + return ( + + ); + } case IdentityAuthMethod.UNIVERSAL_AUTH: { return ( ; + +type Props = { + handlePopUpOpen: (popUpName: keyof UsePopUpState<["upgradePlan"]>) => void; + handlePopUpToggle: ( + popUpName: keyof UsePopUpState<["identityAuthMethod"]>, + state?: boolean + ) => void; + identityAuthMethodData: { + identityId: string; + name: string; + authMethod?: IdentityAuthMethod; + }; +}; + +export const IdentityAzureAuthForm = ({ + handlePopUpOpen, + handlePopUpToggle, + identityAuthMethodData +}: Props) => { + const { currentOrg } = useOrganization(); + const orgId = currentOrg?.id || ""; + const { subscription } = useSubscription(); + + const { mutateAsync: addMutateAsync } = useAddIdentityAzureAuth(); + const { mutateAsync: updateMutateAsync } = useUpdateIdentityAzureAuth(); + + const { data } = useGetIdentityAzureAuth(identityAuthMethodData?.identityId ?? ""); + + const { + control, + handleSubmit, + reset, + formState: { isSubmitting } + } = useForm({ + resolver: zodResolver(schema), + defaultValues: { + tenantId: "", + resource: "https://management.azure.com/", + allowedServicePrincipalIds: "", + accessTokenTTL: "2592000", + accessTokenMaxTTL: "2592000", + accessTokenNumUsesLimit: "0", + accessTokenTrustedIps: [{ ipAddress: "0.0.0.0/0" }, { ipAddress: "::/0" }] + } + }); + + const { + fields: accessTokenTrustedIpsFields, + append: appendAccessTokenTrustedIp, + remove: removeAccessTokenTrustedIp + } = useFieldArray({ control, name: "accessTokenTrustedIps" }); + + useEffect(() => { + if (data) { + reset({ + tenantId: data.tenantId, + resource: data.resource, + allowedServicePrincipalIds: data.allowedServicePrincipalIds, + accessTokenTTL: String(data.accessTokenTTL), + accessTokenMaxTTL: String(data.accessTokenMaxTTL), + accessTokenNumUsesLimit: String(data.accessTokenNumUsesLimit), + accessTokenTrustedIps: data.accessTokenTrustedIps.map( + ({ ipAddress, prefix }: IdentityTrustedIp) => { + return { + ipAddress: `${ipAddress}${prefix !== undefined ? `/${prefix}` : ""}` + }; + } + ) + }); + } else { + reset({ + tenantId: "", + resource: "https://management.azure.com/", + allowedServicePrincipalIds: "", + accessTokenTTL: "2592000", + accessTokenMaxTTL: "2592000", + accessTokenNumUsesLimit: "0", + accessTokenTrustedIps: [{ ipAddress: "0.0.0.0/0" }, { ipAddress: "::/0" }] + }); + } + }, [data]); + + const onFormSubmit = async ({ + tenantId, + resource, + allowedServicePrincipalIds, + accessTokenTTL, + accessTokenMaxTTL, + accessTokenNumUsesLimit, + accessTokenTrustedIps + }: FormData) => { + try { + if (!identityAuthMethodData) return; + + if (data) { + await updateMutateAsync({ + organizationId: orgId, + identityId: identityAuthMethodData.identityId, + tenantId, + resource, + allowedServicePrincipalIds, + accessTokenTTL: Number(accessTokenTTL), + accessTokenMaxTTL: Number(accessTokenMaxTTL), + accessTokenNumUsesLimit: Number(accessTokenNumUsesLimit), + accessTokenTrustedIps + }); + } else { + await addMutateAsync({ + organizationId: orgId, + identityId: identityAuthMethodData.identityId, + tenantId: tenantId || "", + resource: resource || "", + allowedServicePrincipalIds: allowedServicePrincipalIds || "", + accessTokenTTL: Number(accessTokenTTL), + accessTokenMaxTTL: Number(accessTokenMaxTTL), + accessTokenNumUsesLimit: Number(accessTokenNumUsesLimit), + accessTokenTrustedIps + }); + } + + handlePopUpToggle("identityAuthMethod", false); + + createNotification({ + text: `Successfully ${ + identityAuthMethodData?.authMethod ? "updated" : "configured" + } auth method`, + type: "success" + }); + + reset(); + } catch (err) { + createNotification({ + text: `Failed to ${identityAuthMethodData?.authMethod ? "update" : "configure"} identity`, + type: "error" + }); + } + }; + + return ( +
+ ( + + + + )} + /> + ( + + + + )} + /> + ( + + + + )} + /> + ( + + + + )} + /> + ( + + + + )} + /> + ( + + + + )} + /> + {accessTokenTrustedIpsFields.map(({ id }, index) => ( +
+ { + return ( + + { + if (subscription?.ipAllowlisting) { + field.onChange(e); + return; + } + + handlePopUpOpen("upgradePlan"); + }} + placeholder="123.456.789.0" + /> + + ); + }} + /> + { + if (subscription?.ipAllowlisting) { + removeAccessTokenTrustedIp(index); + return; + } + + handlePopUpOpen("upgradePlan"); + }} + size="lg" + colorSchema="danger" + variant="plain" + ariaLabel="update" + className="p-3" + > + + +
+ ))} +
+ +
+
+ + +
+ + ); +}; From 9352e8bca059dd2c9186bebab9ba11471a1b43c5 Mon Sep 17 00:00:00 2001 From: Tuan Dang Date: Wed, 15 May 2024 23:13:19 -0700 Subject: [PATCH 005/101] Add docs for Azure auth --- .../routes/v1/identity-azure-auth-router.ts | 5 +- .../routes/v1/identity-gcp-auth-router.ts | 6 +- .../identity-azure-auth-service.ts | 2 +- .../identity-azure-auth-types.ts | 6 +- .../identity-azure-auth-validators.ts | 14 ++ .../platform/identities/aws-auth.mdx | 4 + .../platform/identities/azure-auth.mdx | 176 ++++++++++++++++++ .../identities/machine-identities.mdx | 7 +- ...dentities-org-create-azure-auth-method.png | Bin 0 -> 525551 bytes docs/mint.json | 1 + .../IdentitySection/IdentityAzureAuthForm.tsx | 6 +- 11 files changed, 211 insertions(+), 16 deletions(-) create mode 100644 backend/src/services/identity-azure-auth/identity-azure-auth-validators.ts create mode 100644 docs/documentation/platform/identities/azure-auth.mdx create mode 100644 docs/images/platform/identities/identities-org-create-azure-auth-method.png diff --git a/backend/src/server/routes/v1/identity-azure-auth-router.ts b/backend/src/server/routes/v1/identity-azure-auth-router.ts index 9e9e49b56..d10cd131b 100644 --- a/backend/src/server/routes/v1/identity-azure-auth-router.ts +++ b/backend/src/server/routes/v1/identity-azure-auth-router.ts @@ -6,6 +6,7 @@ import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; import { TIdentityTrustedIp } from "@app/services/identity/identity-types"; +import { validateAzureAuthField } from "@app/services/identity-azure-auth/identity-azure-auth-validators"; export const registerIdentityAzureAuthRouter = async (server: FastifyZodProvider) => { server.route({ @@ -75,7 +76,7 @@ export const registerIdentityAzureAuthRouter = async (server: FastifyZodProvider body: z.object({ tenantId: z.string().trim(), resource: z.string().trim(), - allowedServicePrincipalIds: z.string().trim(), + allowedServicePrincipalIds: validateAzureAuthField, accessTokenTrustedIps: z .object({ ipAddress: z.string().trim() @@ -157,7 +158,7 @@ export const registerIdentityAzureAuthRouter = async (server: FastifyZodProvider body: z.object({ tenantId: z.string().trim().optional(), resource: z.string().trim().optional(), - allowedServicePrincipalIds: z.string().trim().optional(), + allowedServicePrincipalIds: validateAzureAuthField.optional(), accessTokenTrustedIps: z .object({ ipAddress: z.string().trim() diff --git a/backend/src/server/routes/v1/identity-gcp-auth-router.ts b/backend/src/server/routes/v1/identity-gcp-auth-router.ts index 58654f220..34940eb13 100644 --- a/backend/src/server/routes/v1/identity-gcp-auth-router.ts +++ b/backend/src/server/routes/v1/identity-gcp-auth-router.ts @@ -160,9 +160,9 @@ export const registerIdentityGcpAuthRouter = async (server: FastifyZodProvider) }), body: z.object({ type: z.enum(["iam", "gce"]).optional(), - allowedServiceAccounts: validateGcpAuthField, - allowedProjects: validateGcpAuthField, - allowedZones: validateGcpAuthField, + allowedServiceAccounts: validateGcpAuthField.optional(), + allowedProjects: validateGcpAuthField.optional(), + allowedZones: validateGcpAuthField.optional(), accessTokenTrustedIps: z .object({ ipAddress: z.string().trim() diff --git a/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts b/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts index 02e3996cf..044ca28bc 100644 --- a/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts +++ b/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts @@ -63,7 +63,7 @@ export const identityAzureAuthServiceFactory = ({ const isServicePrincipalAllowed = identityAzureAuth.allowedServicePrincipalIds .split(",") .map((servicePrincipalId) => servicePrincipalId.trim()) - .some((servicePrincipalId) => servicePrincipalId === azureIdentity.appid); + .some((servicePrincipalId) => servicePrincipalId === azureIdentity.oid); if (!isServicePrincipalAllowed) throw new UnauthorizedError(); } diff --git a/backend/src/services/identity-azure-auth/identity-azure-auth-types.ts b/backend/src/services/identity-azure-auth/identity-azure-auth-types.ts index b8c4b6855..65459003c 100644 --- a/backend/src/services/identity-azure-auth/identity-azure-auth-types.ts +++ b/backend/src/services/identity-azure-auth/identity-azure-auth-types.ts @@ -79,7 +79,7 @@ type TUserPayload = { xms_tcdt: number; }; -type TAppRegistrationPayload = { +type TAppPayload = { aud: string; iss: string; iat: number; @@ -90,7 +90,7 @@ type TAppRegistrationPayload = { appidacr: string; idp: string; idtyp: string; - oid: string; + oid: string; // service principal id rh: string; sub: string; tid: string; @@ -103,7 +103,7 @@ type TAppRegistrationPayload = { xms_tcdt: number; }; -export type TAzureAuthJwtPayload = TUserPayload | TAppRegistrationPayload; +export type TAzureAuthJwtPayload = TUserPayload | TAppPayload; export type TDecodedAzureAuthJwt = { header: { diff --git a/backend/src/services/identity-azure-auth/identity-azure-auth-validators.ts b/backend/src/services/identity-azure-auth/identity-azure-auth-validators.ts new file mode 100644 index 000000000..3f7f7d8af --- /dev/null +++ b/backend/src/services/identity-azure-auth/identity-azure-auth-validators.ts @@ -0,0 +1,14 @@ +import { z } from "zod"; + +export const validateAzureAuthField = z + .string() + .trim() + .default("") + .transform((data) => { + if (data === "") return ""; + // Trim each ID and join with ', ' to ensure formatting + return data + .split(",") + .map((id) => id.trim()) + .join(", "); + }); diff --git a/docs/documentation/platform/identities/aws-auth.mdx b/docs/documentation/platform/identities/aws-auth.mdx index de43fd83c..567917f27 100644 --- a/docs/documentation/platform/identities/aws-auth.mdx +++ b/docs/documentation/platform/identities/aws-auth.mdx @@ -277,6 +277,10 @@ access the Infisical API using the AWS Auth authentication method. --data-urlencode 'iamRequestHeaders=...' ``` + + Note that you should replace `` with the ID of the identity you created in step 1. + + #### Sample response ```bash Response diff --git a/docs/documentation/platform/identities/azure-auth.mdx b/docs/documentation/platform/identities/azure-auth.mdx new file mode 100644 index 000000000..3ac957752 --- /dev/null +++ b/docs/documentation/platform/identities/azure-auth.mdx @@ -0,0 +1,176 @@ +--- +title: Azure Auth +description: "Learn how to authenticate with Infisical for services on Azure" +--- + +**Azure Auth** is an Azure-native authentication method for Azure resources like Azure VMs, Azure App Services, Azure Functions, Azure Kubernetes Service, etc. to access Infisical. + +## Diagram + +The following sequence digram illustrates the Azure Auth workflow for authenticating Azure [service principals](https://learn.microsoft.com/en-us/entra/identity-platform/app-objects-and-service-principals?tabs=browser) with Infisical. + +```mermaid +sequenceDiagram + participant Client as Client + participant Infis as Infisical + participant Azure as Azure AD OpenID + + Note over Client,Azure: Step 1: Instance Identity Token Retrieval + Client->>Azure: Request managed identity access token + Azure-->>Client: Return managed identity access token + + Note over Client,Infis: Step 2: Identity Token Login Operation + Client->>Infis: Send managed identity access token to /api/v1/auth/azure-auth/login + Infis->>Azure: Request public key + Azure-->>Infis: Return public key + + Note over Infis: Step 3: Identity Token Verification + Note over Infis: Step 4: Identity Property Validation + Infis->>Client: Return short-lived access token + + Note over Client,Infis: Step 4: Access Infisical API with Token + Client->>Infis: Make authenticated requests using the short-lived access token +``` + +## Concept + +At a high-level, Infisical authenticates an Azure service by verifying its identity and checking that it meets specific requirements (e.g. it is bound to an allowed service principal) at the `/api/v1/auth/azure-auth/login` endpoint. If successful, +then Infisical returns a short-lived access token that can be used to make authenticated requests to the Infisical API. + +To be more specific: + +1. The client running on an Azure service obtains an [access token](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http) that is a JWT token representing the managed identity for the Azure resource such as a Virtual Machine; the managed identity is associated with a service principal in Azure AD. +2. The client sends the access token to Infisical. +3. Infisical verifies the token against the corresponding public key at the [public Azure AD OpenID configuration endpoint](https://learn.microsoft.com/en-us/answers/questions/793793/azure-ad-validate-access-token). +4. Infisical checks if the entity behind the access token is allowed to authenticate with Infisical based on set criteria such as **Allowed Service Principal IDs**. +5. If all is well, Infisical returns a short-lived access token that the client can use to make authenticated requests to the Infisical API. + + +We recommend using one of Infisical's clients like SDKs or the Infisical Agent +to authenticate with Infisical using Azure Auth as they handle the +authentication process including generating the client access token for you. + +Also, note that Infisical needs network-level access to send requests to the Google Cloud API +as part of the Azure Auth workflow. + + + +## Guide + +In the following steps, we explore how to create and use identities for your applications in Azure to +access the Infisical API using the Azure Auth authentication method. + + + + To create an identity, head to your Organization Settings > Access Control > Machine Identities and press **Create identity**. + + ![identities organization](/images/platform/identities/identities-org.png) + + When creating an identity, you specify an organization level [role](/documentation/platform/role-based-access-controls) for it to assume; you can configure roles in Organization Settings > Access Control > Organization Roles. + + ![identities organization create](/images/platform/identities/identities-org-create.png) + + Now input a few details for your new identity. Here's some guidance for each field: + + - Name (required): A friendly name for the identity. + - Role (required): A role from the **Organization Roles** tab for the identity to assume. The organization role assigned will determine what organization level resources this identity can have access to. + + Once you've created an identity, you'll be prompted to configure the authentication method for it. Here, select **Azure Auth**. + + ![identities create azure auth method](/images/platform/identities/identities-org-create-azure-auth-method.png) + + Here's some more guidance on each field: + + - Tenant ID: The [tenant ID](https://learn.microsoft.com/en-us/entra/fundamentals/how-to-find-tenant) for the Azure AD organization. + - Resource / Audience: The resource URL for the application registered in Azure AD. The value is expected to match the `aud` claim of the access token JWT later used in the login operation against Infisical. See the [resource](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http) parameter for how the audience is set when requesting a JWT access token from the Azure Instance Metadata Service (IMDS) endpoint. In most cases, this value should be `https://management.azure.com/` which is the default. + - Allowed Service Principal IDs: A comma-separated list of Azure AD service principal IDs that are allowed to authenticate with Infisical. + - Access Token TTL (default is `2592000` equivalent to 30 days): The lifetime for an acccess token in seconds. This value will be referenced at renewal time. + - Access Token Max TTL (default is `2592000` equivalent to 30 days): The maximum lifetime for an acccess token in seconds. This value will be referenced at renewal time. + - Access Token Max Number of Uses (default is `0`): The maximum number of times that an access token can be used; a value of `0` implies infinite number of uses. + - Access Token Trusted IPs: The IPs or CIDR ranges that access tokens can be used from. By default, each token is given the `0.0.0.0/0`, allowing usage from any network address. + + + + To enable the identity to access project-level resources such as secrets within a specific project, you should add it to that project. + + To do this, head over to the project you want to add the identity to and go to Project Settings > Access Control > Machine Identities and press **Add identity**. + + Next, select the identity you want to add to the project and the project level role you want to allow it to assume. The project role assigned will determine what project level resources this identity can have access to. + + ![identities project](/images/platform/identities/identities-project.png) + + ![identities project create](/images/platform/identities/identities-project-create.png) + + + To access the Infisical API as the identity, you need to generate a managed identity [access token](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http) that is a JWT token representing the managed identity for the Azure resource such as a Virtual Machine. The client token must be sent to the `/api/v1/auth/azure-auth/login` endpoint in exchange for a separate access token to access the Infisical API. + + We provide a few code examples below of how you can authenticate with Infisical to access the [Infisical API](/api-reference/overview/introduction). + + + + Start by making a request from your Azure client such as Virtual Machine to obtain a managed identity access token. + + For more examples of how to obtain the managed identity access token, refer to the [official documentation](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http). + + #### Sample request + ```bash curl + curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -H Metadata:true -s + ``` + + #### Sample response + ```bash + { + "access_token": "eyJ0eXAi...", + "refresh_token": "", + "expires_in": "3599", + "expires_on": "1506484173", + "not_before": "1506480273", + "resource": "https://management.azure.com/", + "token_type": "Bearer" + } + ``` + + Next use send the obtained managed identity access token (i.e. the token from the `access_token` field above) to authenticate with Infisical and obtain a separate access token. + + #### Sample request + + ```bash Request + curl --location --request POST 'https://app.infisical.com/api/v1/auth/gcp-auth/login' \ + --header 'Content-Type: application/x-www-form-urlencoded' \ + --data-urlencode 'identityId=...' \ + --data-urlencode 'jwt=...' + ``` + + + Note that you should replace `` with the ID of the identity you created in step 1. + + + #### Sample response + + ```bash Response + { + "accessToken": "...", + "expiresIn": 7200, + "accessTokenMaxTTL": 43244 + "tokenType": "Bearer" + } + ``` + + Next, you can use this access token to access the [Infisical API](/api-reference/overview/introduction) + + + + + We recommend using one of Infisical's clients like SDKs or the Infisical Agent to authenticate with Infisical using Azure Auth as they handle the authentication process including retrieving the client access token. + + + Each identity access token has a time-to-live (TLL) which you can infer from the response of the login operation; + the default TTL is `7200` seconds which can be adjusted. + If an identity access token expires, it can no longer authenticate with the Infisical API. In this case, + a new access token should be obtained by performing another login operation. + + + + diff --git a/docs/documentation/platform/identities/machine-identities.mdx b/docs/documentation/platform/identities/machine-identities.mdx index 28bde95fe..41f464c4c 100644 --- a/docs/documentation/platform/identities/machine-identities.mdx +++ b/docs/documentation/platform/identities/machine-identities.mdx @@ -7,7 +7,7 @@ description: "Learn how to use Machine Identities to programmatically interact w An Infisical machine identity is an entity that represents a workload or application that require access to various resources in Infisical. This is conceptually similar to an IAM user in AWS or service account in Google Cloud Platform (GCP). -Each identity must authenticate with the Infisical API using a supported authentication method like [Universal Auth](/documentation/platform/identities/universal-auth), [AWS Auth](/documentation/platform/identities/aws-auth), or [GCP Auth](/documentation/platform/identities/gcp-auth) to get back a short-lived access token to be used in subsequent requests. +Each identity must authenticate with the Infisical API using a supported authentication method like [Universal Auth](/documentation/platform/identities/universal-auth), [AWS Auth](/documentation/platform/identities/aws-auth), [Azure Auth](/documentation/platform/identities/azure-auth), or [GCP Auth](/documentation/platform/identities/gcp-auth) to get back a short-lived access token to be used in subsequent requests. ![organization identities](/images/platform/organization/organization-machine-identities.png) @@ -38,11 +38,10 @@ Machine Identity support for the rest of the clients is planned to be released i To interact with various resources in Infisical, Machine Identities are able to authenticate using: - [Universal Auth](/documentation/platform/identities/universal-auth): A platform-agnostic authentication method that can be configured on an identity suitable to authenticate from any platform/environment. -- [AWS Auth](/documentation/platform/identities/aws-auth): An AWS-native authentication method for IAM principals like EC2 instances or Lambda functions to authenticate with Infisical. +- [AWS Auth](/documentation/platform/identities/aws-auth): An AWS-native authentication method for AWS services (e.g. EC2, Lambda functions, etc.) to authenticate with Infisical. +- [Azure Auth](/documentation/platform/identities/azure-auth): An Azure-native authentication method for Azure resources (e.g. Azure VMs, Azure App Services, Azure Functions, Azure Kubernetes Service, etc.) to authenticate with Infisical. - [GCP Auth](/documentation/platform/identities/gcp-auth): A GCP-native authentication method for GCP resources (e.g. Compute Engine, App Engine, Cloud Run, Google Kubernetes Engine, IAM service accounts, etc.) to authenticate with Infisical. -IAM service accounts and GCE instances to authenticate with Infisical. - ## FAQ diff --git a/docs/images/platform/identities/identities-org-create-azure-auth-method.png b/docs/images/platform/identities/identities-org-create-azure-auth-method.png new file mode 100644 index 0000000000000000000000000000000000000000..fc0fd16657a24938fc60b88e123f83e4e91e43b6 GIT binary patch literal 525551 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%0AhCY;0DVmW0>AL$A$S407Ytlb{8!(4Q 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

`$0DT$#1XYE|HVECLbm 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�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%0Df5}mW-gV8s8(iDEoy?R8Wcj$B!5L~v*!qIU0 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∈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 z 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 literal 0 HcmV?d00001 diff --git a/docs/mint.json b/docs/mint.json index 4a106a79c..65cc6a4a9 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -154,6 +154,7 @@ "documentation/platform/token", "documentation/platform/identities/universal-auth", "documentation/platform/identities/gcp-auth", + "documentation/platform/identities/azure-auth", "documentation/platform/identities/aws-auth", "documentation/platform/mfa", { diff --git a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityAzureAuthForm.tsx b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityAzureAuthForm.tsx index 1dbdfdfac..8a99c633b 100644 --- a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityAzureAuthForm.tsx +++ b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityAzureAuthForm.tsx @@ -187,7 +187,7 @@ export const IdentityAzureAuthForm = ({ errorText={error?.message} isRequired > - + )} /> @@ -200,7 +200,7 @@ export const IdentityAzureAuthForm = ({ isError={Boolean(error)} errorText={error?.message} > - + )} /> @@ -213,7 +213,7 @@ export const IdentityAzureAuthForm = ({ isError={Boolean(error)} errorText={error?.message} > - + )} /> From 04d961b83222560a7745ab6676a46571f72c1d88 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 16 May 2024 15:39:32 +0530 Subject: [PATCH 006/101] feat: added dal to remove expired token for queue and fixed token validation check missing num uses increment and maxTTL failed check --- .../identity-access-token-dal.ts | 45 +++++++++++- .../identity-access-token-service.ts | 70 ++++++++++++------- 2 files changed, 88 insertions(+), 27 deletions(-) diff --git a/backend/src/services/identity-access-token/identity-access-token-dal.ts b/backend/src/services/identity-access-token/identity-access-token-dal.ts index 42fb5bba5..448f2dd46 100644 --- a/backend/src/services/identity-access-token/identity-access-token-dal.ts +++ b/backend/src/services/identity-access-token/identity-access-token-dal.ts @@ -37,5 +37,48 @@ export const identityAccessTokenDALFactory = (db: TDbClient) => { } }; - return { ...identityAccessTokenOrm, findOne }; + const removeExpiredTokens = async (tx?: Knex) => { + try { + const docs = (tx || db)(TableName.IdentityAccessToken) + .where({ + isAccessTokenRevoked: true + }) + .orWhere((qb) => { + void qb + .where("accessTokenNumUsesLimit", ">", 0) + .andWhere( + "accessTokenNumUses", + ">", + db.ref("accessTokenNumUsesLimit").withSchema(TableName.IdentityAccessToken) + ); + }) + .orWhere((qb) => { + void qb.where("accessTokenTTL", ">", 0).andWhere((qb2) => { + void qb2 + .where((qb3) => { + void qb3 + .whereNotNull("accessTokenLastRenewedAt") + // accessTokenLastRenewedAt + convert_integer_to_seconds(accessTokenTTL) < present_date + .andWhereRaw( + `"${TableName.IdentityAccessToken}"."accessTokenLastRenewedAt" + make_interval(secs => "${TableName.IdentityAccessToken}"."accessTokenTTL") < NOW()` + ); + }) + .orWhere((qb3) => { + void qb3 + .whereNull("accessTokenLastRenewedAt") + // created + convert_integer_to_seconds(accessTokenTTL) < present_date + .andWhereRaw( + `"${TableName.IdentityAccessToken}"."createdAt" + make_interval(secs => "${TableName.IdentityAccessToken}"."accessTokenTTL") < NOW()` + ); + }); + }); + }) + .delete(); + return await docs; + } catch (error) { + throw new DatabaseError({ error, name: "IdentityAccesTokenPrune" }); + } + }; + + return { ...identityAccessTokenOrm, findOne, removeExpiredTokens }; }; diff --git a/backend/src/services/identity-access-token/identity-access-token-service.ts b/backend/src/services/identity-access-token/identity-access-token-service.ts index 4b53c8174..79d7d4708 100644 --- a/backend/src/services/identity-access-token/identity-access-token-service.ts +++ b/backend/src/services/identity-access-token/identity-access-token-service.ts @@ -21,17 +21,18 @@ export const identityAccessTokenServiceFactory = ({ identityAccessTokenDAL, identityOrgMembershipDAL }: TIdentityAccessTokenServiceFactoryDep) => { - const validateAccessTokenExp = (identityAccessToken: TIdentityAccessTokens) => { + const validateAccessTokenExp = async (identityAccessToken: TIdentityAccessTokens) => { const { + id: tokenId, accessTokenTTL, accessTokenNumUses, accessTokenNumUsesLimit, accessTokenLastRenewedAt, - accessTokenMaxTTL, createdAt: accessTokenCreatedAt } = identityAccessToken; if (accessTokenNumUsesLimit > 0 && accessTokenNumUses > 0 && accessTokenNumUses >= accessTokenNumUsesLimit) { + await identityAccessTokenDAL.deleteById(tokenId); throw new BadRequestError({ message: "Unable to renew because access token number of uses limit reached" }); @@ -46,41 +47,26 @@ export const identityAccessTokenServiceFactory = ({ const ttlInMilliseconds = Number(accessTokenTTL) * 1000; const expirationDate = new Date(accessTokenRenewed.getTime() + ttlInMilliseconds); - if (currentDate > expirationDate) + if (currentDate > expirationDate) { + await identityAccessTokenDAL.deleteById(tokenId); throw new UnauthorizedError({ message: "Failed to renew MI access token due to TTL expiration" }); + } } else { // access token has never been renewed const accessTokenCreated = new Date(accessTokenCreatedAt); const ttlInMilliseconds = Number(accessTokenTTL) * 1000; const expirationDate = new Date(accessTokenCreated.getTime() + ttlInMilliseconds); - if (currentDate > expirationDate) + if (currentDate > expirationDate) { + await identityAccessTokenDAL.deleteById(tokenId); throw new UnauthorizedError({ message: "Failed to renew MI access token due to TTL expiration" }); + } } } - - // max ttl checks - if (Number(accessTokenMaxTTL) > 0) { - const accessTokenCreated = new Date(accessTokenCreatedAt); - const ttlInMilliseconds = Number(accessTokenMaxTTL) * 1000; - const currentDate = new Date(); - const expirationDate = new Date(accessTokenCreated.getTime() + ttlInMilliseconds); - - if (currentDate > expirationDate) - throw new UnauthorizedError({ - message: "Failed to renew MI access token due to Max TTL expiration" - }); - - const extendToDate = new Date(currentDate.getTime() + Number(accessTokenTTL)); - if (extendToDate > expirationDate) - throw new UnauthorizedError({ - message: "Failed to renew MI access token past its Max TTL expiration" - }); - } }; const renewAccessToken = async ({ accessToken }: TRenewAccessTokenDTO) => { @@ -97,7 +83,32 @@ export const identityAccessTokenServiceFactory = ({ }); if (!identityAccessToken) throw new UnauthorizedError(); - validateAccessTokenExp(identityAccessToken); + await validateAccessTokenExp(identityAccessToken); + + const { accessTokenMaxTTL, createdAt: accessTokenCreatedAt, accessTokenTTL } = identityAccessToken; + + // max ttl checks - will it go above max ttl + if (Number(accessTokenMaxTTL) > 0) { + const accessTokenCreated = new Date(accessTokenCreatedAt); + const ttlInMilliseconds = Number(accessTokenMaxTTL) * 1000; + const currentDate = new Date(); + const expirationDate = new Date(accessTokenCreated.getTime() + ttlInMilliseconds); + + if (currentDate > expirationDate) { + await identityAccessTokenDAL.deleteById(identityAccessToken.id); + throw new UnauthorizedError({ + message: "Failed to renew MI access token due to Max TTL expiration" + }); + } + + const extendToDate = new Date(currentDate.getTime() + Number(accessTokenTTL * 1000)); + if (extendToDate > expirationDate) { + await identityAccessTokenDAL.deleteById(identityAccessToken.id); + throw new UnauthorizedError({ + message: "Failed to renew MI access token past its Max TTL expiration" + }); + } + } const updatedIdentityAccessToken = await identityAccessTokenDAL.updateById(identityAccessToken.id, { accessTokenLastRenewedAt: new Date() @@ -113,7 +124,7 @@ export const identityAccessTokenServiceFactory = ({ }); if (!identityAccessToken) throw new UnauthorizedError(); - if (ipAddress) { + if (ipAddress && identityAccessToken) { checkIPAgainstBlocklist({ ipAddress, trustedIps: identityAccessToken?.accessTokenTrustedIps as TIp[] @@ -128,7 +139,14 @@ export const identityAccessTokenServiceFactory = ({ throw new UnauthorizedError({ message: "Identity does not belong to any organization" }); } - validateAccessTokenExp(identityAccessToken); + await validateAccessTokenExp(identityAccessToken); + + await identityAccessTokenDAL.updateById(identityAccessToken.id, { + accessTokenLastUsedAt: new Date(), + $incr: { + accessTokenNumUses: 1 + } + }); return { ...identityAccessToken, orgId: identityOrgMembership.orgId }; }; From 08e7815ec13db296b53b49ad865a78ea39497e66 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 16 May 2024 15:40:20 +0530 Subject: [PATCH 007/101] feat: added increment and decrement ops in update knex orm --- backend/src/lib/knex/index.ts | 56 +++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/backend/src/lib/knex/index.ts b/backend/src/lib/knex/index.ts index d78020809..bf057cc73 100644 --- a/backend/src/lib/knex/index.ts +++ b/backend/src/lib/knex/index.ts @@ -104,24 +104,68 @@ export const ormify = (db: Kne throw new DatabaseError({ error, name: "Create" }); } }, - updateById: async (id: string, data: Tables[Tname]["update"], tx?: Knex) => { + updateById: async ( + id: string, + { + $incr, + $decr, + ...data + }: Tables[Tname]["update"] & { + $incr?: { [x in keyof Partial]: number }; + $decr?: { [x in keyof Partial]: number }; + }, + tx?: Knex + ) => { try { - const [res] = await (tx || db)(tableName) + const query = (tx || db)(tableName) .where({ id } as never) .update(data as never) .returning("*"); - return res; + if ($incr) { + Object.entries($incr).forEach(([incrementField, incrementValue]) => { + void query.increment(incrementField, incrementValue); + }); + } + if ($decr) { + Object.entries($decr).forEach(([incrementField, incrementValue]) => { + void query.increment(incrementField, incrementValue); + }); + } + const [docs] = await query; + return docs; } catch (error) { throw new DatabaseError({ error, name: "Update by id" }); } }, - update: async (filter: TFindFilter, data: Tables[Tname]["update"], tx?: Knex) => { + update: async ( + filter: TFindFilter, + { + $incr, + $decr, + ...data + }: Tables[Tname]["update"] & { + $incr?: { [x in keyof Partial]: number }; + $decr?: { [x in keyof Partial]: number }; + }, + tx?: Knex + ) => { try { - const res = await (tx || db)(tableName) + const query = (tx || db)(tableName) .where(buildFindFilter(filter)) .update(data as never) .returning("*"); - return res; + // increment and decrement operation in update + if ($incr) { + Object.entries($incr).forEach(([incrementField, incrementValue]) => { + void query.increment(incrementField, incrementValue); + }); + } + if ($decr) { + Object.entries($decr).forEach(([incrementField, incrementValue]) => { + void query.increment(incrementField, incrementValue); + }); + } + return await query; } catch (error) { throw new DatabaseError({ error, name: "Update" }); } From 3ed5dd61093833a6dcdd314a90402f6ec292c918 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 16 May 2024 15:41:03 +0530 Subject: [PATCH 008/101] feat: removed audit log queue and switched to resource clean up queue --- .../ee/services/audit-log/audit-log-queue.ts | 31 +--------- backend/src/queue/queue-service.ts | 12 +++- backend/src/server/routes/index.ts | 8 ++- .../resource-cleanup-queue.ts | 58 +++++++++++++++++++ 4 files changed, 77 insertions(+), 32 deletions(-) create mode 100644 backend/src/services/resource-cleanup/resource-cleanup-queue.ts diff --git a/backend/src/ee/services/audit-log/audit-log-queue.ts b/backend/src/ee/services/audit-log/audit-log-queue.ts index 6c563b573..f93b391a5 100644 --- a/backend/src/ee/services/audit-log/audit-log-queue.ts +++ b/backend/src/ee/services/audit-log/audit-log-queue.ts @@ -3,7 +3,6 @@ import { RawAxiosRequestHeaders } from "axios"; import { SecretKeyEncoding } from "@app/db/schemas"; import { request } from "@app/lib/config/request"; import { infisicalSymmetricDecrypt } from "@app/lib/crypto/encryption"; -import { logger } from "@app/lib/logger"; import { QueueJobs, QueueName, TQueueServiceFactory } from "@app/queue"; import { TProjectDALFactory } from "@app/services/project/project-dal"; @@ -113,35 +112,7 @@ export const auditLogQueueServiceFactory = ({ ); }); - queueService.start(QueueName.AuditLogPrune, async () => { - logger.info(`${QueueName.AuditLogPrune}: queue task started`); - await auditLogDAL.pruneAuditLog(); - logger.info(`${QueueName.AuditLogPrune}: queue task completed`); - }); - - // we do a repeat cron job in utc timezone at 12 Midnight each day - const startAuditLogPruneJob = async () => { - // clear previous job - await queueService.stopRepeatableJob( - QueueName.AuditLogPrune, - QueueJobs.AuditLogPrune, - { pattern: "0 0 * * *", utc: true }, - QueueName.AuditLogPrune // just a job id - ); - - await queueService.queue(QueueName.AuditLogPrune, QueueJobs.AuditLogPrune, undefined, { - delay: 5000, - jobId: QueueName.AuditLogPrune, - repeat: { pattern: "0 0 * * *", utc: true } - }); - }; - - queueService.listen(QueueName.AuditLogPrune, "failed", (err) => { - logger.error(err?.failedReason, `${QueueName.AuditLogPrune}: log pruning failed`); - }); - return { - pushToLog, - startAuditLogPruneJob + pushToLog }; }; diff --git a/backend/src/queue/queue-service.ts b/backend/src/queue/queue-service.ts index bc8ac88ff..9d85b6015 100644 --- a/backend/src/queue/queue-service.ts +++ b/backend/src/queue/queue-service.ts @@ -12,7 +12,9 @@ export enum QueueName { SecretRotation = "secret-rotation", SecretReminder = "secret-reminder", AuditLog = "audit-log", + // TODO(akhilmhdh): This will get removed later. For now this is kept to stop the repeatable queue AuditLogPrune = "audit-log-prune", + DailyResourceCleanUp = "daily-resource-cleanup", TelemetryInstanceStats = "telemtry-self-hosted-stats", IntegrationSync = "sync-integrations", SecretWebhook = "secret-webhook", @@ -26,7 +28,9 @@ export enum QueueJobs { SecretReminder = "secret-reminder-job", SecretRotation = "secret-rotation-job", AuditLog = "audit-log-job", + // TODO(akhilmhdh): This will get removed later. For now this is kept to stop the repeatable queue AuditLogPrune = "audit-log-prune-job", + DailyResourceCleanUp = "daily-resource-cleanup-job", SecWebhook = "secret-webhook-trigger", TelemetryInstanceStats = "telemetry-self-hosted-stats", IntegrationSync = "secret-integration-pull", @@ -55,6 +59,10 @@ export type TQueueJobTypes = { name: QueueJobs.AuditLog; payload: TCreateAuditLogDTO; }; + [QueueName.DailyResourceCleanUp]: { + name: QueueJobs.DailyResourceCleanUp; + payload: undefined; + }; [QueueName.AuditLogPrune]: { name: QueueJobs.AuditLogPrune; payload: undefined; @@ -172,7 +180,9 @@ export const queueServiceFactory = (redisUrl: string) => { jobId?: string ) => { const q = queueContainer[name]; - return q.removeRepeatable(job, repeatOpt, jobId); + if (q) { + return q.removeRepeatable(job, repeatOpt, jobId); + } }; const stopRepeatableJobByJobId = async (name: T, jobId: string) => { diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts index 3a050bcad..8ef6ee3be 100644 --- a/backend/src/server/routes/index.ts +++ b/backend/src/server/routes/index.ts @@ -113,6 +113,7 @@ import { projectMembershipServiceFactory } from "@app/services/project-membershi import { projectUserMembershipRoleDALFactory } from "@app/services/project-membership/project-user-membership-role-dal"; import { projectRoleDALFactory } from "@app/services/project-role/project-role-dal"; import { projectRoleServiceFactory } from "@app/services/project-role/project-role-service"; +import { dailyResourceCleanUpQueueServiceFactory } from "@app/services/resource-cleanup/resource-cleanup-queue"; import { secretDALFactory } from "@app/services/secret/secret-dal"; import { secretQueueFactory } from "@app/services/secret/secret-queue"; import { secretServiceFactory } from "@app/services/secret/secret-service"; @@ -757,14 +758,19 @@ export const registerRoutes = async ( folderDAL, licenseService }); + const dailyResourceCleanUp = dailyResourceCleanUpQueueServiceFactory({ + auditLogDAL, + queueService, + identityAccessTokenDAL + }); await superAdminService.initServerCfg(); // // setup the communication with license key server await licenseService.init(); - await auditLogQueue.startAuditLogPruneJob(); await telemetryQueue.startTelemetryCheck(); + await dailyResourceCleanUp.startCleanUp(); // inject all services server.decorate("services", { diff --git a/backend/src/services/resource-cleanup/resource-cleanup-queue.ts b/backend/src/services/resource-cleanup/resource-cleanup-queue.ts new file mode 100644 index 000000000..3c8bcb1f7 --- /dev/null +++ b/backend/src/services/resource-cleanup/resource-cleanup-queue.ts @@ -0,0 +1,58 @@ +import { TAuditLogDALFactory } from "@app/ee/services/audit-log/audit-log-dal"; +import { logger } from "@app/lib/logger"; +import { QueueJobs, QueueName, TQueueServiceFactory } from "@app/queue"; + +import { TIdentityAccessTokenDALFactory } from "../identity-access-token/identity-access-token-dal"; + +type TDailyResourceCleanUpQueueServiceFactoryDep = { + auditLogDAL: Pick; + identityAccessTokenDAL: Pick; + queueService: TQueueServiceFactory; +}; + +export type TDailyResourceCleanUpQueueServiceFactory = ReturnType; + +export const dailyResourceCleanUpQueueServiceFactory = ({ + auditLogDAL, + queueService, + identityAccessTokenDAL +}: TDailyResourceCleanUpQueueServiceFactoryDep) => { + queueService.start(QueueName.DailyResourceCleanUp, async () => { + logger.info(`${QueueName.DailyResourceCleanUp}: queue task started`); + await auditLogDAL.pruneAuditLog(); + await identityAccessTokenDAL.removeExpiredTokens(); + logger.info(`${QueueName.DailyResourceCleanUp}: queue task completed`); + }); + + // we do a repeat cron job in utc timezone at 12 Midnight each day + const startCleanUp = async () => { + // TODO(akhilmhdh): remove later + await queueService.stopRepeatableJob( + QueueName.AuditLogPrune, + QueueJobs.AuditLogPrune, + { pattern: "0 0 * * *", utc: true }, + QueueName.AuditLogPrune // just a job id + ); + // clear previous job + await queueService.stopRepeatableJob( + QueueName.DailyResourceCleanUp, + QueueJobs.DailyResourceCleanUp, + { pattern: "0 0 * * *", utc: true }, + QueueName.DailyResourceCleanUp // just a job id + ); + + await queueService.queue(QueueName.DailyResourceCleanUp, QueueJobs.DailyResourceCleanUp, undefined, { + delay: 5000, + jobId: QueueName.DailyResourceCleanUp, + repeat: { pattern: "0 0 * * *", utc: true } + }); + }; + + queueService.listen(QueueName.DailyResourceCleanUp, "failed", (_, err) => { + logger.error(err, `${QueueName.DailyResourceCleanUp}: resource cleanup failed`); + }); + + return { + startCleanUp + }; +}; From 76c9d642a9b4d1c7ddcde1fc2afa3753914ffb85 Mon Sep 17 00:00:00 2001 From: = Date: Thu, 16 May 2024 15:45:51 +0530 Subject: [PATCH 009/101] fix: resolved identity check failing due to comma seperated header in ip --- backend/src/server/plugins/ip.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/backend/src/server/plugins/ip.ts b/backend/src/server/plugins/ip.ts index b3c8171af..7b5838d57 100644 --- a/backend/src/server/plugins/ip.ts +++ b/backend/src/server/plugins/ip.ts @@ -6,6 +6,7 @@ const headersOrder = [ "cf-connecting-ip", // Cloudflare "Cf-Pseudo-IPv4", // Cloudflare "x-client-ip", // Most common + "x-envoy-external-address", // for envoy "x-forwarded-for", // Mostly used by proxies "fastly-client-ip", "true-client-ip", // Akamai and Cloudflare @@ -23,7 +24,21 @@ export const fastifyIp = fp(async (fastify) => { const forwardedIpHeader = headersOrder.find((header) => Boolean(req.headers[header])); const forwardedIp = forwardedIpHeader ? req.headers[forwardedIpHeader] : undefined; if (forwardedIp) { - req.realIp = Array.isArray(forwardedIp) ? forwardedIp[0] : forwardedIp; + if (Array.isArray(forwardedIp)) { + // eslint-disable-next-line + req.realIp = forwardedIp[0]; + return; + } + + if (forwardedIp.includes(",")) { + // the ip header when placed with load balancers that proxy request + // will attach the internal ips to header by appending with comma + // https://github.com/go-chi/chi/blob/master/middleware/realip.go + const clientIPFromProxy = forwardedIp.slice(0, forwardedIp.indexOf(",")).trim(); + req.realIp = clientIPFromProxy; + return; + } + req.realIp = forwardedIp; } else { req.realIp = req.ip; } From b350eef2b94e809d5ec589ec404a15977d37329d Mon Sep 17 00:00:00 2001 From: Tuan Dang Date: Fri, 17 May 2024 15:43:12 -0700 Subject: [PATCH 010/101] Add access token trusted ip support for azure auth --- .../identity-access-token-dal.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/backend/src/services/identity-access-token/identity-access-token-dal.ts b/backend/src/services/identity-access-token/identity-access-token-dal.ts index de8eb7ebc..05e268ffa 100644 --- a/backend/src/services/identity-access-token/identity-access-token-dal.ts +++ b/backend/src/services/identity-access-token/identity-access-token-dal.ts @@ -39,11 +39,18 @@ export const identityAccessTokenDALFactory = (db: TDbClient) => { `${TableName.IdentityAwsAuth}.identityId` ); }) + .leftJoin(TableName.IdentityAzureAuth, (qb) => { + qb.on(`${TableName.Identity}.authMethod`, db.raw("?", [IdentityAuthMethod.AZURE_AUTH])).andOn( + `${TableName.Identity}.id`, + `${TableName.IdentityAzureAuth}.identityId` + ); + }) .select(selectAllTableCols(TableName.IdentityAccessToken)) .select( db.ref("accessTokenTrustedIps").withSchema(TableName.IdentityUniversalAuth).as("accessTokenTrustedIpsUa"), db.ref("accessTokenTrustedIps").withSchema(TableName.IdentityGcpAuth).as("accessTokenTrustedIpsGcp"), db.ref("accessTokenTrustedIps").withSchema(TableName.IdentityAwsAuth).as("accessTokenTrustedIpsAws"), + db.ref("accessTokenTrustedIps").withSchema(TableName.IdentityAwsAuth).as("accessTokenTrustedIpsAzure"), db.ref("name").withSchema(TableName.Identity) ) .first(); @@ -53,7 +60,10 @@ export const identityAccessTokenDALFactory = (db: TDbClient) => { return { ...doc, accessTokenTrustedIps: - doc.accessTokenTrustedIpsUa || doc.accessTokenTrustedIpsGcp || doc.accessTokenTrustedIpsAws + doc.accessTokenTrustedIpsUa || + doc.accessTokenTrustedIpsGcp || + doc.accessTokenTrustedIpsAws || + doc.accessTokenTrustedIpsAzure }; } catch (error) { throw new DatabaseError({ error, name: "IdAccessTokenFindOne" }); From 91eda2419a65b49489cc36dc7948ff2e9875032a Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Mon, 20 May 2024 00:32:10 +0200 Subject: [PATCH 011/101] Update machine-identities.mdx --- docs/documentation/platform/identities/machine-identities.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/documentation/platform/identities/machine-identities.mdx b/docs/documentation/platform/identities/machine-identities.mdx index 41f464c4c..4cb8dfd8c 100644 --- a/docs/documentation/platform/identities/machine-identities.mdx +++ b/docs/documentation/platform/identities/machine-identities.mdx @@ -9,7 +9,7 @@ An Infisical machine identity is an entity that represents a workload or applica Each identity must authenticate with the Infisical API using a supported authentication method like [Universal Auth](/documentation/platform/identities/universal-auth), [AWS Auth](/documentation/platform/identities/aws-auth), [Azure Auth](/documentation/platform/identities/azure-auth), or [GCP Auth](/documentation/platform/identities/gcp-auth) to get back a short-lived access token to be used in subsequent requests. -![organization identities](/images/platform/organization/organization-machine-identities.png) +![Organization Identities](/images/platform/organization/organization-machine-identities.png) Key Features: From dea67e3cb0128499c3f85389c14efad51a70e20c Mon Sep 17 00:00:00 2001 From: Tuan Dang Date: Sun, 19 May 2024 22:24:26 -0700 Subject: [PATCH 012/101] Update azure auth based on review --- .../services/identity-azure-auth/identity-azure-auth-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts b/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts index 044ca28bc..fa439bdc0 100644 --- a/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts +++ b/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts @@ -24,7 +24,7 @@ import { } from "./identity-azure-auth-types"; type TIdentityAzureAuthServiceFactoryDep = { - identityAzureAuthDAL: TIdentityAzureAuthDALFactory; // TODO: Pick + identityAzureAuthDAL: Pick; identityOrgMembershipDAL: Pick; identityAccessTokenDAL: Pick; identityDAL: Pick; From a724ab101c91126be3c578b8554f010f085a678a Mon Sep 17 00:00:00 2001 From: Tuan Dang Date: Sun, 19 May 2024 22:24:26 -0700 Subject: [PATCH 013/101] Fix identities docs markings --- .../identity-azure-auth/identity-azure-auth-service.ts | 2 +- .../platform/identities/machine-identities.mdx | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts b/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts index 044ca28bc..fa439bdc0 100644 --- a/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts +++ b/backend/src/services/identity-azure-auth/identity-azure-auth-service.ts @@ -24,7 +24,7 @@ import { } from "./identity-azure-auth-types"; type TIdentityAzureAuthServiceFactoryDep = { - identityAzureAuthDAL: TIdentityAzureAuthDALFactory; // TODO: Pick + identityAzureAuthDAL: Pick; identityOrgMembershipDAL: Pick; identityAccessTokenDAL: Pick; identityDAL: Pick; diff --git a/docs/documentation/platform/identities/machine-identities.mdx b/docs/documentation/platform/identities/machine-identities.mdx index f9b5eb259..9cc6c4c3d 100644 --- a/docs/documentation/platform/identities/machine-identities.mdx +++ b/docs/documentation/platform/identities/machine-identities.mdx @@ -7,12 +7,7 @@ description: "Learn how to use Machine Identities to programmatically interact w An Infisical machine identity is an entity that represents a workload or application that require access to various resources in Infisical. This is conceptually similar to an IAM user in AWS or service account in Google Cloud Platform (GCP). -<<<<<<< HEAD -Each identity must authenticate with the Infisical API using a supported authentication method like [Universal Auth](/documentation/platform/identities/universal-auth), [AWS Auth](/documentation/platform/identities/aws-auth), [Azure Auth](/documentation/platform/identities/azure-auth), or [GCP Auth](/documentation/platform/identities/gcp-auth) to get back a short-lived access token to be used in subsequent requests. -======= -Each identity must authenticate with the Infisical API using a supported authentication method like [Universal Auth](/documentation/platform/identities/universal-auth), [Kubernetes Auth](/documentation/platform/identities/kubernetes-auth), [AWS Auth](/documentation/platform/identities/aws-auth), or [GCP Auth](/documentation/platform/identities/gcp-auth) to get back a short-lived access token to be used in subsequent requests. - -> > > > > > > origin +Each identity must authenticate with the Infisical API using a supported authentication method like [Universal Auth](/documentation/platform/identities/universal-auth), [Kubernetes Auth](/documentation/platform/identities/kubernetes-auth), [AWS Auth](/documentation/platform/identities/aws-auth), [Azure Auth](/documentation/platform/identities/azure-auth), or [GCP Auth](/documentation/platform/identities/gcp-auth) to get back a short-lived access token to be used in subsequent requests. ![Organization Identities](/images/platform/organization/organization-machine-identities.png) From 4e06fa3a0cab72471a4b1329a28e879c1f9b15f2 Mon Sep 17 00:00:00 2001 From: Tuan Dang Date: Mon, 20 May 2024 21:15:42 -0700 Subject: [PATCH 014/101] Move azure auth migration file to front --- ...entity-azure-auth.ts => 20240521041514_identity-azure-auth.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename backend/src/db/migrations/{20240515211432_identity-azure-auth.ts => 20240521041514_identity-azure-auth.ts} (100%) diff --git a/backend/src/db/migrations/20240515211432_identity-azure-auth.ts b/backend/src/db/migrations/20240521041514_identity-azure-auth.ts similarity index 100% rename from backend/src/db/migrations/20240515211432_identity-azure-auth.ts rename to backend/src/db/migrations/20240521041514_identity-azure-auth.ts From 75bb651b1d61d0b4fa05c376646f4c689681c626 Mon Sep 17 00:00:00 2001 From: Akhil Mohan Date: Wed, 22 May 2024 00:19:04 +0530 Subject: [PATCH 015/101] docs: updated the cause of option1 and option2 in role update commit --- backend/src/lib/api-docs/constants.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/lib/api-docs/constants.ts b/backend/src/lib/api-docs/constants.ts index 01f0e5142..d84f68d7f 100644 --- a/backend/src/lib/api-docs/constants.ts +++ b/backend/src/lib/api-docs/constants.ts @@ -225,7 +225,7 @@ export const PROJECT_IDENTITIES = { roles: { description: "A list of role slugs to assign to the identity project membership.", role: "The role slug to assign to the newly created identity project membership.", - isTemporary: "Whether the assigned role is temporary.", + isTemporary: "Whether the assigned role is temporary. If isTemporary is set true, must provide temporaryMode, temporaryRange and temporaryAccessStartTime.", temporaryMode: "Type of temporary expiry.", temporaryRange: "Expiry time for temporary access. In relative mode it could be 1s,2m,3h", temporaryAccessStartTime: "Time to which the temporary access starts" @@ -242,7 +242,7 @@ export const PROJECT_IDENTITIES = { roles: { description: "A list of role slugs to assign to the newly created identity project membership.", role: "The role slug to assign to the newly created identity project membership.", - isTemporary: "Whether the assigned role is temporary.", + isTemporary: "Whether the assigned role is temporary. If isTemporary is set true, must provide temporaryMode, temporaryRange and temporaryAccessStartTime.", temporaryMode: "Type of temporary expiry.", temporaryRange: "Expiry time for temporary access. In relative mode it could be 1s,2m,3h", temporaryAccessStartTime: "Time to which the temporary access starts" From 440c77965cdea920d9a43b51b38bdec7481dcd23 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Tue, 21 May 2024 22:35:13 -0400 Subject: [PATCH 016/101] add logs to track permission inject --- backend/src/server/plugins/auth/inject-permission.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/src/server/plugins/auth/inject-permission.ts b/backend/src/server/plugins/auth/inject-permission.ts index 084f18198..e3dfc6151 100644 --- a/backend/src/server/plugins/auth/inject-permission.ts +++ b/backend/src/server/plugins/auth/inject-permission.ts @@ -1,5 +1,6 @@ import fp from "fastify-plugin"; +import { logger } from "@app/lib/logger"; import { ActorType } from "@app/services/auth/auth-type"; // inject permission type needed based on auth extracted @@ -37,5 +38,7 @@ export const injectPermission = fp(async (server) => { authMethod: null }; } + + logger.info(`injectPermission: Injecting permissions for [permissionsForIdentity=${req?.permission?.id}]`); }); }); From 41d72d5dc6936962b7575f251f49575cd12406a0 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Wed, 22 May 2024 21:55:56 +0800 Subject: [PATCH 017/101] feat: added user-locking on mfa failure --- ...0522072006_add-user-account-mfa-locking.ts | 43 +++++++++++++++ backend/src/db/schemas/users.ts | 10 +++- backend/src/server/routes/v1/user-router.ts | 30 ++++++++++- .../services/auth-token/auth-token-service.ts | 8 ++- .../services/auth-token/auth-token-types.ts | 3 +- backend/src/services/auth/auth-fns.ts | 21 ++++++++ .../src/services/auth/auth-login-service.ts | 51 +++++++++++++++--- backend/src/services/smtp/smtp-service.ts | 1 + .../smtp/templates/unlockAccount.handlebars | 16 ++++++ backend/src/services/user/user-fns.ts | 53 +++++++++++++++++++ backend/src/services/user/user-service.ts | 16 +++++- 11 files changed, 240 insertions(+), 12 deletions(-) create mode 100644 backend/src/db/migrations/20240522072006_add-user-account-mfa-locking.ts create mode 100644 backend/src/services/smtp/templates/unlockAccount.handlebars diff --git a/backend/src/db/migrations/20240522072006_add-user-account-mfa-locking.ts b/backend/src/db/migrations/20240522072006_add-user-account-mfa-locking.ts new file mode 100644 index 000000000..2b2ecd783 --- /dev/null +++ b/backend/src/db/migrations/20240522072006_add-user-account-mfa-locking.ts @@ -0,0 +1,43 @@ +import { Knex } from "knex"; + +import { TableName } from "../schemas"; + +export async function up(knex: Knex): Promise { + const hasConsecutiveFailedMfaAttempts = await knex.schema.hasColumn(TableName.Users, "consecutiveFailedMfaAttempts"); + const hasIsLocked = await knex.schema.hasColumn(TableName.Users, "isLocked"); + const hasTemporaryLockDateEnd = await knex.schema.hasColumn(TableName.Users, "temporaryLockDateEnd"); + + await knex.schema.alterTable(TableName.Users, (t) => { + if (!hasConsecutiveFailedMfaAttempts) { + t.integer("consecutiveFailedMfaAttempts").defaultTo(0); + } + + if (!hasIsLocked) { + t.boolean("isLocked").defaultTo(false); + } + + if (!hasTemporaryLockDateEnd) { + t.dateTime("temporaryLockDateEnd").nullable(); + } + }); +} + +export async function down(knex: Knex): Promise { + const hasConsecutiveFailedMfaAttempts = await knex.schema.hasColumn(TableName.Users, "consecutiveFailedMfaAttempts"); + const hasIsLocked = await knex.schema.hasColumn(TableName.Users, "isLocked"); + const hasTemporaryLockDateEnd = await knex.schema.hasColumn(TableName.Users, "temporaryLockDateEnd"); + + await knex.schema.alterTable(TableName.Users, (t) => { + if (hasConsecutiveFailedMfaAttempts) { + t.dropColumn("consecutiveFailedMfaAttempts"); + } + + if (hasIsLocked) { + t.dropColumn("isLocked"); + } + + if (hasTemporaryLockDateEnd) { + t.dropColumn("temporaryLockDateEnd"); + } + }); +} diff --git a/backend/src/db/schemas/users.ts b/backend/src/db/schemas/users.ts index d5a4d5b49..935351d33 100644 --- a/backend/src/db/schemas/users.ts +++ b/backend/src/db/schemas/users.ts @@ -22,9 +22,15 @@ export const UsersSchema = z.object({ updatedAt: z.date(), isGhost: z.boolean().default(false), username: z.string(), - isEmailVerified: z.boolean().default(false).nullable().optional() + isEmailVerified: z.boolean().default(false).nullable().optional(), + consecutiveFailedMfaAttempts: z.number(), + isLocked: z.boolean(), + temporaryLockDateEnd: z.date().nullable().optional() }); export type TUsers = z.infer; -export type TUsersInsert = Omit, TImmutableDBKeys>; +export type TUsersInsert = Omit< + z.input, + TImmutableDBKeys | "isLocked" | "consecutiveFailedMfaAttempts" +>; export type TUsersUpdate = Partial, TImmutableDBKeys>>; diff --git a/backend/src/server/routes/v1/user-router.ts b/backend/src/server/routes/v1/user-router.ts index bdede8a3a..aa3962c5a 100644 --- a/backend/src/server/routes/v1/user-router.ts +++ b/backend/src/server/routes/v1/user-router.ts @@ -1,11 +1,15 @@ import { z } from "zod"; import { UserEncryptionKeysSchema, UsersSchema } from "@app/db/schemas"; -import { readLimit } from "@app/server/config/rateLimiter"; +import { getConfig } from "@app/lib/config/env"; +import { logger } from "@app/lib/logger"; +import { authRateLimit, readLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; export const registerUserRouter = async (server: FastifyZodProvider) => { + const appCfg = getConfig(); + server.route({ method: "GET", url: "/", @@ -25,4 +29,28 @@ export const registerUserRouter = async (server: FastifyZodProvider) => { return { user }; } }); + + server.route({ + method: "GET", + url: "/:userId/unlock-verify", + config: { + rateLimit: authRateLimit + }, + schema: { + querystring: z.object({ + token: z.string().trim() + }), + params: z.object({ + userId: z.string() + }) + }, + handler: async (req, res) => { + try { + await server.services.user.unlockUser(req.params.userId, req.query.token); + } catch (err) { + logger.error(`User unlock failed for ${req.params.userId}`); + } + return res.redirect(`${appCfg.SITE_URL}/login`); + } + }); }; diff --git a/backend/src/services/auth-token/auth-token-service.ts b/backend/src/services/auth-token/auth-token-service.ts index 5d68a4e94..b1f8aa2f6 100644 --- a/backend/src/services/auth-token/auth-token-service.ts +++ b/backend/src/services/auth-token/auth-token-service.ts @@ -13,8 +13,9 @@ import { TCreateTokenForUserDTO, TIssueAuthTokenDTO, TokenType, TValidateTokenFo type TAuthTokenServiceFactoryDep = { tokenDAL: TTokenDALFactory; - userDAL: Pick; + userDAL: Pick; }; + export type TAuthTokenServiceFactory = ReturnType; export const getTokenConfig = (tokenType: TokenType) => { @@ -53,6 +54,11 @@ export const getTokenConfig = (tokenType: TokenType) => { const expiresAt = new Date(new Date().getTime() + 86400000); return { token, expiresAt }; } + case TokenType.TOKEN_USER_UNLOCK: { + const token = crypto.randomBytes(16).toString("hex"); + const expiresAt = new Date(new Date().getTime() + 259200000); + return { token, expiresAt }; + } default: { const token = crypto.randomBytes(16).toString("hex"); const expiresAt = new Date(); diff --git a/backend/src/services/auth-token/auth-token-types.ts b/backend/src/services/auth-token/auth-token-types.ts index 630e36310..8917bd672 100644 --- a/backend/src/services/auth-token/auth-token-types.ts +++ b/backend/src/services/auth-token/auth-token-types.ts @@ -3,7 +3,8 @@ export enum TokenType { TOKEN_EMAIL_VERIFICATION = "emailVerification", // unverified -> verified TOKEN_EMAIL_MFA = "emailMfa", TOKEN_EMAIL_ORG_INVITATION = "organizationInvitation", - TOKEN_EMAIL_PASSWORD_RESET = "passwordReset" + TOKEN_EMAIL_PASSWORD_RESET = "passwordReset", + TOKEN_USER_UNLOCK = "userUnlock" } export type TCreateTokenForUserDTO = { diff --git a/backend/src/services/auth/auth-fns.ts b/backend/src/services/auth/auth-fns.ts index 80fb0b325..4911cc258 100644 --- a/backend/src/services/auth/auth-fns.ts +++ b/backend/src/services/auth/auth-fns.ts @@ -44,3 +44,24 @@ export const validateSignUpAuthorization = (token: string, userId: string, valid if (decodedToken.authTokenType !== AuthTokenType.SIGNUP_TOKEN) throw new UnauthorizedError(); if (decodedToken.userId !== userId) throw new UnauthorizedError(); }; + +export const enforceUserLockStatus = (isLocked: boolean, temporaryLockDateEnd?: Date | null) => { + if (isLocked) { + throw new UnauthorizedError({ + name: "User Locked", + message: + "User is locked due to multiple failed login attempts. An email has been sent to you in order to unlock your account." + }); + } + + if (temporaryLockDateEnd) { + const timeDiff = new Date().getTime() - temporaryLockDateEnd.getTime(); + if (timeDiff < 0) + throw new UnauthorizedError({ + name: "User Locked", + message: `User is locked due to multiple failed login attempts. Try logging in again after ${Math.round( + (-1 * timeDiff) / 1000 + )} seconds.` + }); + } +}; diff --git a/backend/src/services/auth/auth-login-service.ts b/backend/src/services/auth/auth-login-service.ts index 4d2a302c6..96c32c0df 100644 --- a/backend/src/services/auth/auth-login-service.ts +++ b/backend/src/services/auth/auth-login-service.ts @@ -13,7 +13,8 @@ import { TokenType } from "../auth-token/auth-token-types"; import { TOrgDALFactory } from "../org/org-dal"; import { SmtpTemplates, TSmtpService } from "../smtp/smtp-service"; import { TUserDALFactory } from "../user/user-dal"; -import { validateProviderAuthToken } from "./auth-fns"; +import { processFailedMfaAttempt } from "../user/user-fns"; +import { enforceUserLockStatus, validateProviderAuthToken } from "./auth-fns"; import { TLoginClientProofDTO, TLoginGenServerPublicKeyDTO, @@ -212,6 +213,9 @@ export const authLoginServiceFactory = ({ }); // send multi factor auth token if they it enabled if (userEnc.isMfaEnabled && userEnc.email) { + const user = await userDAL.findById(userEnc.userId); + enforceUserLockStatus(user.isLocked, user.temporaryLockDateEnd); + const mfaToken = jwt.sign( { authMethod, @@ -300,6 +304,7 @@ export const authLoginServiceFactory = ({ const resendMfaToken = async (userId: string) => { const user = await userDAL.findById(userId); if (!user || !user.email) return; + enforceUserLockStatus(user.isLocked, user.temporaryLockDateEnd); await sendUserMfaCode({ userId: user.id, email: user.email @@ -311,17 +316,51 @@ export const authLoginServiceFactory = ({ * Third step of login in which user completes with mfa * */ const verifyMfaToken = async ({ userId, mfaToken, mfaJwtToken, ip, userAgent, orgId }: TVerifyMfaTokenDTO) => { - await tokenService.validateTokenForUser({ - type: TokenType.TOKEN_EMAIL_MFA, - userId, - code: mfaToken - }); + const appCfg = getConfig(); + const user = await userDAL.findById(userId); + enforceUserLockStatus(user.isLocked, user.temporaryLockDateEnd); + + try { + await tokenService.validateTokenForUser({ + type: TokenType.TOKEN_EMAIL_MFA, + userId, + code: mfaToken + }); + } catch (err) { + const updatedUser = await processFailedMfaAttempt(userId, userDAL); + if (updatedUser.isLocked) { + if (updatedUser.email) { + const unlockToken = await tokenService.createTokenForUser({ + type: TokenType.TOKEN_USER_UNLOCK, + userId: updatedUser.id + }); + + await smtpService.sendMail({ + template: SmtpTemplates.UnlockAccount, + subjectLine: "Unlock your Infisical account", + recipients: [updatedUser.email], + substitutions: { + token: unlockToken, + callback_url: `${appCfg.SITE_URL}/api/v1/user/${updatedUser.id}/unlock-verify` + } + }); + } + } + + throw err; + } const decodedToken = jwt.verify(mfaJwtToken, getConfig().AUTH_SECRET) as AuthModeMfaJwtTokenPayload; const userEnc = await userDAL.findUserEncKeyByUserId(userId); if (!userEnc) throw new Error("Failed to authenticate user"); + // reset lock states + await userDAL.updateById(userId, { + consecutiveFailedMfaAttempts: 0, + temporaryLockDateEnd: null + }); + const token = await generateUserTokens({ user: { ...userEnc, diff --git a/backend/src/services/smtp/smtp-service.ts b/backend/src/services/smtp/smtp-service.ts index 81680537d..7d6b98b31 100644 --- a/backend/src/services/smtp/smtp-service.ts +++ b/backend/src/services/smtp/smtp-service.ts @@ -21,6 +21,7 @@ export enum SmtpTemplates { EmailVerification = "emailVerification.handlebars", SecretReminder = "secretReminder.handlebars", EmailMfa = "emailMfa.handlebars", + UnlockAccount = "unlockAccount.handlebars", AccessApprovalRequest = "accessApprovalRequest.handlebars", HistoricalSecretList = "historicalSecretLeakIncident.handlebars", NewDeviceJoin = "newDevice.handlebars", diff --git a/backend/src/services/smtp/templates/unlockAccount.handlebars b/backend/src/services/smtp/templates/unlockAccount.handlebars new file mode 100644 index 000000000..cb1859e51 --- /dev/null +++ b/backend/src/services/smtp/templates/unlockAccount.handlebars @@ -0,0 +1,16 @@ + + + + + + Your Infisical account has been locked + + + +

Unlock your Infisical account

+

Your account has been temporarily locked due to multiple failed login attempts. + Unlock your account now +

If these attempts were not made by you, reset your password immediately.

+ + + \ No newline at end of file diff --git a/backend/src/services/user/user-fns.ts b/backend/src/services/user/user-fns.ts index 639320e24..2750bb87e 100644 --- a/backend/src/services/user/user-fns.ts +++ b/backend/src/services/user/user-fns.ts @@ -1,5 +1,7 @@ import slugify from "@sindresorhus/slugify"; +import { TableName } from "@app/db/schemas"; +import { DatabaseError } from "@app/lib/errors"; import { alphaNumericNanoId } from "@app/lib/nanoid"; import { TUserDALFactory } from "@app/services/user/user-dal"; @@ -19,3 +21,54 @@ export const normalizeUsername = async (username: string, userDAL: Pick) => { + try { + const updatedUser = await userDAL.transaction(async (tx) => { + const PROGRESSIVE_DELAY_INTERVAL = 3; + const [user] = await tx(TableName.Users) + .where("id", userId) + .increment("consecutiveFailedMfaAttempts", 1) + .returning("*"); + + if (!user) { + throw new Error("User not found"); + } + + const progressiveDelaysInMins = [5, 30, 60]; + + // lock user when failed attempt exceeds threshold + if (user.consecutiveFailedMfaAttempts > PROGRESSIVE_DELAY_INTERVAL * progressiveDelaysInMins.length) { + return ( + await tx(TableName.Users) + .where("id", userId) + .update({ + isLocked: true, + temporaryLockDateEnd: null + }) + .returning("*") + )[0]; + } + + // delay user only when failed MFA attempts is a multiple of configured delay interval + if (user.consecutiveFailedMfaAttempts % PROGRESSIVE_DELAY_INTERVAL === 0) { + const delayIndex = user.consecutiveFailedMfaAttempts / PROGRESSIVE_DELAY_INTERVAL - 1; + + return ( + await tx(TableName.Users) + .where("id", userId) + .update({ + temporaryLockDateEnd: new Date(new Date().getTime() + progressiveDelaysInMins[delayIndex] * 60 * 1000) + }) + .returning("*") + )[0]; + } + + return user; + }); + + return updatedUser; + } catch (error) { + throw new DatabaseError({ error, name: "Process failed MFA Attempt" }); + } +}; diff --git a/backend/src/services/user/user-service.ts b/backend/src/services/user/user-service.ts index 089f3b8c6..a82259db6 100644 --- a/backend/src/services/user/user-service.ts +++ b/backend/src/services/user/user-service.ts @@ -207,6 +207,19 @@ export const userServiceFactory = ({ return userAction; }; + const unlockUser = async (userId: string, token: string) => { + await tokenService.validateTokenForUser({ + userId, + code: token, + type: TokenType.TOKEN_USER_UNLOCK + }); + + await userDAL.update( + { id: userId }, + { consecutiveFailedMfaAttempts: 0, isLocked: false, temporaryLockDateEnd: null } + ); + }; + return { sendEmailVerificationCode, verifyEmailVerificationCode, @@ -216,6 +229,7 @@ export const userServiceFactory = ({ deleteMe, getMe, createUserAction, - getUserAction + getUserAction, + unlockUser }; }; From e3dae9d498218f11a3afb05b0324344fe3050aab Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Wed, 22 May 2024 22:51:20 +0800 Subject: [PATCH 018/101] feat: integration user lock flow to frontend --- backend/src/server/routes/v1/user-router.ts | 1 + backend/src/services/auth/auth-fns.ts | 2 +- backend/src/services/user/user-fns.ts | 2 +- .../components/InitialStep/InitialStep.tsx | 12 +++++- .../Login/components/MFAStep/MFAStep.tsx | 42 +++++++++---------- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/backend/src/server/routes/v1/user-router.ts b/backend/src/server/routes/v1/user-router.ts index aa3962c5a..0253ac86b 100644 --- a/backend/src/server/routes/v1/user-router.ts +++ b/backend/src/server/routes/v1/user-router.ts @@ -49,6 +49,7 @@ export const registerUserRouter = async (server: FastifyZodProvider) => { await server.services.user.unlockUser(req.params.userId, req.query.token); } catch (err) { logger.error(`User unlock failed for ${req.params.userId}`); + logger.error(err); } return res.redirect(`${appCfg.SITE_URL}/login`); } diff --git a/backend/src/services/auth/auth-fns.ts b/backend/src/services/auth/auth-fns.ts index 4911cc258..036d9068e 100644 --- a/backend/src/services/auth/auth-fns.ts +++ b/backend/src/services/auth/auth-fns.ts @@ -59,7 +59,7 @@ export const enforceUserLockStatus = (isLocked: boolean, temporaryLockDateEnd?: if (timeDiff < 0) throw new UnauthorizedError({ name: "User Locked", - message: `User is locked due to multiple failed login attempts. Try logging in again after ${Math.round( + message: `User is locked due to multiple failed login attempts. Try again after ${Math.round( (-1 * timeDiff) / 1000 )} seconds.` }); diff --git a/backend/src/services/user/user-fns.ts b/backend/src/services/user/user-fns.ts index 2750bb87e..e8a0905f8 100644 --- a/backend/src/services/user/user-fns.ts +++ b/backend/src/services/user/user-fns.ts @@ -38,7 +38,7 @@ export const processFailedMfaAttempt = async (userId: string, userDAL: Pick PROGRESSIVE_DELAY_INTERVAL * progressiveDelaysInMins.length) { + if (user.consecutiveFailedMfaAttempts >= PROGRESSIVE_DELAY_INTERVAL * (progressiveDelaysInMins.length + 1)) { return ( await tx(TableName.Users) .where("id", userId) diff --git a/frontend/src/views/Login/components/InitialStep/InitialStep.tsx b/frontend/src/views/Login/components/InitialStep/InitialStep.tsx index f3b40300e..a4e5e89f5 100644 --- a/frontend/src/views/Login/components/InitialStep/InitialStep.tsx +++ b/frontend/src/views/Login/components/InitialStep/InitialStep.tsx @@ -105,8 +105,18 @@ export const InitialStep = ({ setStep, email, setEmail, password, setPassword }: }); } } - } catch (err) { + } catch (err: any) { console.error(err); + if (err.response.data.error === "User Locked") { + createNotification({ + title: err.response.data.error, + text: err.response.data.message, + type: "error" + }); + setIsLoading(false); + return; + } + setLoginError(true); createNotification({ text: "Login unsuccessful. Double-check your credentials and try again.", diff --git a/frontend/src/views/Login/components/MFAStep/MFAStep.tsx b/frontend/src/views/Login/components/MFAStep/MFAStep.tsx index eaaac88a9..249c043b6 100644 --- a/frontend/src/views/Login/components/MFAStep/MFAStep.tsx +++ b/frontend/src/views/Login/components/MFAStep/MFAStep.tsx @@ -46,20 +46,7 @@ type Props = { callbackPort?: string | null; }; -interface VerifyMfaTokenError { - response: { - data: { - context: { - code: string; - triesLeft: number; - }; - }; - status: number; - }; -} - export const MFAStep = ({ email, password, providerAuthToken }: Props) => { - const router = useRouter(); const [isLoading, setIsLoading] = useState(false); const [isLoadingResend, setIsLoadingResend] = useState(false); @@ -178,20 +165,31 @@ export const MFAStep = ({ email, password, providerAuthToken }: Props) => { }); } } - } catch (err) { - const error = err as VerifyMfaTokenError; + } catch (err: any) { + if (err.response.data.error === "User Locked") { + createNotification({ + title: err.response.data.error, + text: err.response.data.message, + type: "error" + }); + setIsLoading(false); + return; + } + createNotification({ text: "Failed to log in", type: "error" }); - if (error?.response?.status === 500) { - window.location.reload(); - } else if (error?.response?.data?.context?.triesLeft) { - setTriesLeft(error?.response?.data?.context?.triesLeft); - if (error.response.data.context.triesLeft === 0) { - window.location.reload(); - } + if (triesLeft) { + setTriesLeft((left) => { + if (triesLeft === 1) { + window.location.reload(); + } + return (left as number) - 1; + }); + } else { + setTriesLeft(2); } setIsLoading(false); From 8ec8b1ce2f496c45fb74c77a04089a3e8781f245 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Wed, 22 May 2024 23:51:58 +0800 Subject: [PATCH 019/101] feat: add custom rate limiting for mfa --- backend/src/server/config/rateLimiter.ts | 9 +++++++++ backend/src/server/routes/v2/mfa-router.ts | 6 +++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/backend/src/server/config/rateLimiter.ts b/backend/src/server/config/rateLimiter.ts index 6c92de62c..0f6903773 100644 --- a/backend/src/server/config/rateLimiter.ts +++ b/backend/src/server/config/rateLimiter.ts @@ -52,6 +52,15 @@ export const inviteUserRateLimit: RateLimitOptions = { keyGenerator: (req) => req.realIp }; +export const mfaRateLimit: RateLimitOptions = { + timeWindow: 60 * 1000, + max: 20, + keyGenerator: (req) => { + // fallback to IP to avoid global rate limiting when authorization is set to empty + return req.headers.authorization?.split(" ")[1] || req.realIp; + } +}; + export const creationLimit: RateLimitOptions = { // identity, project, org timeWindow: 60 * 1000, diff --git a/backend/src/server/routes/v2/mfa-router.ts b/backend/src/server/routes/v2/mfa-router.ts index 973804c7c..1c685866d 100644 --- a/backend/src/server/routes/v2/mfa-router.ts +++ b/backend/src/server/routes/v2/mfa-router.ts @@ -2,7 +2,7 @@ import jwt from "jsonwebtoken"; import { z } from "zod"; import { getConfig } from "@app/lib/config/env"; -import { writeLimit } from "@app/server/config/rateLimiter"; +import { mfaRateLimit } from "@app/server/config/rateLimiter"; import { AuthModeMfaJwtTokenPayload, AuthTokenType } from "@app/services/auth/auth-type"; export const registerMfaRouter = async (server: FastifyZodProvider) => { @@ -34,7 +34,7 @@ export const registerMfaRouter = async (server: FastifyZodProvider) => { method: "POST", url: "/mfa/send", config: { - rateLimit: writeLimit + rateLimit: mfaRateLimit }, schema: { response: { @@ -53,7 +53,7 @@ export const registerMfaRouter = async (server: FastifyZodProvider) => { url: "/mfa/verify", method: "POST", config: { - rateLimit: writeLimit + rateLimit: mfaRateLimit }, schema: { body: z.object({ From a0d9331e67df9e1cb64076327a16087f2ea0e672 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Thu, 23 May 2024 00:21:19 +0800 Subject: [PATCH 020/101] misc: removed comment --- backend/src/server/config/rateLimiter.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/src/server/config/rateLimiter.ts b/backend/src/server/config/rateLimiter.ts index 0f6903773..dfecfb495 100644 --- a/backend/src/server/config/rateLimiter.ts +++ b/backend/src/server/config/rateLimiter.ts @@ -56,7 +56,6 @@ export const mfaRateLimit: RateLimitOptions = { timeWindow: 60 * 1000, max: 20, keyGenerator: (req) => { - // fallback to IP to avoid global rate limiting when authorization is set to empty return req.headers.authorization?.split(" ")[1] || req.realIp; } }; From 82eeae603051a1985def94769bd0d69f329959c8 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 22 May 2024 13:34:44 -0400 Subject: [PATCH 021/101] track identity --- .../server/plugins/auth/inject-permission.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/backend/src/server/plugins/auth/inject-permission.ts b/backend/src/server/plugins/auth/inject-permission.ts index e3dfc6151..11a94657b 100644 --- a/backend/src/server/plugins/auth/inject-permission.ts +++ b/backend/src/server/plugins/auth/inject-permission.ts @@ -16,6 +16,10 @@ export const injectPermission = fp(async (server) => { orgId: req.auth.orgId, // if the req.auth.authMode is AuthMode.API_KEY, the orgId will be "API_KEY" authMethod: req.auth.authMethod // if the req.auth.authMode is AuthMode.API_KEY, the authMethod will be null }; + + logger.info( + `injectPermission: Injecting permissions for [permissionsForIdentity=${req.auth.userId}] [type=${ActorType.USER}]` + ); } else if (req.auth.actor === ActorType.IDENTITY) { req.permission = { type: ActorType.IDENTITY, @@ -23,6 +27,10 @@ export const injectPermission = fp(async (server) => { orgId: req.auth.orgId, authMethod: null }; + + logger.info( + `injectPermission: Injecting permissions for [permissionsForIdentity=${req.auth.identityId}] [type=${ActorType.IDENTITY}]` + ); } else if (req.auth.actor === ActorType.SERVICE) { req.permission = { type: ActorType.SERVICE, @@ -30,6 +38,10 @@ export const injectPermission = fp(async (server) => { orgId: req.auth.orgId, authMethod: null }; + + logger.info( + `injectPermission: Injecting permissions for [permissionsForIdentity=${req.auth.serviceTokenId}] [type=${ActorType.SERVICE}]` + ); } else if (req.auth.actor === ActorType.SCIM_CLIENT) { req.permission = { type: ActorType.SCIM_CLIENT, @@ -37,8 +49,10 @@ export const injectPermission = fp(async (server) => { orgId: req.auth.orgId, authMethod: null }; - } - logger.info(`injectPermission: Injecting permissions for [permissionsForIdentity=${req?.permission?.id}]`); + logger.info( + `injectPermission: Injecting permissions for [permissionsForIdentity=${req.auth.scimTokenId}] [type=${ActorType.SCIM_CLIENT}]` + ); + } }); }); From efcc248486b4c013ddb1431480eebd77ca9fde34 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 22 May 2024 14:54:20 -0400 Subject: [PATCH 022/101] add tx to find ghost user --- .../services/project-membership/project-membership-dal.ts | 6 ++++-- backend/src/services/project/project-service.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/src/services/project-membership/project-membership-dal.ts b/backend/src/services/project-membership/project-membership-dal.ts index f8acc10d8..590c26ecc 100644 --- a/backend/src/services/project-membership/project-membership-dal.ts +++ b/backend/src/services/project-membership/project-membership-dal.ts @@ -1,3 +1,5 @@ +import { Knex } from "knex"; + import { TDbClient } from "@app/db"; import { TableName, TUserEncryptionKeys } from "@app/db/schemas"; import { DatabaseError } from "@app/lib/errors"; @@ -104,9 +106,9 @@ export const projectMembershipDALFactory = (db: TDbClient) => { } }; - const findProjectGhostUser = async (projectId: string) => { + const findProjectGhostUser = async (projectId: string, tx?: Knex) => { try { - const ghostUser = await db(TableName.ProjectMembership) + const ghostUser = await (tx || db)(TableName.ProjectMembership) .where({ projectId }) .join(TableName.Users, `${TableName.ProjectMembership}.userId`, `${TableName.Users}.id`) .select(selectAllTableCols(TableName.Users)) diff --git a/backend/src/services/project/project-service.ts b/backend/src/services/project/project-service.ts index 008dac593..f58fd7788 100644 --- a/backend/src/services/project/project-service.ts +++ b/backend/src/services/project/project-service.ts @@ -340,7 +340,7 @@ export const projectServiceFactory = ({ const deletedProject = await projectDAL.transaction(async (tx) => { const delProject = await projectDAL.deleteById(project.id, tx); - const projectGhostUser = await projectMembershipDAL.findProjectGhostUser(project.id).catch(() => null); + const projectGhostUser = await projectMembershipDAL.findProjectGhostUser(project.id, tx).catch(() => null); // Delete the org membership for the ghost user if it's found. if (projectGhostUser) { From 6af4b3f64c58bd74d80928974ef05002642de808 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 22 May 2024 15:48:24 -0400 Subject: [PATCH 023/101] add index for audit logs --- ...3447_index-audit-logs-project-id-org-id.ts | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 backend/src/db/migrations/20240522193447_index-audit-logs-project-id-org-id.ts diff --git a/backend/src/db/migrations/20240522193447_index-audit-logs-project-id-org-id.ts b/backend/src/db/migrations/20240522193447_index-audit-logs-project-id-org-id.ts new file mode 100644 index 000000000..7b208f010 --- /dev/null +++ b/backend/src/db/migrations/20240522193447_index-audit-logs-project-id-org-id.ts @@ -0,0 +1,26 @@ +import { Knex } from "knex"; + +import { TableName } from "../schemas"; + +export async function up(knex: Knex): Promise { + const doesOrgIdExist = await knex.schema.hasColumn(TableName.AuditLog, "orgId"); + const doesProjectIdExist = await knex.schema.hasColumn(TableName.AuditLog, "projectId"); + if (await knex.schema.hasTable(TableName.AuditLog)) { + await knex.schema.alterTable(TableName.AuditLog, (t) => { + if (doesProjectIdExist) t.index("projectId"); + if (doesOrgIdExist) t.index("orgId"); + }); + } +} + +export async function down(knex: Knex): Promise { + const doesOrgIdExist = await knex.schema.hasColumn(TableName.AuditLog, "orgId"); + const doesProjectIdExist = await knex.schema.hasColumn(TableName.AuditLog, "projectId"); + + if (await knex.schema.hasTable(TableName.AuditLog)) { + await knex.schema.alterTable(TableName.AuditLog, (t) => { + if (doesProjectIdExist) t.dropIndex("projectId"); + if (doesOrgIdExist) t.dropIndex("orgId"); + }); + } +} From e649667da8d7f53da9f1bed7226d361428794c59 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 22 May 2024 16:52:18 -0400 Subject: [PATCH 024/101] add indexs to secret versions and secret snapshot secrets --- ...425_index-secret-snapshot-secrets-envid.ts | 22 +++++++++++++++++++ ...240522204414_index-secret-version-envId.ts | 22 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 backend/src/db/migrations/20240522203425_index-secret-snapshot-secrets-envid.ts create mode 100644 backend/src/db/migrations/20240522204414_index-secret-version-envId.ts diff --git a/backend/src/db/migrations/20240522203425_index-secret-snapshot-secrets-envid.ts b/backend/src/db/migrations/20240522203425_index-secret-snapshot-secrets-envid.ts new file mode 100644 index 000000000..59fe14145 --- /dev/null +++ b/backend/src/db/migrations/20240522203425_index-secret-snapshot-secrets-envid.ts @@ -0,0 +1,22 @@ +import { Knex } from "knex"; + +import { TableName } from "../schemas"; + +export async function up(knex: Knex): Promise { + const doesEnvIdExist = await knex.schema.hasColumn(TableName.SnapshotSecret, "envId"); + if (await knex.schema.hasTable(TableName.SnapshotSecret)) { + await knex.schema.alterTable(TableName.SnapshotSecret, (t) => { + if (doesEnvIdExist) t.index("envId"); + }); + } +} + +export async function down(knex: Knex): Promise { + const doesEnvIdExist = await knex.schema.hasColumn(TableName.SnapshotSecret, "envId"); + + if (await knex.schema.hasTable(TableName.SnapshotSecret)) { + await knex.schema.alterTable(TableName.SnapshotSecret, (t) => { + if (doesEnvIdExist) t.dropIndex("envId"); + }); + } +} diff --git a/backend/src/db/migrations/20240522204414_index-secret-version-envId.ts b/backend/src/db/migrations/20240522204414_index-secret-version-envId.ts new file mode 100644 index 000000000..f01c0d3cc --- /dev/null +++ b/backend/src/db/migrations/20240522204414_index-secret-version-envId.ts @@ -0,0 +1,22 @@ +import { Knex } from "knex"; + +import { TableName } from "../schemas"; + +export async function up(knex: Knex): Promise { + const doesEnvIdExist = await knex.schema.hasColumn(TableName.SecretVersion, "envId"); + if (await knex.schema.hasTable(TableName.SecretVersion)) { + await knex.schema.alterTable(TableName.SecretVersion, (t) => { + if (doesEnvIdExist) t.index("envId"); + }); + } +} + +export async function down(knex: Knex): Promise { + const doesEnvIdExist = await knex.schema.hasColumn(TableName.SecretVersion, "envId"); + + if (await knex.schema.hasTable(TableName.SecretVersion)) { + await knex.schema.alterTable(TableName.SecretVersion, (t) => { + if (doesEnvIdExist) t.dropIndex("envId"); + }); + } +} From 0b87121b6709642232e75727f6764c8d688c11be Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 22 May 2024 17:46:16 -0400 Subject: [PATCH 025/101] add index to secret-snapshot-secret for field snapshotId --- ...et-snapshot-secrets-index-on-snapshotId.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 backend/src/db/migrations/20240522212706_secret-snapshot-secrets-index-on-snapshotId.ts diff --git a/backend/src/db/migrations/20240522212706_secret-snapshot-secrets-index-on-snapshotId.ts b/backend/src/db/migrations/20240522212706_secret-snapshot-secrets-index-on-snapshotId.ts new file mode 100644 index 000000000..7f200ed3e --- /dev/null +++ b/backend/src/db/migrations/20240522212706_secret-snapshot-secrets-index-on-snapshotId.ts @@ -0,0 +1,21 @@ +import { Knex } from "knex"; + +import { TableName } from "../schemas"; + +export async function up(knex: Knex): Promise { + const doesSnapshotIdExist = await knex.schema.hasColumn(TableName.SnapshotSecret, "snapshotId"); + if (await knex.schema.hasTable(TableName.SnapshotSecret)) { + await knex.schema.alterTable(TableName.SnapshotSecret, (t) => { + if (doesSnapshotIdExist) t.index("snapshotId"); + }); + } +} + +export async function down(knex: Knex): Promise { + const doesSnapshotIdExist = await knex.schema.hasColumn(TableName.SnapshotSecret, "snapshotId"); + if (await knex.schema.hasTable(TableName.SnapshotSecret)) { + await knex.schema.alterTable(TableName.SnapshotSecret, (t) => { + if (doesSnapshotIdExist) t.dropIndex("snapshotId"); + }); + } +} From f4de52e714d38dbe07f91499ab02f08e629bd958 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 22 May 2024 18:15:04 -0400 Subject: [PATCH 026/101] add index on secret snapshot folders --- ...ret-snapshot-folder-index-on-snapshotId.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 backend/src/db/migrations/20240522221147_secret-snapshot-folder-index-on-snapshotId.ts diff --git a/backend/src/db/migrations/20240522221147_secret-snapshot-folder-index-on-snapshotId.ts b/backend/src/db/migrations/20240522221147_secret-snapshot-folder-index-on-snapshotId.ts new file mode 100644 index 000000000..ffb7c3336 --- /dev/null +++ b/backend/src/db/migrations/20240522221147_secret-snapshot-folder-index-on-snapshotId.ts @@ -0,0 +1,21 @@ +import { Knex } from "knex"; + +import { TableName } from "../schemas"; + +export async function up(knex: Knex): Promise { + const doesSnapshotIdExist = await knex.schema.hasColumn(TableName.SnapshotFolder, "snapshotId"); + if (await knex.schema.hasTable(TableName.SnapshotFolder)) { + await knex.schema.alterTable(TableName.SnapshotFolder, (t) => { + if (doesSnapshotIdExist) t.index("snapshotId"); + }); + } +} + +export async function down(knex: Knex): Promise { + const doesSnapshotIdExist = await knex.schema.hasColumn(TableName.SnapshotFolder, "snapshotId"); + if (await knex.schema.hasTable(TableName.SnapshotFolder)) { + await knex.schema.alterTable(TableName.SnapshotFolder, (t) => { + if (doesSnapshotIdExist) t.dropIndex("snapshotId"); + }); + } +} From 19bbc2ab267d2ebbb8a9a584089d138044154138 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 22 May 2024 19:04:44 -0400 Subject: [PATCH 027/101] add secrets index --- ...5402_secrets-index-on-folder-id-user-id.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 backend/src/db/migrations/20240522225402_secrets-index-on-folder-id-user-id.ts diff --git a/backend/src/db/migrations/20240522225402_secrets-index-on-folder-id-user-id.ts b/backend/src/db/migrations/20240522225402_secrets-index-on-folder-id-user-id.ts new file mode 100644 index 000000000..f1225e264 --- /dev/null +++ b/backend/src/db/migrations/20240522225402_secrets-index-on-folder-id-user-id.ts @@ -0,0 +1,24 @@ +import { Knex } from "knex"; + +import { TableName } from "../schemas"; + +export async function up(knex: Knex): Promise { + const doesFolderIdExist = await knex.schema.hasColumn(TableName.Secret, "folderId"); + const doesUserIdExist = await knex.schema.hasColumn(TableName.Secret, "userId"); + if (await knex.schema.hasTable(TableName.Secret)) { + await knex.schema.alterTable(TableName.Secret, (t) => { + if (doesFolderIdExist && doesUserIdExist) t.index(["folderId", "userId"]); + }); + } +} + +export async function down(knex: Knex): Promise { + const doesFolderIdExist = await knex.schema.hasColumn(TableName.Secret, "folderId"); + const doesUserIdExist = await knex.schema.hasColumn(TableName.Secret, "userId"); + + if (await knex.schema.hasTable(TableName.Secret)) { + await knex.schema.alterTable(TableName.Secret, (t) => { + if (doesUserIdExist && doesFolderIdExist) t.dropIndex(["folderId", "userId"]); + }); + } +} From 941a71efaf11dd2a2e31d773e11ba61f0ff55109 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 22 May 2024 20:38:04 -0400 Subject: [PATCH 028/101] add index for expire at needed for pruning --- ...0523003158_audit-log-add-expireAt-index.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 backend/src/db/migrations/20240523003158_audit-log-add-expireAt-index.ts diff --git a/backend/src/db/migrations/20240523003158_audit-log-add-expireAt-index.ts b/backend/src/db/migrations/20240523003158_audit-log-add-expireAt-index.ts new file mode 100644 index 000000000..b6dbf3e74 --- /dev/null +++ b/backend/src/db/migrations/20240523003158_audit-log-add-expireAt-index.ts @@ -0,0 +1,22 @@ +import { Knex } from "knex"; + +import { TableName } from "../schemas"; + +export async function up(knex: Knex): Promise { + const doesExpireAtExist = await knex.schema.hasColumn(TableName.AuditLog, "expiresAt"); + if (await knex.schema.hasTable(TableName.AuditLog)) { + await knex.schema.alterTable(TableName.AuditLog, (t) => { + if (doesExpireAtExist) t.index("expiresAt"); + }); + } +} + +export async function down(knex: Knex): Promise { + const doesExpireAtExist = await knex.schema.hasColumn(TableName.AuditLog, "expiresAt"); + + if (await knex.schema.hasTable(TableName.AuditLog)) { + await knex.schema.alterTable(TableName.AuditLog, (t) => { + if (doesExpireAtExist) t.dropIndex("expiresAt"); + }); + } +} From 663f8abc5149b1b429466debe1591ab879381bda Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 22 May 2024 20:44:07 -0400 Subject: [PATCH 029/101] bring back last updated at for service token --- .../services/service-token/service-token-service.ts | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/backend/src/services/service-token/service-token-service.ts b/backend/src/services/service-token/service-token-service.ts index 677ba78fa..e434bd91f 100644 --- a/backend/src/services/service-token/service-token-service.ts +++ b/backend/src/services/service-token/service-token-service.ts @@ -7,7 +7,6 @@ import { TPermissionServiceFactory } from "@app/ee/services/permission/permissio import { ProjectPermissionActions, ProjectPermissionSub } from "@app/ee/services/permission/project-permission"; import { getConfig } from "@app/lib/config/env"; import { BadRequestError, UnauthorizedError } from "@app/lib/errors"; -import { logger } from "@app/lib/logger"; import { ActorType } from "../auth/auth-type"; import { TProjectDALFactory } from "../project/project-dal"; @@ -167,15 +166,11 @@ export const serviceTokenServiceFactory = ({ const isMatch = await bcrypt.compare(TOKEN_SECRET, serviceToken.secretHash); if (!isMatch) throw new UnauthorizedError(); - // const updatedToken = await serviceTokenDAL.updateById(serviceToken.id, { - // lastUsed: new Date() - // }); + const updatedToken = await serviceTokenDAL.updateById(serviceToken.id, { + lastUsed: new Date() + }); - logger.info( - `fnValidateServiceToken: [serviceToken=${serviceToken.id}] [serviceTokenProjectId=${serviceToken.projectId}]` - ); - - return { ...serviceToken, lastUsed: serviceToken.lastUsed, orgId: project.orgId }; + return { ...serviceToken, lastUsed: updatedToken.lastUsed, orgId: project.orgId }; }; return { From 3d65d121c082ce37eb08d82ed973c7d9540d2d05 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Thu, 23 May 2024 04:45:33 +0200 Subject: [PATCH 030/101] docs: updated docs to reflect new SDK structure --- docs/documentation/guides/node.mdx | 2 +- docs/documentation/guides/python.mdx | 16 +- docs/sdks/languages/csharp.mdx | 166 +++++++++++-- docs/sdks/languages/java.mdx | 146 ++++++++++- docs/sdks/languages/node.mdx | 143 +++++++++-- docs/sdks/languages/python.mdx | 356 ++++++++++++++++++--------- 6 files changed, 657 insertions(+), 172 deletions(-) diff --git a/docs/documentation/guides/node.mdx b/docs/documentation/guides/node.mdx index 8b78cde5e..8bd9e743b 100644 --- a/docs/documentation/guides/node.mdx +++ b/docs/documentation/guides/node.mdx @@ -36,7 +36,7 @@ Initialize a new Node.js project with a default `package.json` file. npm init -y ``` -Install `express` and [infisical-node](https://github.com/Infisical/infisical-node), the client Node SDK for Infisical. +Install `express` and [@infisical/sdk](https://www.npmjs.com/package/@infisical/sdk), the client Node SDK for Infisical. ```console npm install express @infisical/sdk diff --git a/docs/documentation/guides/python.mdx b/docs/documentation/guides/python.mdx index 696f0a7ee..00b3d6089 100644 --- a/docs/documentation/guides/python.mdx +++ b/docs/documentation/guides/python.mdx @@ -5,7 +5,7 @@ title: "Python" This guide demonstrates how to use Infisical to manage secrets for your Python stack from local development to production. It uses: - Infisical (you can use [Infisical Cloud](https://app.infisical.com) or a [self-hosted instance of Infisical](https://infisical.com/docs/self-hosting/overview)) to store your secrets. -- The [infisical-python](https://github.com/Infisical/sdk/tree/main/crates/infisical-py) Python client SDK to fetch secrets back to your Python application on demand. +- The [infisical-python](https://pypi.org/project/infisical-python/) Python client SDK to fetch secrets back to your Python application on demand. ## Project Setup @@ -36,23 +36,27 @@ python3 -m venv env source env/bin/activate ``` -Install Flask and [infisical-python](https://github.com/Infisical/sdk/tree/main/crates/infisical-py), the client Python SDK for Infisical. +Install Flask and [infisical-python](https://pypi.org/project/infisical-python/), the client Python SDK for Infisical. ```console -pip install Flask infisical-python +pip install flask infisical-python ``` Finally, create an `app.py` file containing the application code. ```py from flask import Flask -from infisical_client import ClientSettings, InfisicalClient, GetSecretOptions +from infisical_client import ClientSettings, InfisicalClient, GetSecretOptions, AuthenticationOptions, UniversalAuthMethod app = Flask(__name__) client = InfisicalClient(ClientSettings( - client_id="MACHINE_IDENTITY_CLIENT_ID", - client_secret="MACHINE_IDENTITY_CLIENT_SECRET", + auth=AuthenticationOptions( + universal_auth=UniversalAuthMethod( + client_id="CLIENT_ID", + client_secret="CLIENT_SECRET", + ) + ) )) @app.route("/") diff --git a/docs/sdks/languages/csharp.mdx b/docs/sdks/languages/csharp.mdx index b3a1d2086..fc87a1efe 100644 --- a/docs/sdks/languages/csharp.mdx +++ b/docs/sdks/languages/csharp.mdx @@ -21,21 +21,28 @@ namespace Example static void Main(string[] args) { - var settings = new ClientSettings + ClientSettings settings = new ClientSettings + { + Auth = new AuthenticationOptions { - ClientId = "CLIENT_ID", - ClientSecret = "CLIENT_SECRET", - // SiteUrl = "http://localhost:8080", <-- This line can be omitted if you're using Infisical Cloud. - }; - var infisical = new InfisicalClient(settings); + UniversalAuth = new UniversalAuthMethod + { + ClientId = "your-client-id", + ClientSecret = "your-client-secret" + } + } + }; - var options = new GetSecretOptions + + var infisicalClient = new InfisicalClient(settings); + + var getSecretOptions = new GetSecretOptions { SecretName = "TEST", ProjectId = "PROJECT_ID", Environment = "dev", }; - var secret = infisical.GetSecret(options); + var secret = infisical.GetSecret(getSecretOptions); Console.WriteLine($"The value of secret '{secret.SecretKey}', is: {secret.SecretValue}"); @@ -52,8 +59,6 @@ This example demonstrates how to use the Infisical C# SDK in a C# application. T # Installation -Run `npm` to add `@infisical/sdk` to your project. - ```console $ dotnet add package Infisical.Sdk ``` @@ -70,14 +75,20 @@ namespace Example { static void Main(string[] args) { - - var settings = new ClientSettings + ClientSettings settings = new ClientSettings + { + Auth = new AuthenticationOptions { - ClientId = "CLIENT_ID", - ClientSecret = "CLIENT_SECRET", - }; + UniversalAuth = new UniversalAuthMethod + { + ClientId = "your-client-id", + ClientSecret = "your-client-secret" + } + } + }; - var infisical = new InfisicalClient(settings); // <-- Your SDK instance! + + var infisicalClient = new InfisicalClient(settings); // <-- Your SDK client is now ready to use } } } @@ -87,14 +98,14 @@ namespace Example - + Your machine identity client ID. - + Your machine identity client secret. - + An access token obtained from the machine identity login endpoint. @@ -103,13 +114,120 @@ namespace Example If manually set to 0, caching will be disabled, this is not recommended. - + Your self-hosted absolute site URL including the protocol (e.g. `https://app.infisical.com`) + + + The authentication object to use for the client. This is required unless you're using environment variables. + +### Authentication + +The SDK supports a variety of authentication methods. The most common authentication method is Universal Auth, which uses a client ID and client secret to authenticate. + +#### Universal Auth + +**Using environment variables** +- `INFISICAL_UNIVERSAL_AUTH_CLIENT_ID` - Your machine identity client ID. +- `INFISICAL_UNIVERSAL_AUTH_CLIENT_SECRET` - Your machine identity client secret. + +**Using the SDK directly** +```csharp + ClientSettings settings = new ClientSettings + { + Auth = new AuthenticationOptions + { + UniversalAuth = new UniversalAuthMethod + { + ClientId = "your-client-id", + ClientSecret = "your-client-secret" + } + } + }; + + var infisicalClient = new InfisicalClient(settings); +``` + +#### GCP ID Token Auth + + Please note that this authentication method will only work if you're running your application on Google Cloud Platform. + Please [read more](/documentation/platform/identities/gcp-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_GCP_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. + +**Using the SDK directly** +```csharp + ClientSettings settings = new ClientSettings + { + Auth = new AuthenticationOptions + { + GcpIdToken = new GcpIdTokenAuthMethod + { + IdentityId = "your-machine-identity-id", + } + } + }; + + + var infisicalClient = new InfisicalClient(settings); +``` + +#### GCP IAM Auth + +**Using environment variables** +- `INFISICAL_GCP_IAM_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. +- `INFISICAL_GCP_IAM_SERVICE_ACCOUNT_KEY_FILE_PATH` - The path to your GCP service account key file. + +**Using the SDK directly** +```csharp + ClientSettings settings = new ClientSettings + { + Auth = new AuthenticationOptions + { + GcpIam = new GcpIamAuthMethod + { + IdentityId = "your-machine-identity-id", + ServiceAccountKeyFilePath = "./path/to/your/service-account-key.json" + } + } + }; + + + var infisicalClient = new InfisicalClient(settings); +``` + +#### AWS IAM Auth + + Please note that this authentication method will only work if you're running your application on AWS. + Please [read more](/documentation/platform/identities/aws-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_AWS_IAM_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. + +**Using the SDK directly** +```csharp + ClientSettings settings = new ClientSettings + { + Auth = new AuthenticationOptions + { + AwsIam = new AwsIamAuthMethod + { + IdentityId = "your-machine-identity-id", + } + } + }; + + + var infisicalClient = new InfisicalClient(settings); +``` + ### Caching To reduce the number of API requests, the SDK temporarily stores secrets it retrieves. By default, a secret remains cached for 5 minutes after it's first fetched. Each time it's fetched again, this 5-minute timer resets. You can adjust this caching duration by setting the "cacheTTL" option when creating the client. @@ -155,6 +273,14 @@ Retrieve all secrets within the Infisical project and environment that client is Whether or not to include imported secrets from the current path. Read about [secret import](/documentation/platform/secret-reference) + + + Whether or not to fetch secrets recursively from the specified path. Please note that there's a 20-depth limit for recursive fetching. + + + + Whether or not to expand secret references in the fetched secrets. Read about [secret reference](/documentation/platform/secret-reference) + diff --git a/docs/sdks/languages/java.mdx b/docs/sdks/languages/java.mdx index 5b8797b5d..102b28355 100644 --- a/docs/sdks/languages/java.mdx +++ b/docs/sdks/languages/java.mdx @@ -19,12 +19,19 @@ import com.infisical.sdk.schema.*; public class Example { public static void main(String[] args) { - // Create a new Infisical Client + + // Create the authentication settings for the client ClientSettings settings = new ClientSettings(); - settings.setClientID("MACHINE_IDENTITY_CLIENT_ID"); - settings.setClientSecret("MACHINE_IDENTITY_CLIENT_SECRET"); - settings.setCacheTTL(Long.valueOf(300)); // 300 seconds, 5 minutes + AuthenticationOptions authOptions = new AuthenticationOptions(); + UniversalAuthMethod authMethod = new UniversalAuthMethod(); + authMethod.setClientID("YOUR_IDENTITY_ID"); + authMethod.setClientSecret("YOUR_CLIENT_SECRET"); + + authOptions.setUniversalAuth(authMethod); + settings.setAuth(authOptions); + + // Create a new Infisical Client InfisicalClient client = new InfisicalClient(settings); // Create the options for fetching the secret @@ -68,11 +75,18 @@ import com.infisical.sdk.schema.*; public class App { public static void main(String[] args) { - + // Create the authentication settings for the client ClientSettings settings = new ClientSettings(); - settings.setClientID("MACHINE_IDENTITY_CLIENT_ID"); - settings.setClientSecret("MACHINE_IDENTITY_CLIENT_SECRET"); + AuthenticationOptions authOptions = new AuthenticationOptions(); + UniversalAuthMethod authMethod = new UniversalAuthMethod(); + authMethod.setClientID("YOUR_IDENTITY_ID"); + authMethod.setClientSecret("YOUR_CLIENT_SECRET"); + + authOptions.setUniversalAuth(authMethod); + settings.setAuth(authOptions); + + // Create a new Infisical Client InfisicalClient client = new InfisicalClient(settings); // Your client! } } @@ -82,15 +96,21 @@ public class App { - + Your machine identity client ID. + + **This field is deprecated and will be removed in future versions.** Please use the `setAuth()` method on the client settings instead. - + Your machine identity client secret. + + **This field is deprecated and will be removed in future versions.** Please use the `setAuth()` method on the client settings instead. - + An access token obtained from the machine identity login endpoint. + + **This field is deprecated and will be removed in future versions.** Please use the `setAuth()` method on the client settings instead. @@ -101,10 +121,106 @@ public class App { Your self-hosted absolute site URL including the protocol (e.g. `https://app.infisical.com`) + + + The authentication object to use for the client. This is required unless you're using environment variables. + +### Authentication + +The SDK supports a variety of authentication methods. The most common authentication method is Universal Auth, which uses a client ID and client secret to authenticate. + +#### Universal Auth + +**Using environment variables** +- `INFISICAL_UNIVERSAL_AUTH_CLIENT_ID` - Your machine identity client ID. +- `INFISICAL_UNIVERSAL_AUTH_CLIENT_SECRET` - Your machine identity client secret. + +**Using the SDK directly** +```java + ClientSettings settings = new ClientSettings(); + AuthenticationOptions authOptions = new AuthenticationOptions(); + UniversalAuthMethod authMethod = new UniversalAuthMethod(); + + authMethod.setClientID("YOUR_IDENTITY_ID"); + authMethod.setClientSecret("YOUR_CLIENT_SECRET"); + + authOptions.setUniversalAuth(authMethod); + settings.setAuth(authOptions); + + InfisicalClient client = new InfisicalClient(settings); +``` + +#### GCP ID Token Auth + + Please note that this authentication method will only work if you're running your application on Google Cloud Platform. + Please [read more](/documentation/platform/identities/gcp-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_GCP_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. + +**Using the SDK directly** +```java + ClientSettings settings = new ClientSettings(); + AuthenticationOptions authOptions = new AuthenticationOptions(); + GCPIDTokenAuthMethod authMethod = new GCPIDTokenAuthMethod(); + + authMethod.setIdentityID("YOUR_MACHINE_IDENTITY_ID"); + + authOptions.setGcpIDToken(authMethod); + settings.setAuth(authOptions); + + InfisicalClient client = new InfisicalClient(settings); +``` + +#### GCP IAM Auth + +**Using environment variables** +- `INFISICAL_GCP_IAM_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. +- `INFISICAL_GCP_IAM_SERVICE_ACCOUNT_KEY_FILE_PATH` - The path to your GCP service account key file. + +**Using the SDK directly** +```java + ClientSettings settings = new ClientSettings(); + AuthenticationOptions authOptions = new AuthenticationOptions(); + GCPIamAuthMethod authMethod = new GCPIamAuthMethod(); + + authMethod.setIdentityID("YOUR_MACHINE_IDENTITY_ID"); + authMethod.setServiceAccountKeyFilePath("./path/to/your/service-account-key.json"); + + authOptions.setGcpIam(authMethod); + settings.setAuth(authOptions); + + InfisicalClient client = new InfisicalClient(settings); +``` + +#### AWS IAM Auth + + Please note that this authentication method will only work if you're running your application on AWS. + Please [read more](/documentation/platform/identities/aws-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_AWS_IAM_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. + +**Using the SDK directly** +```java + ClientSettings settings = new ClientSettings(); + AuthenticationOptions authOptions = new AuthenticationOptions(); + AWSIamAuthMethod authMethod = new AWSIamAuthMethod(); + + authMethod.setIdentityID("YOUR_MACHINE_IDENTITY_ID"); + + authOptions.setAwsIam(authMethod); + settings.setAuth(authOptions); + + InfisicalClient client = new InfisicalClient(settings); +``` + ### Caching To reduce the number of API requests, the SDK temporarily stores secrets it retrieves. By default, a secret remains cached for 5 minutes after it's first fetched. Each time it's fetched again, this 5-minute timer resets. You can adjust this caching duration by setting the "cacheTTL" option when creating the client. @@ -119,6 +235,8 @@ options.setEnvironment("dev"); options.setProjectID("PROJECT_ID"); options.setPath("/foo/bar"); options.setIncludeImports(false); +options.setRecursive(false); +options.setExpandSecretReferences(true); SecretElement[] secrets = client.listSecrets(options); ``` @@ -148,6 +266,14 @@ Retrieve all secrets within the Infisical project and environment that client is Whether or not to include imported secrets from the current path. Read about [secret import](/documentation/platform/secret-reference) + + + Whether or not to fetch secrets recursively from the specified path. Please note that there's a 20-depth limit for recursive fetching. + + + + Whether or not to expand secret references in the fetched secrets. Read about [secret reference](/documentation/platform/secret-reference) + diff --git a/docs/sdks/languages/node.mdx b/docs/sdks/languages/node.mdx index 4816392ed..c626d2dcd 100644 --- a/docs/sdks/languages/node.mdx +++ b/docs/sdks/languages/node.mdx @@ -4,7 +4,7 @@ sidebarTitle: "Node.js" icon: "node" --- -If you're working with Node.js, the official [infisical-node](https://github.com/Infisical/sdk/tree/main/languages/node) package is the easiest way to fetch and work with secrets for your application. +If you're working with Node.js, the official [Infisical Node SDK](https://github.com/Infisical/sdk/tree/main/languages/node) package is the easiest way to fetch and work with secrets for your application. - [NPM Package](https://www.npmjs.com/package/@infisical/sdk) - [Github Repository](https://github.com/Infisical/sdk/tree/main/languages/node) @@ -21,14 +21,19 @@ const app = express(); const PORT = 3000; const client = new InfisicalClient({ - clientId: "YOUR_CLIENT_ID", - clientSecret: "YOUR_CLIENT_SECRET", + siteUrl: "https://app.infisical.com", // Optional, defaults to https://app.infisical.com + auth: { + universalAuth: { + clientId: "YOUR_CLIENT_ID", + clientSecret: "YOUR_CLIENT_SECRET" + } + }, logLevel: LogLevel.Error }); app.get("/", async (req, res) => { - // access value - + // Access the secret + const name = await client.getSecret({ environment: "dev", projectId: "PROJECT_ID", @@ -72,8 +77,12 @@ Import the SDK and create a client instance with your [Machine Identity](/docume import { InfisicalClient, LogLevel } from "@infisical/sdk"; const client = new InfisicalClient({ - clientId: "YOUR_CLIENT_ID", - clientSecret: "YOUR_CLIENT_SECRET", + auth: { + universalAuth: { + clientId: "YOUR_CLIENT_ID", + clientSecret: "YOUR_CLIENT_SECRET" + } + }, logLevel: LogLevel.Error }); ``` @@ -81,31 +90,40 @@ Import the SDK and create a client instance with your [Machine Identity](/docume ```js - const { InfisicalClient, LogLevel } = require("@infisical/sdk"); + const { InfisicalClient } = require("@infisical/sdk"); const client = new InfisicalClient({ - clientId: "YOUR_CLIENT_ID", - clientSecret: "YOUR_CLIENT_SECRET", - logLevel: LogLevel.Error + auth: { + universalAuth: { + clientId: "YOUR_CLIENT_ID", + clientSecret: "YOUR_CLIENT_SECRET" + } + }, }); ``` -#### Parameters +### Parameters - + Your machine identity client ID. + + **This field is deprecated and will be removed in future versions.** Please use the `auth.universalAuth.clientId` field instead. - + Your machine identity client secret. + + **This field is deprecated and will be removed in future versions.** Please use the `auth.universalAuth.clientSecret` field instead. - + An access token obtained from the machine identity login endpoint. + + **This field is deprecated and will be removed in future versions.** Please use the `auth.accessToken` field instead. @@ -119,10 +137,97 @@ Import the SDK and create a client instance with your [Machine Identity](/docume The level of logs you wish to log The logs are derived from Rust, as we have written our base SDK in Rust. + + + The authentication object to use for the client. This is required unless you're using environment variables. + + +### Authentication + +The SDK supports a variety of authentication methods. The most common authentication method is Universal Auth, which uses a client ID and client secret to authenticate. + +#### Universal Auth + +**Using environment variables** +- `INFISICAL_UNIVERSAL_AUTH_CLIENT_ID` - Your machine identity client ID. +- `INFISICAL_UNIVERSAL_AUTH_CLIENT_SECRET` - Your machine identity client secret. + +**Using the SDK directly** +```js +const client = new InfisicalClient({ + auth: { + universalAuth: { + clientId: "YOUR_CLIENT_ID", + clientSecret: "YOUR_CLIENT_SECRET" + } + } +}); +``` + +#### GCP ID Token Auth + + Please note that this authentication method will only work if you're running your application on Google Cloud Platform. + Please [read more](/documentation/platform/identities/gcp-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_GCP_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. + +**Using the SDK directly** +```js +const client = new InfisicalClient({ + auth: { + gcpIdToken: { + identityId: "YOUR_IDENTITY_ID" + } + } +}); +``` + +#### GCP IAM Auth + +**Using environment variables** +- `INFISICAL_GCP_IAM_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. +- `INFISICAL_GCP_IAM_SERVICE_ACCOUNT_KEY_FILE_PATH` - The path to your GCP service account key file. + +**Using the SDK directly** +```js +const client = new InfisicalClient({ + auth: { + gcpIam: { + identityId: "YOUR_IDENTITY_ID", + serviceAccountKeyFilePath: "./path/to/your/service-account-key.json" + } + } +}); +``` + +#### AWS IAM Auth + + Please note that this authentication method will only work if you're running your application on AWS. + Please [read more](/documentation/platform/identities/aws-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_AWS_IAM_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. + +**Using the SDK directly** +```js +const client = new InfisicalClient({ + auth: { + awsIam: { + identityId: "YOUR_IDENTITY_ID" + } + } +}); +``` + + + ### Caching To reduce the number of API requests, the SDK temporarily stores secrets it retrieves. By default, a secret remains cached for 5 minutes after it's first fetched. Each time it's fetched again, this 5-minute timer resets. You can adjust this caching duration by setting the "cacheTtl" option when creating the client. @@ -161,6 +266,14 @@ Retrieve all secrets within the Infisical project and environment that client is Whether or not to set the fetched secrets to the process environment. If true, you can access the secrets like so `process.env["SECRET_NAME"]`. + + Whether or not to fetch secrets recursively from the specified path. Please note that there's a 20-depth limit for recursive fetching. + + + + Whether or not to expand secret references in the fetched secrets. Read about [secret reference](/documentation/platform/secret-reference) + + Whether or not to include imported secrets from the current path. Read about [secret import](/documentation/platform/secret-reference) diff --git a/docs/sdks/languages/python.mdx b/docs/sdks/languages/python.mdx index 0ce221757..d0a504b1f 100644 --- a/docs/sdks/languages/python.mdx +++ b/docs/sdks/languages/python.mdx @@ -6,20 +6,24 @@ icon: "python" If you're working with Python, the official [infisical-python](https://github.com/Infisical/sdk/edit/main/crates/infisical-py) package is the easiest way to fetch and work with secrets for your application. -- [PyPi Package](https://pypi.org/project/infisical-python/) -- [Github Repository](https://github.com/Infisical/sdk/edit/main/crates/infisical-py) +- [PyPi Package](https://pypi.org/project/infisical-python/) +- [Github Repository](https://github.com/Infisical/sdk/edit/main/crates/infisical-py) ## Basic Usage ```py from flask import Flask -from infisical_client import ClientSettings, InfisicalClient, GetSecretOptions +from infisical_client import ClientSettings, InfisicalClient, GetSecretOptions, AuthenticationOptions, UniversalAuthMethod app = Flask(__name__) client = InfisicalClient(ClientSettings( - client_id="MACHINE_IDENTITY_CLIENT_ID", - client_secret="MACHINE_IDENTITY_CLIENT_SECRET", + auth=AuthenticationOptions( + universal_auth=UniversalAuthMethod( + client_id="CLIENT_ID", + client_secret="CLIENT_SECRET", + ) + ) )) @app.route("/") @@ -38,7 +42,7 @@ def hello_world(): This example demonstrates how to use the Infisical Python SDK with a Flask application. The application retrieves a secret named "NAME" and responds to requests with a greeting that includes the secret value. - We do not recommend hardcoding your [Machine Identity Tokens](/platform/identities/overview). Setting it as an environment variable would be best. + We do not recommend hardcoding your [Machine Identity Tokens](/platform/identities/overview). Setting it as an environment variable would be best. ## Installation @@ -56,11 +60,15 @@ Note: You need Python 3.7+. Import the SDK and create a client instance with your [Machine Identity](/api-reference/overview/authentication). ```py -from infisical_client import ClientSettings, InfisicalClient +from infisical_client import ClientSettings, InfisicalClient, AuthenticationOptions, UniversalAuthMethod client = InfisicalClient(ClientSettings( - client_id="MACHINE_IDENTITY_CLIENT_ID", - client_secret="MACHINE_IDENTITY_CLIENT_SECRET", + auth=AuthenticationOptions( + universal_auth=UniversalAuthMethod( + client_id="CLIENT_ID", + client_secret="CLIENT_SECRET", + ) + ) )) ``` @@ -68,14 +76,20 @@ client = InfisicalClient(ClientSettings( - + Your Infisical Client ID. + + **This field is deprecated and will be removed in future versions.** Please use the `auth` field instead. - + Your Infisical Client Secret. + + **This field is deprecated and will be removed in future versions.** Please use the `auth` field instead. - + If you want to directly pass an access token obtained from the authentication endpoints, you can do so. + + **This field is deprecated and will be removed in future versions.** Please use the `auth` field instead. @@ -85,18 +99,108 @@ client = InfisicalClient(ClientSettings( - Your self-hosted absolute site URL including the protocol (e.g. - `https://app.infisical.com`) + Your self-hosted absolute site URL including the protocol (e.g. `https://app.infisical.com`) + + + The authentication object to use for the client. This is required unless you're using environment variables. + +### Authentication + +The SDK supports a variety of authentication methods. The most common authentication method is Universal Auth, which uses a client ID and client secret to authenticate. + +#### Universal Auth + +**Using environment variables** +- `INFISICAL_UNIVERSAL_AUTH_CLIENT_ID` - Your machine identity client ID. +- `INFISICAL_UNIVERSAL_AUTH_CLIENT_SECRET` - Your machine identity client secret. + +**Using the SDK directly** +```python3 +from infisical_client import ClientSettings, InfisicalClient, AuthenticationOptions, UniversalAuthMethod + +client = InfisicalClient(ClientSettings( + auth=AuthenticationOptions( + universal_auth=UniversalAuthMethod( + client_id="CLIENT_ID", + client_secret="CLIENT_SECRET", + ) + ) +)) +``` + +#### GCP ID Token Auth + + Please note that this authentication method will only work if you're running your application on Google Cloud Platform. + Please [read more](/documentation/platform/identities/gcp-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_GCP_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. + +**Using the SDK directly** +```py +from infisical_client import ClientSettings, InfisicalClient, AuthenticationOptions, GCPIDTokenAuthMethod + +client = InfisicalClient(ClientSettings( + auth=AuthenticationOptions( + gcp_id_token=GCPIDTokenAuthMethod( + identity_id="MACHINE_IDENTITY_ID", + ) + ) +)) +``` + +#### GCP IAM Auth + +**Using environment variables** +- `INFISICAL_GCP_IAM_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. +- `INFISICAL_GCP_IAM_SERVICE_ACCOUNT_KEY_FILE_PATH` - The path to your GCP service account key file. + +**Using the SDK directly** +```py +from infisical_client import ClientSettings, InfisicalClient, AuthenticationOptions, GCPIamAuthMethod + + +client = InfisicalClient(ClientSettings( + auth=AuthenticationOptions( + gcp_iam=GCPIamAuthMethod( + identity_id="MACHINE_IDENTITY_ID", + service_account_key_file_path="./path/to/service_account_key.json" + ) + ) +)) +``` + +#### AWS IAM Auth + + Please note that this authentication method will only work if you're running your application on AWS. + Please [read more](/documentation/platform/identities/aws-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_AWS_IAM_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. + +**Using the SDK directly** +```py +from infisical_client import ClientSettings, InfisicalClient, AuthenticationOptions, AWSIamAuthMethod + +client = InfisicalClient(ClientSettings( + auth=AuthenticationOptions( + aws_iam=AWSIamAuthMethod(identity_id="MACHINE_IDENTITY_ID") + ) +)) +``` + ### Caching To reduce the number of API requests, the SDK temporarily stores secrets it retrieves. By default, a secret remains cached for 5 minutes after it's first fetched. Each time it's fetched again, this 5-minute timer resets. You can adjust this caching duration by setting the "cache_ttl" option when creating the client. @@ -133,6 +237,14 @@ Retrieve all secrets within the Infisical project and environment that client is Whether or not to set the fetched secrets to the process environment. If true, you can access the secrets like so `process.env["SECRET_NAME"]`. + + Whether or not to fetch secrets recursively from the specified path. Please note that there's a 20-depth limit for recursive fetching. + + + + Whether or not to expand secret references in the fetched secrets. Read about [secret reference](/documentation/platform/secret-reference) + + Whether or not to include imported secrets from the current path. Read about [secret import](/documentation/platform/secret-reference) @@ -156,26 +268,26 @@ By default, `getSecret()` fetches and returns a shared secret. If not found, it #### Parameters - - - The key of the secret to retrieve - - - The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. - - - The project ID where the secret lives in. - - - The path from where secret should be fetched from. - - - The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "personal". - - - Whether or not to include imported secrets from the current path. Read about [secret import](/documentation/platform/secret-reference) - - + + + The key of the secret to retrieve + + + The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. + + + The project ID where the secret lives in. + + + The path from where secret should be fetched from. + + + The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "personal". + + + Whether or not to include imported secrets from the current path. Read about [secret import](/documentation/platform/secret-reference) + + ### client.createSecret(options) @@ -194,26 +306,26 @@ Create a new secret in Infisical. #### Parameters - - - The key of the secret to create. - - - The value of the secret. - - - The project ID where the secret lives in. - - - The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. - - - The path from where secret should be created. - - - The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". - - + + + The key of the secret to create. + + + The value of the secret. + + + The project ID where the secret lives in. + + + The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. + + + The path from where secret should be created. + + + The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". + + ### client.updateSecret(options) @@ -232,26 +344,26 @@ Update an existing secret in Infisical. #### Parameters - - - The key of the secret to update. - - - The new value of the secret. - - - The project ID where the secret lives in. - - - The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. - - - The path from where secret should be updated. - - - The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". - - + + + The key of the secret to update. + + + The new value of the secret. + + + The project ID where the secret lives in. + + + The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. + + + The path from where secret should be updated. + + + The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". + + ### client.deleteSecret(options) @@ -269,23 +381,23 @@ Delete a secret in Infisical. #### Parameters - - - The key of the secret to update. - - - The project ID where the secret lives in. - - - The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. - - - The path from where secret should be deleted. - - - The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". - - + + + The key of the secret to update. + + + The project ID where the secret lives in. + + + The slug name (dev, prod, etc) of the environment from where secrets should be fetched from. + + + The path from where secret should be deleted. + + + The type of the secret. Valid options are "shared" or "personal". If not specified, the default value is "shared". + + ## Cryptography @@ -299,9 +411,11 @@ key = client.createSymmetricKey() ``` #### Returns (string) + `key` (string): A base64-encoded, 256-bit symmetric key, that can be used for encryption/decryption purposes. ### Encrypt symmetric + ```py encryptOptions = EncryptSymmetricOptions( key=key, @@ -314,22 +428,22 @@ encryptedData = client.encryptSymmetric(encryptOptions) #### Parameters - - - The plaintext you want to encrypt. - - - The symmetric key to use for encryption. - - + + + The plaintext you want to encrypt. + + + The symmetric key to use for encryption. + + #### Returns (object) -`tag` (string): A base64-encoded, 128-bit authentication tag. -`iv` (string): A base64-encoded, 96-bit initialization vector. -`ciphertext` (string): A base64-encoded, encrypted ciphertext. + +`tag` (string): A base64-encoded, 128-bit authentication tag. `iv` (string): A base64-encoded, 96-bit initialization vector. `ciphertext` (string): A base64-encoded, encrypted ciphertext. ### Decrypt symmetric + ```py decryptOptions = DecryptSymmetricOptions( ciphertext=encryptedData.ciphertext, @@ -344,22 +458,24 @@ decryptedString = client.decryptSymmetric(decryptOptions) ``` #### Parameters + - - - The ciphertext you want to decrypt. - - - The symmetric key to use for encryption. - - - The initialization vector to use for decryption. - - - The authentication tag to use for decryption. - - + + + The ciphertext you want to decrypt. + + + The symmetric key to use for encryption. + + + The initialization vector to use for decryption. + + + The authentication tag to use for decryption. + + #### Returns (string) + `plaintext` (string): The decrypted plaintext. From de2a5b4255c4b6164fe047d7d78d8c31fa7986cd Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Thu, 23 May 2024 20:30:55 +0800 Subject: [PATCH 031/101] feat: added one to one support for aws SM integration --- backend/src/lib/api-docs/constants.ts | 1 + .../server/routes/v1/integration-router.ts | 2 + .../integration-auth/integration-list.ts | 5 + .../integration-sync-secret.ts | 222 ++++++++++-------- .../src/hooks/api/integrations/queries.tsx | 1 + frontend/src/hooks/api/integrations/types.ts | 6 + .../aws-secret-manager/create.tsx | 68 ++++-- .../IntegrationsSection.tsx | 52 ++-- 8 files changed, 217 insertions(+), 140 deletions(-) diff --git a/backend/src/lib/api-docs/constants.ts b/backend/src/lib/api-docs/constants.ts index 01f0e5142..6ae5a9d33 100644 --- a/backend/src/lib/api-docs/constants.ts +++ b/backend/src/lib/api-docs/constants.ts @@ -662,6 +662,7 @@ export const INTEGRATION = { secretPrefix: "The prefix for the saved secret. Used by GCP.", secretSuffix: "The suffix for the saved secret. Used by GCP.", initialSyncBehavoir: "Type of syncing behavoir with the integration.", + mappingBehavior: "The mapping behavior of the integration.", shouldAutoRedeploy: "Used by Render to trigger auto deploy.", secretGCPLabel: "The label for GCP secrets.", secretAWSTag: "The tags for AWS secrets.", diff --git a/backend/src/server/routes/v1/integration-router.ts b/backend/src/server/routes/v1/integration-router.ts index 1fd92df3a..1aee2431d 100644 --- a/backend/src/server/routes/v1/integration-router.ts +++ b/backend/src/server/routes/v1/integration-router.ts @@ -49,6 +49,7 @@ export const registerIntegrationRouter = async (server: FastifyZodProvider) => { secretPrefix: z.string().optional().describe(INTEGRATION.CREATE.metadata.secretPrefix), secretSuffix: z.string().optional().describe(INTEGRATION.CREATE.metadata.secretSuffix), initialSyncBehavior: z.string().optional().describe(INTEGRATION.CREATE.metadata.initialSyncBehavoir), + mappingBehavior: z.string().optional().describe(INTEGRATION.CREATE.metadata.mappingBehavior), shouldAutoRedeploy: z.boolean().optional().describe(INTEGRATION.CREATE.metadata.shouldAutoRedeploy), secretGCPLabel: z .object({ @@ -160,6 +161,7 @@ export const registerIntegrationRouter = async (server: FastifyZodProvider) => { secretPrefix: z.string().optional().describe(INTEGRATION.CREATE.metadata.secretPrefix), secretSuffix: z.string().optional().describe(INTEGRATION.CREATE.metadata.secretSuffix), initialSyncBehavior: z.string().optional().describe(INTEGRATION.CREATE.metadata.initialSyncBehavoir), + mappingBehavior: z.string().optional().describe(INTEGRATION.CREATE.metadata.mappingBehavior), shouldAutoRedeploy: z.boolean().optional().describe(INTEGRATION.CREATE.metadata.shouldAutoRedeploy), secretGCPLabel: z .object({ diff --git a/backend/src/services/integration-auth/integration-list.ts b/backend/src/services/integration-auth/integration-list.ts index e49cd3862..2aaf5d5f4 100644 --- a/backend/src/services/integration-auth/integration-list.ts +++ b/backend/src/services/integration-auth/integration-list.ts @@ -43,6 +43,11 @@ export enum IntegrationInitialSyncBehavior { PREFER_SOURCE = "prefer-source" } +export enum IntegrationMappingBehavior { + ONE_TO_ONE = "one-to-one", + MANY_TO_ONE = "many-to-one" +} + export enum IntegrationUrls { // integration oauth endpoints GCP_TOKEN_URL = "https://oauth2.googleapis.com/token", diff --git a/backend/src/services/integration-auth/integration-sync-secret.ts b/backend/src/services/integration-auth/integration-sync-secret.ts index 1581eaef7..5c5500a69 100644 --- a/backend/src/services/integration-auth/integration-sync-secret.ts +++ b/backend/src/services/integration-auth/integration-sync-secret.ts @@ -30,7 +30,12 @@ import { BadRequestError } from "@app/lib/errors"; import { TCreateManySecretsRawFn, TUpdateManySecretsRawFn } from "@app/services/secret/secret-types"; import { TIntegrationDALFactory } from "../integration/integration-dal"; -import { IntegrationInitialSyncBehavior, Integrations, IntegrationUrls } from "./integration-list"; +import { + IntegrationInitialSyncBehavior, + IntegrationMappingBehavior, + Integrations, + IntegrationUrls +} from "./integration-list"; const getSecretKeyValuePair = (secrets: Record) => Object.keys(secrets).reduce>((prev, key) => { @@ -570,134 +575,145 @@ const syncSecretsAWSSecretManager = async ({ accessId: string | null; accessToken: string; }) => { - let secretsManager; - const secKeyVal = getSecretKeyValuePair(secrets); const metadata = z.record(z.any()).parse(integration.metadata || {}); - try { - if (!accessId) return; - secretsManager = new SecretsManagerClient({ - region: integration.region as string, - credentials: { - accessKeyId: accessId, - secretAccessKey: accessToken + if (!accessId) return; + + const secretsManager = new SecretsManagerClient({ + region: integration.region as string, + credentials: { + accessKeyId: accessId, + secretAccessKey: accessToken + } + }); + + const processAwsSecret = async (secretId: string, keyValuePairs: Record) => { + try { + const awsSecretManagerSecret = await secretsManager.send( + new GetSecretValueCommand({ + SecretId: secretId + }) + ); + + let awsSecretManagerSecretObj: { [key: string]: AWS.SecretsManager } = {}; + + if (awsSecretManagerSecret?.SecretString) { + awsSecretManagerSecretObj = JSON.parse(awsSecretManagerSecret.SecretString); } - }); - const awsSecretManagerSecret = await secretsManager.send( - new GetSecretValueCommand({ - SecretId: integration.app as string - }) - ); + if (!isEqual(awsSecretManagerSecretObj, keyValuePairs)) { + await secretsManager.send( + new UpdateSecretCommand({ + SecretId: secretId, + SecretString: JSON.stringify(keyValuePairs) + }) + ); + } - let awsSecretManagerSecretObj: { [key: string]: AWS.SecretsManager } = {}; + const secretAWSTag = metadata.secretAWSTag as { key: string; value: string }[] | undefined; - if (awsSecretManagerSecret?.SecretString) { - awsSecretManagerSecretObj = JSON.parse(awsSecretManagerSecret.SecretString); - } + if (secretAWSTag && secretAWSTag.length) { + const describedSecret = await secretsManager.send( + // requires secretsmanager:DescribeSecret policy + new DescribeSecretCommand({ + SecretId: secretId + }) + ); - if (!isEqual(awsSecretManagerSecretObj, secKeyVal)) { - await secretsManager.send( - new UpdateSecretCommand({ - SecretId: integration.app as string, - SecretString: JSON.stringify(secKeyVal) - }) - ); - } + if (!describedSecret.Tags) return; - const secretAWSTag = metadata.secretAWSTag as { key: string; value: string }[] | undefined; + const integrationTagObj = secretAWSTag.reduce( + (acc, item) => { + acc[item.key] = item.value; + return acc; + }, + {} as Record + ); - if (secretAWSTag && secretAWSTag.length) { - const describedSecret = await secretsManager.send( - // requires secretsmanager:DescribeSecret policy - new DescribeSecretCommand({ - SecretId: integration.app as string - }) - ); + const awsTagObj = (describedSecret.Tags || []).reduce( + (acc, item) => { + if (item.Key && item.Value) { + acc[item.Key] = item.Value; + } + return acc; + }, + {} as Record + ); - if (!describedSecret.Tags) return; + const tagsToUpdate: { Key: string; Value: string }[] = []; + const tagsToDelete: { Key: string; Value: string }[] = []; - const integrationTagObj = secretAWSTag.reduce( - (acc, item) => { - acc[item.key] = item.value; - return acc; - }, - {} as Record - ); - - const awsTagObj = (describedSecret.Tags || []).reduce( - (acc, item) => { - if (item.Key && item.Value) { - acc[item.Key] = item.Value; + describedSecret.Tags?.forEach((tag) => { + if (tag.Key && tag.Value) { + if (!(tag.Key in integrationTagObj)) { + // delete tag from AWS secret manager + tagsToDelete.push({ + Key: tag.Key, + Value: tag.Value + }); + } else if (tag.Value !== integrationTagObj[tag.Key]) { + // update tag in AWS secret manager + tagsToUpdate.push({ + Key: tag.Key, + Value: integrationTagObj[tag.Key] + }); + } } - return acc; - }, - {} as Record - ); + }); - const tagsToUpdate: { Key: string; Value: string }[] = []; - const tagsToDelete: { Key: string; Value: string }[] = []; - - describedSecret.Tags?.forEach((tag) => { - if (tag.Key && tag.Value) { - if (!(tag.Key in integrationTagObj)) { - // delete tag from AWS secret manager - tagsToDelete.push({ - Key: tag.Key, - Value: tag.Value - }); - } else if (tag.Value !== integrationTagObj[tag.Key]) { - // update tag in AWS secret manager + secretAWSTag?.forEach((tag) => { + if (!(tag.key in awsTagObj)) { + // create tag in AWS secret manager tagsToUpdate.push({ - Key: tag.Key, - Value: integrationTagObj[tag.Key] + Key: tag.key, + Value: tag.value }); } - } - }); + }); - secretAWSTag?.forEach((tag) => { - if (!(tag.key in awsTagObj)) { - // create tag in AWS secret manager - tagsToUpdate.push({ - Key: tag.key, - Value: tag.value - }); + if (tagsToUpdate.length) { + await secretsManager.send( + new TagResourceCommand({ + SecretId: secretId, + Tags: tagsToUpdate + }) + ); } - }); - if (tagsToUpdate.length) { - await secretsManager.send( - new TagResourceCommand({ - SecretId: integration.app as string, - Tags: tagsToUpdate - }) - ); + if (tagsToDelete.length) { + await secretsManager.send( + new UntagResourceCommand({ + SecretId: secretId, + TagKeys: tagsToDelete.map((tag) => tag.Key) + }) + ); + } } - - if (tagsToDelete.length) { + } catch (err) { + // case when AWS manager can't find the specified secret + if (err instanceof ResourceNotFoundException && secretsManager) { await secretsManager.send( - new UntagResourceCommand({ - SecretId: integration.app as string, - TagKeys: tagsToDelete.map((tag) => tag.Key) + new CreateSecretCommand({ + Name: secretId, + SecretString: JSON.stringify(keyValuePairs), + ...(metadata.kmsKeyId && { KmsKeyId: metadata.kmsKeyId }), + Tags: metadata.secretAWSTag + ? metadata.secretAWSTag.map((tag: { key: string; value: string }) => ({ Key: tag.key, Value: tag.value })) + : [] }) ); } } - } catch (err) { - // case when AWS manager can't find the specified secret - if (err instanceof ResourceNotFoundException && secretsManager) { - await secretsManager.send( - new CreateSecretCommand({ - Name: integration.app as string, - SecretString: JSON.stringify(secKeyVal), - ...(metadata.kmsKeyId && { KmsKeyId: metadata.kmsKeyId }), - Tags: metadata.secretAWSTag - ? metadata.secretAWSTag.map((tag: { key: string; value: string }) => ({ Key: tag.key, Value: tag.value })) - : [] - }) - ); + }; + + if (metadata.mappingBehavior === IntegrationMappingBehavior.ONE_TO_ONE) { + for await (const [key, value] of Object.entries(secrets)) { + await processAwsSecret(key, { + [key]: value.value + }); } + } else { + await processAwsSecret(integration.app as string, getSecretKeyValuePair(secrets)); } }; diff --git a/frontend/src/hooks/api/integrations/queries.tsx b/frontend/src/hooks/api/integrations/queries.tsx index 9a1ee6fbf..7325dc4a3 100644 --- a/frontend/src/hooks/api/integrations/queries.tsx +++ b/frontend/src/hooks/api/integrations/queries.tsx @@ -64,6 +64,7 @@ export const useCreateIntegration = () => { secretSuffix?: string; initialSyncBehavior?: string; shouldAutoRedeploy?: boolean; + mappingBehavior?: string; secretAWSTag?: { key: string; value: string; diff --git a/frontend/src/hooks/api/integrations/types.ts b/frontend/src/hooks/api/integrations/types.ts index 345e41b1a..21e6bff26 100644 --- a/frontend/src/hooks/api/integrations/types.ts +++ b/frontend/src/hooks/api/integrations/types.ts @@ -36,6 +36,7 @@ export type TIntegration = { metadata?: { secretSuffix?: string; syncBehavior?: IntegrationSyncBehavior; + mappingBehavior?: IntegrationMappingBehavior; scope: string; org: string; project: string; @@ -48,3 +49,8 @@ export enum IntegrationSyncBehavior { PREFER_TARGET = "prefer-target", PREFER_SOURCE = "prefer-source" } + +export enum IntegrationMappingBehavior { + ONE_TO_ONE = "one-to-one", + MANY_TO_ONE = "many-to-one" +} diff --git a/frontend/src/pages/integrations/aws-secret-manager/create.tsx b/frontend/src/pages/integrations/aws-secret-manager/create.tsx index 07daff39c..3e61baf79 100644 --- a/frontend/src/pages/integrations/aws-secret-manager/create.tsx +++ b/frontend/src/pages/integrations/aws-secret-manager/create.tsx @@ -15,6 +15,7 @@ import queryString from "query-string"; import { useCreateIntegration } from "@app/hooks/api"; import { useGetIntegrationAuthAwsKmsKeys } from "@app/hooks/api/integrationAuth/queries"; +import { IntegrationMappingBehavior } from "@app/hooks/api/integrations/types"; import { Button, @@ -70,6 +71,17 @@ const awsRegions = [ { name: "AWS GovCloud (US-West)", slug: "us-gov-west-1" } ]; +const mappingBehaviors = [ + { + label: "Many to One - secrets will be mapped to one AWS Secret", + value: IntegrationMappingBehavior.MANY_TO_ONE + }, + { + label: "One to One - secrets will be mapped to individual AWS secrets", + value: IntegrationMappingBehavior.ONE_TO_ONE + } +]; + export default function AWSSecretManagerCreateIntegrationPage() { const router = useRouter(); const { mutateAsync } = useCreateIntegration(); @@ -84,6 +96,9 @@ export default function AWSSecretManagerCreateIntegrationPage() { const [selectedSourceEnvironment, setSelectedSourceEnvironment] = useState(""); const [secretPath, setSecretPath] = useState("/"); const [selectedAWSRegion, setSelectedAWSRegion] = useState(""); + const [selectedMappingBehavior, setSelectedMappingBehavior] = useState( + IntegrationMappingBehavior.MANY_TO_ONE + ); const [targetSecretName, setTargetSecretName] = useState(""); const [targetSecretNameErrorText, setTargetSecretNameErrorText] = useState(""); const [tagKey, setTagKey] = useState(""); @@ -116,7 +131,14 @@ export default function AWSSecretManagerCreateIntegrationPage() { const handleButtonClick = async () => { try { - if (targetSecretName.trim() === "") { + if (!selectedMappingBehavior) { + return; + } + + if ( + selectedMappingBehavior === IntegrationMappingBehavior.MANY_TO_ONE && + targetSecretName.trim() === "" + ) { setTargetSecretName("Secret name cannot be blank"); return; } @@ -143,7 +165,8 @@ export default function AWSSecretManagerCreateIntegrationPage() { ] } : {}), - ...(kmsKeyId && { kmsKeyId }) + ...(kmsKeyId && { kmsKeyId }), + mappingBehavior: selectedMappingBehavior } }); @@ -248,19 +271,36 @@ export default function AWSSecretManagerCreateIntegrationPage() { ))} - - setTargetSecretName(e.target.value)} - /> + + + {selectedMappingBehavior === IntegrationMappingBehavior.MANY_TO_ONE && ( + + setTargetSecretName(e.target.value)} + /> + + )} diff --git a/frontend/src/views/IntegrationsPage/components/IntegrationsSection/IntegrationsSection.tsx b/frontend/src/views/IntegrationsPage/components/IntegrationsSection/IntegrationsSection.tsx index a6e3a45e7..267ff8580 100644 --- a/frontend/src/views/IntegrationsPage/components/IntegrationsSection/IntegrationsSection.tsx +++ b/frontend/src/views/IntegrationsPage/components/IntegrationsSection/IntegrationsSection.tsx @@ -21,6 +21,7 @@ import { import { ProjectPermissionActions, ProjectPermissionSub } from "@app/context"; import { usePopUp } from "@app/hooks"; import { useSyncIntegration } from "@app/hooks/api/integrations/queries"; +import { IntegrationMappingBehavior } from "@app/hooks/api/integrations/types"; import { TIntegration } from "@app/hooks/api/types"; type Props = { @@ -131,30 +132,35 @@ export const IntegrationsSection = ({

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�nTlqvJ;d2D31*ViP3u-KQ+(E@e018 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

)} -
- -
- {(integration.integration === "hashicorp-vault" && - `${integration.app} - path: ${integration.path}`) || - (integration.scope === "github-org" && `${integration.owner}`) || - (integration.integration === "aws-parameter-store" && - `${integration.path}`) || - (integration.scope?.startsWith("github-") && - `${integration.owner}/${integration.app}`) || - integration.app} + {!( + integration.integration === "aws-secret-manager" && + integration.metadata?.mappingBehavior === IntegrationMappingBehavior.ONE_TO_ONE + ) && ( +
+ +
+ {(integration.integration === "hashicorp-vault" && + `${integration.app} - path: ${integration.path}`) || + (integration.scope === "github-org" && `${integration.owner}`) || + (integration.integration === "aws-parameter-store" && + `${integration.path}`) || + (integration.scope?.startsWith("github-") && + `${integration.owner}/${integration.app}`) || + integration.app} +
-
+ )} {(integration.integration === "vercel" || integration.integration === "netlify" || integration.integration === "railway" || From b75d601754856371ecab421d723118a12a51467f Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Thu, 23 May 2024 21:03:48 +0800 Subject: [PATCH 032/101] misc: documentation changes and minor UI adjustments --- ...integrations-aws-secret-manager-create.png | Bin 165766 -> 145118 bytes .../integrations/cloud/aws-secret-manager.mdx | 3 +++ .../aws-secret-manager/create.tsx | 12 ++++++++---- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/images/integrations/aws/integrations-aws-secret-manager-create.png b/docs/images/integrations/aws/integrations-aws-secret-manager-create.png index 21f2213ef30981b0354f4aeac720d16da40976bf..e43cfbf9ef6f9f67bf9b3a8226f1860327c736ce 100644 GIT binary patch literal 145118 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%0DTa~z9qG7Uatd@`F%lUj!;-w!jHm%hg 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

*GNC9WU6w*dg8dkcv6O?p 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Ǐ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 qvIu&M{;=vFR{eh=Rm-sZMi$w>OyBf}A The region that you want to integrate with in AWS Secrets Manager. + + How you want the integration to map the secrets. The selected value could be either one to one or one to many. + The secret name/path in AWS into which you want to sync the secrets from Infisical. diff --git a/frontend/src/pages/integrations/aws-secret-manager/create.tsx b/frontend/src/pages/integrations/aws-secret-manager/create.tsx index 3e61baf79..2c04702e1 100644 --- a/frontend/src/pages/integrations/aws-secret-manager/create.tsx +++ b/frontend/src/pages/integrations/aws-secret-manager/create.tsx @@ -73,11 +73,11 @@ const awsRegions = [ const mappingBehaviors = [ { - label: "Many to One - secrets will be mapped to one AWS Secret", + label: "Many to One (All Infisical secrets will be mapped to a single AWS secret)", value: IntegrationMappingBehavior.MANY_TO_ONE }, { - label: "One to One - secrets will be mapped to individual AWS secrets", + label: "One to One - (Each Infisical secret will be mapped to its own AWS secret)", value: IntegrationMappingBehavior.ONE_TO_ONE } ]; @@ -277,10 +277,14 @@ export default function AWSSecretManagerCreateIntegrationPage() { onValueChange={(val) => { setSelectedMappingBehavior(val as IntegrationMappingBehavior); }} - className="w-full border border-mineshaft-500" + className="w-full border border-mineshaft-500 text-left" > {mappingBehaviors.map((option) => ( - + {option.label} ))} From 290d99e02cf40b7afb791653ee46e1aab7686e3f Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Thu, 23 May 2024 15:11:20 +0200 Subject: [PATCH 033/101] Fix: No orgs selectable if a user has been removed from an organization --- frontend/src/pages/login/select-organization.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/src/pages/login/select-organization.tsx b/frontend/src/pages/login/select-organization.tsx index de866a323..22006408e 100644 --- a/frontend/src/pages/login/select-organization.tsx +++ b/frontend/src/pages/login/select-organization.tsx @@ -121,6 +121,14 @@ export default function LoginPage() { } }, [router]); + // Case: User has no organizations. + // This can happen if the user was previously a member, but the organization was deleted or the user was removed. + useEffect(() => { + if (!organizations.isLoading && organizations.data?.length === 0) { + router.push("/org/none"); + } + }, [organizations.isLoading, organizations.data]); + if (userLoading || !user) { return ; } From 68d1849ba050dbdeedc2020ce24c36e9caa0d90d Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Thu, 23 May 2024 15:47:08 +0200 Subject: [PATCH 034/101] Fix: Better error message on project not found during bot lookup --- .../src/services/project-bot/project-bot-fns.ts | 16 +++++++++++++--- .../services/project-bot/project-bot-service.ts | 2 +- backend/src/services/secret/secret-fns.ts | 4 ++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/backend/src/services/project-bot/project-bot-fns.ts b/backend/src/services/project-bot/project-bot-fns.ts index 3f22b8704..44bb59209 100644 --- a/backend/src/services/project-bot/project-bot-fns.ts +++ b/backend/src/services/project-bot/project-bot-fns.ts @@ -3,6 +3,7 @@ import { decryptAsymmetric, infisicalSymmetricDecrypt } from "@app/lib/crypto/en import { BadRequestError } from "@app/lib/errors"; import { TProjectBotDALFactory } from "@app/services/project-bot/project-bot-dal"; +import { TProjectDALFactory } from "../project/project-dal"; import { TGetPrivateKeyDTO } from "./project-bot-types"; export const getBotPrivateKey = ({ bot }: TGetPrivateKeyDTO) => @@ -13,11 +14,20 @@ export const getBotPrivateKey = ({ bot }: TGetPrivateKeyDTO) => ciphertext: bot.encryptedPrivateKey }); -export const getBotKeyFnFactory = (projectBotDAL: TProjectBotDALFactory) => { +export const getBotKeyFnFactory = ( + projectBotDAL: TProjectBotDALFactory, + projectDAL: Pick +) => { const getBotKeyFn = async (projectId: string) => { - const bot = await projectBotDAL.findOne({ projectId }); + const project = await projectDAL.findById(projectId); + if (!project) + throw new BadRequestError({ + message: "Project not found during bot lookup." + }); - if (!bot) throw new BadRequestError({ message: "failed to find bot key" }); + const bot = await projectBotDAL.findOne({ projectId: project.id }); + + if (!bot) throw new BadRequestError({ message: "Failed to find bot key" }); if (!bot.isActive) throw new BadRequestError({ message: "Bot is not active" }); if (!bot.encryptedProjectKeyNonce || !bot.encryptedProjectKey) throw new BadRequestError({ message: "Encryption key missing" }); diff --git a/backend/src/services/project-bot/project-bot-service.ts b/backend/src/services/project-bot/project-bot-service.ts index 23667ef67..ce7782a80 100644 --- a/backend/src/services/project-bot/project-bot-service.ts +++ b/backend/src/services/project-bot/project-bot-service.ts @@ -25,7 +25,7 @@ export const projectBotServiceFactory = ({ projectDAL, permissionService }: TProjectBotServiceFactoryDep) => { - const getBotKeyFn = getBotKeyFnFactory(projectBotDAL); + const getBotKeyFn = getBotKeyFnFactory(projectBotDAL, projectDAL); const getBotKey = async (projectId: string) => { return getBotKeyFn(projectId); diff --git a/backend/src/services/secret/secret-fns.ts b/backend/src/services/secret/secret-fns.ts index 6b2b50920..51ad7a6aa 100644 --- a/backend/src/services/secret/secret-fns.ts +++ b/backend/src/services/secret/secret-fns.ts @@ -608,7 +608,7 @@ export const createManySecretsRawFnFactory = ({ secretVersionTagDAL, folderDAL }: TCreateManySecretsRawFnFactory) => { - const getBotKeyFn = getBotKeyFnFactory(projectBotDAL); + const getBotKeyFn = getBotKeyFnFactory(projectBotDAL, projectDAL); const createManySecretsRawFn = async ({ projectId, environment, @@ -706,7 +706,7 @@ export const updateManySecretsRawFnFactory = ({ secretVersionTagDAL, folderDAL }: TUpdateManySecretsRawFnFactory) => { - const getBotKeyFn = getBotKeyFnFactory(projectBotDAL); + const getBotKeyFn = getBotKeyFnFactory(projectBotDAL, projectDAL); const updateManySecretsRawFn = async ({ projectId, environment, From 62301677948f07b7b20a5afa6fac89c3467dae9e Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Thu, 23 May 2024 15:48:54 +0200 Subject: [PATCH 035/101] Update project-bot-fns.ts --- backend/src/services/project-bot/project-bot-fns.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/backend/src/services/project-bot/project-bot-fns.ts b/backend/src/services/project-bot/project-bot-fns.ts index 44bb59209..00604b37f 100644 --- a/backend/src/services/project-bot/project-bot-fns.ts +++ b/backend/src/services/project-bot/project-bot-fns.ts @@ -20,10 +20,7 @@ export const getBotKeyFnFactory = ( ) => { const getBotKeyFn = async (projectId: string) => { const project = await projectDAL.findById(projectId); - if (!project) - throw new BadRequestError({ - message: "Project not found during bot lookup." - }); + if (!project) throw new BadRequestError({ message: "Project not found during bot lookup." }); const bot = await projectBotDAL.findOne({ projectId: project.id }); From b0bc41da1476e0f65788affae48ab51efa193fa7 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Thu, 23 May 2024 22:18:24 +0800 Subject: [PATCH 036/101] misc: finalized schema type --- backend/src/server/routes/v1/integration-router.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/src/server/routes/v1/integration-router.ts b/backend/src/server/routes/v1/integration-router.ts index 1aee2431d..f23abc45b 100644 --- a/backend/src/server/routes/v1/integration-router.ts +++ b/backend/src/server/routes/v1/integration-router.ts @@ -8,6 +8,7 @@ import { writeLimit } from "@app/server/config/rateLimiter"; import { getTelemetryDistinctId } from "@app/server/lib/telemetry"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; +import { IntegrationMappingBehavior } from "@app/services/integration-auth/integration-list"; import { PostHogEventTypes, TIntegrationCreatedEvent } from "@app/services/telemetry/telemetry-types"; export const registerIntegrationRouter = async (server: FastifyZodProvider) => { @@ -49,7 +50,10 @@ export const registerIntegrationRouter = async (server: FastifyZodProvider) => { secretPrefix: z.string().optional().describe(INTEGRATION.CREATE.metadata.secretPrefix), secretSuffix: z.string().optional().describe(INTEGRATION.CREATE.metadata.secretSuffix), initialSyncBehavior: z.string().optional().describe(INTEGRATION.CREATE.metadata.initialSyncBehavoir), - mappingBehavior: z.string().optional().describe(INTEGRATION.CREATE.metadata.mappingBehavior), + mappingBehavior: z + .nativeEnum(IntegrationMappingBehavior) + .optional() + .describe(INTEGRATION.CREATE.metadata.mappingBehavior), shouldAutoRedeploy: z.boolean().optional().describe(INTEGRATION.CREATE.metadata.shouldAutoRedeploy), secretGCPLabel: z .object({ From e7c5645aa970502191dd8a4faf8f59a0e7c80160 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Fri, 24 May 2024 00:35:55 +0800 Subject: [PATCH 037/101] misc: made aws sm mapping one to one plaintext --- .../integration-sync-secret.ts | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/backend/src/services/integration-auth/integration-sync-secret.ts b/backend/src/services/integration-auth/integration-sync-secret.ts index 5c5500a69..40d51c81a 100644 --- a/backend/src/services/integration-auth/integration-sync-secret.ts +++ b/backend/src/services/integration-auth/integration-sync-secret.ts @@ -587,7 +587,10 @@ const syncSecretsAWSSecretManager = async ({ } }); - const processAwsSecret = async (secretId: string, keyValuePairs: Record) => { + const processAwsSecret = async ( + secretId: string, + secretValue: Record | string + ) => { try { const awsSecretManagerSecret = await secretsManager.send( new GetSecretValueCommand({ @@ -595,17 +598,20 @@ const syncSecretsAWSSecretManager = async ({ }) ); - let awsSecretManagerSecretObj: { [key: string]: AWS.SecretsManager } = {}; - + let secretToCompare; if (awsSecretManagerSecret?.SecretString) { - awsSecretManagerSecretObj = JSON.parse(awsSecretManagerSecret.SecretString); + if (typeof secretValue === "string") { + secretToCompare = awsSecretManagerSecret.SecretString; + } else { + secretToCompare = JSON.parse(awsSecretManagerSecret.SecretString); + } } - if (!isEqual(awsSecretManagerSecretObj, keyValuePairs)) { + if (!isEqual(secretToCompare, secretValue)) { await secretsManager.send( new UpdateSecretCommand({ SecretId: secretId, - SecretString: JSON.stringify(keyValuePairs) + SecretString: typeof secretValue === "string" ? secretValue : JSON.stringify(secretValue) }) ); } @@ -695,7 +701,7 @@ const syncSecretsAWSSecretManager = async ({ await secretsManager.send( new CreateSecretCommand({ Name: secretId, - SecretString: JSON.stringify(keyValuePairs), + SecretString: typeof secretValue === "string" ? secretValue : JSON.stringify(secretValue), ...(metadata.kmsKeyId && { KmsKeyId: metadata.kmsKeyId }), Tags: metadata.secretAWSTag ? metadata.secretAWSTag.map((tag: { key: string; value: string }) => ({ Key: tag.key, Value: tag.value })) @@ -708,9 +714,7 @@ const syncSecretsAWSSecretManager = async ({ if (metadata.mappingBehavior === IntegrationMappingBehavior.ONE_TO_ONE) { for await (const [key, value] of Object.entries(secrets)) { - await processAwsSecret(key, { - [key]: value.value - }); + await processAwsSecret(key, value.value); } } else { await processAwsSecret(integration.app as string, getSecretKeyValuePair(secrets)); From 133841c322b151ba0355d14b2aedffb0e1e92214 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Fri, 24 May 2024 01:55:59 +0800 Subject: [PATCH 038/101] doc: added reminder for oauth user permissions --- .../integrations/cloud/gcp-secret-manager.mdx | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/docs/integrations/cloud/gcp-secret-manager.mdx b/docs/integrations/cloud/gcp-secret-manager.mdx index 0f21a6a9d..6425acff6 100644 --- a/docs/integrations/cloud/gcp-secret-manager.mdx +++ b/docs/integrations/cloud/gcp-secret-manager.mdx @@ -51,6 +51,8 @@ description: "How to sync secrets from Infisical to GCP Secret Manager" Using Infisical to sync secrets to GCP Secret Manager requires that you enable the Service Usage API and Cloud Resource Manager API in the Google Cloud project you want to sync secrets to. More on that [here](https://cloud.google.com/service-usage/docs/set-up-development-environment). + + Additionally, ensure that your GCP account has the right roles for the selected project (Secrets Manager Admin and Service Usage Admin) @@ -115,6 +117,7 @@ description: "How to sync secrets from Infisical to GCP Secret Manager" + Using the GCP Secret Manager integration (via the OAuth2 method) on a self-hosted instance of Infisical requires configuring an OAuth2 application in GCP @@ -123,27 +126,27 @@ description: "How to sync secrets from Infisical to GCP Secret Manager" Navigate to your project API & Services > Credentials to create a new OAuth2 application. - - ![integrations GCP secret manager config](../../images/integrations/gcp-secret-manager/integrations-gcp-secret-manager-config-api-services.png) - ![integrations GCP secret manager config](../../images/integrations/gcp-secret-manager/integrations-gcp-secret-manager-config-new-app.png) - + + ![integrations GCP secret manager config](../../images/integrations/gcp-secret-manager/integrations-gcp-secret-manager-config-api-services.png) + ![integrations GCP secret manager config](../../images/integrations/gcp-secret-manager/integrations-gcp-secret-manager-config-new-app.png) + Create the application. As part of the form, add to **Authorized redirect URIs**: `https://your-domain.com/integrations/gcp-secret-manager/oauth2/callback`. - - ![integrations GCP secret manager config](../../images/integrations/gcp-secret-manager/integrations-gcp-secret-manager-config-new-app-form.png) + + ![integrations GCP secret manager config](../../images/integrations/gcp-secret-manager/integrations-gcp-secret-manager-config-new-app-form.png) Obtain the **Client ID** and **Client Secret** for your GCP OAuth2 application. - - ![integrations GCP secret manager config](../../images/integrations/gcp-secret-manager/integrations-gcp-secret-manager-config-credentials.png) - + + ![integrations GCP secret manager config](../../images/integrations/gcp-secret-manager/integrations-gcp-secret-manager-config-credentials.png) + Back in your Infisical instance, add two new environment variables for the credentials of your GCP OAuth2 application: - `CLIENT_ID_GCP_SECRET_MANAGER`: The **Client ID** of your GCP OAuth2 application. - `CLIENT_SECRET_GCP_SECRET_MANAGER`: The **Client Secret** of your GCP OAuth2 application. - + Once added, restart your Infisical instance and use the GCP Secret Manager integration. + - From 8497182a7b0489262b7ff4560b899fc2fb0311fe Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Fri, 24 May 2024 02:11:03 +0800 Subject: [PATCH 039/101] misc: finalized addition --- docs/integrations/cloud/gcp-secret-manager.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations/cloud/gcp-secret-manager.mdx b/docs/integrations/cloud/gcp-secret-manager.mdx index 6425acff6..42dc3701d 100644 --- a/docs/integrations/cloud/gcp-secret-manager.mdx +++ b/docs/integrations/cloud/gcp-secret-manager.mdx @@ -52,7 +52,7 @@ description: "How to sync secrets from Infisical to GCP Secret Manager" Using Infisical to sync secrets to GCP Secret Manager requires that you enable the Service Usage API and Cloud Resource Manager API in the Google Cloud project you want to sync secrets to. More on that [here](https://cloud.google.com/service-usage/docs/set-up-development-environment). - Additionally, ensure that your GCP account has the right roles for the selected project (Secrets Manager Admin and Service Usage Admin) + Additionally, ensure that your GCP account has sufficient permission to manage secret and service resources (you can assign Secret Manager Admin and Service Usage Admin roles) From c9b234dbea1a49bdc60f4a9b706a60bf030cb2f3 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Fri, 24 May 2024 17:42:38 +0800 Subject: [PATCH 040/101] fix: address json drag behavior --- .../SecretMainPage/components/SecretDropzone/SecretDropzone.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/views/SecretMainPage/components/SecretDropzone/SecretDropzone.tsx b/frontend/src/views/SecretMainPage/components/SecretDropzone/SecretDropzone.tsx index 0155e5b31..98ffb0862 100644 --- a/frontend/src/views/SecretMainPage/components/SecretDropzone/SecretDropzone.tsx +++ b/frontend/src/views/SecretMainPage/components/SecretDropzone/SecretDropzone.tsx @@ -152,7 +152,7 @@ export const SecretDropzone = ({ e.dataTransfer.dropEffect = "copy"; setDragActive.off(); - parseFile(e.dataTransfer.files[0]); + parseFile(e.dataTransfer.files[0], e.dataTransfer.files[0].type === "application/json"); }; const handleFileUpload = (e: ChangeEvent) => { From 008b37c0f41a7e032e63f800673cc1ee3f4f40a2 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Fri, 24 May 2024 19:45:20 +0800 Subject: [PATCH 041/101] fix: resolved cloudflare pages integration --- .../integration-sync-secret.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/backend/src/services/integration-auth/integration-sync-secret.ts b/backend/src/services/integration-auth/integration-sync-secret.ts index 40d51c81a..587f6c6a8 100644 --- a/backend/src/services/integration-auth/integration-sync-secret.ts +++ b/backend/src/services/integration-auth/integration-sync-secret.ts @@ -2696,18 +2696,21 @@ const syncSecretsCloudflarePages = async ({ }) ).data.result.deployment_configs[integration.targetEnvironment as string].env_vars; - // copy the secrets object, so we can set deleted keys to null - const secretsObj = Object.fromEntries( - Object.entries(getSecretKeyValuePair(secrets)).map(([key, val]) => [ - key, - key in Object.keys(getSecretsRes) ? { type: "secret_text", value: val } : null - ]) - ); + let secretEntries: [string, object | null][] = Object.entries(getSecretKeyValuePair(secrets)).map(([key, val]) => [ + key, + { type: "secret_text", value: val } + ]); + + if (getSecretsRes) { + const toDeleteKeys = Object.keys(getSecretsRes).filter((key) => !Object.keys(secrets).includes(key)); + const toDeleteEntries: [string, null][] = toDeleteKeys.map((key) => [key, null]); + secretEntries = [...secretEntries, ...toDeleteEntries]; + } const data = { deployment_configs: { [integration.targetEnvironment as string]: { - env_vars: secretsObj + env_vars: Object.fromEntries(secretEntries) } } }; From efe10e361f047ace0febc7c489a80686fce117bd Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Fri, 24 May 2024 22:14:32 +0800 Subject: [PATCH 042/101] feat: added personal overrides and support for secret ref to download envs --- frontend/src/helpers/secret.ts | 175 ++++++++++++++++++ frontend/src/hooks/api/secrets/queries.tsx | 2 +- .../components/ActionBar/ActionBar.tsx | 48 ++++- 3 files changed, 216 insertions(+), 9 deletions(-) create mode 100644 frontend/src/helpers/secret.ts diff --git a/frontend/src/helpers/secret.ts b/frontend/src/helpers/secret.ts new file mode 100644 index 000000000..607fa4268 --- /dev/null +++ b/frontend/src/helpers/secret.ts @@ -0,0 +1,175 @@ +import path from "path"; + +import { decryptSymmetric } from "@app/components/utilities/cryptography/crypto"; +import { fetchProjectEncryptedSecrets } from "@app/hooks/api/secrets/queries"; + +const INTERPOLATION_SYNTAX_REG = /\${([^}]+)}/g; +export const interpolateSecrets = ({ + projectId, + secretEncKey +}: { + projectId: string; + secretEncKey: string; +}) => { + const fetchSecretsCrossEnv = () => { + const fetchCache: Record> = {}; + + return async (secRefEnv: string, secRefPath: string[], secRefKey: string) => { + const secRefPathUrl = path.join("/", ...secRefPath); + const uniqKey = `${secRefEnv}-${secRefPathUrl}`; + + if (fetchCache?.[uniqKey]) { + return fetchCache[uniqKey][secRefKey]; + } + + // get secrets by projectId, env, path + const encryptedSecrets = await fetchProjectEncryptedSecrets({ + workspaceId: projectId, + environment: secRefEnv, + secretPath: secRefPathUrl + }); + + const decryptedSec = encryptedSecrets.reduce>((prev, secret) => { + const secretKey = decryptSymmetric({ + ciphertext: secret.secretKeyCiphertext, + iv: secret.secretKeyIV, + tag: secret.secretKeyTag, + key: secretEncKey + }); + const secretValue = decryptSymmetric({ + ciphertext: secret.secretValueCiphertext, + iv: secret.secretValueIV, + tag: secret.secretValueTag, + key: secretEncKey + }); + + // eslint-disable-next-line + prev[secretKey] = secretValue; + return prev; + }, {}); + + fetchCache[uniqKey] = decryptedSec; + + return fetchCache[uniqKey][secRefKey]; + }; + }; + + const recursivelyExpandSecret = async ( + expandedSec: Record, + interpolatedSec: Record, + fetchCrossEnv: (env: string, secPath: string[], secKey: string) => Promise, + recursionChainBreaker: Record, + key: string + ) => { + if (expandedSec?.[key] !== undefined) { + return expandedSec[key]; + } + if (recursionChainBreaker?.[key]) { + return ""; + } + // eslint-disable-next-line + recursionChainBreaker[key] = true; + + let interpolatedValue = interpolatedSec[key]; + if (!interpolatedValue) { + // eslint-disable-next-line no-console + console.error(`Couldn't find referenced value - ${key}`); + return ""; + } + + const refs = interpolatedValue.match(INTERPOLATION_SYNTAX_REG); + if (refs) { + await Promise.all( + refs.map(async (interpolationSyntax) => { + const interpolationKey = interpolationSyntax.slice(2, interpolationSyntax.length - 1); + const entities = interpolationKey.trim().split("."); + + if (entities.length === 1) { + const val = await recursivelyExpandSecret( + expandedSec, + interpolatedSec, + fetchCrossEnv, + recursionChainBreaker, + interpolationKey + ); + if (val) { + interpolatedValue = interpolatedValue.replaceAll(interpolationSyntax, val); + } + return; + } + + if (entities.length > 1) { + const secRefEnv = entities[0]; + const secRefPath = entities.slice(1, entities.length - 1); + const secRefKey = entities[entities.length - 1]; + + const val = await fetchCrossEnv(secRefEnv, secRefPath, secRefKey); + if (val) { + interpolatedValue = interpolatedValue.replaceAll(interpolationSyntax, val); + } + } + }) + ); + } + + // eslint-disable-next-line + expandedSec[key] = interpolatedValue; + return interpolatedValue; + }; + + // used to convert multi line ones to quotes ones with \n + const formatMultiValueEnv = (val?: string) => { + if (!val) return ""; + if (!val.match("\n")) return val; + return `"${val.replace(/\n/g, "\\n")}"`; + }; + + const expandSecrets = async ( + secrets: Record + ) => { + const expandedSec: Record = {}; + const interpolatedSec: Record = {}; + + const crossSecEnvFetch = fetchSecretsCrossEnv(); + + Object.keys(secrets).forEach((key) => { + if (secrets[key].value.match(INTERPOLATION_SYNTAX_REG)) { + interpolatedSec[key] = secrets[key].value; + } else { + expandedSec[key] = secrets[key].value; + } + }); + + await Promise.all( + Object.keys(secrets).map(async (key) => { + if (expandedSec?.[key]) { + // should not do multi line encoding if user has set it to skip + // eslint-disable-next-line + secrets[key].value = secrets[key].skipMultilineEncoding + ? expandedSec[key] + : formatMultiValueEnv(expandedSec[key]); + return; + } + + // this is to avoid recursion loop. So the graph should be direct graph rather than cyclic + // so for any recursion building if there is an entity two times same key meaning it will be looped + const recursionChainBreaker: Record = {}; + const expandedVal = await recursivelyExpandSecret( + expandedSec, + interpolatedSec, + crossSecEnvFetch, + recursionChainBreaker, + key + ); + + // eslint-disable-next-line + secrets[key].value = secrets[key].skipMultilineEncoding + ? expandedVal + : formatMultiValueEnv(expandedVal); + }) + ); + + return secrets; + }; + return expandSecrets; +}; diff --git a/frontend/src/hooks/api/secrets/queries.tsx b/frontend/src/hooks/api/secrets/queries.tsx index 1ba9a5251..28999389e 100644 --- a/frontend/src/hooks/api/secrets/queries.tsx +++ b/frontend/src/hooks/api/secrets/queries.tsx @@ -98,7 +98,7 @@ export const decryptSecrets = ( return secrets; }; -const fetchProjectEncryptedSecrets = async ({ +export const fetchProjectEncryptedSecrets = async ({ workspaceId, environment, secretPath diff --git a/frontend/src/views/SecretMainPage/components/ActionBar/ActionBar.tsx b/frontend/src/views/SecretMainPage/components/ActionBar/ActionBar.tsx index 61c7cf8c0..9b235867b 100644 --- a/frontend/src/views/SecretMainPage/components/ActionBar/ActionBar.tsx +++ b/frontend/src/views/SecretMainPage/components/ActionBar/ActionBar.tsx @@ -23,6 +23,7 @@ import { twMerge } from "tailwind-merge"; import { createNotification } from "@app/components/notifications"; import { ProjectPermissionCan } from "@app/components/permissions"; +import { decryptAssymmetric } from "@app/components/utilities/cryptography/crypto"; import { Button, DeleteActionModal, @@ -43,8 +44,9 @@ import { UpgradePlanModal } from "@app/components/v2"; import { ProjectPermissionActions, ProjectPermissionSub, useSubscription } from "@app/context"; +import { interpolateSecrets } from "@app/helpers/secret"; import { usePopUp } from "@app/hooks"; -import { useCreateFolder, useDeleteSecretBatch } from "@app/hooks/api"; +import { useCreateFolder, useDeleteSecretBatch, useGetUserWsKey } from "@app/hooks/api"; import { DecryptedSecret, TImportedSecrets, WsTag } from "@app/hooks/api/types"; import { debounce } from "@app/lib/fn/debounce"; @@ -112,6 +114,7 @@ export const ActionBar = ({ const { mutateAsync: createFolder } = useCreateFolder(); const { mutateAsync: deleteBatchSecretV3 } = useDeleteSecretBatch(); + const { data: decryptFileKey } = useGetUserWsKey(workspaceId); const selectedSecrets = useSelectedSecrets(); const { reset: resetSelectedSecret } = useSelectedSecretActions(); @@ -144,30 +147,59 @@ export const ActionBar = ({ const handleSecretDownload = async () => { const secPriority: Record = {}; const downloadedSecrets: Array<{ key: string; value: string; comment?: string }> = []; + + const PRIVATE_KEY = localStorage.getItem("PRIVATE_KEY") as string; + const workspaceKey = decryptAssymmetric({ + ciphertext: decryptFileKey!.encryptedKey, + nonce: decryptFileKey!.nonce, + publicKey: decryptFileKey!.sender.publicKey, + privateKey: PRIVATE_KEY + }); + + const expandSecrets = interpolateSecrets({ + projectId: workspaceId, + secretEncKey: workspaceKey + }); + + const secretRecord: Record< + string, + { value: string; comment?: string; skipMultilineEncoding?: boolean } + > = {}; + // load up secrets in dashboard - secrets?.forEach(({ key, value, comment }) => { + secrets?.forEach(({ key, value, valueOverride, comment }) => { secPriority[key] = true; - downloadedSecrets.push({ key, value, comment }); + downloadedSecrets.push({ key, value: valueOverride || value, comment }); }); // now load imported secrets with secPriority for (let i = importedSecrets.length - 1; i >= 0; i -= 1) { - importedSecrets[i].secrets.forEach(({ key, value, comment }) => { + importedSecrets[i].secrets.forEach(({ key, value, valueOverride, comment }) => { if (secPriority?.[key]) return; - downloadedSecrets.unshift({ key, value, comment }); + downloadedSecrets.unshift({ key, value: valueOverride || value, comment }); secPriority[key] = true; }); } + downloadedSecrets.forEach((secret) => { + secretRecord[secret.key] = { + value: secret.value, + comment: secret.comment + }; + }); + + await expandSecrets(secretRecord); + const file = downloadedSecrets .sort((a, b) => a.key.toLowerCase().localeCompare(b.key.toLowerCase())) .reduce( - (prev, { key, value, comment }, index) => + (prev, { key, comment }, index) => prev + (comment - ? `${index === 0 ? "#" : "\n#"} ${comment}\n${key}=${value}\n` - : `${key}=${value}\n`), + ? `${index === 0 ? "#" : "\n#"} ${comment}\n${key}=${secretRecord[key].value}\n` + : `${key}=${secretRecord[key].value}\n`), "" ); + const blob = new Blob([file], { type: "text/plain;charset=utf-8" }); FileSaver.saveAs(blob, `${environment}.env`); }; From c0daa11aeb310acf33093d03817af83ea49d05b2 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Fri, 24 May 2024 23:45:16 +0800 Subject: [PATCH 043/101] misc: addressed PR comments --- backend/src/db/schemas/users.ts | 9 +-- backend/src/server/routes/v1/user-router.ts | 2 +- backend/src/services/auth/auth-fns.ts | 2 +- .../src/services/auth/auth-login-service.ts | 61 ++++++++++++++++--- .../services/auth/auth-password-service.ts | 5 ++ backend/src/services/user/user-dal.ts | 16 ++++- backend/src/services/user/user-fns.ts | 53 ---------------- 7 files changed, 79 insertions(+), 69 deletions(-) diff --git a/backend/src/db/schemas/users.ts b/backend/src/db/schemas/users.ts index 935351d33..c10af4ba4 100644 --- a/backend/src/db/schemas/users.ts +++ b/backend/src/db/schemas/users.ts @@ -23,14 +23,11 @@ export const UsersSchema = z.object({ isGhost: z.boolean().default(false), username: z.string(), isEmailVerified: z.boolean().default(false).nullable().optional(), - consecutiveFailedMfaAttempts: z.number(), - isLocked: z.boolean(), + consecutiveFailedMfaAttempts: z.number().optional(), + isLocked: z.boolean().optional(), temporaryLockDateEnd: z.date().nullable().optional() }); export type TUsers = z.infer; -export type TUsersInsert = Omit< - z.input, - TImmutableDBKeys | "isLocked" | "consecutiveFailedMfaAttempts" ->; +export type TUsersInsert = Omit, TImmutableDBKeys>; export type TUsersUpdate = Partial, TImmutableDBKeys>>; diff --git a/backend/src/server/routes/v1/user-router.ts b/backend/src/server/routes/v1/user-router.ts index 0253ac86b..3d9f531b9 100644 --- a/backend/src/server/routes/v1/user-router.ts +++ b/backend/src/server/routes/v1/user-router.ts @@ -32,7 +32,7 @@ export const registerUserRouter = async (server: FastifyZodProvider) => { server.route({ method: "GET", - url: "/:userId/unlock-verify", + url: "/:userId/unlock", config: { rateLimit: authRateLimit }, diff --git a/backend/src/services/auth/auth-fns.ts b/backend/src/services/auth/auth-fns.ts index 036d9068e..30297e605 100644 --- a/backend/src/services/auth/auth-fns.ts +++ b/backend/src/services/auth/auth-fns.ts @@ -50,7 +50,7 @@ export const enforceUserLockStatus = (isLocked: boolean, temporaryLockDateEnd?: throw new UnauthorizedError({ name: "User Locked", message: - "User is locked due to multiple failed login attempts. An email has been sent to you in order to unlock your account." + "User is locked due to multiple failed login attempts. An email has been sent to you in order to unlock your account. You can also reset your password to unlock." }); } diff --git a/backend/src/services/auth/auth-login-service.ts b/backend/src/services/auth/auth-login-service.ts index 96c32c0df..a97e94145 100644 --- a/backend/src/services/auth/auth-login-service.ts +++ b/backend/src/services/auth/auth-login-service.ts @@ -4,7 +4,7 @@ import { TUsers, UserDeviceSchema } from "@app/db/schemas"; import { isAuthMethodSaml } from "@app/ee/services/permission/permission-fns"; import { getConfig } from "@app/lib/config/env"; import { generateSrpServerKey, srpCheckClientProof } from "@app/lib/crypto"; -import { BadRequestError, UnauthorizedError } from "@app/lib/errors"; +import { BadRequestError, DatabaseError, UnauthorizedError } from "@app/lib/errors"; import { getServerCfg } from "@app/services/super-admin/super-admin-service"; import { TTokenDALFactory } from "../auth-token/auth-token-dal"; @@ -13,7 +13,6 @@ import { TokenType } from "../auth-token/auth-token-types"; import { TOrgDALFactory } from "../org/org-dal"; import { SmtpTemplates, TSmtpService } from "../smtp/smtp-service"; import { TUserDALFactory } from "../user/user-dal"; -import { processFailedMfaAttempt } from "../user/user-fns"; import { enforceUserLockStatus, validateProviderAuthToken } from "./auth-fns"; import { TLoginClientProofDTO, @@ -214,7 +213,7 @@ export const authLoginServiceFactory = ({ // send multi factor auth token if they it enabled if (userEnc.isMfaEnabled && userEnc.email) { const user = await userDAL.findById(userEnc.userId); - enforceUserLockStatus(user.isLocked, user.temporaryLockDateEnd); + enforceUserLockStatus(Boolean(user.isLocked), user.temporaryLockDateEnd); const mfaToken = jwt.sign( { @@ -304,13 +303,61 @@ export const authLoginServiceFactory = ({ const resendMfaToken = async (userId: string) => { const user = await userDAL.findById(userId); if (!user || !user.email) return; - enforceUserLockStatus(user.isLocked, user.temporaryLockDateEnd); + enforceUserLockStatus(Boolean(user.isLocked), user.temporaryLockDateEnd); await sendUserMfaCode({ userId: user.id, email: user.email }); }; + const processFailedMfaAttempt = async (userId: string) => { + try { + const updatedUser = await userDAL.transaction(async (tx) => { + const PROGRESSIVE_DELAY_INTERVAL = 3; + const user = await userDAL.incrementFailedMfaAttempt(userId, tx); + + if (!user) { + throw new Error("User not found"); + } + + const progressiveDelaysInMins = [5, 30, 60]; + + // lock user when failed attempt exceeds threshold + if ( + user.consecutiveFailedMfaAttempts && + user.consecutiveFailedMfaAttempts >= PROGRESSIVE_DELAY_INTERVAL * (progressiveDelaysInMins.length + 1) + ) { + return userDAL.updateById( + userId, + { + isLocked: true, + temporaryLockDateEnd: null + }, + tx + ); + } + + // delay user only when failed MFA attempts is a multiple of configured delay interval + if (user.consecutiveFailedMfaAttempts && user.consecutiveFailedMfaAttempts % PROGRESSIVE_DELAY_INTERVAL === 0) { + const delayIndex = user.consecutiveFailedMfaAttempts / PROGRESSIVE_DELAY_INTERVAL - 1; + return userDAL.updateById( + userId, + { + temporaryLockDateEnd: new Date(new Date().getTime() + progressiveDelaysInMins[delayIndex] * 60 * 1000) + }, + tx + ); + } + + return user; + }); + + return updatedUser; + } catch (error) { + throw new DatabaseError({ error, name: "Process failed MFA Attempt" }); + } + }; + /* * Multi factor authentication verification of code * Third step of login in which user completes with mfa @@ -318,7 +365,7 @@ export const authLoginServiceFactory = ({ const verifyMfaToken = async ({ userId, mfaToken, mfaJwtToken, ip, userAgent, orgId }: TVerifyMfaTokenDTO) => { const appCfg = getConfig(); const user = await userDAL.findById(userId); - enforceUserLockStatus(user.isLocked, user.temporaryLockDateEnd); + enforceUserLockStatus(Boolean(user.isLocked), user.temporaryLockDateEnd); try { await tokenService.validateTokenForUser({ @@ -327,7 +374,7 @@ export const authLoginServiceFactory = ({ code: mfaToken }); } catch (err) { - const updatedUser = await processFailedMfaAttempt(userId, userDAL); + const updatedUser = await processFailedMfaAttempt(userId); if (updatedUser.isLocked) { if (updatedUser.email) { const unlockToken = await tokenService.createTokenForUser({ @@ -341,7 +388,7 @@ export const authLoginServiceFactory = ({ recipients: [updatedUser.email], substitutions: { token: unlockToken, - callback_url: `${appCfg.SITE_URL}/api/v1/user/${updatedUser.id}/unlock-verify` + callback_url: `${appCfg.SITE_URL}/api/v1/user/${updatedUser.id}/unlock` } }); } diff --git a/backend/src/services/auth/auth-password-service.ts b/backend/src/services/auth/auth-password-service.ts index 4025e4903..8f4e8a6d2 100644 --- a/backend/src/services/auth/auth-password-service.ts +++ b/backend/src/services/auth/auth-password-service.ts @@ -138,6 +138,11 @@ export const authPaswordServiceFactory = ({ code }); + await userDAL.updateById(user.id, { + isLocked: false, + temporaryLockDateEnd: null + }); + const token = jwt.sign( { authTokenType: AuthTokenType.SIGNUP_TOKEN, diff --git a/backend/src/services/user/user-dal.ts b/backend/src/services/user/user-dal.ts index f2da0df0e..7c73fc4f4 100644 --- a/backend/src/services/user/user-dal.ts +++ b/backend/src/services/user/user-dal.ts @@ -143,6 +143,19 @@ export const userDALFactory = (db: TDbClient) => { } }; + const incrementFailedMfaAttempt = async (userId: string, tx?: Knex) => { + try { + const [user] = await (tx || db)(TableName.Users) + .where("id", userId) + .increment("consecutiveFailedMfaAttempts", 1) + .returning("*"); + + return user; + } catch (error) { + throw new DatabaseError({ error, name: "Increment Failed MFA Attempt" }); + } + }; + return { ...userOrm, findUserByUsername, @@ -155,6 +168,7 @@ export const userDALFactory = (db: TDbClient) => { upsertUserEncryptionKey, createUserEncryption, findOneUserAction, - createUserAction + createUserAction, + incrementFailedMfaAttempt }; }; diff --git a/backend/src/services/user/user-fns.ts b/backend/src/services/user/user-fns.ts index e8a0905f8..639320e24 100644 --- a/backend/src/services/user/user-fns.ts +++ b/backend/src/services/user/user-fns.ts @@ -1,7 +1,5 @@ import slugify from "@sindresorhus/slugify"; -import { TableName } from "@app/db/schemas"; -import { DatabaseError } from "@app/lib/errors"; import { alphaNumericNanoId } from "@app/lib/nanoid"; import { TUserDALFactory } from "@app/services/user/user-dal"; @@ -21,54 +19,3 @@ export const normalizeUsername = async (username: string, userDAL: Pick) => { - try { - const updatedUser = await userDAL.transaction(async (tx) => { - const PROGRESSIVE_DELAY_INTERVAL = 3; - const [user] = await tx(TableName.Users) - .where("id", userId) - .increment("consecutiveFailedMfaAttempts", 1) - .returning("*"); - - if (!user) { - throw new Error("User not found"); - } - - const progressiveDelaysInMins = [5, 30, 60]; - - // lock user when failed attempt exceeds threshold - if (user.consecutiveFailedMfaAttempts >= PROGRESSIVE_DELAY_INTERVAL * (progressiveDelaysInMins.length + 1)) { - return ( - await tx(TableName.Users) - .where("id", userId) - .update({ - isLocked: true, - temporaryLockDateEnd: null - }) - .returning("*") - )[0]; - } - - // delay user only when failed MFA attempts is a multiple of configured delay interval - if (user.consecutiveFailedMfaAttempts % PROGRESSIVE_DELAY_INTERVAL === 0) { - const delayIndex = user.consecutiveFailedMfaAttempts / PROGRESSIVE_DELAY_INTERVAL - 1; - - return ( - await tx(TableName.Users) - .where("id", userId) - .update({ - temporaryLockDateEnd: new Date(new Date().getTime() + progressiveDelaysInMins[delayIndex] * 60 * 1000) - }) - .returning("*") - )[0]; - } - - return user; - }); - - return updatedUser; - } catch (error) { - throw new DatabaseError({ error, name: "Process failed MFA Attempt" }); - } -}; From 966bd77234f2cfcbf4a77c8b75e6b178a395dadb Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Fri, 24 May 2024 11:55:29 -0400 Subject: [PATCH 044/101] Update gcp-secret-manager.mdx --- docs/integrations/cloud/gcp-secret-manager.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/integrations/cloud/gcp-secret-manager.mdx b/docs/integrations/cloud/gcp-secret-manager.mdx index 42dc3701d..99edcd115 100644 --- a/docs/integrations/cloud/gcp-secret-manager.mdx +++ b/docs/integrations/cloud/gcp-secret-manager.mdx @@ -52,7 +52,7 @@ description: "How to sync secrets from Infisical to GCP Secret Manager" Using Infisical to sync secrets to GCP Secret Manager requires that you enable the Service Usage API and Cloud Resource Manager API in the Google Cloud project you want to sync secrets to. More on that [here](https://cloud.google.com/service-usage/docs/set-up-development-environment). - Additionally, ensure that your GCP account has sufficient permission to manage secret and service resources (you can assign Secret Manager Admin and Service Usage Admin roles) + Additionally, ensure that your GCP account has sufficient permission to manage secret and service resources (you can assign Secret Manager Admin and Service Usage Admin roles for testing purposes) From b9a6f94eea18c10fd43f027aa648ebe1f5802e60 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Fri, 24 May 2024 23:56:24 +0800 Subject: [PATCH 045/101] misc: moved user lock reset after backup success --- backend/src/services/auth/auth-password-service.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/backend/src/services/auth/auth-password-service.ts b/backend/src/services/auth/auth-password-service.ts index 8f4e8a6d2..a400c297b 100644 --- a/backend/src/services/auth/auth-password-service.ts +++ b/backend/src/services/auth/auth-password-service.ts @@ -138,11 +138,6 @@ export const authPaswordServiceFactory = ({ code }); - await userDAL.updateById(user.id, { - isLocked: false, - temporaryLockDateEnd: null - }); - const token = jwt.sign( { authTokenType: AuthTokenType.SIGNUP_TOKEN, @@ -179,6 +174,12 @@ export const authPaswordServiceFactory = ({ salt, verifier }); + + await userDAL.updateById(userId, { + isLocked: false, + temporaryLockDateEnd: null, + consecutiveFailedMfaAttempts: 0 + }); }; /* From 1753cd76be02d0409b04e0f2fb571cd5dad4d364 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Fri, 24 May 2024 12:43:14 -0400 Subject: [PATCH 046/101] update delete access token logic --- .../identity-access-token/identity-access-token-dal.ts | 4 ++-- .../src/services/resource-cleanup/resource-cleanup-queue.ts | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/src/services/identity-access-token/identity-access-token-dal.ts b/backend/src/services/identity-access-token/identity-access-token-dal.ts index 448f2dd46..ee89fbdd8 100644 --- a/backend/src/services/identity-access-token/identity-access-token-dal.ts +++ b/backend/src/services/identity-access-token/identity-access-token-dal.ts @@ -48,7 +48,7 @@ export const identityAccessTokenDALFactory = (db: TDbClient) => { .where("accessTokenNumUsesLimit", ">", 0) .andWhere( "accessTokenNumUses", - ">", + ">=", db.ref("accessTokenNumUsesLimit").withSchema(TableName.IdentityAccessToken) ); }) @@ -76,7 +76,7 @@ export const identityAccessTokenDALFactory = (db: TDbClient) => { .delete(); return await docs; } catch (error) { - throw new DatabaseError({ error, name: "IdentityAccesTokenPrune" }); + throw new DatabaseError({ error, name: "IdentityAccessTokenPrune" }); } }; diff --git a/backend/src/services/resource-cleanup/resource-cleanup-queue.ts b/backend/src/services/resource-cleanup/resource-cleanup-queue.ts index 3c8bcb1f7..a5e240839 100644 --- a/backend/src/services/resource-cleanup/resource-cleanup-queue.ts +++ b/backend/src/services/resource-cleanup/resource-cleanup-queue.ts @@ -44,7 +44,10 @@ export const dailyResourceCleanUpQueueServiceFactory = ({ await queueService.queue(QueueName.DailyResourceCleanUp, QueueJobs.DailyResourceCleanUp, undefined, { delay: 5000, jobId: QueueName.DailyResourceCleanUp, - repeat: { pattern: "0 0 * * *", utc: true } + repeat: { + every: 10000 + // limit: 100, + } }); }; From b6ff07b605ed8737159f4b5ee202ef6d43b41f5b Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Fri, 24 May 2024 12:45:19 -0400 Subject: [PATCH 047/101] revert repete cron --- .../src/services/resource-cleanup/resource-cleanup-queue.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/backend/src/services/resource-cleanup/resource-cleanup-queue.ts b/backend/src/services/resource-cleanup/resource-cleanup-queue.ts index a5e240839..3c8bcb1f7 100644 --- a/backend/src/services/resource-cleanup/resource-cleanup-queue.ts +++ b/backend/src/services/resource-cleanup/resource-cleanup-queue.ts @@ -44,10 +44,7 @@ export const dailyResourceCleanUpQueueServiceFactory = ({ await queueService.queue(QueueName.DailyResourceCleanUp, QueueJobs.DailyResourceCleanUp, undefined, { delay: 5000, jobId: QueueName.DailyResourceCleanUp, - repeat: { - every: 10000 - // limit: 100, - } + repeat: { pattern: "0 0 * * *", utc: true } }); }; From 719f3beab0b6014fed066b1bee0052e06e507d06 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 26 May 2024 22:45:00 +0530 Subject: [PATCH 048/101] feat: api changes for update role api for identity based use --- backend/src/ee/routes/v1/org-role-router.ts | 2 +- .../src/ee/routes/v1/project-role-router.ts | 214 ++++++++++++----- .../project-role/project-role-service.ts | 219 ++++++++++-------- .../project-role/project-role-types.ts | 27 +++ 4 files changed, 304 insertions(+), 158 deletions(-) diff --git a/backend/src/ee/routes/v1/org-role-router.ts b/backend/src/ee/routes/v1/org-role-router.ts index 380f61e23..6691032a8 100644 --- a/backend/src/ee/routes/v1/org-role-router.ts +++ b/backend/src/ee/routes/v1/org-role-router.ts @@ -23,7 +23,7 @@ export const registerOrgRoleRouter = async (server: FastifyZodProvider) => { .min(1) .trim() .refine( - (val) => !Object.keys(OrgMembershipRole).includes(val), + (val) => !Object.values(OrgMembershipRole).includes(val as OrgMembershipRole), "Please choose a different slug, the slug you have entered is reserved" ) .refine((v) => slugify(v) === v, { diff --git a/backend/src/ee/routes/v1/project-role-router.ts b/backend/src/ee/routes/v1/project-role-router.ts index bb4d2fa8e..69038a057 100644 --- a/backend/src/ee/routes/v1/project-role-router.ts +++ b/backend/src/ee/routes/v1/project-role-router.ts @@ -1,146 +1,232 @@ +import { packRules } from "@casl/ability/extra"; +import slugify from "@sindresorhus/slugify"; import { z } from "zod"; -import { ProjectMembershipsSchema, ProjectRolesSchema } from "@app/db/schemas"; +import { ProjectMembershipRole, ProjectMembershipsSchema, ProjectRolesSchema } from "@app/db/schemas"; +import { PROJECT_ROLE } from "@app/lib/api-docs"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; +import { ProjectPermissionSchema, SanitizedRoleSchema } from "@app/server/routes/sanitizedSchemas"; import { AuthMode } from "@app/services/auth/auth-type"; export const registerProjectRoleRouter = async (server: FastifyZodProvider) => { server.route({ method: "POST", - url: "/:projectId/roles", + url: "/:projectSlug/roles", config: { rateLimit: writeLimit }, schema: { + description: "Create a project role", + security: [ + { + bearerAuth: [] + } + ], params: z.object({ - projectId: z.string().trim() + projectSlug: z.string().trim().describe(PROJECT_ROLE.CREATE.projectSlug) }), body: z.object({ - slug: z.string().trim(), - name: z.string().trim(), - description: z.string().trim().optional(), - permissions: z.any().array() + slug: z + .string() + .toLowerCase() + .trim() + .min(1) + .refine( + (val) => !Object.values(ProjectMembershipRole).includes(val as ProjectMembershipRole), + "Please choose a different slug, the slug you have entered is reserved" + ) + .refine((v) => slugify(v) === v, { + message: "Slug must be a valid" + }) + .describe(PROJECT_ROLE.CREATE.slug), + name: z.string().min(1).trim().describe(PROJECT_ROLE.CREATE.name), + description: z.string().trim().optional().describe(PROJECT_ROLE.CREATE.description), + permissions: ProjectPermissionSchema.array().describe(PROJECT_ROLE.CREATE.permissions) }), response: { 200: z.object({ - role: ProjectRolesSchema + role: SanitizedRoleSchema }) } }, - onRequest: verifyAuth([AuthMode.JWT]), + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), handler: async (req) => { - const role = await server.services.projectRole.createRole( - req.permission.type, - req.permission.id, - req.params.projectId, - req.body, - req.permission.authMethod, - req.permission.orgId - ); + const role = await server.services.projectRole.createRole({ + actorAuthMethod: req.permission.authMethod, + actorId: req.permission.id, + actorOrgId: req.permission.orgId, + actor: req.permission.type, + projectSlug: req.params.projectSlug, + data: { + ...req.body, + permissions: JSON.stringify(packRules(req.body.permissions)) + } + }); return { role }; } }); server.route({ method: "PATCH", - url: "/:projectId/roles/:roleId", + url: "/:projectSlug/roles/:roleId", config: { rateLimit: writeLimit }, schema: { + description: "Update a project role", + security: [ + { + bearerAuth: [] + } + ], params: z.object({ - projectId: z.string().trim(), - roleId: z.string().trim() + projectSlug: z.string().trim().describe(PROJECT_ROLE.UPDATE.projectSlug), + roleId: z.string().trim().describe(PROJECT_ROLE.UPDATE.roleId) }), body: z.object({ - slug: z.string().trim().optional(), - name: z.string().trim().optional(), - description: z.string().trim().optional(), - permissions: z.any().array() + slug: z + .string() + .toLowerCase() + .trim() + .optional() + .describe(PROJECT_ROLE.UPDATE.slug) + .refine( + (val) => + typeof val === "undefined" || + !Object.values(ProjectMembershipRole).includes(val as ProjectMembershipRole), + "Please choose a different slug, the slug you have entered is reserved" + ) + .refine((val) => typeof val === "undefined" || slugify(val) === val, { + message: "Slug must be a valid" + }), + name: z.string().trim().optional().describe(PROJECT_ROLE.UPDATE.name), + permissions: ProjectPermissionSchema.array().describe(PROJECT_ROLE.UPDATE.permissions) }), response: { 200: z.object({ - role: ProjectRolesSchema + role: SanitizedRoleSchema }) } }, - onRequest: verifyAuth([AuthMode.JWT]), + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), handler: async (req) => { - const role = await server.services.projectRole.updateRole( - req.permission.type, - req.permission.id, - req.params.projectId, - req.params.roleId, - req.body, - req.permission.authMethod, - req.permission.orgId - ); + const role = await server.services.projectRole.updateRole({ + actorAuthMethod: req.permission.authMethod, + actorId: req.permission.id, + actorOrgId: req.permission.orgId, + actor: req.permission.type, + projectSlug: req.params.projectSlug, + roleId: req.params.roleId, + data: { + ...req.body, + permissions: JSON.stringify(packRules(req.body.permissions)) + } + }); return { role }; } }); server.route({ method: "DELETE", - url: "/:projectId/roles/:roleId", + url: "/:projectSlug/roles/:roleId", config: { rateLimit: writeLimit }, schema: { + description: "Delete a project role", + security: [ + { + bearerAuth: [] + } + ], params: z.object({ - projectId: z.string().trim(), - roleId: z.string().trim() + projectSlug: z.string().trim().describe(PROJECT_ROLE.DELETE.projectSlug), + roleId: z.string().trim().describe(PROJECT_ROLE.DELETE.roleId) }), response: { 200: z.object({ - role: ProjectRolesSchema + role: SanitizedRoleSchema }) } }, - onRequest: verifyAuth([AuthMode.JWT]), + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), handler: async (req) => { - const role = await server.services.projectRole.deleteRole( - req.permission.type, - req.permission.id, - req.params.projectId, - req.params.roleId, - req.permission.authMethod, - req.permission.orgId - ); + const role = await server.services.projectRole.deleteRole({ + actorAuthMethod: req.permission.authMethod, + actorId: req.permission.id, + actorOrgId: req.permission.orgId, + actor: req.permission.type, + projectSlug: req.params.projectSlug, + roleId: req.params.roleId + }); return { role }; } }); server.route({ method: "GET", - url: "/:projectId/roles", + url: "/:projectSlug/roles", + config: { + rateLimit: readLimit + }, + schema: { + description: "List project role", + security: [ + { + bearerAuth: [] + } + ], + params: z.object({ + projectSlug: z.string().trim().describe(PROJECT_ROLE.LIST.projectSlug) + }), + response: { + 200: z.object({ + roles: ProjectRolesSchema.omit({ permissions: true }).array() + }) + } + }, + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), + handler: async (req) => { + const roles = await server.services.projectRole.listRoles({ + actorAuthMethod: req.permission.authMethod, + actorId: req.permission.id, + actorOrgId: req.permission.orgId, + actor: req.permission.type, + projectSlug: req.params.projectSlug + }); + return { roles }; + } + }); + + server.route({ + method: "GET", + url: "/:projectSlug/roles/slug/:slug", config: { rateLimit: readLimit }, schema: { params: z.object({ - projectId: z.string().trim() + projectSlug: z.string().trim().describe(PROJECT_ROLE.GET_ROLE_BY_SLUG.projectSlug), + slug: z.string().trim().describe(PROJECT_ROLE.GET_ROLE_BY_SLUG.roleSlug) }), response: { 200: z.object({ - data: z.object({ - roles: ProjectRolesSchema.omit({ permissions: true }) - .merge(z.object({ permissions: z.unknown() })) - .array() - }) + role: SanitizedRoleSchema }) } }, - onRequest: verifyAuth([AuthMode.JWT]), + onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), handler: async (req) => { - const roles = await server.services.projectRole.listRoles( - req.permission.type, - req.permission.id, - req.params.projectId, - req.permission.authMethod, - req.permission.orgId - ); - return { data: { roles } }; + const role = await server.services.projectRole.getRoleBySlug({ + actorAuthMethod: req.permission.authMethod, + actorId: req.permission.id, + actorOrgId: req.permission.orgId, + actor: req.permission.type, + projectSlug: req.params.projectSlug, + roleSlug: req.params.slug + }); + return { role }; } }); diff --git a/backend/src/services/project-role/project-role-service.ts b/backend/src/services/project-role/project-role-service.ts index 831af3200..5a50c4a44 100644 --- a/backend/src/services/project-role/project-role-service.ts +++ b/backend/src/services/project-role/project-role-service.ts @@ -1,25 +1,30 @@ -import { ForbiddenError } from "@casl/ability"; -import { packRules } from "@casl/ability/extra"; +import { ForbiddenError, MongoAbility, RawRuleOf } from "@casl/ability"; +import { PackRule, packRules, unpackRules } from "@casl/ability/extra"; -import { ProjectMembershipRole, TOrgRolesUpdate, TProjectRolesInsert } from "@app/db/schemas"; +import { ProjectMembershipRole } from "@app/db/schemas"; +import { UnpackedPermissionSchema } from "@app/ee/services/identity-project-additional-privilege/identity-project-additional-privilege-service"; import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service"; import { projectAdminPermissions, projectMemberPermissions, projectNoAccessPermissions, ProjectPermissionActions, + ProjectPermissionSet, ProjectPermissionSub, projectViewerPermission } from "@app/ee/services/permission/project-permission"; import { BadRequestError } from "@app/lib/errors"; -import { ActorAuthMethod, ActorType } from "../auth/auth-type"; +import { ActorAuthMethod } from "../auth/auth-type"; import { TIdentityProjectMembershipRoleDALFactory } from "../identity-project/identity-project-membership-role-dal"; +import { TProjectDALFactory } from "../project/project-dal"; import { TProjectUserMembershipRoleDALFactory } from "../project-membership/project-user-membership-role-dal"; import { TProjectRoleDALFactory } from "./project-role-dal"; +import { TCreateRoleDTO, TDeleteRoleDTO, TGetRoleBySlugDTO, TListRolesDTO, TUpdateRoleDTO } from "./project-role-types"; type TProjectRoleServiceFactoryDep = { projectRoleDAL: TProjectRoleDALFactory; + projectDAL: Pick; permissionService: Pick; identityProjectMembershipRoleDAL: TIdentityProjectMembershipRoleDALFactory; projectUserMembershipRoleDAL: TProjectUserMembershipRoleDALFactory; @@ -27,20 +32,68 @@ type TProjectRoleServiceFactoryDep = { export type TProjectRoleServiceFactory = ReturnType; +const unpackPermissions = (permissions: unknown) => + UnpackedPermissionSchema.array().parse( + unpackRules((permissions || []) as PackRule>>[]) + ); + +const getPredefinedRoles = (projectId: string, roleFilter?: ProjectMembershipRole) => { + return [ + { + id: "b11b49a9-09a9-4443-916a-4246f9ff2c69", // dummy userid + projectId, + name: "Admin", + slug: ProjectMembershipRole.Admin, + permissions: projectAdminPermissions, + description: "Complete administration access over the project", + createdAt: new Date(), + updatedAt: new Date() + }, + { + id: "b11b49a9-09a9-4443-916a-4246f9ff2c70", // dummy user for zod validation in response + projectId, + name: "Developer", + slug: ProjectMembershipRole.Member, + permissions: projectMemberPermissions, + description: "Non-administrative role in an project", + createdAt: new Date(), + updatedAt: new Date() + }, + { + id: "b11b49a9-09a9-4443-916a-4246f9ff2c71", // dummy user for zod validation in response + projectId, + name: "Viewer", + slug: ProjectMembershipRole.Viewer, + permissions: projectViewerPermission, + description: "Non-administrative role in an project", + createdAt: new Date(), + updatedAt: new Date() + }, + { + id: "b11b49a9-09a9-4443-916a-4246f9ff2c72", // dummy user for zod validation in response + projectId, + name: "No Access", + slug: ProjectMembershipRole.NoAccess, + permissions: projectNoAccessPermissions, + description: "No access to any resources in the project", + createdAt: new Date(), + updatedAt: new Date() + } + ].filter(({ slug }) => !roleFilter || roleFilter.includes(slug)); +}; + export const projectRoleServiceFactory = ({ projectRoleDAL, permissionService, identityProjectMembershipRoleDAL, - projectUserMembershipRoleDAL + projectUserMembershipRoleDAL, + projectDAL }: TProjectRoleServiceFactoryDep) => { - const createRole = async ( - actor: ActorType, - actorId: string, - projectId: string, - data: Omit, - actorAuthMethod: ActorAuthMethod, - actorOrgId: string | undefined - ) => { + const createRole = async ({ projectSlug, data, actor, actorId, actorAuthMethod, actorOrgId }: TCreateRoleDTO) => { + const project = await projectDAL.findProjectBySlug(projectSlug, actorOrgId); + if (!project) throw new BadRequestError({ message: "Project not found" }); + const projectId = project.id; + const { permission } = await permissionService.getProjectPermission( actor, actorId, @@ -53,21 +106,54 @@ export const projectRoleServiceFactory = ({ if (existingRole) throw new BadRequestError({ name: "Create Role", message: "Duplicate role" }); const role = await projectRoleDAL.create({ ...data, - projectId, - permissions: JSON.stringify(data.permissions) + projectId }); - return role; + return { ...role, permissions: unpackPermissions(role.permissions) }; }; - const updateRole = async ( - actor: ActorType, - actorId: string, - projectId: string, - roleId: string, - data: Omit, - actorAuthMethod: ActorAuthMethod, - actorOrgId: string | undefined - ) => { + const getRoleBySlug = async ({ + actor, + actorId, + projectSlug, + actorAuthMethod, + actorOrgId, + roleSlug + }: TGetRoleBySlugDTO) => { + const project = await projectDAL.findProjectBySlug(projectSlug, actorOrgId); + if (!project) throw new BadRequestError({ message: "Project not found" }); + const projectId = project.id; + + const { permission } = await permissionService.getProjectPermission( + actor, + actorId, + projectId, + actorAuthMethod, + actorOrgId + ); + ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Read, ProjectPermissionSub.Role); + if (roleSlug !== "custom" && Object.values(ProjectMembershipRole).includes(roleSlug as ProjectMembershipRole)) { + const predefinedRole = getPredefinedRoles(projectId, roleSlug as ProjectMembershipRole)[0]; + return { ...predefinedRole, permissions: UnpackedPermissionSchema.array().parse(predefinedRole.permissions) }; + } + + const customRole = await projectRoleDAL.findOne({ slug: roleSlug, projectId }); + if (!customRole) throw new BadRequestError({ message: "Role not found" }); + return { ...customRole, permissions: unpackPermissions(customRole.permissions) }; + }; + + const updateRole = async ({ + roleId, + projectSlug, + actorOrgId, + actorAuthMethod, + actorId, + actor, + data + }: TUpdateRoleDTO) => { + const project = await projectDAL.findProjectBySlug(projectSlug, actorOrgId); + if (!project) throw new BadRequestError({ message: "Project not found" }); + const projectId = project.id; + const { permission } = await permissionService.getProjectPermission( actor, actorId, @@ -81,22 +167,16 @@ export const projectRoleServiceFactory = ({ if (existingRole && existingRole.id !== roleId) throw new BadRequestError({ name: "Update Role", message: "Duplicate role" }); } - const [updatedRole] = await projectRoleDAL.update( - { id: roleId, projectId }, - { ...data, permissions: data.permissions ? JSON.stringify(data.permissions) : undefined } - ); + const [updatedRole] = await projectRoleDAL.update({ id: roleId, projectId }, data); if (!updatedRole) throw new BadRequestError({ message: "Role not found", name: "Update role" }); - return updatedRole; + return { ...updatedRole, permissions: unpackPermissions(updatedRole.permissions) }; }; - const deleteRole = async ( - actor: ActorType, - actorId: string, - projectId: string, - roleId: string, - actorAuthMethod: ActorAuthMethod, - actorOrgId: string | undefined - ) => { + const deleteRole = async ({ actor, actorId, actorAuthMethod, actorOrgId, projectSlug, roleId }: TDeleteRoleDTO) => { + const project = await projectDAL.findProjectBySlug(projectSlug, actorOrgId); + if (!project) throw new BadRequestError({ message: "Project not found" }); + const projectId = project.id; + const { permission } = await permissionService.getProjectPermission( actor, actorId, @@ -125,16 +205,14 @@ export const projectRoleServiceFactory = ({ const [deletedRole] = await projectRoleDAL.delete({ id: roleId, projectId }); if (!deletedRole) throw new BadRequestError({ message: "Role not found", name: "Delete role" }); - return deletedRole; + return { ...deletedRole, permissions: unpackPermissions(deletedRole.permissions) }; }; - const listRoles = async ( - actor: ActorType, - actorId: string, - projectId: string, - actorAuthMethod: ActorAuthMethod, - actorOrgId: string | undefined - ) => { + const listRoles = async ({ projectSlug, actorOrgId, actorAuthMethod, actorId, actor }: TListRolesDTO) => { + const project = await projectDAL.findProjectBySlug(projectSlug, actorOrgId); + if (!project) throw new BadRequestError({ message: "Project not found" }); + const projectId = project.id; + const { permission } = await permissionService.getProjectPermission( actor, actorId, @@ -144,52 +222,7 @@ export const projectRoleServiceFactory = ({ ); ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Read, ProjectPermissionSub.Role); const customRoles = await projectRoleDAL.find({ projectId }); - const roles = [ - { - id: "b11b49a9-09a9-4443-916a-4246f9ff2c69", // dummy userid - projectId, - name: "Admin", - slug: ProjectMembershipRole.Admin, - description: "Complete administration access over the project", - permissions: packRules(projectAdminPermissions), - createdAt: new Date(), - updatedAt: new Date() - }, - { - id: "b11b49a9-09a9-4443-916a-4246f9ff2c70", // dummy user for zod validation in response - projectId, - name: "Developer", - slug: ProjectMembershipRole.Member, - description: "Non-administrative role in an project", - permissions: packRules(projectMemberPermissions), - createdAt: new Date(), - updatedAt: new Date() - }, - { - id: "b11b49a9-09a9-4443-916a-4246f9ff2c71", // dummy user for zod validation in response - projectId, - name: "Viewer", - slug: ProjectMembershipRole.Viewer, - description: "Non-administrative role in an project", - permissions: packRules(projectViewerPermission), - createdAt: new Date(), - updatedAt: new Date() - }, - { - id: "b11b49a9-09a9-4443-916a-4246f9ff2c72", // dummy user for zod validation in response - projectId, - name: "No Access", - slug: "no-access", - description: "No access to any resources in the project", - permissions: packRules(projectNoAccessPermissions), - createdAt: new Date(), - updatedAt: new Date() - }, - ...(customRoles || []).map(({ permissions, ...data }) => ({ - ...data, - permissions - })) - ]; + const roles = [...getPredefinedRoles(projectId), ...(customRoles || [])]; return roles; }; @@ -209,5 +242,5 @@ export const projectRoleServiceFactory = ({ return { permissions: packRules(permission.rules), membership }; }; - return { createRole, updateRole, deleteRole, listRoles, getUserPermission }; + return { createRole, updateRole, deleteRole, listRoles, getUserPermission, getRoleBySlug }; }; diff --git a/backend/src/services/project-role/project-role-types.ts b/backend/src/services/project-role/project-role-types.ts index e69de29bb..62b627a79 100644 --- a/backend/src/services/project-role/project-role-types.ts +++ b/backend/src/services/project-role/project-role-types.ts @@ -0,0 +1,27 @@ +import { TOrgRolesUpdate, TProjectRolesInsert } from "@app/db/schemas"; +import { TProjectPermission } from "@app/lib/types"; + +export type TCreateRoleDTO = { + data: Omit; + projectSlug: string; +} & Omit; + +export type TGetRoleBySlugDTO = { + roleSlug: string; + projectSlug: string; +} & Omit; + +export type TUpdateRoleDTO = { + roleId: string; + data: Omit; + projectSlug: string; +} & Omit; + +export type TDeleteRoleDTO = { + roleId: string; + projectSlug: string; +} & Omit; + +export type TListRolesDTO = { + projectSlug: string; +} & Omit; From ee5130f56cacec6fb06514633cc5d92478540c8d Mon Sep 17 00:00:00 2001 From: = Date: Sun, 26 May 2024 22:47:19 +0530 Subject: [PATCH 049/101] feat: privilege api better permission inputs and required changes in ui for role and privilege --- ...ity-project-additional-privilege-router.ts | 70 +++- backend/src/server/routes/index.ts | 3 +- backend/src/server/routes/sanitizedSchemas.ts | 29 ++ .../types.tsx | 21 +- frontend/src/hooks/api/roles/index.tsx | 1 + frontend/src/hooks/api/roles/mutation.tsx | 32 +- frontend/src/hooks/api/roles/queries.tsx | 36 ++- frontend/src/hooks/api/roles/types.ts | 6 +- .../components/GroupsSection/GroupModal.tsx | 300 +++++++++--------- .../components/GroupsSection/GroupRoles.tsx | 28 +- .../IdentityTab/components/IdentityModal.tsx | 4 +- .../IdentityRoleForm/IdentityRbacSection.tsx | 31 +- .../SpecificPrivilegeSection.tsx | 33 +- .../MemberRoleForm/MemberRbacSection.tsx | 31 +- .../ProjectRoleListTab/ProjectRoleListTab.tsx | 5 +- .../ProjectRoleList/ProjectRoleList.tsx | 16 +- .../ProjectRoleModifySection.tsx | 43 ++- .../ProjectRoleModifySection.utils.ts | 12 +- 18 files changed, 397 insertions(+), 304 deletions(-) diff --git a/backend/src/ee/routes/v1/identity-project-additional-privilege-router.ts b/backend/src/ee/routes/v1/identity-project-additional-privilege-router.ts index 9a1a91672..58c6793d7 100644 --- a/backend/src/ee/routes/v1/identity-project-additional-privilege-router.ts +++ b/backend/src/ee/routes/v1/identity-project-additional-privilege-router.ts @@ -5,10 +5,15 @@ import { z } from "zod"; import { IdentityProjectAdditionalPrivilegeTemporaryMode } from "@app/ee/services/identity-project-additional-privilege/identity-project-additional-privilege-types"; import { IDENTITY_ADDITIONAL_PRIVILEGE } from "@app/lib/api-docs"; +import { BadRequestError } from "@app/lib/errors"; import { alphaNumericNanoId } from "@app/lib/nanoid"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; -import { ProjectPermissionSchema, SanitizedIdentityPrivilegeSchema } from "@app/server/routes/sanitizedSchemas"; +import { + ProjectPermissionSchema, + ProjectSpecificPrivilegePermissionSchema, + SanitizedIdentityPrivilegeSchema +} from "@app/server/routes/sanitizedSchemas"; import { AuthMode } from "@app/services/auth/auth-type"; export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: FastifyZodProvider) => { @@ -39,7 +44,12 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F }) .optional() .describe(IDENTITY_ADDITIONAL_PRIVILEGE.CREATE.slug), - permissions: ProjectPermissionSchema.array().describe(IDENTITY_ADDITIONAL_PRIVILEGE.CREATE.permissions) + permissions: ProjectPermissionSchema.array() + .describe(IDENTITY_ADDITIONAL_PRIVILEGE.CREATE.permissions) + .optional(), + privilegePermission: ProjectSpecificPrivilegePermissionSchema.describe( + IDENTITY_ADDITIONAL_PRIVILEGE.CREATE.privilegePermission + ).optional() }), response: { 200: z.object({ @@ -49,6 +59,18 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F }, onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), handler: async (req) => { + const { permissions, privilegePermission } = req.body; + if (!permissions && !privilegePermission) { + throw new BadRequestError({ message: "Permission or privilegePermission must be provided" }); + } + + const permission = privilegePermission + ? privilegePermission.actions.map((action) => ({ + action, + subject: privilegePermission.subject, + conditions: privilegePermission.conditions + })) + : permissions!; const privilege = await server.services.identityProjectAdditionalPrivilege.create({ actorId: req.permission.id, actor: req.permission.type, @@ -57,7 +79,7 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F ...req.body, slug: req.body.slug ? slugify(req.body.slug) : slugify(alphaNumericNanoId(12)), isTemporary: false, - permissions: JSON.stringify(packRules(req.body.permissions)) + permissions: JSON.stringify(packRules(permission)) }); return { privilege }; } @@ -90,7 +112,12 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F }) .optional() .describe(IDENTITY_ADDITIONAL_PRIVILEGE.CREATE.slug), - permissions: ProjectPermissionSchema.array().describe(IDENTITY_ADDITIONAL_PRIVILEGE.CREATE.permissions), + permissions: ProjectPermissionSchema.array() + .describe(IDENTITY_ADDITIONAL_PRIVILEGE.CREATE.permissions) + .optional(), + privilegePermission: ProjectSpecificPrivilegePermissionSchema.describe( + IDENTITY_ADDITIONAL_PRIVILEGE.CREATE.privilegePermission + ).optional(), temporaryMode: z .nativeEnum(IdentityProjectAdditionalPrivilegeTemporaryMode) .describe(IDENTITY_ADDITIONAL_PRIVILEGE.CREATE.temporaryMode), @@ -111,6 +138,19 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F }, onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), handler: async (req) => { + const { permissions, privilegePermission } = req.body; + if (!permissions && !privilegePermission) { + throw new BadRequestError({ message: "Permission or privilegePermission must be provided" }); + } + + const permission = privilegePermission + ? privilegePermission.actions.map((action) => ({ + action, + subject: privilegePermission.subject, + conditions: privilegePermission.conditions + })) + : permissions!; + const privilege = await server.services.identityProjectAdditionalPrivilege.create({ actorId: req.permission.id, actor: req.permission.type, @@ -119,7 +159,7 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F ...req.body, slug: req.body.slug ? slugify(req.body.slug) : slugify(alphaNumericNanoId(12)), isTemporary: true, - permissions: JSON.stringify(packRules(req.body.permissions)) + permissions: JSON.stringify(packRules(permission)) }); return { privilege }; } @@ -156,13 +196,16 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F }) .describe(IDENTITY_ADDITIONAL_PRIVILEGE.UPDATE.newSlug), permissions: ProjectPermissionSchema.array().describe(IDENTITY_ADDITIONAL_PRIVILEGE.UPDATE.permissions), + privilegePermission: ProjectSpecificPrivilegePermissionSchema.describe( + IDENTITY_ADDITIONAL_PRIVILEGE.UPDATE.privilegePermission + ).optional(), isTemporary: z.boolean().describe(IDENTITY_ADDITIONAL_PRIVILEGE.UPDATE.isTemporary), temporaryMode: z .nativeEnum(IdentityProjectAdditionalPrivilegeTemporaryMode) .describe(IDENTITY_ADDITIONAL_PRIVILEGE.UPDATE.temporaryMode), temporaryRange: z .string() - .refine((val) => ms(val) > 0, "Temporary range must be a positive number") + .refine((val) => typeof val === "undefined" || ms(val) > 0, "Temporary range must be a positive number") .describe(IDENTITY_ADDITIONAL_PRIVILEGE.UPDATE.temporaryRange), temporaryAccessStartTime: z .string() @@ -179,7 +222,18 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F }, onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), handler: async (req) => { - const updatedInfo = req.body.privilegeDetails; + const { permissions, privilegePermission, ...updatedInfo } = req.body.privilegeDetails; + if (!permissions && !privilegePermission) { + throw new BadRequestError({ message: "Permission or privilegePermission must be provided" }); + } + + const permission = privilegePermission + ? privilegePermission.actions.map((action) => ({ + action, + subject: privilegePermission.subject, + conditions: privilegePermission.conditions + })) + : permissions!; const privilege = await server.services.identityProjectAdditionalPrivilege.updateBySlug({ actorId: req.permission.id, actor: req.permission.type, @@ -190,7 +244,7 @@ export const registerIdentityProjectAdditionalPrivilegeRouter = async (server: F projectSlug: req.body.projectSlug, data: { ...updatedInfo, - permissions: updatedInfo?.permissions ? JSON.stringify(packRules(updatedInfo.permissions)) : undefined + permissions: permission ? JSON.stringify(packRules(permission)) : undefined } }); return { privilege }; diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts index 2ef6b972a..797987ce7 100644 --- a/backend/src/server/routes/index.ts +++ b/backend/src/server/routes/index.ts @@ -521,7 +521,8 @@ export const registerRoutes = async ( permissionService, projectRoleDAL, projectUserMembershipRoleDAL, - identityProjectMembershipRoleDAL + identityProjectMembershipRoleDAL, + projectDAL }); const snapshotService = secretSnapshotServiceFactory({ diff --git a/backend/src/server/routes/sanitizedSchemas.ts b/backend/src/server/routes/sanitizedSchemas.ts index cf9f23851..5b0b754f3 100644 --- a/backend/src/server/routes/sanitizedSchemas.ts +++ b/backend/src/server/routes/sanitizedSchemas.ts @@ -4,6 +4,7 @@ import { DynamicSecretsSchema, IdentityProjectAdditionalPrivilegeSchema, IntegrationAuthsSchema, + ProjectRolesSchema, SecretApprovalPoliciesSchema, UsersSchema } from "@app/db/schemas"; @@ -88,10 +89,38 @@ export const ProjectPermissionSchema = z.object({ .optional() }); +export const ProjectSpecificPrivilegePermissionSchema = z.object({ + actions: z + .nativeEnum(ProjectPermissionActions) + .describe("Describe what action an entity can take. Possible actions: create, edit, delete, and read") + .array() + .min(1), + subject: z + .enum([ProjectPermissionSub.Secrets]) + .describe("The entity this permission pertains to. Possible options: secrets, environments"), + conditions: z + .object({ + environment: z.string().describe("The environment slug this permission should allow."), + secretPath: z + .object({ + $glob: z + .string() + .min(1) + .describe("The secret path this permission should allow. Can be a glob pattern such as /folder-name/*/** ") + }) + .optional() + }) + .describe("When specified, only matching conditions will be allowed to access given resource.") +}); + export const SanitizedIdentityPrivilegeSchema = IdentityProjectAdditionalPrivilegeSchema.extend({ permissions: UnpackedPermissionSchema.array() }); +export const SanitizedRoleSchema = ProjectRolesSchema.extend({ + permissions: UnpackedPermissionSchema.array() +}); + export const SanitizedDynamicSecretSchema = DynamicSecretsSchema.omit({ inputIV: true, inputTag: true, diff --git a/frontend/src/hooks/api/identityProjectAdditionalPrivilege/types.tsx b/frontend/src/hooks/api/identityProjectAdditionalPrivilege/types.tsx index fad549e38..df04f3e8a 100644 --- a/frontend/src/hooks/api/identityProjectAdditionalPrivilege/types.tsx +++ b/frontend/src/hooks/api/identityProjectAdditionalPrivilege/types.tsx @@ -12,21 +12,30 @@ export type TIdentityProjectPrivilege = { updatedAt: Date; permissions?: TProjectPermission[]; } & ( - | { + | { isTemporary: true; temporaryMode: string; temporaryRange: string; temporaryAccessStartTime: string; temporaryAccessEndTime?: string; } - | { + | { isTemporary: false; temporaryMode?: null; temporaryRange?: null; temporaryAccessStartTime?: null; temporaryAccessEndTime?: null; } - ); +); + +export type TProjectSpecificPrivilegePermission = { + conditions: { + environment: string; + secretPath?: { $glob: string }; + }; + actions: string[]; + subject: string; +}; export type TCreateIdentityProjectPrivilegeDTO = { identityId: string; @@ -36,14 +45,16 @@ export type TCreateIdentityProjectPrivilegeDTO = { temporaryMode?: IdentityProjectAdditionalPrivilegeTemporaryMode; temporaryRange?: string; temporaryAccessStartTime?: string; - permissions: TProjectPermission[]; + privilegePermission: TProjectSpecificPrivilegePermission; }; export type TUpdateIdentityProjectPrivlegeDTO = { projectSlug: string; identityId: string; privilegeSlug: string; - privilegeDetails: Partial>; + privilegeDetails: Partial< + Omit + >; }; export type TDeleteIdentityProjectPrivilegeDTO = { diff --git a/frontend/src/hooks/api/roles/index.tsx b/frontend/src/hooks/api/roles/index.tsx index 50736b30d..53c05a7b6 100644 --- a/frontend/src/hooks/api/roles/index.tsx +++ b/frontend/src/hooks/api/roles/index.tsx @@ -8,6 +8,7 @@ export { } from "./mutation"; export { useGetOrgRoles, + useGetProjectRoleBySlug, useGetProjectRoles, useGetUserOrgPermissions, useGetUserProjectPermissions diff --git a/frontend/src/hooks/api/roles/mutation.tsx b/frontend/src/hooks/api/roles/mutation.tsx index 6df6a3933..ae3e170de 100644 --- a/frontend/src/hooks/api/roles/mutation.tsx +++ b/frontend/src/hooks/api/roles/mutation.tsx @@ -17,13 +17,10 @@ export const useCreateProjectRole = () => { const queryClient = useQueryClient(); return useMutation({ - mutationFn: ({ projectId, permissions, ...dto }: TCreateProjectRoleDTO) => - apiRequest.post(`/api/v1/workspace/${projectId}/roles`, { - ...dto, - permissions: permissions.length ? packRules(permissions) : [] - }), - onSuccess: (_, { projectId }) => { - queryClient.invalidateQueries(roleQueryKeys.getProjectRoles(projectId)); + mutationFn: ({ projectSlug, ...dto }: TCreateProjectRoleDTO) => + apiRequest.post(`/api/v1/workspace/${projectSlug}/roles`, dto), + onSuccess: (_, { projectSlug }) => { + queryClient.invalidateQueries(roleQueryKeys.getProjectRoles(projectSlug)); } }); }; @@ -32,13 +29,10 @@ export const useUpdateProjectRole = () => { const queryClient = useQueryClient(); return useMutation({ - mutationFn: ({ id, projectId, permissions, ...dto }: TUpdateProjectRoleDTO) => - apiRequest.patch(`/api/v1/workspace/${projectId}/roles/${id}`, { - ...dto, - permissions: permissions?.length ? packRules(permissions) : [] - }), - onSuccess: (_, { projectId }) => { - queryClient.invalidateQueries(roleQueryKeys.getProjectRoles(projectId)); + mutationFn: ({ id, projectSlug, ...dto }: TUpdateProjectRoleDTO) => + apiRequest.patch(`/api/v1/workspace/${projectSlug}/roles/${id}`, dto), + onSuccess: (_, { projectSlug }) => { + queryClient.invalidateQueries(roleQueryKeys.getProjectRoles(projectSlug)); } }); }; @@ -47,12 +41,10 @@ export const useDeleteProjectRole = () => { const queryClient = useQueryClient(); return useMutation({ - mutationFn: ({ projectId, id }: TDeleteProjectRoleDTO) => - apiRequest.delete(`/api/v1/workspace/${projectId}/roles/${id}`, { - data: { projectId } - }), - onSuccess: (_, { projectId }) => { - queryClient.invalidateQueries(roleQueryKeys.getProjectRoles(projectId)); + mutationFn: ({ projectSlug, id }: TDeleteProjectRoleDTO) => + apiRequest.delete(`/api/v1/workspace/${projectSlug}/roles/${id}`), + onSuccess: (_, { projectSlug }) => { + queryClient.invalidateQueries(roleQueryKeys.getProjectRoles(projectSlug)); } }); }; diff --git a/frontend/src/hooks/api/roles/queries.tsx b/frontend/src/hooks/api/roles/queries.tsx index 3280bface..f04af697d 100644 --- a/frontend/src/hooks/api/roles/queries.tsx +++ b/frontend/src/hooks/api/roles/queries.tsx @@ -14,7 +14,6 @@ import { TGetUserProjectPermissionDTO, TOrgRole, TPermission, - TProjectPermission, TProjectRole } from "./types"; @@ -37,7 +36,9 @@ const glob: JsInterpreter> = (node, object, context) => { const conditionsMatcher = buildMongoQueryMatcher({ $glob }, { glob }); export const roleQueryKeys = { - getProjectRoles: (projectId: string) => ["roles", { projectId }] as const, + getProjectRoles: (projectSlug: string) => ["roles", { projectSlug }] as const, + getProjectRoleBySlug: (projectSlug: string, roleSlug: string) => + ["roles", { projectSlug, roleSlug }] as const, getOrgRoles: (orgId: string) => ["org-roles", { orgId }] as const, getUserOrgPermissions: ({ orgId }: TGetUserOrgPermissionsDTO) => ["user-permissions", { orgId }] as const, @@ -46,20 +47,29 @@ export const roleQueryKeys = { }; const getProjectRoles = async (projectId: string) => { - const { data } = await apiRequest.get<{ - data: { roles: Array & { permissions: unknown }> }; - }>(`/api/v1/workspace/${projectId}/roles`); - return data.data.roles.map(({ permissions, ...el }) => ({ - ...el, - permissions: unpackRules(permissions as PackRule[]) - })); + const { data } = await apiRequest.get<{ roles: Array> }>( + `/api/v1/workspace/${projectId}/roles` + ); + return data.roles; }; -export const useGetProjectRoles = (projectId: string) => +export const useGetProjectRoles = (projectSlug: string) => useQuery({ - queryKey: roleQueryKeys.getProjectRoles(projectId), - queryFn: () => getProjectRoles(projectId), - enabled: Boolean(projectId) + queryKey: roleQueryKeys.getProjectRoles(projectSlug), + queryFn: () => getProjectRoles(projectSlug), + enabled: Boolean(projectSlug) + }); + +export const useGetProjectRoleBySlug = (projectSlug: string, roleSlug: string) => + useQuery({ + queryKey: roleQueryKeys.getProjectRoleBySlug(projectSlug, roleSlug), + queryFn: async () => { + const { data } = await apiRequest.get<{ role: TProjectRole }>( + `/api/v1/workspace/${projectSlug}/roles/slug/${roleSlug}` + ); + return data.role; + }, + enabled: Boolean(projectSlug && roleSlug) }); const getOrgRoles = async (orgId: string) => { diff --git a/frontend/src/hooks/api/roles/types.ts b/frontend/src/hooks/api/roles/types.ts index 97a90b421..e2d1b533a 100644 --- a/frontend/src/hooks/api/roles/types.ts +++ b/frontend/src/hooks/api/roles/types.ts @@ -71,7 +71,7 @@ export type TDeleteOrgRoleDTO = { }; export type TCreateProjectRoleDTO = { - projectId: string; + projectSlug: string; name: string; description?: string; slug: string; @@ -79,11 +79,11 @@ export type TCreateProjectRoleDTO = { }; export type TUpdateProjectRoleDTO = { - projectId: string; + projectSlug: string; id: string; } & Partial>; export type TDeleteProjectRoleDTO = { - projectId: string; + projectSlug: string; id: string; }; diff --git a/frontend/src/views/Project/MembersPage/components/GroupsTab/components/GroupsSection/GroupModal.tsx b/frontend/src/views/Project/MembersPage/components/GroupsTab/components/GroupsSection/GroupModal.tsx index 818c6eae0..f0ed1c5b7 100644 --- a/frontend/src/views/Project/MembersPage/components/GroupsTab/components/GroupsSection/GroupModal.tsx +++ b/frontend/src/views/Project/MembersPage/components/GroupsTab/components/GroupsSection/GroupModal.tsx @@ -5,25 +5,19 @@ import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { createNotification } from "@app/components/notifications"; -import { - Button, - FormControl, - Modal, - ModalContent, - Select, - SelectItem} from "@app/components/v2"; +import { Button, FormControl, Modal, ModalContent, Select, SelectItem } from "@app/components/v2"; import { useOrganization, useWorkspace } from "@app/context"; -import { - useAddGroupToWorkspace, - useGetOrganizationGroups, - useGetProjectRoles, - useListWorkspaceGroups, +import { + useAddGroupToWorkspace, + useGetOrganizationGroups, + useGetProjectRoles, + useListWorkspaceGroups } from "@app/hooks/api"; import { UsePopUpState } from "@app/hooks/usePopUp"; const schema = z.object({ - slug: z.string(), - role: z.string() + slug: z.string(), + role: z.string() }); export type FormData = z.infer; @@ -33,150 +27,146 @@ type Props = { handlePopUpToggle: (popUpName: keyof UsePopUpState<["group"]>, state?: boolean) => void; }; -export const GroupModal = ({ - popUp, - handlePopUpToggle -}: Props) => { - const { currentOrg } = useOrganization(); - const { currentWorkspace } = useWorkspace(); +export const GroupModal = ({ popUp, handlePopUpToggle }: Props) => { + const { currentOrg } = useOrganization(); + const { currentWorkspace } = useWorkspace(); - const orgId = currentOrg?.id || ""; - const workspaceId = currentWorkspace?.id || ""; - - const { data: groups } = useGetOrganizationGroups(orgId); - const { data: groupMemberships } = useListWorkspaceGroups(currentWorkspace?.slug || ""); - - const { data: roles } = useGetProjectRoles(workspaceId); - - const { mutateAsync: addGroupToWorkspaceMutateAsync } = useAddGroupToWorkspace(); - - const filteredGroupMembershipOrgs = useMemo(() => { - const wsGroupIds = new Map(); + const orgId = currentOrg?.id || ""; + const projectSlug = currentWorkspace?.slug || ""; - groupMemberships?.forEach((groupMembership) => { - wsGroupIds.set(groupMembership.group.id, true); - }); + const { data: groups } = useGetOrganizationGroups(orgId); + const { data: groupMemberships } = useListWorkspaceGroups(currentWorkspace?.slug || ""); - return (groups || []).filter(({ id }) => !wsGroupIds.has(id)); - }, [groups, groupMemberships]); - - const { - control, - handleSubmit, - reset, - formState: { isSubmitting } - } = useForm({ - resolver: zodResolver(schema) + const { data: roles } = useGetProjectRoles(projectSlug); + + const { mutateAsync: addGroupToWorkspaceMutateAsync } = useAddGroupToWorkspace(); + + const filteredGroupMembershipOrgs = useMemo(() => { + const wsGroupIds = new Map(); + + groupMemberships?.forEach((groupMembership) => { + wsGroupIds.set(groupMembership.group.id, true); + }); + + return (groups || []).filter(({ id }) => !wsGroupIds.has(id)); + }, [groups, groupMemberships]); + + const { + control, + handleSubmit, + reset, + formState: { isSubmitting } + } = useForm({ + resolver: zodResolver(schema) + }); + + const onFormSubmit = async ({ slug, role }: FormData) => { + try { + await addGroupToWorkspaceMutateAsync({ + projectSlug: currentWorkspace?.slug || "", + groupSlug: slug, + role: role || undefined }); - const onFormSubmit = async ({ slug, role }: FormData) => { - try { - await addGroupToWorkspaceMutateAsync({ - projectSlug: currentWorkspace?.slug || "", - groupSlug: slug, - role: role || undefined - }); - - reset(); - handlePopUpToggle("group", false); - - createNotification({ - text: "Successfully added group to project", - type: "success" - }); - - } catch (err) { - createNotification({ - text: "Failed to add group to project", - type: "error" - }); - } + reset(); + handlePopUpToggle("group", false); + + createNotification({ + text: "Successfully added group to project", + type: "success" + }); + } catch (err) { + createNotification({ + text: "Failed to add group to project", + type: "error" + }); } - - return ( - { - handlePopUpToggle("group", isOpen); - reset(); - }} - > - - {filteredGroupMembershipOrgs.length ? ( -
- ( - - - - )} - /> - ( - - - - )} - /> -
- - -
- - ) : ( -
-
- All groups in your organization have already been added to this project. -
- - - -
- )} -
-
- ); -} \ No newline at end of file + }; + + return ( + { + handlePopUpToggle("group", isOpen); + reset(); + }} + > + + {filteredGroupMembershipOrgs.length ? ( +
+ ( + + + + )} + /> + ( + + + + )} + /> +
+ + +
+ + ) : ( +
+
+ All groups in your organization have already been added to this project. +
+ + + +
+ )} +
+
+ ); +}; diff --git a/frontend/src/views/Project/MembersPage/components/GroupsTab/components/GroupsSection/GroupRoles.tsx b/frontend/src/views/Project/MembersPage/components/GroupsTab/components/GroupsSection/GroupRoles.tsx index 83ea00ede..449c0c95f 100644 --- a/frontend/src/views/Project/MembersPage/components/GroupsTab/components/GroupsSection/GroupRoles.tsx +++ b/frontend/src/views/Project/MembersPage/components/GroupsTab/components/GroupsSection/GroupRoles.tsx @@ -201,11 +201,7 @@ export type TMemberRolesProp = { const MAX_ROLES_TO_BE_SHOWN_IN_TABLE = 2; -export const GroupRoles = ({ - roles = [], - disableEdit = false, - groupSlug -}: TMemberRolesProp) => { +export const GroupRoles = ({ roles = [], disableEdit = false, groupSlug }: TMemberRolesProp) => { const { currentWorkspace } = useWorkspace(); const { popUp, handlePopUpToggle } = usePopUp(["editRole"] as const); const [searchRoles, setSearchRoles] = useState(""); @@ -220,9 +216,9 @@ export const GroupRoles = ({ resolver: zodResolver(formSchema) }); - const workspaceId = currentWorkspace?.id || ""; + const projectSlug = currentWorkspace?.slug || ""; - const { data: projectRoles, isLoading: isRolesLoading } = useGetProjectRoles(workspaceId); + const { data: projectRoles, isLoading: isRolesLoading } = useGetProjectRoles(projectSlug); const userRolesGroupBySlug = groupBy(roles, ({ customRoleSlug, role }) => customRoleSlug || role); const updateGroupWorkspaceRole = useUpdateGroupWorkspaceRole(); @@ -317,7 +313,7 @@ export const GroupRoles = ({ icon={faClock} className={twMerge( new Date() > new Date(temporaryAccessEndTime as string) && - "text-red-600" + "text-red-600" )} /> @@ -390,14 +386,14 @@ export const GroupRoles = ({ defaultValue={ userProjectRoleDetails?.isTemporary ? { - isTemporary: true, - temporaryAccessStartTime: - userProjectRoleDetails.temporaryAccessStartTime as string, - temporaryRange: - userProjectRoleDetails.temporaryRange as string, - temporaryAccessEndTime: - userProjectRoleDetails.temporaryAccessEndTime - } + isTemporary: true, + temporaryAccessStartTime: + userProjectRoleDetails.temporaryAccessStartTime as string, + temporaryRange: + userProjectRoleDetails.temporaryRange as string, + temporaryAccessEndTime: + userProjectRoleDetails.temporaryAccessEndTime + } : false } render={({ field }) => ( diff --git a/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentityModal.tsx b/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentityModal.tsx index 72d39537e..5637b2f1a 100644 --- a/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentityModal.tsx +++ b/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentityModal.tsx @@ -30,17 +30,17 @@ type Props = { }; export const IdentityModal = ({ popUp, handlePopUpToggle }: Props) => { - const { currentOrg } = useOrganization(); const { currentWorkspace } = useWorkspace(); const orgId = currentOrg?.id || ""; const workspaceId = currentWorkspace?.id || ""; + const projectSlug = currentWorkspace?.slug || ""; const { data: identityMembershipOrgs } = useGetIdentityMembershipOrgs(orgId); const { data: identityMemberships } = useGetWorkspaceIdentityMemberships(workspaceId); - const { data: roles } = useGetProjectRoles(workspaceId); + const { data: roles } = useGetProjectRoles(projectSlug); const { mutateAsync: addIdentityToWorkspaceMutateAsync } = useAddIdentityToWorkspace(); diff --git a/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentityRoleForm/IdentityRbacSection.tsx b/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentityRoleForm/IdentityRbacSection.tsx index ca7e31464..05aeb1fb0 100644 --- a/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentityRoleForm/IdentityRbacSection.tsx +++ b/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentityRoleForm/IdentityRbacSection.tsx @@ -65,7 +65,8 @@ export const IdentityRbacSection = ({ identityProjectMember, onOpenUpgradeModal const { subscription } = useSubscription(); const { currentWorkspace } = useWorkspace(); const workspaceId = currentWorkspace?.id || ""; - const { data: projectRoles, isLoading: isRolesLoading } = useGetProjectRoles(workspaceId); + const projectSlug = currentWorkspace?.slug || ""; + const { data: projectRoles, isLoading: isRolesLoading } = useGetProjectRoles(projectSlug); const { permission } = useProjectPermission(); const isMemberEditDisabled = permission.cannot( ProjectPermissionActions.Edit, @@ -79,14 +80,14 @@ export const IdentityRbacSection = ({ identityProjectMember, onOpenUpgradeModal slug: customRoleSlug || role, temporaryAccess: dto.isTemporary ? { - isTemporary: true, - temporaryRange: dto.temporaryRange, - temporaryAccessEndTime: dto.temporaryAccessEndTime, - temporaryAccessStartTime: dto.temporaryAccessStartTime - } + isTemporary: true, + temporaryRange: dto.temporaryRange, + temporaryAccessEndTime: dto.temporaryAccessEndTime, + temporaryAccessStartTime: dto.temporaryAccessStartTime + } : { - isTemporary: dto.isTemporary - } + isTemporary: dto.isTemporary + } })) } }); @@ -191,9 +192,9 @@ export const IdentityRbacSection = ({ identityProjectMember, onOpenUpgradeModal ? isExpired ? "Timed Access Expired" : `Until ${format( - new Date(temporaryAccess.temporaryAccessEndTime || ""), - "yyyy-MM-dd HH:mm:ss" - )}` + new Date(temporaryAccess.temporaryAccessEndTime || ""), + "yyyy-MM-dd HH:mm:ss" + )}` : "Non expiry access" } > @@ -212,9 +213,9 @@ export const IdentityRbacSection = ({ identityProjectMember, onOpenUpgradeModal ? isExpired ? "Access Expired" : formatDistance( - new Date(temporaryAccess.temporaryAccessEndTime || ""), - new Date() - ) + new Date(temporaryAccess.temporaryAccessEndTime || ""), + new Date() + ) : "Permanent"} @@ -338,7 +339,7 @@ export const IdentityRbacSection = ({ identityProjectMember, onOpenUpgradeModal type="submit" className={twMerge( "transition-all", - "opacity-0 cursor-default", + "cursor-default opacity-0", roleForm.formState.isDirty && "cursor-pointer opacity-100" )} isDisabled={!roleForm.formState.isDirty} diff --git a/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentityRoleForm/SpecificPrivilegeSection.tsx b/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentityRoleForm/SpecificPrivilegeSection.tsx index 6c1d4654d..7f76992bb 100644 --- a/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentityRoleForm/SpecificPrivilegeSection.tsx +++ b/frontend/src/views/Project/MembersPage/components/IdentityTab/components/IdentityRoleForm/SpecificPrivilegeSection.tsx @@ -131,20 +131,17 @@ const SpecificPrivilegeSecretForm = ({ { action: ProjectPermissionActions.Delete, allowed: data.delete }, { action: ProjectPermissionActions.Edit, allowed: data.edit } ]; - const conditions: Record = { environment: data.environmentSlug }; - if (data.secretPath) { - conditions.secretPath = { $glob: data.secretPath }; - } await updateIdentityPrivilege.mutateAsync({ privilegeDetails: { ...data.temporaryAccess, - permissions: actions - .filter(({ allowed }) => allowed) - .map(({ action }) => ({ - action, - subject: ProjectPermissionSub.Secrets, - conditions - })) + privilegePermission: { + actions: actions.filter(({ allowed }) => allowed).map(({ action }) => action), + subject: ProjectPermissionSub.Secrets, + conditions: { + environment: data.environmentSlug, + ...(data.secretPath ? { secretPath: { $glob: data.secretPath } } : {}) + } + } }, privilegeSlug: privilege.slug, identityId, @@ -474,15 +471,13 @@ export const SpecificPrivilegeSection = ({ identityId }: Props) => { if (createIdentityPrivilege.isLoading) return; try { await createIdentityPrivilege.mutateAsync({ - permissions: [ - { - action: ProjectPermissionActions.Read, - subject: ProjectPermissionSub.Secrets, - conditions: { - environment: currentWorkspace?.environments?.[0].slug - } + privilegePermission: { + actions: [ProjectPermissionActions.Read], + subject: ProjectPermissionSub.Secrets, + conditions: { + environment: currentWorkspace?.environments?.[0].slug as string } - ], + }, identityId, projectSlug }); diff --git a/frontend/src/views/Project/MembersPage/components/MemberListTab/MemberRoleForm/MemberRbacSection.tsx b/frontend/src/views/Project/MembersPage/components/MemberListTab/MemberRoleForm/MemberRbacSection.tsx index 04497c62c..5cad54801 100644 --- a/frontend/src/views/Project/MembersPage/components/MemberListTab/MemberRoleForm/MemberRbacSection.tsx +++ b/frontend/src/views/Project/MembersPage/components/MemberListTab/MemberRoleForm/MemberRbacSection.tsx @@ -65,7 +65,8 @@ export const MemberRbacSection = ({ projectMember, onOpenUpgradeModal }: Props) const { subscription } = useSubscription(); const { currentWorkspace } = useWorkspace(); const workspaceId = currentWorkspace?.id || ""; - const { data: projectRoles, isLoading: isRolesLoading } = useGetProjectRoles(workspaceId); + const projectSlug = currentWorkspace?.slug || ""; + const { data: projectRoles, isLoading: isRolesLoading } = useGetProjectRoles(projectSlug); const { permission } = useProjectPermission(); const isMemberEditDisabled = permission.cannot( ProjectPermissionActions.Edit, @@ -79,14 +80,14 @@ export const MemberRbacSection = ({ projectMember, onOpenUpgradeModal }: Props) slug: customRoleSlug || role, temporaryAccess: dto.isTemporary ? { - isTemporary: true, - temporaryRange: dto.temporaryRange, - temporaryAccessEndTime: dto.temporaryAccessEndTime, - temporaryAccessStartTime: dto.temporaryAccessStartTime - } + isTemporary: true, + temporaryRange: dto.temporaryRange, + temporaryAccessEndTime: dto.temporaryAccessEndTime, + temporaryAccessStartTime: dto.temporaryAccessStartTime + } : { - isTemporary: dto.isTemporary - } + isTemporary: dto.isTemporary + } })) } }); @@ -191,9 +192,9 @@ export const MemberRbacSection = ({ projectMember, onOpenUpgradeModal }: Props) ? isExpired ? "Timed Access Expired" : `Until ${format( - new Date(temporaryAccess.temporaryAccessEndTime || ""), - "yyyy-MM-dd HH:mm:ss" - )}` + new Date(temporaryAccess.temporaryAccessEndTime || ""), + "yyyy-MM-dd HH:mm:ss" + )}` : "Non expiry access" } > @@ -212,9 +213,9 @@ export const MemberRbacSection = ({ projectMember, onOpenUpgradeModal }: Props) ? isExpired ? "Access Expired" : formatDistance( - new Date(temporaryAccess.temporaryAccessEndTime || ""), - new Date() - ) + new Date(temporaryAccess.temporaryAccessEndTime || ""), + new Date() + ) : "Permanent"} @@ -335,7 +336,7 @@ export const MemberRbacSection = ({ projectMember, onOpenUpgradeModal }: Props) type="submit" className={twMerge( "transition-all", - "opacity-0 cursor-default", + "cursor-default opacity-0", roleForm.formState.isDirty && "cursor-pointer opacity-100" )} isDisabled={!roleForm.formState.isDirty} diff --git a/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/ProjectRoleListTab.tsx b/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/ProjectRoleListTab.tsx index 6cfec25ea..5eb443fb6 100644 --- a/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/ProjectRoleListTab.tsx +++ b/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/ProjectRoleListTab.tsx @@ -3,7 +3,6 @@ import { motion } from "framer-motion"; import { ProjectPermissionActions, ProjectPermissionSub } from "@app/context"; import { withProjectPermission } from "@app/hoc"; import { usePopUp } from "@app/hooks"; -import { TProjectRole } from "@app/hooks/api/roles/types"; import { ProjectRoleList } from "./components/ProjectRoleList"; import { ProjectRoleModifySection } from "./components/ProjectRoleModifySection"; @@ -21,7 +20,7 @@ export const ProjectRoleListTab = withProjectPermission( exit={{ opacity: 0, translateX: 30 }} > handlePopUpClose("editRole")} /> @@ -33,7 +32,7 @@ export const ProjectRoleListTab = withProjectPermission( animate={{ opacity: 1, translateX: 0 }} exit={{ opacity: 0, translateX: -30 }} > - handlePopUpOpen("editRole", role)} /> + handlePopUpOpen("editRole", slug)} /> ); }, diff --git a/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleList/ProjectRoleList.tsx b/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleList/ProjectRoleList.tsx index d8a22bdb4..e19e61aec 100644 --- a/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleList/ProjectRoleList.tsx +++ b/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleList/ProjectRoleList.tsx @@ -24,7 +24,7 @@ import { useDeleteProjectRole, useGetProjectRoles } from "@app/hooks/api"; import { TProjectRole } from "@app/hooks/api/roles/types"; type Props = { - onSelectRole: (role?: TProjectRole) => void; + onSelectRole: (slug?: string) => void; }; export const ProjectRoleList = ({ onSelectRole }: Props) => { @@ -32,10 +32,9 @@ export const ProjectRoleList = ({ onSelectRole }: Props) => { const { popUp, handlePopUpOpen, handlePopUpClose } = usePopUp(["deleteRole"] as const); const { currentWorkspace } = useWorkspace(); - const workspaceId = currentWorkspace?.id || ""; + const projectSlug = currentWorkspace?.slug || ""; - const { data: roles, isLoading: isRolesLoading } = useGetProjectRoles(workspaceId); - console.log(roles); + const { data: roles, isLoading: isRolesLoading } = useGetProjectRoles(projectSlug); const { mutateAsync: deleteRole } = useDeleteProjectRole(); @@ -43,7 +42,7 @@ export const ProjectRoleList = ({ onSelectRole }: Props) => { const { id } = popUp?.deleteRole?.data as TProjectRole; try { await deleteRole({ - projectId: workspaceId, + projectSlug, id }); createNotification({ type: "success", text: "Successfully removed the role" }); @@ -109,7 +108,7 @@ export const ProjectRoleList = ({ onSelectRole }: Props) => { onSelectRole(role)} + onClick={() => onSelectRole(role.slug)} variant="plain" > @@ -146,9 +145,8 @@ export const ProjectRoleList = ({ onSelectRole }: Props) => {

handlePopUpClose("deleteRole")} onDeleteApproved={handleRoleDelete} diff --git a/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/ProjectRoleModifySection.tsx b/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/ProjectRoleModifySection.tsx index 4a57e2810..cd2eaeee0 100644 --- a/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/ProjectRoleModifySection.tsx +++ b/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/ProjectRoleModifySection.tsx @@ -19,9 +19,13 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { zodResolver } from "@hookform/resolvers/zod"; import { createNotification } from "@app/components/notifications"; -import { Button, FormControl, Input } from "@app/components/v2"; +import { Button, FormControl, Input, Spinner } from "@app/components/v2"; import { ProjectPermissionSub, useWorkspace } from "@app/context"; -import { useCreateProjectRole, useUpdateProjectRole } from "@app/hooks/api"; +import { + useCreateProjectRole, + useGetProjectRoleBySlug, + useUpdateProjectRole +} from "@app/hooks/api"; import { TProjectRole } from "@app/hooks/api/roles/types"; import { MultiEnvProjectPermission } from "./MultiEnvProjectPermission"; @@ -117,17 +121,20 @@ const SINGLE_PERMISSION_LIST = [ ] as const; type Props = { - role?: TProjectRole; + roleSlug?: string; onGoBack: VoidFunction; }; -export const ProjectRoleModifySection = ({ role, onGoBack }: Props) => { - const isNonEditable = ["admin", "member", "viewer", "no-access"].includes(role?.slug || ""); - const isNewRole = !role?.slug; +export const ProjectRoleModifySection = ({ roleSlug, onGoBack }: Props) => { + const isNonEditable = ["admin", "member", "viewer", "no-access"].includes(roleSlug || ""); + const isNewRole = !roleSlug; - const { currentWorkspace } = useWorkspace(); - const workspaceId = currentWorkspace?.id || ""; + const projectSlug = currentWorkspace?.slug || ""; + const { data: roleDetails, isLoading: isRoleDetailsLoading } = useGetProjectRoleBySlug( + currentWorkspace?.slug || "", + roleSlug as string + ); const { handleSubmit, @@ -137,19 +144,21 @@ export const ProjectRoleModifySection = ({ role, onGoBack }: Props) => { getValues, control } = useForm({ - defaultValues: role ? { ...role, permissions: rolePermission2Form(role.permissions) } : {}, + values: roleDetails + ? { ...roleDetails, permissions: rolePermission2Form(roleDetails.permissions) } + : ({} as TProjectRole), resolver: zodResolver(formSchema) }); const { mutateAsync: createRole } = useCreateProjectRole(); const { mutateAsync: updateRole } = useUpdateProjectRole(); const handleRoleUpdate = async (el: TFormSchema) => { - if (!role?.id) return; + if (!roleDetails?.id) return; try { await updateRole({ - id: role?.id, - projectId: workspaceId, + id: roleDetails?.id as string, + projectSlug, ...el, permissions: formRolePermission2API(el.permissions) }); @@ -169,7 +178,7 @@ export const ProjectRoleModifySection = ({ role, onGoBack }: Props) => { try { await createRole({ - projectId: workspaceId, + projectSlug, ...el, permissions: formRolePermission2API(el.permissions) }); @@ -181,6 +190,14 @@ export const ProjectRoleModifySection = ({ role, onGoBack }: Props) => { } }; + if (!isNewRole && isRoleDetailsLoading) { + return ( +
+ +
+ ); + } + return (
diff --git a/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/ProjectRoleModifySection.utils.ts b/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/ProjectRoleModifySection.utils.ts index 5dc90cf8b..4d4d45e64 100644 --- a/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/ProjectRoleModifySection.utils.ts +++ b/frontend/src/views/Project/MembersPage/components/ProjectRoleListTab/components/ProjectRoleModifySection/ProjectRoleModifySection.utils.ts @@ -95,10 +95,8 @@ export const rolePermission2Form = (permissions: TProjectPermission[] = []) => { const formVal: Record = {}; permissions.forEach((permission) => { - const { - subject: [subject], - action - } = permission; + const { subject: caslSub, action } = permission; + const subject = typeof caslSub === "string" ? caslSub : caslSub[0]; if (!formVal?.[subject]) formVal[subject] = {}; if (subject === "secrets") { @@ -123,7 +121,7 @@ const multiEnvForm2Api = ( const isFullAccess = PERMISSION_ACTIONS.every((action) => formVal?.all?.[action]); // if any of them is set in all push it without any condition PERMISSION_ACTIONS.forEach((action) => { - if (formVal?.all?.[action]) permissions.push({ action, subject: [subject] }); + if (formVal?.all?.[action]) permissions.push({ action, subject }); }); if (!isFullAccess) { @@ -144,7 +142,7 @@ const multiEnvForm2Api = ( if (formVal[slug]?.secretPath) conditions.secretPath = { $glob: formVal?.[slug]?.secretPath }; - permissions.push({ action, subject: [subject], conditions }); + permissions.push({ action, subject, conditions }); } }); }); @@ -161,7 +159,7 @@ export const formRolePermission2API = (formVal: TFormSchema["permissions"]) => { } else { Object.entries(actions).forEach(([action, isAllowed]) => { if (isAllowed) { - permissions.push({ subject: [rule], action }); + permissions.push({ subject: rule, action }); } }); } From 7a955e3fae77cbba28e1bdcd6e19ad9490b2fcf2 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 26 May 2024 22:48:53 +0530 Subject: [PATCH 050/101] docs: api docs for identity specific privilege --- backend/src/lib/api-docs/constants.ts | 37 ++++++++++++++++++- .../endpoints/project-roles/create.mdx | 4 ++ .../endpoints/project-roles/delete.mdx | 4 ++ .../endpoints/project-roles/get-by-slug.mdx | 4 ++ .../endpoints/project-roles/list.mdx | 4 ++ .../endpoints/project-roles/update.mdx | 4 ++ docs/mint.json | 10 +++++ 7 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 docs/api-reference/endpoints/project-roles/create.mdx create mode 100644 docs/api-reference/endpoints/project-roles/delete.mdx create mode 100644 docs/api-reference/endpoints/project-roles/get-by-slug.mdx create mode 100644 docs/api-reference/endpoints/project-roles/list.mdx create mode 100644 docs/api-reference/endpoints/project-roles/update.mdx diff --git a/backend/src/lib/api-docs/constants.ts b/backend/src/lib/api-docs/constants.ts index 6ae5a9d33..7aa0b24cf 100644 --- a/backend/src/lib/api-docs/constants.ts +++ b/backend/src/lib/api-docs/constants.ts @@ -519,7 +519,8 @@ export const IDENTITY_ADDITIONAL_PRIVILEGE = { projectSlug: "The slug of the project of the identity in.", identityId: "The ID of the identity to create.", slug: "The slug of the privilege to create.", - permissions: `The permission object for the privilege. + permissions: `@deprecated - use privilegePermission +The permission object for the privilege. - Read secrets \`\`\` { "permissions": [{"action": "read", "subject": "secrets"]} @@ -533,6 +534,7 @@ export const IDENTITY_ADDITIONAL_PRIVILEGE = { - { "permissions": [{"action": "read", "subject": "secrets", "conditions": { "environment": "dev", "secretPath": { "$glob": "/" } }}] } \`\`\` `, + privilegePermission: "The permission object for the privilege.", isPackPermission: "Whether the server should pack(compact) the permission object.", isTemporary: "Whether the privilege is temporary.", temporaryMode: "Type of temporary access given. Types: relative", @@ -544,7 +546,8 @@ export const IDENTITY_ADDITIONAL_PRIVILEGE = { identityId: "The ID of the identity to update.", slug: "The slug of the privilege to update.", newSlug: "The new slug of the privilege to update.", - permissions: `The permission object for the privilege. + permissions: `@deprecated - use privilegePermission +The permission object for the privilege. - Read secrets \`\`\` { "permissions": [{"action": "read", "subject": "secrets"]} @@ -558,6 +561,7 @@ export const IDENTITY_ADDITIONAL_PRIVILEGE = { - { "permissions": [{"action": "read", "subject": "secrets", "conditions": { "environment": "dev", "secretPath": { "$glob": "/" } }}] } \`\`\` `, + privilegePermission: "The permission object for the privilege.", isTemporary: "Whether the privilege is temporary.", temporaryMode: "Type of temporary access given. Types: relative", temporaryRange: "TTL for the temporay time. Eg: 1m, 1h, 1d", @@ -715,3 +719,32 @@ export const AUDIT_LOG_STREAMS = { id: "The ID of the audit log stream to get details." } }; + +export const PROJECT_ROLE = { + CREATE: { + projectSlug: "The slug of the project to create role.", + slug: "The slug of the role.", + name: "The name of the role.", + description: "The description for the role.", + permissions: "The permissions assigned to the role." + }, + UPDATE: { + projectSlug: "The slug of the project to update role.", + roleId: "The ID of the role to update", + slug: "The slug of the role.", + name: "The name of the role.", + description: "The description for the role.", + permissions: "The permissions assigned to the role." + }, + DELETE: { + projectSlug: "The slug of the project to delete role.", + roleId: "The ID of the role to update" + }, + GET_ROLE_BY_SLUG: { + projectSlug: "The slug of the project.", + roleSlug: "The slug of the role to get details" + }, + LIST: { + projectSlug: "The slug of the project to list roles." + } +}; diff --git a/docs/api-reference/endpoints/project-roles/create.mdx b/docs/api-reference/endpoints/project-roles/create.mdx new file mode 100644 index 000000000..2220b9309 --- /dev/null +++ b/docs/api-reference/endpoints/project-roles/create.mdx @@ -0,0 +1,4 @@ +--- +title: "Create" +openapi: "POST /api/v1/workspace/{projectSlug}/roles" +--- diff --git a/docs/api-reference/endpoints/project-roles/delete.mdx b/docs/api-reference/endpoints/project-roles/delete.mdx new file mode 100644 index 000000000..6362c2154 --- /dev/null +++ b/docs/api-reference/endpoints/project-roles/delete.mdx @@ -0,0 +1,4 @@ +--- +title: "Delete" +openapi: "DELETE /api/v1/workspace/{projectSlug}/roles/{roleId}" +--- diff --git a/docs/api-reference/endpoints/project-roles/get-by-slug.mdx b/docs/api-reference/endpoints/project-roles/get-by-slug.mdx new file mode 100644 index 000000000..18817bca9 --- /dev/null +++ b/docs/api-reference/endpoints/project-roles/get-by-slug.mdx @@ -0,0 +1,4 @@ +--- +title: "Get By Slug" +openapi: "GET /api/v1/workspace/{projectSlug}/roles/slug/{slug}" +--- diff --git a/docs/api-reference/endpoints/project-roles/list.mdx b/docs/api-reference/endpoints/project-roles/list.mdx new file mode 100644 index 000000000..ca83d6e7d --- /dev/null +++ b/docs/api-reference/endpoints/project-roles/list.mdx @@ -0,0 +1,4 @@ +--- +title: "List" +openapi: "GET /api/v1/workspace/{projectSlug}/roles" +--- diff --git a/docs/api-reference/endpoints/project-roles/update.mdx b/docs/api-reference/endpoints/project-roles/update.mdx new file mode 100644 index 000000000..5a3d9668e --- /dev/null +++ b/docs/api-reference/endpoints/project-roles/update.mdx @@ -0,0 +1,4 @@ +--- +title: "Update" +openapi: "PATCH /api/v1/workspace/{projectSlug}/roles/{roleId}" +--- diff --git a/docs/mint.json b/docs/mint.json index 06b92711c..cdf8dcbaf 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -475,6 +475,16 @@ "api-reference/endpoints/project-identities/delete-identity-membership" ] }, + { + "group": "Project Roles", + "pages": [ + "api-reference/endpoints/project-roles/create", + "api-reference/endpoints/project-roles/update", + "api-reference/endpoints/project-roles/delete", + "api-reference/endpoints/project-roles/get-by-slug", + "api-reference/endpoints/project-roles/list" + ] + }, { "group": "Environments", "pages": [ From 3e32915a825ac58dc6dbb1dfcc3890a0a009a3c0 Mon Sep 17 00:00:00 2001 From: Vladyslav Matsiiako Date: Sun, 26 May 2024 16:14:37 -0700 Subject: [PATCH 051/101] added company handbook --- company/handbook/onboarding.mdx | 25 +++++++++++++++++++++++ company/handbook/overview.mdx | 11 ++++++++++ company/mint.json | 36 ++++++++++----------------------- 3 files changed, 47 insertions(+), 25 deletions(-) create mode 100644 company/handbook/onboarding.mdx create mode 100644 company/handbook/overview.mdx diff --git a/company/handbook/onboarding.mdx b/company/handbook/onboarding.mdx new file mode 100644 index 000000000..f1cc502f0 --- /dev/null +++ b/company/handbook/onboarding.mdx @@ -0,0 +1,25 @@ +--- +title: "Onboarding" +sidebarTitle: "Onboarding" +description: "This handbook explains how we work at Infisical." +--- + +Welcome to Infisical! + +The first few days of every new joiner are going to be packed with learning lots of new information, meeting new teammates, and understanding Infisical on a deeper level. + +Plus, our team is remote-first and spread across the globe (from San Francisco to Philippines), so having a great onboarding experience is very important for the new joiner to feel part of the team and be excited about what we're doing as a company. + +## Onboarding buddy + +Every new joiner has an onboarding buddy who should ideally be in the the same timezone. The onboarding buddy should be able to help with any questions that pop up during the first few weeks. Of course, everyone is available to help, but it's good to have a dedicated person that you can go to with any questions. + +## Onboarding Checklist + +1. Join the weekly all-hands meeting. It typically happens on Monday's at 8:30am PT. +3. Ship something together on day one – even if tiny! It feels great to hit the ground running, with a development environment all ready to go. +4. Check out the [Areas of Responsibility (AoR) Table](https://docs.google.com/spreadsheets/d/1RnXlGFg83Sgu0dh7ycuydsSobmFfI3A0XkGw7vrVxEI/edit?usp=sharing). This is helpful to know who you can ask about particular areas of Infisical. Feel free to add yourself to the areas you'd be most interesting to dive into. +5. Read the [Infisical Strategy Doc](https://docs.google.com/document/d/1oy_NP1Q_Zt1oqxLpyNkLIGmhAI3N28AmZq6dDIOONSQ/edit?usp=sharing). +7. Update your LinkedIn profile with one of [Infisical's official banners](https://drive.google.com/drive/u/0/folders/1oSNWjbpRl9oNYwxM_98IqzKs9fAskrb2) (if you want to). You can also coordinate your social posts in the #marketing Slack channel, so that we can boost it from Infisical's official social media accounts. +8. Over the first few weeks, feel free to schedule 1:1s with folks on the team to get to know them a bit better. +2. Change your Slack username in the users channel to `[NAME] (Infisical)`. diff --git a/company/handbook/overview.mdx b/company/handbook/overview.mdx new file mode 100644 index 000000000..c7067612d --- /dev/null +++ b/company/handbook/overview.mdx @@ -0,0 +1,11 @@ +--- +title: "Infisical Company Handbook" +sidebarTitle: "Welcome" +description: "This handbook explains how we work at Infisical." +--- + +Welcome! This handbook explains how we work and what we stand for at Infisical. + +Given that Infisical's core is open source, we decided to make this handbook also availably publicly to everyone. + +You can treat it as a living document as more pages and information will be added over time. diff --git a/company/mint.json b/company/mint.json index d867ab7a5..bdac8f3bd 100644 --- a/company/mint.json +++ b/company/mint.json @@ -1,6 +1,5 @@ { "name": "Infisical", - "openapi": "https://app.infisical.com/api/docs/json", "logo": { "dark": "/logo/dark.svg", "light": "/logo/light.svg", @@ -44,33 +43,20 @@ "name": "Start for Free", "url": "https://app.infisical.com/signup" }, - "tabs": [ - { - "name": "Integrations", - "url": "integrations" - }, - { - "name": "CLI", - "url": "cli" - }, - { - "name": "API Reference", - "url": "api-reference" - }, - { - "name": "SDKs", - "url": "sdks" - }, - { - "name": "Changelog", - "url": "changelog" - } - ], + "primaryTab": { + "name": "About" + }, "navigation": [ { - "group": "Getting Started", + "group": "Handbook", "pages": [ - "documentation/getting-started/introduction" + "handbook/overview" + ] + }, + { + "group": "How we work", + "pages": [ + "handbook/onboarding" ] } ], From 3639a7fc18c5ad4e59bcc5a07c599e58433b697a Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Mon, 27 May 2024 11:01:22 +0800 Subject: [PATCH 052/101] misc: migrated to native DAL method --- backend/src/services/auth/auth-login-service.ts | 2 +- backend/src/services/user/user-dal.ts | 16 +--------------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/backend/src/services/auth/auth-login-service.ts b/backend/src/services/auth/auth-login-service.ts index a97e94145..cbf43b245 100644 --- a/backend/src/services/auth/auth-login-service.ts +++ b/backend/src/services/auth/auth-login-service.ts @@ -314,7 +314,7 @@ export const authLoginServiceFactory = ({ try { const updatedUser = await userDAL.transaction(async (tx) => { const PROGRESSIVE_DELAY_INTERVAL = 3; - const user = await userDAL.incrementFailedMfaAttempt(userId, tx); + const user = await userDAL.updateById(userId, { $incr: { consecutiveFailedMfaAttempts: 1 } }, tx); if (!user) { throw new Error("User not found"); diff --git a/backend/src/services/user/user-dal.ts b/backend/src/services/user/user-dal.ts index 7c73fc4f4..f2da0df0e 100644 --- a/backend/src/services/user/user-dal.ts +++ b/backend/src/services/user/user-dal.ts @@ -143,19 +143,6 @@ export const userDALFactory = (db: TDbClient) => { } }; - const incrementFailedMfaAttempt = async (userId: string, tx?: Knex) => { - try { - const [user] = await (tx || db)(TableName.Users) - .where("id", userId) - .increment("consecutiveFailedMfaAttempts", 1) - .returning("*"); - - return user; - } catch (error) { - throw new DatabaseError({ error, name: "Increment Failed MFA Attempt" }); - } - }; - return { ...userOrm, findUserByUsername, @@ -168,7 +155,6 @@ export const userDALFactory = (db: TDbClient) => { upsertUserEncryptionKey, createUserEncryption, findOneUserAction, - createUserAction, - incrementFailedMfaAttempt + createUserAction }; }; From c1c1471439d91e23cf1719b678814339c71423ef Mon Sep 17 00:00:00 2001 From: Sheen Capadngan <65645666+sheensantoscapadngan@users.noreply.github.com> Date: Mon, 27 May 2024 12:28:14 +0800 Subject: [PATCH 053/101] Update onboarding.mdx --- company/handbook/onboarding.mdx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/company/handbook/onboarding.mdx b/company/handbook/onboarding.mdx index f1cc502f0..5191c8b68 100644 --- a/company/handbook/onboarding.mdx +++ b/company/handbook/onboarding.mdx @@ -23,3 +23,6 @@ Every new joiner has an onboarding buddy who should ideally be in the the same t 7. Update your LinkedIn profile with one of [Infisical's official banners](https://drive.google.com/drive/u/0/folders/1oSNWjbpRl9oNYwxM_98IqzKs9fAskrb2) (if you want to). You can also coordinate your social posts in the #marketing Slack channel, so that we can boost it from Infisical's official social media accounts. 8. Over the first few weeks, feel free to schedule 1:1s with folks on the team to get to know them a bit better. 2. Change your Slack username in the users channel to `[NAME] (Infisical)`. +8. Go through the [technical overview](https://infisical.com/docs/internals/overview) of Infisical + + From a0be2985dd1a3d2273c31fd25ca3c6b1b679a42f Mon Sep 17 00:00:00 2001 From: Vladyslav Matsiiako Date: Sun, 26 May 2024 22:19:42 -0700 Subject: [PATCH 054/101] Added money page --- company/handbook/onboarding.mdx | 14 +++++++------- company/handbook/spending-money.mdx | 27 +++++++++++++++++++++++++++ company/mint.json | 3 ++- 3 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 company/handbook/spending-money.mdx diff --git a/company/handbook/onboarding.mdx b/company/handbook/onboarding.mdx index 5191c8b68..b07f1d379 100644 --- a/company/handbook/onboarding.mdx +++ b/company/handbook/onboarding.mdx @@ -17,12 +17,12 @@ Every new joiner has an onboarding buddy who should ideally be in the the same t ## Onboarding Checklist 1. Join the weekly all-hands meeting. It typically happens on Monday's at 8:30am PT. -3. Ship something together on day one – even if tiny! It feels great to hit the ground running, with a development environment all ready to go. -4. Check out the [Areas of Responsibility (AoR) Table](https://docs.google.com/spreadsheets/d/1RnXlGFg83Sgu0dh7ycuydsSobmFfI3A0XkGw7vrVxEI/edit?usp=sharing). This is helpful to know who you can ask about particular areas of Infisical. Feel free to add yourself to the areas you'd be most interesting to dive into. -5. Read the [Infisical Strategy Doc](https://docs.google.com/document/d/1oy_NP1Q_Zt1oqxLpyNkLIGmhAI3N28AmZq6dDIOONSQ/edit?usp=sharing). -7. Update your LinkedIn profile with one of [Infisical's official banners](https://drive.google.com/drive/u/0/folders/1oSNWjbpRl9oNYwxM_98IqzKs9fAskrb2) (if you want to). You can also coordinate your social posts in the #marketing Slack channel, so that we can boost it from Infisical's official social media accounts. -8. Over the first few weeks, feel free to schedule 1:1s with folks on the team to get to know them a bit better. -2. Change your Slack username in the users channel to `[NAME] (Infisical)`. -8. Go through the [technical overview](https://infisical.com/docs/internals/overview) of Infisical +2. Ship something together on day one – even if tiny! It feels great to hit the ground running, with a development environment all ready to go. +3. Check out the [Areas of Responsibility (AoR) Table](https://docs.google.com/spreadsheets/d/1RnXlGFg83Sgu0dh7ycuydsSobmFfI3A0XkGw7vrVxEI/edit?usp=sharing). This is helpful to know who you can ask about particular areas of Infisical. Feel free to add yourself to the areas you'd be most interesting to dive into. +4. Read the [Infisical Strategy Doc](https://docs.google.com/document/d/1oy_NP1Q_Zt1oqxLpyNkLIGmhAI3N28AmZq6dDIOONSQ/edit?usp=sharing). +5. Update your LinkedIn profile with one of [Infisical's official banners](https://drive.google.com/drive/u/0/folders/1oSNWjbpRl9oNYwxM_98IqzKs9fAskrb2) (if you want to). You can also coordinate your social posts in the #marketing Slack channel, so that we can boost it from Infisical's official social media accounts. +6. Over the first few weeks, feel free to schedule 1:1s with folks on the team to get to know them a bit better. +7. Change your Slack username in the users channel to `[NAME] (Infisical)`. +8. Go through the [technical overview](https://infisical.com/docs/internals/overview) of Infisical. diff --git a/company/handbook/spending-money.mdx b/company/handbook/spending-money.mdx new file mode 100644 index 000000000..667ed5ef2 --- /dev/null +++ b/company/handbook/spending-money.mdx @@ -0,0 +1,27 @@ +--- +title: "Spenging Money" +sidebarTitle: "Spending Money" +description: "The guide to spending money at Infisical." +--- + +Fairly frequently, you might run into situations when you need to spend company money. + +**Please spend money in a way that you think is in the best interest of the company.** + +## Trivial expenses + +We don't want you to be slowed down because you're waiting for an approval to purchase some SaaS. For trivial expenses – **Just do it**. + +This means expenses that are: +1. Non-recurring AND less than $75/month in total. +2. Recurring AND less than $20/month. + +## Saving receipts + +Make sure you keep copies for all receipts. If you expense something on a company card and cannot provide a receipt, this may be deducted from your pay. + +You should default to using your company card in all cases - it has no transaction fees. If using your personal card is unavoidable, please reach out to Maidul to get it reimbursed manually. + +## Brex + +We use Brex as our primary credit card provider. Don't have a company card yet? Reach out to Maidul. \ No newline at end of file diff --git a/company/mint.json b/company/mint.json index bdac8f3bd..b99f29331 100644 --- a/company/mint.json +++ b/company/mint.json @@ -56,7 +56,8 @@ { "group": "How we work", "pages": [ - "handbook/onboarding" + "handbook/onboarding", + "handbook/spending-money" ] } ], From fe40e4f475cb411479c55e9980f197674d835f6a Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 27 May 2024 07:37:39 +0000 Subject: [PATCH 055/101] chore: renamed new migration files to latest timestamp (gh-action) --- ...entity-azure-auth.ts => 20240527073740_identity-azure-auth.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename backend/src/db/migrations/{20240521041514_identity-azure-auth.ts => 20240527073740_identity-azure-auth.ts} (100%) diff --git a/backend/src/db/migrations/20240521041514_identity-azure-auth.ts b/backend/src/db/migrations/20240527073740_identity-azure-auth.ts similarity index 100% rename from backend/src/db/migrations/20240521041514_identity-azure-auth.ts rename to backend/src/db/migrations/20240527073740_identity-azure-auth.ts From a0f678a295fa810d081f7efc157cbc6cfcf15c34 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Mon, 27 May 2024 22:59:24 +0800 Subject: [PATCH 056/101] misc: moved to using router push instead of reload --- frontend/src/views/Login/components/MFAStep/MFAStep.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/views/Login/components/MFAStep/MFAStep.tsx b/frontend/src/views/Login/components/MFAStep/MFAStep.tsx index 249c043b6..bf90b9cab 100644 --- a/frontend/src/views/Login/components/MFAStep/MFAStep.tsx +++ b/frontend/src/views/Login/components/MFAStep/MFAStep.tsx @@ -184,7 +184,7 @@ export const MFAStep = ({ email, password, providerAuthToken }: Props) => { if (triesLeft) { setTriesLeft((left) => { if (triesLeft === 1) { - window.location.reload(); + router.push("/"); } return (left as number) - 1; }); From b8c35fbf15e9f2a05f24d22c11b92ff8b63b9104 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Tue, 28 May 2024 00:13:47 +0800 Subject: [PATCH 057/101] fix: resolved identity deletion issue across projects --- .../src/services/identity-project/identity-project-service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/services/identity-project/identity-project-service.ts b/backend/src/services/identity-project/identity-project-service.ts index fb5dc6fb0..10f2b3460 100644 --- a/backend/src/services/identity-project/identity-project-service.ts +++ b/backend/src/services/identity-project/identity-project-service.ts @@ -259,7 +259,7 @@ export const identityProjectServiceFactory = ({ if (!hasRequiredPriviledges) throw new ForbiddenRequestError({ message: "Failed to delete more privileged identity" }); - const [deletedIdentity] = await identityProjectDAL.delete({ identityId }); + const [deletedIdentity] = await identityProjectDAL.delete({ identityId, projectId }); return deletedIdentity; }; From fe4cc950d31d0eb5fab825b2cd6c3132772ccfae Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Tue, 28 May 2024 01:41:16 +0800 Subject: [PATCH 058/101] misc: updated temporary lock error message --- backend/src/services/auth/auth-fns.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/backend/src/services/auth/auth-fns.ts b/backend/src/services/auth/auth-fns.ts index 30297e605..2a322fdea 100644 --- a/backend/src/services/auth/auth-fns.ts +++ b/backend/src/services/auth/auth-fns.ts @@ -56,12 +56,15 @@ export const enforceUserLockStatus = (isLocked: boolean, temporaryLockDateEnd?: if (temporaryLockDateEnd) { const timeDiff = new Date().getTime() - temporaryLockDateEnd.getTime(); - if (timeDiff < 0) + if (timeDiff < 0) { + const secondsDiff = (-1 * timeDiff) / 1000; + const timeDisplay = + secondsDiff > 60 ? `${Math.ceil(secondsDiff / 60)} minutes` : `${Math.ceil(secondsDiff)} seconds`; + throw new UnauthorizedError({ name: "User Locked", - message: `User is locked due to multiple failed login attempts. Try again after ${Math.round( - (-1 * timeDiff) / 1000 - )} seconds.` + message: `User is temporary locked due to multiple failed login attempts. Try again after ${timeDisplay}. You can also reset your password now to proceed.` }); + } } }; From ae075df0ec81397cd92ad1f44c43137530f2b0b8 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Tue, 28 May 2024 00:11:33 +0200 Subject: [PATCH 059/101] Fix: Old docs --- docs/documentation/guides/node.mdx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/documentation/guides/node.mdx b/docs/documentation/guides/node.mdx index 8bd9e743b..d1b8fe5e8 100644 --- a/docs/documentation/guides/node.mdx +++ b/docs/documentation/guides/node.mdx @@ -46,16 +46,19 @@ Finally, create an index.js file containing the application code. ```js const express = require('express'); -const { InfisicalClient, LogLevel } = require("@infisical/sdk"); +const { InfisicalClient } = require("@infisical/sdk"); const app = express(); const PORT = 3000; const client = new InfisicalClient({ - clientId: "YOUR_CLIENT_ID", - clientSecret: "YOUR_CLIENT_SECRET", - logLevel: LogLevel.Error + auth: { + universalAuth: { + clientId: "YOUR_CLIENT_ID", + clientSecret: "YOUR_CLIENT_SECRET", + } + } }); app.get("/", async (req, res) => { From aca71a7b6f40c35cd6d273c429b798c985db7334 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Tue, 28 May 2024 00:11:49 +0200 Subject: [PATCH 060/101] Docs: Azure documentation --- docs/sdks/languages/csharp.mdx | 55 ++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/docs/sdks/languages/csharp.mdx b/docs/sdks/languages/csharp.mdx index fc87a1efe..90351a986 100644 --- a/docs/sdks/languages/csharp.mdx +++ b/docs/sdks/languages/csharp.mdx @@ -228,6 +228,61 @@ The SDK supports a variety of authentication methods. The most common authentica var infisicalClient = new InfisicalClient(settings); ``` + +#### Azure Auth + + Please note that this authentication method will only work if you're running your application on Azure. + Please [read more](/documentation/platform/identities/azure-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_AZURE_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. + +**Using the SDK directly** +```csharp + ClientSettings settings = new ClientSettings + { + Auth = new AuthenticationOptions + { + Azure = new AzureAuthMethod + { + IdentityId = "YOUR_IDENTITY_ID", + } + } + }; + + var infisicalClient = new InfisicalClient(settings); +``` + +#### Kubernetes Auth + + Please note that this authentication method will only work if you're running your application on Kubernetes. + Please [read more](/documentation/platform/identities/kubernetes-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_KUBERNETES_IDENTITY_ID` - Your Infisical Machine Identity ID. +- `INFISICAL_KUBERNETES_SERVICE_ACCOUNT_TOKEN_PATH_ENV_NAME` - The environment variable name that contains the path to the service account token. This is optional and will default to `/var/run/secrets/kubernetes.io/serviceaccount/token`. + +**Using the SDK directly** +```csharp + ClientSettings settings = new ClientSettings + { + Auth = new AuthenticationOptions + { + Kubernetes = new KubernetesAuthMethod + { + ServiceAccountTokenPath = "/var/run/secrets/kubernetes.io/serviceaccount/token", // Optional + IdentityId = "YOUR_IDENTITY_ID", + } + } + }; + + var infisicalClient = new InfisicalClient(settings); +``` + + + ### Caching To reduce the number of API requests, the SDK temporarily stores secrets it retrieves. By default, a secret remains cached for 5 minutes after it's first fetched. Each time it's fetched again, this 5-minute timer resets. You can adjust this caching duration by setting the "cacheTTL" option when creating the client. From c7a8e1102e936013485e858e69b6e421506d2604 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Tue, 28 May 2024 00:11:52 +0200 Subject: [PATCH 061/101] Docs: Azure documentation --- docs/sdks/languages/java.mdx | 49 ++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/docs/sdks/languages/java.mdx b/docs/sdks/languages/java.mdx index 102b28355..879bfa624 100644 --- a/docs/sdks/languages/java.mdx +++ b/docs/sdks/languages/java.mdx @@ -221,6 +221,55 @@ The SDK supports a variety of authentication methods. The most common authentica InfisicalClient client = new InfisicalClient(settings); ``` +#### Azure Auth + + Please note that this authentication method will only work if you're running your application on Azure. + Please [read more](/documentation/platform/identities/azure-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_AZURE_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. + +**Using the SDK directly** +```java + ClientSettings settings = new ClientSettings(); + AuthenticationOptions authOptions = new AuthenticationOptions(); + AzureAuthMethod authMethod = new AzureAuthMethod(); + + authMethod.setIdentityID("YOUR_IDENTITY_ID"); + + authOptions.setAzure(authMethod); + settings.setAuth(authOptions); + + InfisicalClient client = new InfisicalClient(settings); +``` + +#### Kubernetes Auth + + Please note that this authentication method will only work if you're running your application on Kubernetes. + Please [read more](/documentation/platform/identities/kubernetes-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_KUBERNETES_IDENTITY_ID` - Your Infisical Machine Identity ID. +- `INFISICAL_KUBERNETES_SERVICE_ACCOUNT_TOKEN_PATH_ENV_NAME` - The environment variable name that contains the path to the service account token. This is optional and will default to `/var/run/secrets/kubernetes.io/serviceaccount/token`. + +**Using the SDK directly** +```java + ClientSettings settings = new ClientSettings(); + AuthenticationOptions authOptions = new AuthenticationOptions(); + KubernetesAuthMethod authMethod = new KubernetesAuthMethod(); + + authMethod.setIdentityID("YOUR_IDENTITY_ID"); + authMethod.setServiceAccountTokenPath("/var/run/secrets/kubernetes.io/serviceaccount/token"); // Optional + + authOptions.setKubernetes(authMethod); + settings.setAuth(authOptions); + + InfisicalClient client = new InfisicalClient(settings); +``` + + ### Caching To reduce the number of API requests, the SDK temporarily stores secrets it retrieves. By default, a secret remains cached for 5 minutes after it's first fetched. Each time it's fetched again, this 5-minute timer resets. You can adjust this caching duration by setting the "cacheTTL" option when creating the client. From eb8acba0371c3601d78e6ead5d0b6af628015d85 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Tue, 28 May 2024 00:11:55 +0200 Subject: [PATCH 062/101] Docs: Azure documentation --- docs/sdks/languages/node.mdx | 46 +++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/docs/sdks/languages/node.mdx b/docs/sdks/languages/node.mdx index c626d2dcd..1546451b8 100644 --- a/docs/sdks/languages/node.mdx +++ b/docs/sdks/languages/node.mdx @@ -14,7 +14,7 @@ If you're working with Node.js, the official [Infisical Node SDK](https://github ```js import express from "express"; -import { InfisicalClient, LogLevel } from "@infisical/sdk"; +import { InfisicalClient } from "@infisical/sdk"; const app = express(); @@ -27,8 +27,7 @@ const client = new InfisicalClient({ clientId: "YOUR_CLIENT_ID", clientSecret: "YOUR_CLIENT_SECRET" } - }, - logLevel: LogLevel.Error + } }); app.get("/", async (req, res) => { @@ -226,7 +225,48 @@ const client = new InfisicalClient({ }); ``` +#### Azure Auth + + Please note that this authentication method will only work if you're running your application on Azure. + Please [read more](/documentation/platform/identities/azure-auth) about this authentication method. + +**Using environment variables** +- `INFISICAL_AZURE_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. + +**Using the SDK directly** +```js +const client = new InfisicalClient({ + auth: { + azure: { + identityId: "YOUR_IDENTITY_ID" + } + } +}); +``` + + +#### Kubernetes Auth + + Please note that this authentication method will only work if you're running your application on Kubernetes. + Please [read more](/documentation/platform/identities/kubernetes-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_KUBERNETES_IDENTITY_ID` - Your Infisical Machine Identity ID. +- `INFISICAL_KUBERNETES_SERVICE_ACCOUNT_TOKEN_PATH_ENV_NAME` - The environment variable name that contains the path to the service account token. This is optional and will default to `/var/run/secrets/kubernetes.io/serviceaccount/token`. + +**Using the SDK directly** +```js +const client = new InfisicalClient({ + auth: { + kubernetes: { + identityId: "YOUR_IDENTITY_ID", + serviceAccountTokenPathEnvName: "/var/run/secrets/kubernetes.io/serviceaccount/token" // Optional + } + } +}); +``` ### Caching From a6dd36f6842313d3da10a58374da568c066013f4 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Tue, 28 May 2024 00:11:57 +0200 Subject: [PATCH 063/101] Docs: Azure documentation --- docs/sdks/languages/python.mdx | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/docs/sdks/languages/python.mdx b/docs/sdks/languages/python.mdx index d0a504b1f..d9ab49688 100644 --- a/docs/sdks/languages/python.mdx +++ b/docs/sdks/languages/python.mdx @@ -201,6 +201,53 @@ client = InfisicalClient(ClientSettings( )) ``` +#### Azure Auth + + Please note that this authentication method will only work if you're running your application on Azure. + Please [read more](/documentation/platform/identities/azure-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_AZURE_AUTH_IDENTITY_ID` - Your Infisical Machine Identity ID. + +**Using the SDK directly** +```python +from infisical_client import InfisicalClient, ClientSettings, AuthenticationOptions, AzureAuthMethod + +kubernetes_client = InfisicalClient(ClientSettings( + auth=AuthenticationOptions( + azure=AzureAuthMethod( + identity_id="YOUR_IDENTITY_ID", + ) + ) +)) +``` + + +#### Kubernetes Auth + + Please note that this authentication method will only work if you're running your application on Kubernetes. + Please [read more](/documentation/platform/identities/kubernetes-auth) about this authentication method. + + +**Using environment variables** +- `INFISICAL_KUBERNETES_IDENTITY_ID` - Your Infisical Machine Identity ID. +- `INFISICAL_KUBERNETES_SERVICE_ACCOUNT_TOKEN_PATH_ENV_NAME` - The environment variable name that contains the path to the service account token. This is optional and will default to `/var/run/secrets/kubernetes.io/serviceaccount/token`. + +**Using the SDK directly** +```python +from infisical_client import InfisicalClient, ClientSettings, AuthenticationOptions, KubernetesAuthMethod + +kubernetes_client = InfisicalClient(ClientSettings( + auth=AuthenticationOptions( + kubernetes=KubernetesAuthMethod( + identity_id="YOUR_IDENTITY_ID", + service_account_token_path="/var/run/secrets/kubernetes.io/serviceaccount/token" # Optional + ) + ) +)) +``` + ### Caching To reduce the number of API requests, the SDK temporarily stores secrets it retrieves. By default, a secret remains cached for 5 minutes after it's first fetched. Each time it's fetched again, this 5-minute timer resets. You can adjust this caching duration by setting the "cache_ttl" option when creating the client. From c170ba62497c418e750f0b66cdf9750052946162 Mon Sep 17 00:00:00 2001 From: Vladyslav Matsiiako Date: Mon, 27 May 2024 15:32:56 -0700 Subject: [PATCH 064/101] changed docs design --- company/style.css | 11 +++++++++-- docs/style.css | 18 ++++++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/company/style.css b/company/style.css index b76d06450..7fb035e76 100644 --- a/company/style.css +++ b/company/style.css @@ -49,10 +49,10 @@ } */ #header { - border-left: 1px solid #26272b; + border-left: 4px solid #EFFF33; padding-left: 16px; padding-right: 16px; - background-color: #f5f5f5; + background-color: #FDFFE5; padding-bottom: 10px; padding-top: 10px; } @@ -63,6 +63,13 @@ border-color: #ebebeb; } +#content-area:hover .mt-8 .block:hover{ + border-radius: 0; + border-width: 1px; + background-color: #FDFFE5; + border-color: #EFFF33; +} + #content-area .mt-8 .rounded-xl{ border-radius: 0; } diff --git a/docs/style.css b/docs/style.css index b76d06450..449249b42 100644 --- a/docs/style.css +++ b/docs/style.css @@ -27,6 +27,13 @@ padding: 5px; } +#sidebar li > a.text-primary { + border-radius: 0; + background-color: #FBFFCC; + border-left: 4px solid #EFFF33; + padding: 5px; +} + #sidebar li > a.mt-2 { border-radius: 0; padding: 5px; @@ -49,10 +56,10 @@ } */ #header { - border-left: 1px solid #26272b; + border-left: 4px solid #EFFF33; padding-left: 16px; padding-right: 16px; - background-color: #f5f5f5; + background-color: #FDFFE5; padding-bottom: 10px; padding-top: 10px; } @@ -63,6 +70,13 @@ border-color: #ebebeb; } +#content-area:hover .mt-8 .block:hover{ + border-radius: 0; + border-width: 1px; + background-color: #FDFFE5; + border-color: #EFFF33; +} + #content-area .mt-8 .rounded-xl{ border-radius: 0; } From 6ce86c42405308b5671d027eb9c9e60ed12a5bc8 Mon Sep 17 00:00:00 2001 From: Vladyslav Matsiiako Date: Mon, 27 May 2024 16:00:39 -0700 Subject: [PATCH 065/101] added more styling to docs --- company/style.css | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/company/style.css b/company/style.css index 7fb035e76..a570501f9 100644 --- a/company/style.css +++ b/company/style.css @@ -37,6 +37,13 @@ padding: 0px; } +#sidebar li > a.text-primary { + border-radius: 0; + background-color: #FBFFCC; + border-left: 4px solid #EFFF33; + padding: 5px; +} + /* #sidebar ul > div.mt-12 { padding-top: 30px; position: relative; From 1e63604f1eb18d144e1652e70d88e7d7ffddf5b5 Mon Sep 17 00:00:00 2001 From: Vladyslav Matsiiako Date: Mon, 27 May 2024 16:03:42 -0700 Subject: [PATCH 066/101] added more styling to docs --- docs/style.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/style.css b/docs/style.css index 449249b42..646c7d21b 100644 --- a/docs/style.css +++ b/docs/style.css @@ -70,12 +70,12 @@ border-color: #ebebeb; } -#content-area:hover .mt-8 .block:hover{ +/* #content-area:hover .mt-8 .block:hover{ border-radius: 0; border-width: 1px; background-color: #FDFFE5; border-color: #EFFF33; -} +} */ #content-area .mt-8 .rounded-xl{ border-radius: 0; From 0fc4fb8858962b6e3df4e37f04a7b35730d4cf85 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Tue, 28 May 2024 12:13:35 +0800 Subject: [PATCH 067/101] misc: added backend validation for secrets read during integration create/update --- .../src/services/integration/integration-service.ts | 12 +++++++++++- .../pages/integrations/aws-secret-manager/create.tsx | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/backend/src/services/integration/integration-service.ts b/backend/src/services/integration/integration-service.ts index eff73c1b6..821267dfb 100644 --- a/backend/src/services/integration/integration-service.ts +++ b/backend/src/services/integration/integration-service.ts @@ -1,4 +1,4 @@ -import { ForbiddenError } from "@casl/ability"; +import { ForbiddenError, subject } from "@casl/ability"; import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service"; import { ProjectPermissionActions, ProjectPermissionSub } from "@app/ee/services/permission/project-permission"; @@ -66,6 +66,11 @@ export const integrationServiceFactory = ({ ); ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Create, ProjectPermissionSub.Integrations); + ForbiddenError.from(permission).throwUnlessCan( + ProjectPermissionActions.Read, + subject(ProjectPermissionSub.Secrets, { environment: sourceEnvironment, secretPath }) + ); + const folder = await folderDAL.findBySecretPath(integrationAuth.projectId, sourceEnvironment, secretPath); if (!folder) throw new BadRequestError({ message: "Folder path not found" }); @@ -123,6 +128,11 @@ export const integrationServiceFactory = ({ ); ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Edit, ProjectPermissionSub.Integrations); + ForbiddenError.from(permission).throwUnlessCan( + ProjectPermissionActions.Read, + subject(ProjectPermissionSub.Secrets, { environment, secretPath }) + ); + const folder = await folderDAL.findBySecretPath(integration.projectId, environment, secretPath); if (!folder) throw new BadRequestError({ message: "Folder path not found" }); diff --git a/frontend/src/pages/integrations/aws-secret-manager/create.tsx b/frontend/src/pages/integrations/aws-secret-manager/create.tsx index 2c04702e1..e6c2e7618 100644 --- a/frontend/src/pages/integrations/aws-secret-manager/create.tsx +++ b/frontend/src/pages/integrations/aws-secret-manager/create.tsx @@ -169,12 +169,12 @@ export default function AWSSecretManagerCreateIntegrationPage() { mappingBehavior: selectedMappingBehavior } }); - setIsLoading(false); setTargetSecretNameErrorText(""); router.push(`/integrations/${localStorage.getItem("projectData.id")}`); } catch (err) { + setIsLoading(false); console.error(err); } }; From 300deb5607630928e66f1f828e01767ee6eca303 Mon Sep 17 00:00:00 2001 From: Vladyslav Matsiiako Date: Mon, 27 May 2024 22:26:21 -0700 Subject: [PATCH 068/101] added time off page to company wiki --- company/handbook/onboarding.mdx | 2 +- company/handbook/time-off.mdx | 13 +++++++++++++ company/mint.json | 3 ++- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 company/handbook/time-off.mdx diff --git a/company/handbook/onboarding.mdx b/company/handbook/onboarding.mdx index b07f1d379..e85be9f04 100644 --- a/company/handbook/onboarding.mdx +++ b/company/handbook/onboarding.mdx @@ -1,7 +1,7 @@ --- title: "Onboarding" sidebarTitle: "Onboarding" -description: "This handbook explains how we work at Infisical." +description: "This guide explains the onboarding process for new joiners at Infisical." --- Welcome to Infisical! diff --git a/company/handbook/time-off.mdx b/company/handbook/time-off.mdx new file mode 100644 index 000000000..a80721440 --- /dev/null +++ b/company/handbook/time-off.mdx @@ -0,0 +1,13 @@ +--- +title: "Time Off" +sidebarTitle: "Time Off" +description: "The guide to taking time off at Infisical." +--- + +We offer eveyone at Infisical unlimited time off. We care about your results, not how long you work. + +To request time off, just submit a request in Rippling and let Maidul know at least a week in advance. + +## National holidays + +Since Infisical's team is globally distributed, it is hard for us to keep track of all the various national holidays across many different countries. Whether you'd like to celebrate Christmas or National Brisket Day (which, by the way, is on May 28th), you are welcome to take PTO on those days – just let Maidul know at least a week ahead so that we can adjust our planning. \ No newline at end of file diff --git a/company/mint.json b/company/mint.json index b99f29331..0ae63107b 100644 --- a/company/mint.json +++ b/company/mint.json @@ -57,7 +57,8 @@ "group": "How we work", "pages": [ "handbook/onboarding", - "handbook/spending-money" + "handbook/spending-money", + "handbook/time-off" ] } ], From c638caede50fb8bfa43336833ce62145d59d34b4 Mon Sep 17 00:00:00 2001 From: Vladyslav Matsiiako Date: Mon, 27 May 2024 22:32:54 -0700 Subject: [PATCH 069/101] changed sidebar color --- company/style.css | 4 ++-- docs/style.css | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/company/style.css b/company/style.css index a570501f9..ea8c60dc9 100644 --- a/company/style.css +++ b/company/style.css @@ -1,7 +1,7 @@ #navbar .max-w-8xl { max-width: 100%; border-bottom: 1px solid #ebebeb; - background-color: #fcfcfc; + background-color: #F4F3EF; } .max-w-8xl { @@ -14,7 +14,7 @@ padding-right: 30px; border-right: 1px; border-color: #cdd64b; - background-color: #fcfcfc; + background-color: #F4F3EF; border-right: 1px solid #ebebeb; } diff --git a/docs/style.css b/docs/style.css index 646c7d21b..3359151e4 100644 --- a/docs/style.css +++ b/docs/style.css @@ -1,7 +1,7 @@ #navbar .max-w-8xl { max-width: 100%; border-bottom: 1px solid #ebebeb; - background-color: #fcfcfc; + background-color: #F4F3EF; } .max-w-8xl { @@ -14,7 +14,7 @@ padding-right: 30px; border-right: 1px; border-color: #cdd64b; - background-color: #fcfcfc; + background-color: #F4F3EF; border-right: 1px solid #ebebeb; } @@ -67,6 +67,7 @@ #content-area .mt-8 .block{ border-radius: 0; border-width: 1px; + background-color: #FCFBFA; border-color: #ebebeb; } From 4567e505ecc3943f021f9848a2102713ffd5d0e5 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Tue, 28 May 2024 05:40:11 -0400 Subject: [PATCH 070/101] pause project delete --- .../src/server/routes/v1/project-router.ts | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/backend/src/server/routes/v1/project-router.ts b/backend/src/server/routes/v1/project-router.ts index 1cf655a97..824164452 100644 --- a/backend/src/server/routes/v1/project-router.ts +++ b/backend/src/server/routes/v1/project-router.ts @@ -8,6 +8,7 @@ import { UsersSchema } from "@app/db/schemas"; import { PROJECTS } from "@app/lib/api-docs"; +import { BadRequestError } from "@app/lib/errors"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; @@ -192,18 +193,19 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { } }, onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), - handler: async (req) => { - const workspace = await server.services.project.deleteProject({ - filter: { - type: ProjectFilterType.ID, - projectId: req.params.workspaceId - }, - actorId: req.permission.id, - actorAuthMethod: req.permission.authMethod, - actor: req.permission.type, - actorOrgId: req.permission.orgId - }); - return { workspace }; + handler: async () => { + // const workspace = await server.services.project.deleteProject({ + // filter: { + // type: ProjectFilterType.ID, + // projectId: req.params.workspaceId + // }, + // actorId: req.permission.id, + // actorAuthMethod: req.permission.authMethod, + // actor: req.permission.type, + // actorOrgId: req.permission.orgId + // }); + // return { workspace }; + throw new BadRequestError({ message: "Project delete has been paused temporarily, please try again later" }); } }); From a618e0ebf281be12674c2c03375293ea59648a28 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Tue, 28 May 2024 19:43:00 +0800 Subject: [PATCH 071/101] fix: resolved gitlab integration creation issue regarding groups --- backend/src/server/routes/v1/integration-auth-router.ts | 2 +- backend/src/services/integration-auth/integration-team.ts | 4 ++-- frontend/src/hooks/api/integrationAuth/types.ts | 2 +- frontend/src/pages/integrations/gitlab/create.tsx | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/src/server/routes/v1/integration-auth-router.ts b/backend/src/server/routes/v1/integration-auth-router.ts index d9db7404e..899c1cac8 100644 --- a/backend/src/server/routes/v1/integration-auth-router.ts +++ b/backend/src/server/routes/v1/integration-auth-router.ts @@ -330,7 +330,7 @@ export const registerIntegrationAuthRouter = async (server: FastifyZodProvider) teams: z .object({ name: z.string(), - id: z.string().optional() + id: z.string() }) .array() }) diff --git a/backend/src/services/integration-auth/integration-team.ts b/backend/src/services/integration-auth/integration-team.ts index 81ef9b70c..c39b2c44f 100644 --- a/backend/src/services/integration-auth/integration-team.ts +++ b/backend/src/services/integration-auth/integration-team.ts @@ -5,7 +5,7 @@ import { Integrations, IntegrationUrls } from "./integration-list"; type Team = { name: string; - teamId: string; + id: string; }; const getTeamsGitLab = async ({ url, accessToken }: { url: string; accessToken: string }) => { const gitLabApiUrl = url ? `${url}/api` : IntegrationUrls.GITLAB_API_URL; @@ -22,7 +22,7 @@ const getTeamsGitLab = async ({ url, accessToken }: { url: string; accessToken: teams = res.map((t) => ({ name: t.name, - teamId: t.id + id: t.id.toString() })); return teams; diff --git a/frontend/src/hooks/api/integrationAuth/types.ts b/frontend/src/hooks/api/integrationAuth/types.ts index b0e1dd9f5..4a4c5e281 100644 --- a/frontend/src/hooks/api/integrationAuth/types.ts +++ b/frontend/src/hooks/api/integrationAuth/types.ts @@ -30,7 +30,7 @@ export type HerokuPipelineCoupling = { export type Team = { name: string; - teamId: string; + id: string; }; export type Environment = { diff --git a/frontend/src/pages/integrations/gitlab/create.tsx b/frontend/src/pages/integrations/gitlab/create.tsx index 15daad270..529fd037e 100644 --- a/frontend/src/pages/integrations/gitlab/create.tsx +++ b/frontend/src/pages/integrations/gitlab/create.tsx @@ -121,7 +121,7 @@ export default function GitLabCreateIntegrationPage() { if (integrationAuthTeams) { if (integrationAuthTeams.length > 0) { // case: user is part of at least 1 group in GitLab - setValue("targetTeamId", String(integrationAuthTeams[0].teamId)); + setValue("targetTeamId", String(integrationAuthTeams[0].id)); } else { // case: user is not part of any groups in GitLab setValue("targetTeamId", "none"); @@ -312,8 +312,8 @@ export default function GitLabCreateIntegrationPage() { {integrationAuthTeams.length > 0 ? ( integrationAuthTeams.map((integrationAuthTeam) => ( {integrationAuthTeam.name} From 1a4f8b23ff64b44871fca67174305b0aadaf2218 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Tue, 28 May 2024 21:13:59 +0800 Subject: [PATCH 072/101] feat: added support for personal secrets creation via CLI --- cli/packages/cmd/secrets.go | 34 ++++++++++++++++++++++++++++++++-- docs/cli/commands/secrets.mdx | 10 ++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/cli/packages/cmd/secrets.go b/cli/packages/cmd/secrets.go index 305a1f0fd..649d9fa3d 100644 --- a/cli/packages/cmd/secrets.go +++ b/cli/packages/cmd/secrets.go @@ -170,6 +170,11 @@ var secretsSetCmd = &cobra.Command{ util.HandleError(err, "Unable to get your local config details") } + secretType, err := cmd.Flags().GetString("type") + if err != nil || (secretType != util.SECRET_TYPE_SHARED && secretType != util.SECRET_TYPE_PERSONAL) { + util.HandleError(err, "Unable to parse secret type") + } + loggedInUserDetails, err := util.GetCurrentLoggedInUserDetails() if err != nil { util.HandleError(err, "Unable to authenticate") @@ -179,6 +184,7 @@ var secretsSetCmd = &cobra.Command{ util.PrintErrorMessageAndExit("Your login session has expired, please run [infisical login] and try again") } + httpClient := resty.New(). SetAuthToken(loggedInUserDetails.UserCredentials.JTWToken). SetHeader("Accept", "application/json") @@ -224,6 +230,7 @@ var secretsSetCmd = &cobra.Command{ secretOperations := []SecretSetOperation{} secretByKey := getSecretsByKeys(secrets) + personalSecretByKey := getPersonalSecretsByKeys(secrets) for _, arg := range args { splitKeyValueFromArg := strings.SplitN(arg, "=", 2) @@ -251,7 +258,16 @@ var secretsSetCmd = &cobra.Command{ util.HandleError(err, "unable to encrypt your secrets") } - if existingSecret, ok := secretByKey[key]; ok { + var existingSecret models.SingleEnvironmentVariable + var doesSecretExist bool + + if secretType == util.SECRET_TYPE_SHARED { + existingSecret, doesSecretExist = secretByKey[key] + } else { + existingSecret, doesSecretExist = personalSecretByKey[key] + } + + if doesSecretExist { // case: secret exists in project so it needs to be modified encryptedSecretDetails := api.Secret{ ID: existingSecret.ID, @@ -291,7 +307,7 @@ var secretsSetCmd = &cobra.Command{ SecretValueIV: base64.StdEncoding.EncodeToString(encryptedValue.Nonce), SecretValueTag: base64.StdEncoding.EncodeToString(encryptedValue.AuthTag), SecretValueHash: hashedValue, - Type: util.SECRET_TYPE_SHARED, + Type: secretType, PlainTextKey: key, } secretsToCreate = append(secretsToCreate, encryptedSecretDetails) @@ -764,6 +780,19 @@ func getSecretsByKeys(secrets []models.SingleEnvironmentVariable) map[string]mod return secretMapByName } +func getPersonalSecretsByKeys(secrets []models.SingleEnvironmentVariable) map[string]models.SingleEnvironmentVariable { + secretMapByName := make(map[string]models.SingleEnvironmentVariable, len(secrets)) + + for _, secret := range secrets { + if secret.Type == util.SECRET_TYPE_PERSONAL { + secretMapByName[secret.Key] = secret + + } + } + + return secretMapByName +} + func init() { secretsGenerateExampleEnvCmd.Flags().String("token", "", "Fetch secrets using the Infisical Token") secretsGenerateExampleEnvCmd.Flags().String("projectId", "", "manually set the projectId to fetch folders from for machine identity") @@ -781,6 +810,7 @@ func init() { secretsCmd.Flags().Bool("secret-overriding", true, "Prioritizes personal secrets, if any, with the same name over shared secrets") secretsCmd.AddCommand(secretsSetCmd) secretsSetCmd.Flags().String("path", "/", "set secrets within a folder path") + secretsSetCmd.Flags().String("type", util.SECRET_TYPE_SHARED, "the type of secret to create: personal or shared") // Only supports logged in users (JWT auth) secretsSetCmd.PersistentPreRun = func(cmd *cobra.Command, args []string) { diff --git a/docs/cli/commands/secrets.mdx b/docs/cli/commands/secrets.mdx index b9adf6f20..c279b1a15 100644 --- a/docs/cli/commands/secrets.mdx +++ b/docs/cli/commands/secrets.mdx @@ -153,6 +153,16 @@ $ infisical secrets set STRIPE_API_KEY=sjdgwkeudyjwe DOMAIN=example.com HASH=jeb ``` + + + Used to select the type of secret to create. This could be either personal or shared (defaults to shared) + + ```bash + # Example + infisical secrets set DOMAIN=example.com --type=personal + ``` + + From 7d0eb9a0fdb78e3d3d930682d0dd853e00b04b10 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 28 May 2024 15:39:05 +0000 Subject: [PATCH 073/101] chore: renamed new migration files to latest timestamp (gh-action) --- ...-locking.ts => 20240528153905_add-user-account-mfa-locking.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename backend/src/db/migrations/{20240522072006_add-user-account-mfa-locking.ts => 20240528153905_add-user-account-mfa-locking.ts} (100%) diff --git a/backend/src/db/migrations/20240522072006_add-user-account-mfa-locking.ts b/backend/src/db/migrations/20240528153905_add-user-account-mfa-locking.ts similarity index 100% rename from backend/src/db/migrations/20240522072006_add-user-account-mfa-locking.ts rename to backend/src/db/migrations/20240528153905_add-user-account-mfa-locking.ts From 0371a5754832d2bce0a92f9708d155f77e11d999 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Wed, 29 May 2024 00:43:14 +0800 Subject: [PATCH 074/101] fix: added account locked prompt to sso signin flow --- .../components/PasswordStep/PasswordStep.tsx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/frontend/src/views/Login/components/PasswordStep/PasswordStep.tsx b/frontend/src/views/Login/components/PasswordStep/PasswordStep.tsx index f9b086f6d..1cdb1f513 100644 --- a/frontend/src/views/Login/components/PasswordStep/PasswordStep.tsx +++ b/frontend/src/views/Login/components/PasswordStep/PasswordStep.tsx @@ -31,7 +31,6 @@ export const PasswordStep = ({ setPassword, setStep }: Props) => { - const [isLoading, setIsLoading] = useState(false); const { t } = useTranslation(); const router = useRouter(); @@ -146,13 +145,24 @@ export const PasswordStep = ({ } } } - } catch (err) { + } catch (err: any) { setIsLoading(false); + console.error(err); + + if (err.response.data.error === "User Locked") { + createNotification({ + title: err.response.data.error, + text: err.response.data.message, + type: "error" + }); + setIsLoading(false); + return; + } + createNotification({ text: "Login unsuccessful. Double-check your master password and try again.", type: "error" }); - console.error(err); } }; From 4c7e218d0dfd4a19a4771df0eebe0cdc06e6d008 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Wed, 29 May 2024 00:58:29 +0800 Subject: [PATCH 075/101] misc: removed unnecessary set state --- .../src/views/Login/components/PasswordStep/PasswordStep.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/views/Login/components/PasswordStep/PasswordStep.tsx b/frontend/src/views/Login/components/PasswordStep/PasswordStep.tsx index 1cdb1f513..3e5e45985 100644 --- a/frontend/src/views/Login/components/PasswordStep/PasswordStep.tsx +++ b/frontend/src/views/Login/components/PasswordStep/PasswordStep.tsx @@ -155,7 +155,6 @@ export const PasswordStep = ({ text: err.response.data.message, type: "error" }); - setIsLoading(false); return; } From dc7bf9674ab16f8fe5f9dbb6d83feec46c4a863a Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Wed, 29 May 2024 02:00:49 +0800 Subject: [PATCH 076/101] misc: minor ui adjustments --- backend/src/services/auth/auth-fns.ts | 2 +- backend/src/services/smtp/templates/unlockAccount.handlebars | 2 +- frontend/src/views/Login/components/MFAStep/MFAStep.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/services/auth/auth-fns.ts b/backend/src/services/auth/auth-fns.ts index 2a322fdea..ecbf73a48 100644 --- a/backend/src/services/auth/auth-fns.ts +++ b/backend/src/services/auth/auth-fns.ts @@ -50,7 +50,7 @@ export const enforceUserLockStatus = (isLocked: boolean, temporaryLockDateEnd?: throw new UnauthorizedError({ name: "User Locked", message: - "User is locked due to multiple failed login attempts. An email has been sent to you in order to unlock your account. You can also reset your password to unlock." + "User is locked due to multiple failed login attempts. An email has been sent to you in order to unlock your account. You can also reset your password to unlock your account." }); } diff --git a/backend/src/services/smtp/templates/unlockAccount.handlebars b/backend/src/services/smtp/templates/unlockAccount.handlebars index cb1859e51..36664be87 100644 --- a/backend/src/services/smtp/templates/unlockAccount.handlebars +++ b/backend/src/services/smtp/templates/unlockAccount.handlebars @@ -9,7 +9,7 @@

Unlock your Infisical account

Your account has been temporarily locked due to multiple failed login attempts. - Unlock your account now + To unlock your account, follow the link here

If these attempts were not made by you, reset your password immediately.

diff --git a/frontend/src/views/Login/components/MFAStep/MFAStep.tsx b/frontend/src/views/Login/components/MFAStep/MFAStep.tsx index bf90b9cab..b23af1cef 100644 --- a/frontend/src/views/Login/components/MFAStep/MFAStep.tsx +++ b/frontend/src/views/Login/components/MFAStep/MFAStep.tsx @@ -5,7 +5,7 @@ import { useRouter } from "next/router"; import axios from "axios"; import jwt_decode from "jwt-decode"; -import Error from "@app/components/basic/Error"; // which to notification +import Error from "@app/components/basic/Error"; import { createNotification } from "@app/components/notifications"; import attemptCliLoginMfa from "@app/components/utilities/attemptCliLoginMfa"; import attemptLoginMfa from "@app/components/utilities/attemptLoginMfa"; @@ -234,7 +234,7 @@ export const MFAStep = ({ email, password, providerAuthToken }: Props) => { />
{typeof triesLeft === "number" && ( - + )}
From b2ad7cc7c0c4b3eb14e69888331795d3f63f9748 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Tue, 28 May 2024 17:20:22 -0400 Subject: [PATCH 077/101] small rephrase --- backend/src/lib/api-docs/constants.ts | 8 ++++---- backend/src/services/project-role/project-role-service.ts | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/src/lib/api-docs/constants.ts b/backend/src/lib/api-docs/constants.ts index 7aa0b24cf..92b3b9e01 100644 --- a/backend/src/lib/api-docs/constants.ts +++ b/backend/src/lib/api-docs/constants.ts @@ -722,14 +722,14 @@ export const AUDIT_LOG_STREAMS = { export const PROJECT_ROLE = { CREATE: { - projectSlug: "The slug of the project to create role.", + projectSlug: "Slug of the project to create the role for.", slug: "The slug of the role.", name: "The name of the role.", description: "The description for the role.", permissions: "The permissions assigned to the role." }, UPDATE: { - projectSlug: "The slug of the project to update role.", + projectSlug: "Slug of the project to update the role for.", roleId: "The ID of the role to update", slug: "The slug of the role.", name: "The name of the role.", @@ -737,7 +737,7 @@ export const PROJECT_ROLE = { permissions: "The permissions assigned to the role." }, DELETE: { - projectSlug: "The slug of the project to delete role.", + projectSlug: "Slug of the project to delete the role for.", roleId: "The ID of the role to update" }, GET_ROLE_BY_SLUG: { @@ -745,6 +745,6 @@ export const PROJECT_ROLE = { roleSlug: "The slug of the role to get details" }, LIST: { - projectSlug: "The slug of the project to list roles." + projectSlug: "The slug of the project to list the roles for." } }; diff --git a/backend/src/services/project-role/project-role-service.ts b/backend/src/services/project-role/project-role-service.ts index 5a50c4a44..ffd446fad 100644 --- a/backend/src/services/project-role/project-role-service.ts +++ b/backend/src/services/project-role/project-role-service.ts @@ -45,7 +45,7 @@ const getPredefinedRoles = (projectId: string, roleFilter?: ProjectMembershipRol name: "Admin", slug: ProjectMembershipRole.Admin, permissions: projectAdminPermissions, - description: "Complete administration access over the project", + description: "Full administrative access over a project", createdAt: new Date(), updatedAt: new Date() }, @@ -55,7 +55,7 @@ const getPredefinedRoles = (projectId: string, roleFilter?: ProjectMembershipRol name: "Developer", slug: ProjectMembershipRole.Member, permissions: projectMemberPermissions, - description: "Non-administrative role in an project", + description: "Limited read/write role in a project", createdAt: new Date(), updatedAt: new Date() }, @@ -65,7 +65,7 @@ const getPredefinedRoles = (projectId: string, roleFilter?: ProjectMembershipRol name: "Viewer", slug: ProjectMembershipRole.Viewer, permissions: projectViewerPermission, - description: "Non-administrative role in an project", + description: "Only read role in a project", createdAt: new Date(), updatedAt: new Date() }, From be68ecc25d31cb8325c1c1ca4fd79c0e0fa9bc20 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Tue, 28 May 2024 17:31:09 -0400 Subject: [PATCH 078/101] update api fields --- backend/src/lib/api-docs/constants.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/lib/api-docs/constants.ts b/backend/src/lib/api-docs/constants.ts index 92b3b9e01..aa193c4f2 100644 --- a/backend/src/lib/api-docs/constants.ts +++ b/backend/src/lib/api-docs/constants.ts @@ -737,7 +737,7 @@ export const PROJECT_ROLE = { permissions: "The permissions assigned to the role." }, DELETE: { - projectSlug: "Slug of the project to delete the role for.", + projectSlug: "Slug of the project to delete this role for.", roleId: "The ID of the role to update" }, GET_ROLE_BY_SLUG: { @@ -745,6 +745,6 @@ export const PROJECT_ROLE = { roleSlug: "The slug of the role to get details" }, LIST: { - projectSlug: "The slug of the project to list the roles for." + projectSlug: "The slug of the project to list the roles of." } }; From 3e6d43e4df7baed7685cea4f02e7fe04fea19cd5 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Wed, 29 May 2024 02:59:29 +0200 Subject: [PATCH 079/101] Update queries.tsx --- frontend/src/hooks/api/auth/queries.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/hooks/api/auth/queries.tsx b/frontend/src/hooks/api/auth/queries.tsx index 20209df71..1c26e07f8 100644 --- a/frontend/src/hooks/api/auth/queries.tsx +++ b/frontend/src/hooks/api/auth/queries.tsx @@ -5,6 +5,7 @@ import { apiRequest } from "@app/config/request"; import { setAuthToken } from "@app/reactQuery"; import { organizationKeys } from "../organization/queries"; +import { workspaceKeys } from "../workspace/queries"; import { ChangePasswordDTO, CompleteAccountDTO, @@ -79,6 +80,7 @@ export const useSelectOrganization = () => { }, onSuccess: () => { queryClient.invalidateQueries(organizationKeys.getUserOrganizations); + queryClient.invalidateQueries(workspaceKeys.getAllUserWorkspace); } }); }; From 60178a6ba69e11d840256f0ef18c4876b7e3bfdb Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Wed, 29 May 2024 02:59:53 +0200 Subject: [PATCH 080/101] Update queries.tsx --- frontend/src/hooks/api/auth/queries.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/hooks/api/auth/queries.tsx b/frontend/src/hooks/api/auth/queries.tsx index 1c26e07f8..cba815fae 100644 --- a/frontend/src/hooks/api/auth/queries.tsx +++ b/frontend/src/hooks/api/auth/queries.tsx @@ -79,8 +79,10 @@ export const useSelectOrganization = () => { return data; }, onSuccess: () => { - queryClient.invalidateQueries(organizationKeys.getUserOrganizations); - queryClient.invalidateQueries(workspaceKeys.getAllUserWorkspace); + queryClient.invalidateQueries([ + organizationKeys.getUserOrganizations, + workspaceKeys.getAllUserWorkspace + ]); } }); }; From 60556615150f083c57351d3e88edd3e3be83ddb2 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 29 May 2024 00:54:29 -0400 Subject: [PATCH 081/101] add secret version secrets index --- ..._snap-shot-secret-index-secretversionid.ts | 21 +++++++++++++++ .../src/server/routes/v1/project-router.ts | 26 +++++++++---------- 2 files changed, 33 insertions(+), 14 deletions(-) create mode 100644 backend/src/db/migrations/20240529043051_snap-shot-secret-index-secretversionid.ts diff --git a/backend/src/db/migrations/20240529043051_snap-shot-secret-index-secretversionid.ts b/backend/src/db/migrations/20240529043051_snap-shot-secret-index-secretversionid.ts new file mode 100644 index 000000000..8d4322b5a --- /dev/null +++ b/backend/src/db/migrations/20240529043051_snap-shot-secret-index-secretversionid.ts @@ -0,0 +1,21 @@ +import { Knex } from "knex"; + +import { TableName } from "../schemas"; + +export async function up(knex: Knex): Promise { + const doesSecretVersionIdExist = await knex.schema.hasColumn(TableName.SnapshotSecret, "secretVersionId"); + if (await knex.schema.hasTable(TableName.SnapshotSecret)) { + await knex.schema.alterTable(TableName.SnapshotSecret, (t) => { + if (doesSecretVersionIdExist) t.index("secretVersionId"); + }); + } +} + +export async function down(knex: Knex): Promise { + const doesSecretVersionIdExist = await knex.schema.hasColumn(TableName.SnapshotSecret, "secretVersionId"); + if (await knex.schema.hasTable(TableName.SnapshotSecret)) { + await knex.schema.alterTable(TableName.SnapshotSecret, (t) => { + if (doesSecretVersionIdExist) t.dropIndex("secretVersionId"); + }); + } +} diff --git a/backend/src/server/routes/v1/project-router.ts b/backend/src/server/routes/v1/project-router.ts index 824164452..1cf655a97 100644 --- a/backend/src/server/routes/v1/project-router.ts +++ b/backend/src/server/routes/v1/project-router.ts @@ -8,7 +8,6 @@ import { UsersSchema } from "@app/db/schemas"; import { PROJECTS } from "@app/lib/api-docs"; -import { BadRequestError } from "@app/lib/errors"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; @@ -193,19 +192,18 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => { } }, onRequest: verifyAuth([AuthMode.JWT, AuthMode.IDENTITY_ACCESS_TOKEN]), - handler: async () => { - // const workspace = await server.services.project.deleteProject({ - // filter: { - // type: ProjectFilterType.ID, - // projectId: req.params.workspaceId - // }, - // actorId: req.permission.id, - // actorAuthMethod: req.permission.authMethod, - // actor: req.permission.type, - // actorOrgId: req.permission.orgId - // }); - // return { workspace }; - throw new BadRequestError({ message: "Project delete has been paused temporarily, please try again later" }); + handler: async (req) => { + const workspace = await server.services.project.deleteProject({ + filter: { + type: ProjectFilterType.ID, + projectId: req.params.workspaceId + }, + actorId: req.permission.id, + actorAuthMethod: req.permission.authMethod, + actor: req.permission.type, + actorOrgId: req.permission.orgId + }); + return { workspace }; } }); From 7c6b6653f59fb3020d5ecc2bec15b3140c3a7b5e Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Wed, 29 May 2024 13:51:20 +0800 Subject: [PATCH 082/101] feat: removed the need to pass /api for cli domain --- cli/packages/cmd/agent.go | 16 +--------------- cli/packages/cmd/login.go | 2 +- cli/packages/cmd/root.go | 1 + cli/packages/cmd/user.go | 2 +- cli/packages/util/credentials.go | 2 +- cli/packages/util/helper.go | 13 +++++++++++++ 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/cli/packages/cmd/agent.go b/cli/packages/cmd/agent.go index 03bf9af4d..f2b05d1f0 100644 --- a/cli/packages/cmd/agent.go +++ b/cli/packages/cmd/agent.go @@ -15,7 +15,6 @@ import ( "path" "runtime" "slices" - "strings" "sync" "syscall" "text/template" @@ -257,19 +256,6 @@ func WriteBytesToFile(data *bytes.Buffer, outputPath string) error { return err } -func appendAPIEndpoint(address string) string { - // Ensure the address does not already end with "/api" - if strings.HasSuffix(address, "/api") { - return address - } - - // Check if the address ends with a slash and append accordingly - if address[len(address)-1] == '/' { - return address + "api" - } - return address + "/api" -} - func ParseAgentConfig(configFile []byte) (*Config, error) { var rawConfig struct { Infisical InfisicalConfig `yaml:"infisical"` @@ -290,7 +276,7 @@ func ParseAgentConfig(configFile []byte) (*Config, error) { rawConfig.Infisical.Address = DEFAULT_INFISICAL_CLOUD_URL } - config.INFISICAL_URL = appendAPIEndpoint(rawConfig.Infisical.Address) + config.INFISICAL_URL = util.AppendAPIEndpoint(rawConfig.Infisical.Address) log.Info().Msgf("Infisical instance address set to %s", rawConfig.Infisical.Address) diff --git a/cli/packages/cmd/login.go b/cli/packages/cmd/login.go index bbb2c3a05..61e24b12f 100644 --- a/cli/packages/cmd/login.go +++ b/cli/packages/cmd/login.go @@ -101,7 +101,7 @@ var loginCmd = &cobra.Command{ //set domainQuery to false if !overrideDomain { domainQuery = false - config.INFISICAL_URL = config.INFISICAL_URL_MANUAL_OVERRIDE + config.INFISICAL_URL = util.AppendAPIEndpoint(config.INFISICAL_URL_MANUAL_OVERRIDE) } } diff --git a/cli/packages/cmd/root.go b/cli/packages/cmd/root.go index 06846260f..482c6f78a 100644 --- a/cli/packages/cmd/root.go +++ b/cli/packages/cmd/root.go @@ -43,6 +43,7 @@ func init() { rootCmd.PersistentFlags().Bool("silent", false, "Disable output of tip/info messages. Useful when running in scripts or CI/CD pipelines.") rootCmd.PersistentPreRun = func(cmd *cobra.Command, args []string) { silent, err := cmd.Flags().GetBool("silent") + config.INFISICAL_URL = util.AppendAPIEndpoint(config.INFISICAL_URL) if err != nil { util.HandleError(err) } diff --git a/cli/packages/cmd/user.go b/cli/packages/cmd/user.go index 96b03a0bb..844213e18 100644 --- a/cli/packages/cmd/user.go +++ b/cli/packages/cmd/user.go @@ -237,7 +237,7 @@ func NewDomainPrompt() (string, error) { return "", err } - return domain, nil + return util.AppendAPIEndpoint(domain), nil } func LoggedInUsersPrompt(profiles []string) (string, error) { diff --git a/cli/packages/util/credentials.go b/cli/packages/util/credentials.go index af63aa917..4856de35a 100644 --- a/cli/packages/util/credentials.go +++ b/cli/packages/util/credentials.go @@ -88,7 +88,7 @@ func GetCurrentLoggedInUserDetails() (LoggedInUserDetails, error) { //configFile.LoggedInUserDomain //if not empty set as infisical url if configFile.LoggedInUserDomain != "" { - config.INFISICAL_URL = configFile.LoggedInUserDomain + config.INFISICAL_URL = AppendAPIEndpoint(configFile.LoggedInUserDomain) } isAuthenticated := api.CallIsAuthenticated(httpClient) diff --git a/cli/packages/util/helper.go b/cli/packages/util/helper.go index 9a4d960db..9e5052530 100644 --- a/cli/packages/util/helper.go +++ b/cli/packages/util/helper.go @@ -233,3 +233,16 @@ func getCurrentBranch() (string, error) { } return path.Base(strings.TrimSpace(out.String())), nil } + +func AppendAPIEndpoint(address string) string { + // Ensure the address does not already end with "/api" + if strings.HasSuffix(address, "/api") { + return address + } + + // Check if the address ends with a slash and append accordingly + if address[len(address)-1] == '/' { + return address + "api" + } + return address + "/api" +} From 06dca77be209974bbddf72e7049677ae5e8135b5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 29 May 2024 06:07:52 +0000 Subject: [PATCH 083/101] chore: renamed new migration files to latest timestamp (gh-action) --- ...s => 20240529060752_snap-shot-secret-index-secretversionid.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename backend/src/db/migrations/{20240529043051_snap-shot-secret-index-secretversionid.ts => 20240529060752_snap-shot-secret-index-secretversionid.ts} (100%) diff --git a/backend/src/db/migrations/20240529043051_snap-shot-secret-index-secretversionid.ts b/backend/src/db/migrations/20240529060752_snap-shot-secret-index-secretversionid.ts similarity index 100% rename from backend/src/db/migrations/20240529043051_snap-shot-secret-index-secretversionid.ts rename to backend/src/db/migrations/20240529060752_snap-shot-secret-index-secretversionid.ts From 387981ea87e1f7e88bb1c66a14518f99344a0feb Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Tue, 28 May 2024 16:47:11 +0530 Subject: [PATCH 084/101] feat: secret sharing --- backend/src/@types/fastify.d.ts | 2 + backend/src/@types/knex.d.ts | 4 + .../20240426191241_secret_sharing.ts | 24 ++ backend/src/db/schemas/index.ts | 1 + backend/src/db/schemas/models.ts | 1 + backend/src/db/schemas/secret-sharing.ts | 22 ++ .../services/permission/project-permission.ts | 11 + backend/src/server/config/rateLimiter.ts | 8 + backend/src/server/routes/index.ts | 13 +- backend/src/server/routes/v1/index.ts | 2 + .../server/routes/v1/secret-sharing-router.ts | 131 ++++++++ .../secret-sharing/secret-sharing-dal.ts | 16 + .../secret-sharing/secret-sharing-service.ts | 82 +++++ .../secret-sharing/secret-sharing-types.ts | 19 ++ .../documentation/platform/secret-sharing.mdx | 44 +++ .../platform/secret-sharing/copy-url.png | Bin 0 -> 54921 bytes .../platform/secret-sharing/new-secret.png | Bin 0 -> 46534 bytes .../platform/secret-sharing/overview.png | Bin 0 -> 160467 bytes .../platform/secret-sharing/public-view.png | Bin 0 -> 226338 bytes docs/mint.json | 1 + .../utilities/cryptography/crypto.ts | 73 +++++ frontend/src/const.ts | 3 +- .../context/ProjectPermissionContext/types.ts | 2 + frontend/src/hooks/api/secretSharing/index.ts | 3 + .../src/hooks/api/secretSharing/mutations.ts | 35 +++ .../src/hooks/api/secretSharing/queries.ts | 32 ++ frontend/src/hooks/api/secretSharing/types.ts | 27 ++ frontend/src/layouts/AppLayout/AppLayout.tsx | 12 + .../project/[id]/secret-sharing/index.tsx | 27 ++ .../src/pages/shared/secret/[id]/index.tsx | 24 ++ .../views/ShareSecretPage/ShareSecretPage.tsx | 31 ++ .../components/AddShareSecretModal.tsx | 283 ++++++++++++++++++ .../components/ShareSecretSection.tsx | 108 +++++++ .../components/ShareSecretsRow.tsx | 146 +++++++++ .../components/ShareSecretsTable.tsx | 91 ++++++ .../ShareSecretPage/components/index.tsx | 1 + frontend/src/views/ShareSecretPage/index.tsx | 1 + .../ShareSecretPublicPage.tsx | 113 +++++++ .../components/MainImage.tsx | 14 + .../components/SecretTable.tsx | 89 ++++++ .../components/index.tsx | 2 + .../src/views/ShareSecretPublicPage/index.tsx | 1 + 42 files changed, 1497 insertions(+), 2 deletions(-) create mode 100644 backend/src/db/migrations/20240426191241_secret_sharing.ts create mode 100644 backend/src/db/schemas/secret-sharing.ts create mode 100644 backend/src/server/routes/v1/secret-sharing-router.ts create mode 100644 backend/src/services/secret-sharing/secret-sharing-dal.ts create mode 100644 backend/src/services/secret-sharing/secret-sharing-service.ts create mode 100644 backend/src/services/secret-sharing/secret-sharing-types.ts create mode 100644 docs/documentation/platform/secret-sharing.mdx create mode 100644 docs/images/platform/secret-sharing/copy-url.png create mode 100644 docs/images/platform/secret-sharing/new-secret.png create mode 100644 docs/images/platform/secret-sharing/overview.png create mode 100644 docs/images/platform/secret-sharing/public-view.png create mode 100644 frontend/src/hooks/api/secretSharing/index.ts create mode 100644 frontend/src/hooks/api/secretSharing/mutations.ts create mode 100644 frontend/src/hooks/api/secretSharing/queries.ts create mode 100644 frontend/src/hooks/api/secretSharing/types.ts create mode 100644 frontend/src/pages/project/[id]/secret-sharing/index.tsx create mode 100644 frontend/src/pages/shared/secret/[id]/index.tsx create mode 100644 frontend/src/views/ShareSecretPage/ShareSecretPage.tsx create mode 100644 frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx create mode 100644 frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx create mode 100644 frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx create mode 100644 frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx create mode 100644 frontend/src/views/ShareSecretPage/components/index.tsx create mode 100644 frontend/src/views/ShareSecretPage/index.tsx create mode 100644 frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx create mode 100644 frontend/src/views/ShareSecretPublicPage/components/MainImage.tsx create mode 100644 frontend/src/views/ShareSecretPublicPage/components/SecretTable.tsx create mode 100644 frontend/src/views/ShareSecretPublicPage/components/index.tsx create mode 100644 frontend/src/views/ShareSecretPublicPage/index.tsx diff --git a/backend/src/@types/fastify.d.ts b/backend/src/@types/fastify.d.ts index aa9a20ff8..2bc1d9f26 100644 --- a/backend/src/@types/fastify.d.ts +++ b/backend/src/@types/fastify.d.ts @@ -52,6 +52,7 @@ import { TSecretServiceFactory } from "@app/services/secret/secret-service"; import { TSecretBlindIndexServiceFactory } from "@app/services/secret-blind-index/secret-blind-index-service"; import { TSecretFolderServiceFactory } from "@app/services/secret-folder/secret-folder-service"; import { TSecretImportServiceFactory } from "@app/services/secret-import/secret-import-service"; +import { TSecretSharingServiceFactory } from "@app/services/secret-sharing/secret-sharing-service"; import { TSecretTagServiceFactory } from "@app/services/secret-tag/secret-tag-service"; import { TServiceTokenServiceFactory } from "@app/services/service-token/service-token-service"; import { TSuperAdminServiceFactory } from "@app/services/super-admin/super-admin-service"; @@ -143,6 +144,7 @@ declare module "fastify" { dynamicSecretLease: TDynamicSecretLeaseServiceFactory; projectUserAdditionalPrivilege: TProjectUserAdditionalPrivilegeServiceFactory; identityProjectAdditionalPrivilege: TIdentityProjectAdditionalPrivilegeServiceFactory; + secretSharing: TSecretSharingServiceFactory; }; // this is exclusive use for middlewares in which we need to inject data // everywhere else access using service layer diff --git a/backend/src/@types/knex.d.ts b/backend/src/@types/knex.d.ts index ce0e8a724..ffebf920e 100644 --- a/backend/src/@types/knex.d.ts +++ b/backend/src/@types/knex.d.ts @@ -186,6 +186,9 @@ import { TSecretScanningGitRisks, TSecretScanningGitRisksInsert, TSecretScanningGitRisksUpdate, + TSecretSharing, + TSecretSharingInsert, + TSecretSharingUpdate, TSecretsInsert, TSecretSnapshotFolders, TSecretSnapshotFoldersInsert, @@ -328,6 +331,7 @@ declare module "knex/types/tables" { TSecretFolderVersionsInsert, TSecretFolderVersionsUpdate >; + [TableName.SecretSharing]: Knex.CompositeTableType; [TableName.SecretTag]: Knex.CompositeTableType; [TableName.SecretImport]: Knex.CompositeTableType; [TableName.Integration]: Knex.CompositeTableType; diff --git a/backend/src/db/migrations/20240426191241_secret_sharing.ts b/backend/src/db/migrations/20240426191241_secret_sharing.ts new file mode 100644 index 000000000..e9bd89f9a --- /dev/null +++ b/backend/src/db/migrations/20240426191241_secret_sharing.ts @@ -0,0 +1,24 @@ +import { Knex } from "knex"; + +import { TableName } from "../schemas"; +import { createOnUpdateTrigger } from "../utils"; + +export async function up(knex: Knex): Promise { + if (!(await knex.schema.hasTable(TableName.SecretSharing))) { + await knex.schema.createTable(TableName.SecretSharing, (t) => { + t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid()); + t.string("name").notNullable(); + t.text("signedValue").notNullable(); + t.timestamp("expiresAt").notNullable(); + t.uuid("userId").notNullable(); + t.foreign("userId").references("id").inTable(TableName.Users).onDelete("CASCADE"); + t.timestamps(true, true, true); + }); + + await createOnUpdateTrigger(knex, TableName.SecretSharing); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(TableName.SecretSharing); +} diff --git a/backend/src/db/schemas/index.ts b/backend/src/db/schemas/index.ts index b4d245579..517b92e74 100644 --- a/backend/src/db/schemas/index.ts +++ b/backend/src/db/schemas/index.ts @@ -60,6 +60,7 @@ export * from "./secret-imports"; export * from "./secret-rotation-outputs"; export * from "./secret-rotations"; export * from "./secret-scanning-git-risks"; +export * from "./secret-sharing"; export * from "./secret-snapshot-folders"; export * from "./secret-snapshot-secrets"; export * from "./secret-snapshots"; diff --git a/backend/src/db/schemas/models.ts b/backend/src/db/schemas/models.ts index b23c9e9ca..170d886ec 100644 --- a/backend/src/db/schemas/models.ts +++ b/backend/src/db/schemas/models.ts @@ -29,6 +29,7 @@ export enum TableName { ProjectKeys = "project_keys", Secret = "secrets", SecretReference = "secret_references", + SecretSharing = "secret_sharing", SecretBlindIndex = "secret_blind_indexes", SecretVersion = "secret_versions", SecretFolder = "secret_folders", diff --git a/backend/src/db/schemas/secret-sharing.ts b/backend/src/db/schemas/secret-sharing.ts new file mode 100644 index 000000000..d53f34c4e --- /dev/null +++ b/backend/src/db/schemas/secret-sharing.ts @@ -0,0 +1,22 @@ +// Code generated by automation script, DO NOT EDIT. +// Automated by pulling database and generating zod schema +// To update. Just run npm run generate:schema +// Written by akhilmhdh. + +import { z } from "zod"; + +import { TImmutableDBKeys } from "./models"; + +export const SecretSharingSchema = z.object({ + id: z.string().uuid(), + name: z.string(), + signedValue: z.string(), + expiresAt: z.date(), + userId: z.string().uuid(), + createdAt: z.date(), + updatedAt: z.date() +}); + +export type TSecretSharing = z.infer; +export type TSecretSharingInsert = Omit, TImmutableDBKeys>; +export type TSecretSharingUpdate = Partial, TImmutableDBKeys>>; diff --git a/backend/src/ee/services/permission/project-permission.ts b/backend/src/ee/services/permission/project-permission.ts index b24024bd4..8deb6f57e 100644 --- a/backend/src/ee/services/permission/project-permission.ts +++ b/backend/src/ee/services/permission/project-permission.ts @@ -26,6 +26,7 @@ export enum ProjectPermissionSub { SecretRollback = "secret-rollback", SecretApproval = "secret-approval", SecretRotation = "secret-rotation", + SecretSharing = "secret-sharing", Identity = "identity" } @@ -52,6 +53,7 @@ export type ProjectPermissionSet = | [ProjectPermissionActions, ProjectPermissionSub.ServiceTokens] | [ProjectPermissionActions, ProjectPermissionSub.SecretApproval] | [ProjectPermissionActions, ProjectPermissionSub.SecretRotation] + | [ProjectPermissionActions, ProjectPermissionSub.SecretSharing] | [ProjectPermissionActions, ProjectPermissionSub.Identity] | [ProjectPermissionActions.Delete, ProjectPermissionSub.Project] | [ProjectPermissionActions.Edit, ProjectPermissionSub.Project] @@ -71,6 +73,10 @@ const buildAdminPermissionRules = () => { can(ProjectPermissionActions.Edit, ProjectPermissionSub.SecretApproval); can(ProjectPermissionActions.Delete, ProjectPermissionSub.SecretApproval); + can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretSharing); + can(ProjectPermissionActions.Create, ProjectPermissionSub.SecretSharing); + can(ProjectPermissionActions.Delete, ProjectPermissionSub.SecretSharing); + can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretRotation); can(ProjectPermissionActions.Create, ProjectPermissionSub.SecretRotation); can(ProjectPermissionActions.Edit, ProjectPermissionSub.SecretRotation); @@ -158,6 +164,10 @@ const buildMemberPermissionRules = () => { can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretApproval); can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretRotation); + can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretSharing); + can(ProjectPermissionActions.Create, ProjectPermissionSub.SecretSharing); + can(ProjectPermissionActions.Delete, ProjectPermissionSub.SecretSharing); + can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretRollback); can(ProjectPermissionActions.Create, ProjectPermissionSub.SecretRollback); @@ -217,6 +227,7 @@ const buildViewerPermissionRules = () => { can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretApproval); can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretRollback); can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretRotation); + can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretSharing); can(ProjectPermissionActions.Read, ProjectPermissionSub.Member); can(ProjectPermissionActions.Read, ProjectPermissionSub.Groups); can(ProjectPermissionActions.Read, ProjectPermissionSub.Role); diff --git a/backend/src/server/config/rateLimiter.ts b/backend/src/server/config/rateLimiter.ts index dfecfb495..ea5ba3410 100644 --- a/backend/src/server/config/rateLimiter.ts +++ b/backend/src/server/config/rateLimiter.ts @@ -66,3 +66,11 @@ export const creationLimit: RateLimitOptions = { max: 30, keyGenerator: (req) => req.realIp }; + +// Public endpoints to avoid brute force attacks +export const publicEndpointLimit: RateLimitOptions = { + // Shared Secrets + timeWindow: 60 * 1000, + max: 30, + keyGenerator: (req) => req.realIp +}; diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts index 4087ae39b..f8855d11f 100644 --- a/backend/src/server/routes/index.ts +++ b/backend/src/server/routes/index.ts @@ -130,6 +130,8 @@ import { secretFolderServiceFactory } from "@app/services/secret-folder/secret-f import { secretFolderVersionDALFactory } from "@app/services/secret-folder/secret-folder-version-dal"; import { secretImportDALFactory } from "@app/services/secret-import/secret-import-dal"; import { secretImportServiceFactory } from "@app/services/secret-import/secret-import-service"; +import { secretSharingDALFactory } from "@app/services/secret-sharing/secret-sharing-dal"; +import { secretSharingServiceFactory } from "@app/services/secret-sharing/secret-sharing-service"; import { secretTagDALFactory } from "@app/services/secret-tag/secret-tag-dal"; import { secretTagServiceFactory } from "@app/services/secret-tag/secret-tag-service"; import { serviceTokenDALFactory } from "@app/services/service-token/service-token-dal"; @@ -199,6 +201,8 @@ export const registerRoutes = async ( const secretVersionTagDAL = secretVersionTagDALFactory(db); const secretBlindIndexDAL = secretBlindIndexDALFactory(db); + const secretSharingDAL = secretSharingDALFactory(db); + const integrationDAL = integrationDALFactory(db); const integrationAuthDAL = integrationAuthDALFactory(db); const webhookDAL = webhookDALFactory(db); @@ -612,6 +616,12 @@ export const registerRoutes = async ( projectEnvDAL, projectBotService }); + + const secretSharingService = secretSharingServiceFactory({ + permissionService, + secretSharingDAL + }); + const sarService = secretApprovalRequestServiceFactory({ permissionService, projectBotService, @@ -851,7 +861,8 @@ export const registerRoutes = async ( secretBlindIndex: secretBlindIndexService, telemetry: telemetryService, projectUserAdditionalPrivilege: projectUserAdditionalPrivilegeService, - identityProjectAdditionalPrivilege: identityProjectAdditionalPrivilegeService + identityProjectAdditionalPrivilege: identityProjectAdditionalPrivilegeService, + secretSharing: secretSharingService }); server.decorate("store", { diff --git a/backend/src/server/routes/v1/index.ts b/backend/src/server/routes/v1/index.ts index 2744fc153..cbf67ce79 100644 --- a/backend/src/server/routes/v1/index.ts +++ b/backend/src/server/routes/v1/index.ts @@ -19,6 +19,7 @@ import { registerProjectMembershipRouter } from "./project-membership-router"; import { registerProjectRouter } from "./project-router"; import { registerSecretFolderRouter } from "./secret-folder-router"; import { registerSecretImportRouter } from "./secret-import-router"; +import { registerSecretSharingRouter } from "./secret-sharing-router"; import { registerSecretTagRouter } from "./secret-tag-router"; import { registerSsoRouter } from "./sso-router"; import { registerUserActionRouter } from "./user-action-router"; @@ -65,4 +66,5 @@ export const registerV1Routes = async (server: FastifyZodProvider) => { await server.register(registerIntegrationAuthRouter, { prefix: "/integration-auth" }); await server.register(registerWebhookRouter, { prefix: "/webhooks" }); await server.register(registerIdentityRouter, { prefix: "/identities" }); + await server.register(registerSecretSharingRouter, { prefix: "/secret-sharing" }); }; diff --git a/backend/src/server/routes/v1/secret-sharing-router.ts b/backend/src/server/routes/v1/secret-sharing-router.ts new file mode 100644 index 000000000..6a7f95565 --- /dev/null +++ b/backend/src/server/routes/v1/secret-sharing-router.ts @@ -0,0 +1,131 @@ +import { z } from "zod"; + +import { SecretSharingSchema } from "@app/db/schemas"; +import { publicEndpointLimit, readLimit, writeLimit } from "@app/server/config/rateLimiter"; +import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; +import { AuthMode } from "@app/services/auth/auth-type"; + +export const registerSecretSharingRouter = async (server: FastifyZodProvider) => { + server.route({ + method: "GET", + url: "/:projectId", + config: { + rateLimit: readLimit + }, + schema: { + params: z.object({ + projectId: z.string().uuid() + }), + response: { + 200: z.array(SecretSharingSchema) + } + }, + onRequest: verifyAuth([AuthMode.JWT]), + handler: async (req) => { + const { projectId } = req.params; + const sharedSecrets = await req.server.services.secretSharing.getSharedSecrets({ + actor: req.permission.type, + actorId: req.permission.id, + projectId, + actorAuthMethod: req.permission.authMethod, + actorOrgId: req.permission.orgId + }); + + return sharedSecrets; + } + }); + + server.route({ + method: "GET", + url: "/public/:id", + config: { + rateLimit: publicEndpointLimit + }, + schema: { + params: z.object({ + id: z.string().uuid() + }), + response: { + 200: SecretSharingSchema.pick({ name: true, signedValue: true, expiresAt: true }) + } + }, + handler: async (req) => { + const sharedSecret = await req.server.services.secretSharing.getActiveSharedSecretById(req.params.id); + if (!sharedSecret) return undefined; + return { + name: sharedSecret.name, + signedValue: sharedSecret.signedValue, + expiresAt: sharedSecret.expiresAt + }; + } + }); + + server.route({ + method: "POST", + url: "/", + config: { + rateLimit: writeLimit + }, + schema: { + body: z.object({ + name: z.string(), + signedValue: z.string(), + expiresAt: z.string().refine((date) => new Date(date) > new Date(), { + message: "Expires at should be a future date" + }), + workspaceId: z.string().uuid() + }), + response: { + 200: z.object({ + id: z.string().uuid() + }) + } + }, + onRequest: verifyAuth([AuthMode.JWT]), + handler: async (req) => { + const { name, signedValue, expiresAt, workspaceId } = req.body; + const sharedSecret = await req.server.services.secretSharing.createSharedSecret({ + actor: req.permission.type, + actorId: req.permission.id, + projectId: workspaceId, + actorAuthMethod: req.permission.authMethod, + actorOrgId: req.permission.orgId, + name, + signedValue, + expiresAt: new Date(expiresAt) + }); + return { id: sharedSecret.id }; + } + }); + + server.route({ + method: "DELETE", + url: "/:projectId/:sharedSecretId", + config: { + rateLimit: writeLimit + }, + schema: { + params: z.object({ + projectId: z.string().uuid(), + sharedSecretId: z.string().uuid() + }), + response: { + 200: SecretSharingSchema + } + }, + onRequest: verifyAuth([AuthMode.JWT]), + handler: async (req) => { + const { projectId, sharedSecretId } = req.params; + const deletedSharedSecret = await req.server.services.secretSharing.deleteSharedSecretById({ + actor: req.permission.type, + actorId: req.permission.id, + projectId, + actorAuthMethod: req.permission.authMethod, + actorOrgId: req.permission.orgId, + sharedSecretId + }); + + return { ...deletedSharedSecret }; + } + }); +}; diff --git a/backend/src/services/secret-sharing/secret-sharing-dal.ts b/backend/src/services/secret-sharing/secret-sharing-dal.ts new file mode 100644 index 000000000..696719a1e --- /dev/null +++ b/backend/src/services/secret-sharing/secret-sharing-dal.ts @@ -0,0 +1,16 @@ +import { TDbClient } from "@app/db"; +import { TableName } from "@app/db/schemas"; +import { ormify } from "@app/lib/knex"; + +export type TSecretSharingDALFactory = ReturnType; + +export const secretSharingDALFactory = (db: TDbClient) => { + const sharedSecretOrm = ormify(db, TableName.SecretSharing); + + return { + create: sharedSecretOrm.create, + find: sharedSecretOrm.find, + findById: sharedSecretOrm.findById, + deleteById: sharedSecretOrm.deleteById + }; +}; diff --git a/backend/src/services/secret-sharing/secret-sharing-service.ts b/backend/src/services/secret-sharing/secret-sharing-service.ts new file mode 100644 index 000000000..7fdc8f6aa --- /dev/null +++ b/backend/src/services/secret-sharing/secret-sharing-service.ts @@ -0,0 +1,82 @@ +import { ForbiddenError } from "@casl/ability"; + +import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service"; +import { ProjectPermissionActions, ProjectPermissionSub } from "@app/ee/services/permission/project-permission"; + +import { TSecretSharingDALFactory } from "./secret-sharing-dal"; +import { TCreateSharedSecretDTO, TDeleteSharedSecretDTO, TSharedSecretPermission } from "./secret-sharing-types"; + +type TSecretSharingServiceFactoryDep = { + permissionService: Pick; + secretSharingDAL: TSecretSharingDALFactory; +}; + +export type TSecretSharingServiceFactory = ReturnType; + +export const secretSharingServiceFactory = ({ + permissionService, + secretSharingDAL +}: TSecretSharingServiceFactoryDep) => { + const createSharedSecret = async (createSharedSecretInput: TCreateSharedSecretDTO) => { + const { actor, actorId, projectId, actorAuthMethod, actorOrgId, name, signedValue, expiresAt } = + createSharedSecretInput; + const { permission } = await permissionService.getProjectPermission( + actor, + actorId, + projectId, + actorAuthMethod, + actorOrgId + ); + ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Create, ProjectPermissionSub.SecretSharing); + const newSharedSecret = await secretSharingDAL.create({ + name, + signedValue, + expiresAt, + userId: actorId + }); + return { id: newSharedSecret.id }; + }; + + const getSharedSecrets = async (getSharedSecretsInput: TSharedSecretPermission) => { + const { actor, actorId, projectId, actorAuthMethod, actorOrgId } = getSharedSecretsInput; + const { permission } = await permissionService.getProjectPermission( + actor, + actorId, + projectId, + actorAuthMethod, + actorOrgId + ); + ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Read, ProjectPermissionSub.SecretSharing); + const userSharedSecrets = await secretSharingDAL.find({ userId: actorId }, { sort: [["expiresAt", "asc"]] }); + return userSharedSecrets; + }; + + const getActiveSharedSecretById = async (sharedSecretId: string) => { + const sharedSecret = await secretSharingDAL.findById(sharedSecretId); + if (sharedSecret && sharedSecret.expiresAt < new Date()) { + return; + } + return sharedSecret; + }; + + const deleteSharedSecretById = async (deleteSharedSecretInput: TDeleteSharedSecretDTO) => { + const { actor, actorId, projectId, actorAuthMethod, actorOrgId, sharedSecretId } = deleteSharedSecretInput; + const { permission } = await permissionService.getProjectPermission( + actor, + actorId, + projectId, + actorAuthMethod, + actorOrgId + ); + ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Delete, ProjectPermissionSub.SecretSharing); + const deletedSharedSecret = await secretSharingDAL.deleteById(sharedSecretId); + return deletedSharedSecret; + }; + + return { + createSharedSecret, + getSharedSecrets, + deleteSharedSecretById, + getActiveSharedSecretById + }; +}; diff --git a/backend/src/services/secret-sharing/secret-sharing-types.ts b/backend/src/services/secret-sharing/secret-sharing-types.ts new file mode 100644 index 000000000..c08f42612 --- /dev/null +++ b/backend/src/services/secret-sharing/secret-sharing-types.ts @@ -0,0 +1,19 @@ +import { ActorAuthMethod, ActorType } from "../auth/auth-type"; + +export type TSharedSecretPermission = { + actor: ActorType; + actorId: string; + actorAuthMethod: ActorAuthMethod; + actorOrgId: string; + projectId: string; +}; + +export type TCreateSharedSecretDTO = { + name: string; + signedValue: string; + expiresAt: Date; +} & TSharedSecretPermission; + +export type TDeleteSharedSecretDTO = { + sharedSecretId: string; +} & TSharedSecretPermission; diff --git a/docs/documentation/platform/secret-sharing.mdx b/docs/documentation/platform/secret-sharing.mdx new file mode 100644 index 000000000..1b26c0d8e --- /dev/null +++ b/docs/documentation/platform/secret-sharing.mdx @@ -0,0 +1,44 @@ +--- +title: "Secret Sharing" +sidebarTitle: "Secret Sharing" +description: "Learn how to share time-bound secrets securely with anybody on the internet." +--- + +Developers often need to share secrets with their team members, contractors, or other third parties. This can be a risky process, as secrets can be easily leaked or misused. Infisical provides a secure way to share secrets with anybody on the internet in a time-bound manner. + +## Share a Secret + +1. Navigate to the **Projects** page. +2. Click on the **Secret Sharing** tab from the sidebar. + +![Secret Sharing](../../images/platform/secret-sharing/overview.png) + +3. Click on the **Share Secret** button. + + + Infisical does not store the secret you share. This is a part of our Zero + Knowledge Architecture. + + +4. Enter the secret you want to share and set the expiration time. Click on the **Share Secret** button. + +![Add Sharing Secret](../../images/platform/secret-sharing/new-secret.png) + + + Secret once set cannot be changed. This is to ensure that the secret is not + tampered with. + + +5. Copy the link and share it with the intended recipient. Anybody with the link can access the secret before its expiration time. Hence, it is recommended to share the link only with the intended recipient. + +![Copy URL](../../images/platform/secret-sharing/copy-url.png) + +## Access a Shared Secret + +Just click on the link you received to access the secret. The secret will be displayed on the screen & for how long it is valid. + +![Access Shared Secret](../../images/platform/secret-sharing/public-view.png) + +## Delete a Shared Secret + +In the **Secret Sharing** tab, click on the **Delete** button next to the secret you want to delete. This will delete the secret immediately & the link will no longer be accessible. diff --git a/docs/images/platform/secret-sharing/copy-url.png b/docs/images/platform/secret-sharing/copy-url.png new file mode 100644 index 0000000000000000000000000000000000000000..89d86ede44ba734a0b39e6608101a894a47bf9c8 GIT binary patch literal 54921 zcmc$_Wl&sA_b)m?fZ&1Pnh@Mw2S`E!2^u80ySoiG2_Br_p5O^KK+wS*1_{9ix53?I zkTZFo_qlaH{HspgbF1#{s{N&R@9th}um1JYFCSFo32>=#0RRBO`*&~D0f0wn007$X zV=PpUbAp)*0Pqa({>>{*pRBzF+c?^poTW?Wvh)PMDI+fORI8e4No|S?oflVh(EvOM z0TqP6rWdB6j}8<;6jz_)TIj@cjlNSAy12K>D^HT~QJLY5jPRB`>r$ z|1?D3_h+B}+n@E}$;*FwEmYVZKV$q)6JRBM^o007E&VAj`aeS>hHx-<&_53p< zF{rXx^cA4bl^^kKr0u^$6+ygHk6dW2sR2H7%>Rx9x17ELz^Va?X#Z|T`)mXo&0(%L z?beY(_P=zuT%!88q|p9LF{0LIGZ^5D|Lwms?;amu|4SjF_Wx7H{LlQpbfj2ztcvv1 zN}(vhlokx)TlLrh|-{{z-kKw|DCC8FNkw>-W=T9?2J{XGvO? zF*K<}#?Y?V^XO{lbN+~C9Ku)bUwY({zaGA%e|jOgcUX%fXw}-K(HkEV{_E09jIyZM zSZ00?emRxrwk<1ScTv?QT?|7b zUJ3481)Y8|#Sk6QuW$NM^vWeaNO*RABv@p7<&bDjYK7kWp#B}t@4)J&xQ1FOpx13z z9l{0aM}Pjacs5j*_Rry7)pTsXYSKQubzys;8MDG4qV#0n6&V;em`qcK#h)F189VEk z?CE4wVLD6HNXKJPcAzi|Y?#Y~fPyDYhVB>qXuB(K4kG)ZPSU{urx?Xdd(FKpAE9Se z{z2-&wJ?$G7DqxPTvyD5l3_7};MnI6td6tPV8&)yH_U;Szs?_b9cx$He-BBtO-uhQ zj_Trtz#KDMYDu}%OSjDZ?Uq@l7dQE5wpB_=CMVIRmGbEDP=Vw;S$YD>X!mDU{?$c* zBfGM4!iLiZ@J~k2Pn~@KD_cKHJ4|?#3SER=e&@j!L<8}mTwB#MYlIsK+9U@tlZUP= zi%{U{u&~m{b)2&cYr(l@=i9*TK23#RRv8lhAeFITb0F0j~~bi!W)2iLZ~-Oygc@eJ9ssgE}^i|9oDe>GBD(lslixI}zCQ4fq`2 z+-&5;dOTvhk_VUaNZDM35lv>~HF>W1Ls4_q2>$Tor}`!qjj&F>-6B_E%yfRv5_-N@5u~ASSu0}(&CR~{{lK}V zE1v&K=>xm^53-pkm1#4tLY3itRSwxoxfcJ6=!DZjo|D-|VXX|zGN9Q*2L>S{M#^aC z#>W&zJT6T=2UQvw7T~Rs-h_x#wGp=(4p&onrOcY2eKMyeZGV{TANBNadOh~F?>a?P zUl;Y2ku*5W~_7qh)j z&-ZIE3HRmv+BZKqzi5b`{`?^nu8Z%}H);(cjY>TBNE|JgO(oYcu9TAMZ8#0lx+0lQ z?CHLm(9+t9s}m=~f}q=x5uH3=SdcFICD*8)522td{Dr0~6!!Xy?{NN{!jYY)f|eYu z{uQg0d~;oO6fm4j^RYue6!|N!ODH34Y7H5ZBb!3WmId!4V7nrZPcYna9?3H(H%T0G zJp3v)%}!dX*+M@0rH#%N##K=%GyJH(3&Tso8nJ;O-XDqR`35Aw-64{HgXpuSyue1( zQokyUUf55dC{0v*C{dN!=-e+(C8@V1B4?k*Q26||{(%Hrh|1M$MN~_7d&&Ir+Aksk z;7;?%=GX^j<=OZizg9Gn($e2*pz%PHuy#u?bVn`Mgb zvUOhJ>l$=+TVLB46WNZ}V)doAgfx@X-i*Pz#t6%gm^nT>^e+Z>&lXbKb7JIV?Rk^h zCrR;jNeBBx&`}Q-jDTV7{C6=%R+P1_LTf_ZUY_8%4X2TkJCm5WG?;u#K@lQjxqEy_3$h9R*7ZuT=C_SS zGnnoO%76K3ZB?9{MKOnG>y1Dj4Rm5qT1(nubF8CkEaSAbK3oIs9W4ip6LF7l-r7$3 z6h$iJbh>=7y$!IgGNhn+cj~Tv{De3`bRYE&chW7PU{AFO{mi-u-R1MexT2dOcK<+i z%`Q4D1BWn6G*rg+)S_*ub`r}T@A%kP{SAWFT^xU%+u>won5c2yh2ORt;{MV;?en?@ z7ts29l1IM{{*^GfUAXN7d1w#J;9*%JGpZ-wF%b=^N`JCE5KkL!mw$t`bQIk&LfF#X zacMo`mNtkb_9{Cxl%>|>q{;Y)>#ZAsYrTAgd_Yy0xtxcu-jV7e&r`z3?hsBqA)+=& ziu~FiPwA^=YFJ@DudB4(F=9oku89hs_=9`YTZ{~FG$=%#!KGQ0&}5dpvyC0vObvZk zqt?mDO4}Otor#zj^nRQj4W5(<)5KFMLT73=L2ff&DQA#jpTv)SQ5pnhhtx%_pNxN~ z)@IlE)n2guBkOZPOV=V_ALrF(FYcQ+R>PJoF9mQ1QWTT4D_zT}6PDFD#7%lbR>s$x zRm*SyuFk2!rb>QovH|(8Ebk;3c%r{>=jJ(^TgnpZJ!hSM^v)0aj2tG!fyYJax2FmQ z`v(f7m2@Rua1IfT-0baLusKh}YMsd_S>ky&x<4Edi_zn0%a}CkeAk+{bl!NvvOPw} zO`OC%1X1MWCsobaR8BHP0Bz&$yb_0dNMO@WAL2+{@UC(~aV~8MhQ>V}aJr7Z4L8)i zu{HgyZXG^$mMqv-Z|E&SX3~C<&F$MqU#nZ7-ng9f>8U+>e4H3O-HJ|!zP1+jsJDZY z{D>~fzoD;{9Fvq7R2p0KC`mb8vv#h67xX}jg|FzEH40v_i}5r)MRdHFz+tDAL- z)wxL0qJ7{iCf=!w2vfAa^!VV5h#R{v8)nH`)+f7(r-?CA7R7X}fBO9vm)76c56K0P zl=CQS%yix_vsq?@bhr$;efXwF0GCXm%l>mnsLP&A=`jjMEN8Mo`)BZ17G>#+U|hnS zk9rspIQc4>cP$q)QGz{m7f3vZi5)Hxz33vvfUNVD1?5srTE1ZE;PjPbhzygh2#+-L za(4!xAnf2^g&{S@m}3otg-UR*4!*Ga!;~3?K~mWyCJdRlM~werq`2T?6Te56MA6Tq zAdZg6}sNQ6ElHA1J5Z!pK4XtF^DGE>B6WFZ~d~*0lKs9d~eMWL_{o&qW^|TrKr% z@#@w+&?e#TXO#G^mlG7OZ4W0P!ZQ4$Kc;9jPsM>YvW}}Y@R_S)?|gthxA{nx{34ta zt`>Esc5*X##4^DtmdVT|!}<{TFq4}a0W3txQ}Y~ccnp!kdQk`##y);PW**o7PStLc*d~A>DWW)}k)Iq$LbCy{}%CoB`3gFR; zR*>tK&ooeCl}9if^qm#$OSc&# z5EYeE^qH>NwQmFk$9+dK6?mUCrJ_sE9{nKwBxa86h|n*uIi=rgU+Ya~gngu8==vtP zF|xp4-qrC_W0Pi#BUP7&?vwDO}{)OtDeo`fO%Hj}$Mo2r85egPORMN8BAkOgrXY@`rT zPWVTP{_j#uenJ^JVBe8~IGjP9!mQg&4AhVEJoxqATgB)WbMe_+N2^+21vHWUk)%{L ztKc|>on=-GiI$0MhS`O65#^9dvRGM8N@fEm|ID;(^!nPZ9G#auM6;KX5m_DX+B}dH zkr8gWo_6qQ?|$nHNtfg*Q);H$9wWTR#dP4x|w=jq<9ZE zG3E$L?lOuiTQe~(SCVd1dly(QA2@|i;OEOdC#&<*1e5%Y`3chSq^oJctBOb4mE0df zfG>N3jdAk(WmPm%_w#Kj`E}a+ur6yw`1{l|-9@P`ySqFOhn4cQKA6&rE-a#5-`Yo|IhMU% zw_bVXw)w}KaHn271o)QzqI2@sG)qp?Upl)!J!A}9|CDR!>52x`T;3GLBW-$a>_4*^ zg=9alOV4GX2kV8clVwirOFwLkBIoJF4eq|Z9M4EO3>FX_q#|l#I4U-d+j{g?WKeKg zo#SXgIQ97AlkxrATweN3E+ZoN(P)!F_%1_=&X9TQ-Otg7%gG3@@BOUW^R^%^t;*y^ zwUM|HZCrR6J>9C=G!x?qJ+)lgM6MD}S~d0Ci2V0b6k37E>ob@h>?$17{0};{+BQs(T8c?ktpi~uf z`pU)sQJZea0^v;MoVB;Q>dz!dDyR`MiQ=cMn`FOa^u zd!~;$~6YvCo`5F5)V zZG~Q2_;z+Bt=fI=NryUuSqe+kM5*fAwvRXK`+jw1u_=KXQdd$8708#74qTLVhq19E z-mGSPGfhdN(RzYFl|(e(bGb1p;CXKFO-tZ^U`jgg?<&?pU)oEW0!4{ zzwn9vA~5tSckh{`%-v#I{@As{%|nbp-P5lNbY^l?R!5?%_;M(k=Bf}#?kIo2Y3VoOV3Q5-OS2Xms6%F>QGeB zxD6#rUq1_;0Fb9RckuOwTo<_C-qCM&xs$UF6;Wg|FmUr7N8BD$KHZErgp{!`gK14y zX~(IQtJ#}gC|Nvv-%mvHc-}hjz{;7A-8;jSKCb<;3fRuODnxMILJ#8Y3BkE;;Xz4+ zZgmG!TA=jy7RH1>CET z5pw)0v`z25?WMXzd0NZ!Ps+6xYuXC8&^B>DF+54ZN91rzY(KFgsd1;lt`Ovk#lz&+ zo)RfRPe25eJ>MQ>BVL#RWV42nxP_T?;DqqE;bu9eYkq1P#w#`>lT8q2@T=^4TkT@TD}*12%omIw zYBtuDzAkh8w)~o&!MNc!Q`+axU$LY47x)d1tM-nW9{-knb{QomOeDvn75{Z<+O6;8 z=C9xXu-qkUEydAaY^PvW#B%9LZcT~02j6OHK=^u*eEx>(S`8zOK1QpLL%Tq94*vB? zx55~uY?AEy(2Ld(3WrhJD0c*vciTag_N7i4RA>t3;KbyQ!o}>wVCIUxVj0dc+P=MC z8acGlIKhlgoD0C z)|_c6-kwy`3J#hk#lIy#U}Y{d3ju`(H5N@W(?vt5rM+q+PF*qU^b@y<51X`qNFw=r zD@>9N%G~7cnYu{Lbk3{nc(eps;hIDVcN&*D(UD3^Z)nZSjYcb-6$x;~; z@1j1Y&dlTmE)*uMFu;oBjUM2nKgow$fHx`<02P z5UIgG#uX*HAffSds%BmiRM$#7Z|JSMV`Uw^GV<3x;1R~1@BF!wj;#+ce40xjWVK_6p7*KoJY#qnS`<)l` zZC!S!*>U4IuhEY(XT7wbee-0iKx>c=8J^rYx&^HCl9#4 zVfI4B=>SZgfO|XpdE@zJ*4%0#Q~F1hjT@BF~E&3U$iqseLgkebcYl&d4r ziZw^@fau)HkGr>v!XW1%EuHn9VaDy?knfvrcaieVk|vvFuP|Vyr*fg|dx(29c<(LQ_ooZ zzTwth^cQK)lkK9FgFvj$qvy)0HrDO0Mozmb*3!zoKF3uiQ!d2W6pO%8qco#IO;_KS z9$#GxN9{{KpOclXTG8-!BkUX(jq}eUp2JK@F$`Ovt=w}DnCzAIcg_nbclw+uiY|BA z>miugqxd#sO3kXrz4HAVgp~CxvA;nFiPNTDaKk+0*IE+W@;LrV%TWUwqGs zH|m(gszG4n<}tHJxROXc5|&<;_=L1d)E{oIOuj|Kn)WLwpfO@bfhCHVM@(l_FRc9p zBBRqz=x3pC?jlvzgg3U8EYUv7y_-ocZ?P{hQcDe_G$p~aFOPMUw?Kwt_Vc%pRy_J` zr&=Kz!>>kHY})VKhMoT8#3+6I8Q`VLFZU=0uh(v{UOYRl3df_dP0NG8J1Ok&OYi!Q z$x)|jhbAEC45Nh-cam&ML}tBa)!RRy?NaE8iMGh~S)y>(Jx|=>BCCLO@`i*xL!gQa za(dp0`IEBk=~HPv1<=Wn-vN=}{0X{!s`F7*=IP|Z$dC3;!A4;bXQM(AsntwBZjx_+ zv=#H#mKInQz&a&9aXj!>&$4x<1JC}+-Qo(lNUdV3Z2{CDnh*HY%&IhUcNh+zMy~)H zwDHAzqM{hm#x+&Sy(TgU z81^>82Q;{UD2LFFn!ha*10jqg5iq~)0$tIX2i~coxbZovli?}xb#cR&UI&D(m6!&1 zC4&TRO>@tQ$^}ZtxmWLqm&g=R#-!$ID$uJp!XdO%`65 zeuc5_17X163zL(Qj?{gFaM?d|%MKGRTE%e-bGu6P_K)NHEH1;vwC%)lF@lL_jG}9g zqRlfxZk;H0705QNJJTMCFb;7d-LpZl40Ur+U$HHZ!V2wX|N! zaA7U6BvJ^=J)Kd{Jp_Bk(UVo&C#$jp@9|ofq$IvAGz|8oy4AIU-W^iq_E#wZO4|qJ zbKQHKk4N>WpZ=Q*a3?CiE-9$L9P(#;A*=I*qgN`K9xM zGLjcTmA* z6R>sr$;PHX^zU1qXS|?-SF~q`nIaZ0XHG5@&pL- zoX{8jM?a7s2zsL4s*YG2Rk*5qPN?B^h~MCSFNpmX#TSHB(X;mVAUQh&T8j2w7G^1H z7of5R#E=%xZ7!6H8QQ+Adxel}jnvXL*0(y{V6IpEmP7 z4N7z?-w_Tx)~+1BWy!zm$~~3cwF$R)KvUHU?5!m-ZT61pvpb6#$_6SmoEvtQ*BkyP zH{x22?Xk<({bfD&HPU`JHvFPs4szx(A?YNBW~jIc<81BMmjfEh8eAS?IN) zWK%qbn~7h$w3m!bgcd#D)wQjC2gmF(IQ+TZkq%Cb6K0U!KthpBf|l>s5@|w#Gfp)Z zrk@weW67^c{^QoW{xY5cV1?Im^Z?CB(T?Ly^}eY~acZrq{~&!QFWdW4B$^UQ#!;L* zgzXfQ3@gYXTK0OYqSmNaj%ouVEMd@=E4J>B3l#X#8)S@31nHpB8)3ay7gpM~m+%zKO^gQ@LWC`4+?0i85whc!bgJl~U2X;1;c^c#8FeKty zS5`(o&2ZiLAH_SjQMuciC&%pC`_!2Ncd8z`h=9Jck_@Masd~itnxoGJV!j;de`<5t zy@tulXnnLrsA`w%c0NlItd9iftSkE8oGSK-?k}v3wk^C$fB5HToDR52J;X@iOZ*4m zq&!B>fhXb_5GPTY0 zB1VnxYYn<<-Tt`78F`DPhhe}&scZExm#X^5<4x<8(|~JQJCiyFW$|_O+p)$=+?OS^ z@vJYf76`{y7>nvue=HUtpgJrpJGI*kEmuRkk``p-ItGv5&BkrZS*OmOa7<8p;_8OC zOt}c;54f>wW=<#&s_o+3)d*x|F|O++Rx^w*NSQcrMGh0#^*o)kl$C%w#?p1-mQ-@7 zr@i+SSdsS2-ab`t5jgja39>h@PJ>LF@ktlcR~g_YVEBkgY3wL-Os|fm*wY<7PCzFfNFZ%g`(>N77o+2XK9Q3FbYdt8=k>dT`k-(E_SpxU<1T8|Ls*d$+84F zNW$#*cGg3-Yh;qWrvfHXW|j~R)p=9M_>e(yb*H*`F|=OQV^yHc?tp^IWVw~BhVVX8PNdxl4Kfv%Ifj9fydFd*@ zH1zVe`-&Mx%p~Df@2rt;TmbDH>h@aS+xm>s%*b|xc9bKL#WXt0A4+&NJmv6b>3XTe z0>9Wfrei@pI`?d#&)TUOoY^E^QH`3ZhZXd7BrX>CtXq<|p!sD_pXo;R)0nJGr?BZu zNg(|SdV6?9ON4hVMjLY5{!lF;n=tqOpx3@uat7zZIn*6Reyl@1T&Tx-Fywx(+*Ej2OApwCx1Vvotb)M%8Rf^9SsS= zQfi`g@Mg_S)z&$?*=zeQ59k>;7|V^k2d z)3&Chq2JBDsAgL^Z+&EZdM7E9ldIgo%+~hvGWvJbxxommfYqT-?{T{LQ#O^I(qg0R z89QCED63uGn1LEL7nK7dd$J&s&yE#It?N#A?S)Fo>=f;}%FAjRKJjP!Z4M6wffrX}Sq=5_P#XF+>uXPP?G%=LJ{BtY)d4@IbcsQ#;yyX1zznP8^dz6(MdL&R+>5(Smg=n>g}oe#oV#4y z+-lPJ4Xp|bL5fcry6@;+2`z~4?kPptlowO24=b~NXS@5Tf>xvZzSm&FKK6h{xP zZerfktpTitj!eQ2w%%YbQ4X!dX%r!1sA5SV7nKnp?ja=cR>5Cq}sLX=DwX_I2Xnc4yOFc<276Lr&~i=3EFnGO*g# zv_WCZ7Jlqhe`sh6)${_1MQK$3C>RonG6>GeD6c+(WqUZ}f&u_ep$hzkOK~~Z^qT{^ z9Ro>X()oTlF<(04y8*gD+eb3NbQ5eA0diGnZeNe%w~iWOqxK(7r0`Z%H;uf`?_4n< z0(FW-7O&U2M3Ui7rCn)Cpoz7{3Df7?>?zF`i>5VtJ>{pCB(>JR4#f@i_mCL=_-64b z`x;yE2YV9IdE1uw1UU*C4^aIsIRuwE%O&@2!I97xCsgi~?ZZ*EXVm(N1p9!4ix^d+ z_V!5|#fr8*NuZ@QZKD|_PnXV>F~KiRQDW|Zn=BB0 z6YbuPO28prv;FSS*UKR^0*rf~pWoE)b_BD`^6~FIhx=friqU5GgZK*aFUFDt+nF$4 zm%bU3nH}UzhUB4*Ms`It<0@l6N$@sMfG@t_{KzJ(RWe8ADrUk*X~-qXLQkw>zsVHY zzsp0IrNS>0ZfNs?v-^ywh?`l^O6Z-f$TSW>={1}xCsEjW1^aEaO>T4+F!IMEG%qp# zS+@Sp#qq|F?Gjak3U!yTXut{o$`(4a=ir1Lk6N)5d$^@+pxYy+J{@wAKEYd6Lk6Bg zy>x$wd{);0`wcI56y-&38x8vjUtR|5;qZy5VR+zlm+6lPr@34dDumI)ISUDeZ8Kf z2;_W&ScoUQuqh@REPOlY8O22}K#L#2Tg}ogX;dGNPo+Hln%^~7ty-?i2bL9Xa_!~r_FFyQc%4utB9XQb4-LPb#|X(c^I zenJ7<&vD(UUnQ8*nwBxX;%9Z}frq*mO@3)+M8(Mw3)bqZrr|ztv^mxi5gQRMz5NwI zD>4=Do}uWiAkgB6VJ=kS-T_J7Wt^OOvqa3#o}*=cQ!@zO$DQ-HLBUd;iRHqjFF&{( zE7+G!5W-9}T*6fAhfmX|k_P(SY39NPLJhw?x1;zWQpz`P?ILDj;s)7YixGhJ3T#{< zJ$uh*3bB~Si^;5x=3UE0y9n(_YozyUd=CJ&-DA%bl;FD>2KYzi@x}J$s62^WkE#}u z$zGCL|ILZcK$g)eYd6Q!F?#3=7L>iWzjhcXz$BoUge&E1`*Jyk%F}H~QOM#g!qBuo zPr9XqC?$$v;s>|T_I|xerKp?Ts5jJ!A0++sW&ePCuq8uz$BBXUBsYT6++0^M9Kz*b z9?NiC7O;RjX{PY7ysq6a(kq)&;U6EnMWDciiCH$*BY;ti*;|?Pd_LC#tr-FOb597x zpsCj>UNmT@rF}w&%yNsag6wsP!uSq=R>kgO#Sc16p+dA@c~aQn#A~n9UrSiTe|`-( zDf%bMoQ3|%MMx$SWl}`QBDYTF8btoS1XnbeV*9tL}QPP#&r!R5tn?7rkZ>S z+t+p!N7j)DUmlk10Yb6U8-pNq;B*kw*86EyZV=}i($Dv{6!z6FQn1LLK(fj zW>JnQ;&kE5JU$8%P!U21^Yn5v%1BVOkN+T!7_VN(>|zSM zNA5o+(OdrE*j%nF9rPqc@w;9wkBg+#=nqc|7VNra#>JKQN-ESBIPPF8*LhiS*Q{0S z!l%=lAJ`f!w!b*EIJ}`mKKiW6fApp6s4wBf^?nb=Y3*LSi`o@ zpZAJS1$dvi6jvrkQZ!dJl5!MFegcRw?+kMkEoDTT>ByHy0*AkS_`Ws!DRe&>r#TBT zf$l02YWA5c(n_Kx%$0PFG)k4m+N(-opau=QO}$4^KI>8lnz&9xjYm38xL_*5zGljQ z8qasZHmx8=u49yJXYyG7*u8?+5iSq4`ig&E7z+!_#Aj$x6t|{-E-*aHc@OF+tZT-EE9TdBjH}5v{A? zWs7d{R-;Z`6ot@_RIa?0?T_D2ZQiX;vs8xr8kP1VM>vIlXe%~cAdFU%cS-k?nATb< z^<7|^3I_U< zqINY;(#C9*E<6~aE1I)wLpE*(oiXAcFDd)l9R*&U$2HC2vp* zTUWdJPb|r_G<^N|ZL2sM$;xqa9MPavxJ>x&GZVh6T`3nd(VF8DD)0VsxJE7`N|*x^ zJL+vpP?vEL{-rl%k@%VuUh$ZTX(1Zu^@QXygyCUm7gm#wmHyVrO(`cq#(iQgD?QS7 zNNJA$zzu?ImXcDijB|Zh?gqk>AT4)7QsW_xzAA}3of4j~_*kSz)A%{yEB%5|u$^c6 zdJ%zcr;pFehas$wauW+(nmb7}oSORsd8($~xhuLF#3%7C27TUGA*wRYg%}adx$0s2 zB3k8g=8a#JRZ?Q9Y9$kej&JYE_2npseBSJFS2ypx6tRNas!FtulumHR#}RIc<7uW& zRSmqC+s`L{Fw3?Z!%WeU7%~^d$-kq+vh^yf`5TRl-kV8=;mgiD^ZyjKsSv6<4LL6H z^f++eNi)yFT{r8rdFal}2>0-gqpza8B%++m6w=PnVX*`PB~(Qm#%eP)DW+W=`x7J7 ziamV?v0l=T+1IjZ?@mzAh-s-%ho9*$2o^J@S-i9uB+ct!D!KErLJVX<3`W7`+-c7q zNAy*S=&hpMmtNmZ`4e)>HagKK?J!0!t5DbXUk6;EU~hak|6O3XSLu0O)C&RaB%Eg_ zgr~sVbH!BtmtVU>R<;_Ee|;FuLW&}EMc{$A5lo=PuhEPr5;n?!1aJ6FAq)Xh zA&q^fAr)`%*U2dHM~E3$9swFby>W($F}lmXLXFdOH$}sU?i-uqi9}77cqp1x_TGYChdYXZCz0t6Ttq%RHWzFyl?jJtDHl7+`pAZL!m;-$NmqfN*oIw zRJ8FV_KyYtwWdW*$^MIzHB?p@g06ry4ppnv4^*dlhZxrQ-xVbt20m%Gv5Fsh5pam| z1X|GlAYeKv`db5J9<7C&+?e-M6*c`v`s`~)=P5~sNByS;|5ugL^l~;4I;D9M!GDXL zPNS&x{Pks}ufs>&>wLQQ!JfPpgw5Ko0BL2!eChQ6tRus0o6)+@7;%ee5gq?G zH4icQKi6CxE@S{0Pj0xmxsU7brw)(w!TXg}b#-CiCi^$S``aylxr`Eb+raBeSiz;IUz?qPU1W@tG+?T8eU z_CH(<7eEP5)>~B4q5HuSk_H@HSjc>T0lqUnh8f?V!0jJSjPG-AR~|0fP9@ur(A!J! z<>5Ws`Y|w<=?gf?y+zUJtOw z{atd$Y&QR2EW-`R-{SQ;(3W$-=QB7Rr_A05`TwSo68 zbyHmTXN3a~+wKmpZcj(4@Uc)lxV6781|JbcsKv&myh(q7$}`IO>sDi4=052V)q(q{IK`){`@6=wy18xYr@`GBPr3`R%49e}~CcT>2Vk9&8$kcT!(FXW<^r;L~6 zidC}N*w{>98^d0^O=)+5`?cVwOKma$8c|29(<0@0@WbJLUE9?h^B%l4yN>}pB(lGe z>AX^ZIp3x4+%h1~5NMNmU*9Ix+x{xJ!EMk2x-m!K*f%EO^1N>&+k2_7p(M?F5fqMm zaFH==@+kcF?bAn2?UO@ro1CsLm2=xEp{eP9y2!Z#7kSizNb8L+nz*=l9m|$hRH$^o z%@O$F(of>8yoRP`cXgp6=TBjxGj8I5Tr7$bGZgVMcupD3_nG zbi3hHWB_88mX@YfQQ4@SHtMpgo!ziia1a(J34XDzq2W#o!xLw)_ri8zx(GA#WD2_( zDKARWch3rDOwI4_X9G0rgKAh^Mc0KZC>H$An3$N7A|u_H(cavLH&PlJl@IC^nv0YfkA8W|N(uCNT-kiWVY_YHe1FrXd%xy}!sCXu5y|(`SxS0# zcG<|aEie0<%U$OulT|Mcn@>fI!RKV}-@jK%2ZpNU_i66G5ThOMSIhS~Xxw}+;S*1^ z_&|ib+_&EOWgAT;nBv@KsAOrm{&xTJU;%1NF%>&iKIby$*k*P9^CKxKDSTgbbHp$r zD$0DZxv|c+?f%@+$IowVW2g5|;ifak;X@Y#yfr|wRJ+owH@Xy}SI(t(rra{;`iszD zt12A`!gZXh&3A5VZN9shYrZ^yBGxxtk#yc4bae+}=_L86qoZ^AKDT`F6ZhIHaim#j z@?0x2zKe{LxsSL*Uhq5Kc--FJQ3_gdMN#lt9p}AGQ(`F^P5TVZl+>@+sts&hjdTT` z?$s2~ig#u@H;D>6w&Nw%;L?h=GAY zK~eGAYUOpfdFj9yB`tey2G50#(blz2i?lekUqF=vwQRs>-Xme%WvJ>+LtoL9&NW#I zCbB5!d1i`aNqgc_P*9lpU2a72ZV0+>a7D|#Add>2a-983!y*W|ueWPsBN;pK8BaO?Lvh-8(PY0Z^G)Wk<&uX}i))jJ2-sdQkT}!e8th18-W%QHAW~y? z?Kbxd0=e+2s?e+b3b`;<%H>gil)YsozOB}DJDOjHLKahmV%%e_sVbB1R3 zM3I{cQKt+0k^5a9tfyPwo9ctzPM%BOZkg+o0o1*H@0K=1FuyX9z#YgAoHOfd7I~pGDm*#}SRa8~6pZ)SIS-6RejC}VFZi|!>6HANDmZ&nl z^EEIqaPju;TUeme*49Q5`>szV`{{=u~vT?bqJ1*kDqgKMWbZm3Helx=kD}Ok5#SS z48&BbeD2rx;TelBZD7D$yuQ>QfqW;YV z=(@XIOScB??tAwS449s7D03ONW}WX&3A3}He%_q4aFO^Ww5Y6%OI=-kYXK?>OW`hb zUJ7JlW==>>?pZ-t+;sQ2F1MqtuHJmj%G&$TJSnb@ZD*&KUD6VVQW2f*6k82DQI`qT zUr;0ukX2H`H#IeFKE7$&Pm#<{P%C{4YrML&nT=l{;ElYAwuTV`H0((U^Ow z>{tI3cM8j|%6>{hviboZr4{^)?D%}*s%hR=ExyZaptGkO^L?XneXB0h&-g8m_N4x! zEJeWHQhjQ4^f)(ddc-X)k1a{Nfo(71AT|v1$@Mx)ND2xH;!!viglT+Q32x~Z?b-IRO{qW++(SuU|5ot}rB}_!#pVcz8N$Kdi5&rY86p(0Y5Kn8JP6I&waJ zS&+v*SI)!FpHNzv@yg#H7>q?=wFNO%$`boR#+hk*+aa=z**f8>It%0FVcXaQKv$|ol97m~ChqsUj z4Ys)r@vs3eIF`~bTR+uClCjNV^Q+NjNS%|imX=jHn(|u&c(l+F$E50mu5HKUBtgwJ z`opuRer9ulbV|P-GSuBy9e8)6m#eL*8K0K+F1JDK^=sMps*3J5EsnFlzN;G0G6Y_s zoo?hXr17w^^?zSi&6P$nb=ooW^N)SE%rJ+dN9} zUb|1jVB%pgQ{%URgp>M!EPLW7q@+rf@WsE9b>g<^_pvfUun|Fb0plF(08~^srTS_x z{&_=2Mm8UaqywHEz4+y{&@{D~laqr_C6TncYNnD6+&=QvueHO}JQuETx~QE-H}SB& z`jeQQJ-pHtP9^BY#gcgU^c)4g3A!~_qPt#D@52raRhgLjxVVKgM{DFH@){{gtD&Vu z{^Q4wXj*ZSdOKB5Y<$Xo(I|33i~e}48D~x{6!h*GQnbhJ&;2MXvzXeO@$vD2>!C9- z?R76L<=T!Hp}y~}FvK~p=t|fZTQ%E#6OiJM{9nYqWmuF^yEZ%uf(jC%(jX1eAss3u zlG4)MHFOQAsDPA!bcu9#4&6hCGy~ExbT{wfdG`Aq&%57ef5+ZGzT=yNU%=dR-)mj# zy3X^w&b5XW!|&6@_60duncg=@w~Cd$qoWKknXV%Xi;D;ZVtxq`X<}mXBRaY}Ae_b) zDe&tBl-qfNV|Zi)(be^LqQv;gvnP0zl=fAHK6`to=jVD#Hmm$3t?ku=#vZAwi|yIO zsDY>APARuYcH_ZEKg{Fl5d6P8l&=PoOWZv@D@_8Z9Rsge(vCsI7*=ROLG@^FSM$5~ zU5B3K85Vopt}uYj-j@j9v&9sOrT94RI8hje+uW7*^~Jimgrwx&fQG*9u*#>y!!#39 zQ%&{lRgGt4bU;AMk zbc%^|!5S~bE%!|@u!)+Mm{i>VhWS!6Fm$>eY+A_K z*B{Y0H#c9RD#l}ZJh-^c`xb^8ucK(BLyKK)uXa@JyLtOflA4joBvQNTa4^T?HH8ro zkB_&JJ!%@d@>W*4wy$bIVpT{MMvRW@h`017J)+Q-u3QXQ$tG|C0FwwrfYIfb2Z{X9 z&q%o2c>F3@G{Tp=G;&G2A)nAN_t(;VGc<}c8!i{Hw9Cc;(un-=15eNM?5R{RQS&W? zUSEz03=Uq}s+vX5?T`72ML1mVg`4cX&m(swjI*Q8H*#cXMrL-<77CA7_flWj#) zuL}s(CD%HfJgWkXjy3BfBYn}3x1vAWa#YkFTyF$IDE0MgU3MmoIKOvgoRrm57uWqJ zGtR)*Ak@&&)kSTlF)cjV*c`J4tXtOPmZ%-0wBrPv)JOYvmJro&IEZ)og=7)oqop~S zx7jx`P~8_Vx;;+k{Q)w<-JLlYP*GB9!WCm#T#nH<+W2ER<245p-aBdJwqAL8RA>yU z!K?5^rjJM1{l+-8TYF?LIR=O8vN4k2=K87*Yj=yw~@AZ(VFmTrNp zsQV4mkQS+EX-yeS3e<*xq2d7Xy2G*16=C zQg0s+`*`K$hK7M$3etHarY#G^s_+#vuDI&6m4pwCK3Ar0kuZTydg^|J4KH6T1VUn4 zLQmc3{qAmnj_V(O>2%JmsR|l;`fqV%W7i1a^SiC-ch z)G=7~S+}S4ED6K-9@qT0-U6--UJ7qy{zJUOXGo>}kJF6;B9$Kh$5}uB`A%xcG_9|0 zZ+oFF-}NTo?ZJESpYfZ=aNmKyhG|-Y!TO1@b|N0T;S343Ffb#+$A_}zSXlOzF1%_w zm#?<#Z`fHYudrSkc4M3A`pOohBwP@UR@C<(mmPih)Xf@ecES!RdGf~w`V2QunRIUQ zgyL;s3;ciqQh1%yz0t0!`RjsBEE?~BeT+R)*icDKlUE>M^c3InK_M&o$AI!gp`9}{ zOD5^l`3rlSk-K;OPLXI~#cQYmnTe8i-g@mY&B8bs0lV-)RrLKMLOP$nO0IU(5~ijZ z$iu_(Co8b?*I1HtqqfL$974jY2k7@7*oG7piTOw3Rys2h+U$Kkd-7zd%9*I|_suUu zY*Nl|8hY7D!RJRwC*jG_E#E1l|88xyqTz}dp44QN0)%N(X^-s6d}Q5ZRnd1cn^5Gq za5|J?$*wiF`(C5?(x1-Nx0UVd{yvxJ^#JM8k_p;ijVxbjSs8z1l!r_eGqq#M;iI>0 zfpiR844Gc+r`MO|3PZX~?CfdA&V+DwCGs@*kL2h#9v?nnNqBm2kc4QmL}RQ%ot(@U zmex0CYYNmK|EjJISSbG~OT2K;$z<+2#v}z{wT{O|Dq?)Gu(5F-q;OZKpRWod4If1( zT(#nJNs*_f3ny0UA4e~Lu-sW5~Z7G_%vm&(`UXt6v~ zR>7I}q2zUBL5*LggZR-o2H^@dLdakeiCU3~iZ)bcS&$34nU43{9a(+n{60VL9f)P*=a;Jom%z?BZI+&%VxlXnYBqHo5devQ#!?oULREQifGF^plNZUW&BZDdv-EeB&j+Io&lhjygDKLf7tA^O4f z1!X8L!(`^1_q4qL^pdeB1|}<^%1{{VKu1MYz{JAx+_3Z6Skc*oywUET>)cQ`zLLK| zincwXr(KaOdK@We7X-E=h4C&l?d_5*+NF3OQ)xOlTrZ#Kc^*RnMFUb?vvl%OPz~i! zg|?zM?CR8LTRNn}S3#UpP^%~n-o|n9P5)rHENnUxUR$&Gw^eb!y)Nvnf}lY{Rf*u^ zNzVAa$V_}PvUff{6hf7@MvJv-nghvYk4Dd&q(YLKit&vB3v%9>Oz>?ubykxjbobF1 zua{=gkW1|TR>4fn;ZBsSSHPd>{L!8e7FhGUC3Vs29=%+$LW&O>BRjKkPo_)0{((w? z@j=4Hbyuiug6(SiAigmXhdVz7J?`*uXz@}4JEEtrL_4#@S}G$WBHWms!@xm}&yQT2 zuVlfW4&v@nVbpyXC*iUgJY=zC;rT-L8BE4bftNlK)AwvzO!IV9r$aHmV@j=Ovd&OG ztrPVIK&lcO($*B6!>;_lLUEnZ>%Rsi4!-GtRwkVu&WIy0`b01>v*) z>7vHAMtz^?!9m``b-rKf-mjafjK*vPs-QN}#OxMSK_I!GeQiAG z#!`$(iRt-*82OY-AKxmi+k817x^$LBX*&Adw6}I%{jT5VJ4D<*T%SHQ*Bwm-)m?Nj zm*a++{E2-4QB_wT=JUauW4(@-)E}^RxOvfMHtW0k5~An1{Q!>sN*=a|iBEywK3!Db z<)kRmQrSmZ?RhLu6mlH1{9}+eIDseRECtrZtti^7k>cC3RzmPV#LEV=XtDt7Q!uN%lf4C?i5a*XXTCL~p`PJX%vW_}>S%t=izqJp*FRfyUA`^D9D}Bq2cS zj&*4*pe3K^N%Xx8i4yZsY`peEAv>LbO8Ryx<*iMM`!o-Gk-CJ0tBG5SD;T=!^=SA+ zjV-rRGAx*V71sOlbt{Ng_cT-?+j3WGE@^EUHMLN995fyW|Gkgzxe4=IbJEAAdEaLGk93cwk80 zi^YzOOMyIf7Mk_HqP+Gx*0PYMuPJk*A6TA&`?-G~dm+TPZ~jOlnTDkfjYc}mt$IdC z(k=DZ^AwF$;r6OI@8(!$`l0pBqg+vB?TOLgV0iD%A(~#&!4o=3$=1&M4UDokxEhx7gr?8lM*+50vctdZRk>M?HLPH0USSrl|HIAT6i-k-^^ljE!F8e50 z-LcGlK>CRI^Rv}Cc>AuZ%e}6F9-75Nrs-0E8yxx1o|~1$eIeK0Jv{skCSdC8*AZ}^ zJuz&Vzv~hg7O2&WG^L7WuWa;>0VVlRwjo`t1xh@P2hd0F*mjEbImM}(yQWb%FoE=l(>E2)6T0uhjk)6u+Sjm=ZsW1@fZm-~it#L0ohqpYR=z1_%g^|-HY zza_FF{&&0_J>=cH?`Vls1V>YVTvwM7;DlYK^RN=jStM>DkVurj40zNEBee zFX;_e)s1RT+WPv)KNcdrBEq5Z!6OWTTO(ol`Esr{(-Ikzy*ZJc0K-M;)n5qeBtw|| zac^haZhM<3SZb;Q*Zg8E#5rK|{wx2k(DbYfB}-mD%leO?04Wz0Jj3#OTuCquPqEbk zEMgN`U)FD|uTQ>?tP*2TB%|5ebOiNwveFa{ws4LX^2Y;Hr}s=ZDJTewbgbZRUexgL zV^@aFUryuOq0fZq+S_e3;Su1;amZ&BJw2_`dOF*2jZXS)!2l`9$Z(3W>Gnp4Sabdf zC`z@)P)%|o9WVF|CR$wPf{CSzfj@m?=G<;b!~1$26F?sIBsaM0AY1-M=DrRprwu72 z5E&)o;qf7@GjEaz+c_YBnwM?%I33PJma|$@BLD!&y{2^)2Bxk78b@fNag&v^YXIHau4iK%dp znmUHt1rrbI=#N8gF!P1E+29udmC87jcXREsYh8B`9WHrmM98RCf1C-{m`GU1@j;DG zjGdhwI>x=lg@u+hU*FWRN>F_6WM?yGrB_ez)|Ur6VNTMIoMymL&qO})Gs;%#8Skpy=(ULv|+_#yfAp1aotIF&>} z!L`!%9L)IEN>9J&obOEdm6JrvG3(*ls6XcQCBJk8uH$Z#-ZA}l?h$=DP)kb1poAyL z8$8P#>9-0~1BG8~U6*6DuQX%(s*_k{rMrvH8$7_3x9t{Irgw6l7U{ow9^DNBJBX28 zOpHy!Rh>SmpFW7hkzXKizmy9+zRW@)IjGt_+h1%U=;-Lsm0(!p-^5LBbaafDwX+-h zj!s~a)8)f3yWhzoL?b0P!cB|@Lh&f@@g=*%#pShD1wz}_Eb0|N#Dc^$k3vbme@~@b z>$)0=JDV$_kLE(l!4Vsft#HeaD!L&gg$JS4g9jHnPFqghJw2P1aVaT5MMWv%oREt6 z@2krzJmBO)gCEF84u*zzyj-`kU+RmGV>fNbgNDag&Eop%&cGToJwAYrQfc@ae0)0A z*gTeQNQ)(R-C*sV>hZCRrnQC7lRC|z1qrzr7&g?>8y+Mc?0zWZRAQy^m|-`t#v z(|Ay&ICqUrAs8_r>NCK*JFa^osQr*39FLgzdZw*WmW>Z@S|TEDL&Zb0?{Y4-lMKgYI7wH>6b71Rx#OytCHRHd~4LH z(X*|l^wJW^U|ePuniEOINqQwP8PV#Lu562EzE>U<#8#VrsiBsxDdVuZ+*))AptSc7 zl|KP!9Ul)b01gkt2`8Vd_Nfrx8>=S>X@9!4wLlAVX;gd?McUV5eIzW+46s8J- zr{b>`3m-svOiPHn%;FPz`iz_K5LsW@@$zwKYKJUZm5dRk_gPg4QKIzauT~EP9_e!D z@~REoc}Y}#t>N|~u{@<{<%ZBn@}91-Cx`LMBiAyuDP2AiQN7W)zNgjjgpJGI){#ii zcZXZ*58SX5n|DHpd7NptT4^-*7TpL%iRLB84r;p_NL9}2RTR5u z#@xr;>y63D50!h5`u7fSn+!OVG&NsIN(xY!C!E~{3IapnT$60AFW_f0Gcz_t7oHb$ z?86P>>AL#9*`B4V>&xwN`PjF>25#T*?zImEfFV}Sr1DH+*`Duo^wiZ+N#oadK0%(W ztb*38shi(pvf-(D*ldLpGr5opeWjvUXlBL)Mp|!wKQ$x&AG_IKzwk;2L_>HrRR01! z{Gu0$G_jskQt1viX%Uimj6WHE_=iTbKwTk`U+P4!9_r-gc8Zan*E zckfz@tQRmbtYSB(uA)ry)Mv3NUA`hK0X>is2h3{s0M}sge6&*iv5U+5+`^JYHC+%; zaugI5D<=oI&lwrNs4yr_$PWw*&;aH!X z@__LGPw;U6AVCMStgOt+r3dVr$T@jL)py1xC$Z$10kF;wK&t>%1&G{wT=?bk+sA(2 zLYFMG-X+nTj4v+*8s8G|Ky%D~E)RDOkBw0s6E-3+;YwX108oP=Kuz<`tM!_$)e`HO?&CaYN2;ET2!FKH(C<0SD{9S);=@P_2fD?r z35Ib_=_UV6(at6L>*iF@sr>9GzI(h^Q6Ez)&|OpuJOCWtfA~Lt7U!(3#uIa3bVD9M zw&@Ah*O^pRe{$O_Y0A;#{uY!XK+<*Cojp)78x$2T?RPOZOI$fzj|^@wdJK27t&*Rs zcOrfLx*1R#2x!%V1@TL<@eb`~wpCOFz-Sk{_rXvNfr9hM-k$PXD3Ko!Six+~ zxc4MsQ}B{lr1y^-6lOPxaokr_Eb`RWOdR=hFm1!j?YM~!J`$*2YvhCj*Jbv^4olVN zr{}}=O?V(5uM;7^;*e7d6x%EManjpN%h~MsNVseSYcSh)D8#;riKTEY+O*k>ANm1M zX|EYK{`;gRgXcha5|nal?n5Fg*V?3c8r1}iey_Rzk84VWJh zOU-{%)A%D2B>?V;MEwO7DqxF15sV(_4h4h+Wywz$dk(;Z&Pde_3!if^R?pIA1avLG zLEe%0vXp*>O)3x#rgK7GQNTN37J3CRVulRr!g01!F5dIyiP$M0Xvs*2k}aUDitaf5 ziI%rs$HQ-@yxs@4i<-;bD{8Q+;y646zka=EBRE|?ZB)Xs)40P8^cAUK3ja}~<?j7ty`+`1v2|+wk+k0JFMF8WDP4LuG^6LS|x{{ zkJ&He=%phftCvH)G_OW*0d52_{r>s0H?O^BYx7m0i>Rc{yR%VK0HXm;pK%?BfuapPUwR;VwMO3EliP78 z_GTSZu5RB7;}N-x=M?@}kuKsF6^%{L$rj%apx8NWT398a<|>>>7wL5@;rL&283GQ( zE`Bi6E12&8vF_^WGwkc8v@J@XNh%Im>({M0xo%X_(dk_YvF_^YD=eF|2e6~Py`2bq z;(V1-UeRgjb19jf|V`1*Drm-;`!ylh~jq(X&KexK01 zPJkHp$k%gi=cmTcG9Z_dF%Pe;{%uxJtOVUJhR!4h*rPDKTjIYFA3lt zBycmHHl6p)Zb1!3y{Cxa1pX+$3xc>4gm3lPu~+p8F7Dnr^T3!^W_EUQ^P<{F-OaWC zkTC<7<;EyLprG`0eY*0}thv09nltvL6$li0FdgU9cT{(9e#Utp;F3zMgND;yV*t4) zeHte`X9p|FORReYFpSlVjCwjMW*iR4PcJZm+WY>Q&&zRMMU{=eU>@_e%RYY?pZg48 z@vRnknC7;LQCqP7=H}bhL~S_dB0T~AC?d6xlA4;e9W+0DpzPUC!-LEVj?j>vZM;3d z-cyTZ-SPVto|2-mGcpB4v&Hr0TM~N_M+3i{aoIt$nXQi2C7g)=>qt0Kz@SnT-d~xEhcGOBeJw;{I&oKn#@J zAmL`2+mL^BBmS>`#9LVve=_jy@bh(e#M?6E|EewVuMLu<>eEj%UN`!Xfc3FROiGW^ zuQca#OWsLBHi?>TY$-ac^qJ6 zP#%$}KQxHS0i)U@lMS`9I3N{64k`J6-V%_-McLP{MM=kt%utyw5P+x5Tb9<#ElH&S z#KJsg*uSd6%H~N}pQVYu%?YhjQP@Pn*osB!WD0^!RY486YbiZP17JK*cb?~}n1kFr zS!&5jI#!6D8_yq>BAi4a;swkJ0zSe?8FOrZ<~H{HND_3RIvcz*eK=9=4!G!V=_1ie%SY{M zkzrx%ZZij%V+DH6WAdn57_?t*9T2=JVfldxfq8P!dJ@FQ%v_<}zqZhl&cq$Cjvs_T zN|>!!`smcgf>AjP2r<5F%K@^+85=p6`LCCk!qKcBx=v+AZo7r8J-|fIxFUR@nPv*> z@2k3s1~|e@&ll^0z^w#uhuaSvj?%!NrF!gSO6QMDZZPRKr=-5&-V6D6T?bYQisZ|^ z`No6E&YcLy(;v35D&&#SuyR;2kdq}`gUv3}EzvOns!Hhudh|rK-Bb0vtBVYJxwub7 zMU>N3HcRITJ53fm`@6;i``Zac5m6pfyeTQZul!tYTUHp@B;SfsC;`0FtS};$!92d} z&}qM8zLShD=(_O+#cRvN#;UZL@9_jH2Sj&A^A zibpV*4qz+vy+(}yuo1HJ%=b}KQ*&$JI(|jUqI-i?Zfn5r-*@$V=67zzEzknu zGTe9W?C!NN0Rv~WxUiLZ6dYoF(;%{HZbMtRp@W>MKF*weJ5$jbts3Wn>;r3Yp?#HN zb!%L&t#cqOP@_M)!e;LD^%rT0y<=upD9>cJ^+XUB({-CHhW6_mKK_~GxdJz1$8ys9n%xVu5<$;NB2{F&qc2= zaVmt=Uy=(XwgLL=xUmFHhV2`|(IJBdy0@#GQ$x;ZujQ=wtaDDY%1U5-)`1y#i7`Q+ z^6|L+^Eq#kFpU*qNlO{ds#z#5uxS3Rh)FRV?=R5d-18ofI1lwWj$_$BaI~DGx|?m~ z5)qRi3xu~y(^eXxDLSeDTQ7%@u%-p&5P&4V-}9^SFSP;-XjbXz6=*iDFaV_48J6L+ zyQ$I($6ZwS@Zs~uyE)(t!BY3wa?cnxiyeGI+Y4|uYE-RHDP08v(c=2 zn6D0WbimU6Ktp9(bf6Eh0+dn+AgMB18~C-(TR0eKpi@%p*{=NX;XY?VU;eoz@$4*c zF6Q}EGa15!w=9L24i`d&}L;{!41@w5{5I9St8;RFI({ zNx$LBno6%aatKzy^QVk~VX0O;zXkEjvV^x+fkN@~G+5Gr09#>K z2ObT4#Lws`qY}-D8W?v`-7f93po}3H@KgLh%IW8hp4vM=QvUL#a=z0vh>4jwBfI#c zOPm$Ph)DCw>fi2Xo5nC6dw&JL7c@15PwLS`0_ zaP6)4ek8}gF;Lx9#g+-KqRTVB!2<#fJ zlC?O`?xDZwo|me!&B>=_=j%Mah>sF;*pjcpM`n=TW^nxlHs##DxmeJ_N)+@++!paF zbGk4yx;Qj;YXSJ~S)P=`kc415gJ$6o(d zmTb|oMtB})Xw?WQj~zX@kNrD6eL|hGzhK&c1Ng`^qgWiDn*l{^r`r8?!0jCBVct-e zf^#Pq2YqUltbyOQ@Z&^bXs{j9E4q#Xw*w<4w%## z>RL6^*53xoTAT_)*!Xv5M*i|4TMc#fDOM){SU~$o(%D%cXzH=&lhz5F>AFip(at+8)4du@I|IjWu3eAQpC} zO@UofFoaUx`&;NmS@XZ5v>jz;b7-hbA6^K)>_b{%ghTzytFJ(B|LQkm$Vi#L9r zI0q`hpL~}$02s0fZQwj#XnS~Yum_e9^2*z3>+g>-mwsz!X!A%<5cdb-+eU-ioOjgc zOJU$)lhnL$06o&ldZ&b~%v4)VFZi-9at1iSE3URzDPQ?iWTmghOHRX*V`SeO-dQ#^ z1;y6*q{jEvXkR(abYV_Z6)xyQfmZ&9Is;LC-#w-)3?5tO(|WJRpi`>=T9N{uJW(xH zitY)I#{s7>ZYE3_hVMXr!`mQgtdD@ibee4Y8uE8#TW@t5a|S67Q0{+tUUrWg_0wVg zZ-G0fUFZF$pr9b+rO)Wt2Nf{dKfvm8_pE3c>FMERWn@IpYky-GdKG#4&1id&>U%3f zrV^Wr>7DB9rR8O1FmprYs^IXqq^*Yz*$ryb_E~|Z&Yb@oZ$;pq;x9Qo zd;%BUm5ymQkcookVi!rEtw?Cc=JcLXj<$MKtDBq!^|3Jb>yA6WsD zlS;vs9Q<4>Qy)gIS5U`E6asLHVToqfz`&xMItFk|fI@}+5fshI^Kau>silQEEjq73 ziU-j3R@4KNaBJ}Z6AcWqoZg50pn+sNj!Z9!J=k}&oMyw0M4*9B&(wD!2MFHvK|0{q z4<0_GDx72+?lkF)o-Ucd3X?Prr$d*+@IXW5!BSw_mvTFC2@?kR z9)!e^%Jh$B5)p?5QT_R$^}Z-T@Nat@fS@NlH2gZ?tu0k*fpxuBL5-Tay5oYTAP_E1 zfD~|ghFR=%@eGK#C8mp7pT*y-PZeMS8nd*7SiF5w(7NadPLLb76Pc{_5D}`f2fH#b z?e+EP6_Q_HexypzA~zg4e~C@Pm3Tal58A$;fe8SVb1c9qqVD+lhXYAIswc*%LNj3d zu{iWS6=0V-FHsnRZd?8FYGS4AP(r1s{QEdKhJXSD6N%vLsL!&T?sEfJLyA1U?GX&+ z;iA-wAi42;Ss4_DO@HTuQ+T49#ifDK_(R<;*7u+wAbpy4m&e&4%R@`KE)vFbSH|Dl z%$4GQ1n|i7aHDnM-a$zs4D0pH>sHOOeQ8I>Qqo}5-|Kp8a?Wo+DpLY^axcx&IdJ{8 zi7L;jrM!(-jrBZGyX#MorQpD#aqKVv;j{J!r9j|KLw5rIr0U_mloTHE_lY1so5 zm4!cuMZjj~7mQ56LmY02-S-=Mt1dOVc7l+(SO?xNAany*+FIH0t-F>!644e=Ha!Dp z`1F&;e{D32GP1Dldvg6nc(i9MV2atJ z&q~rPZ+#t=Fn+MEO5NwZr>zN?UvvxjREmbB@PvR;1T~nW7|Xv*RX;dgW8(xU4)jSS z0r;x-JTaaKC`r$tC^-tV&o4|wbT@skuoCN#dk%ap_6^CMdui*h)D~Dkvp$qk9_=~T z3le=XU+st{;29N#U6h$Ehe1LpocQ?o7BF#4f$$D!P>WT?FaTo!LRM}+09yg((>iVm z?(``d*mFaZYitfgyAcaw-M2|ZFI}mD0A8s<^F2U^5f^tr%ii*iA5x6kaSyxDZaXxT zk`AaT6=S%NTYu1dw0K>Gf1&O!K0ez?TcM$Y!1hIb;{{x7n_3Ulf!#8_CP(Ps88v~V z^H$dB^FO7OkoQ1WN%7bEuMDHCGD%QSgd|9^cI2r0r2c0n(0^51{^3Xc&vw**iaGyN zZ|Q&cvMm)EXn5i0XJ?q@&iDWEQTt*NGQd=;sb{Ak>woJ`-7gz##RboQD^>mfaEJdx zQ|*8E!T&$H>_5k|#}8rBfZN+-sLSo506G&r` z+$168R?A<5g4i&@SSvIeG_|)sRaDfNK_bDH7=U)lomHv#xj_ixGi0IP#_EA16q=#N zTojEXF5x3}TZlO$5$XTdm&2mO9Q;r^2jYt@PW?C$`D{*faXB32SvaV?Jv4(B#a z>a^cb7bhA3TocBN=tZ^yklrA3fO0WXU``3zbNsM!C@+fah)Ebaxs@BfIT3aHpXFYA5DPO<-GwAce&p_V_K=dcN@ROF- zrPu1}7ztxV^sIDepT}0SzjexaAa9Bd``AcT9>xJ$6Zjpgt7iGzQ=gwxP|5s@x zz}`F7BZ;uTnN82K%L6s5u<=Ym)Z<3pv9xR>X`sFRYo7Vd!?d9;Z~;bE)>LcY`Gv1| zg6@N{f;#*)iHIH7P!hZZihTDFYkz$b&aR<qzWHcIL zfvhCg=&KDxyKucF_TJv!zzWL`v?K4Mv(Cz8prr{^`{H6APsT{Qs%N&An5H0%5G`jF znQj4_5=Ej{V5#OGO?Gh-Z0M$>m4p%VeO)U=0?YIxaElg%$2Xhx<_=^U(b;EFpP1ai zPU2|DeOdcI>1z_o-y93Jlat5f!o0ZQ7svI1?!Z%MWK2KXkd(BoZe80R{r3IOx8G;I zKF@0Nw|L>rsz1$DQoBg|NK0_hPTk)g4c9AiwS z995I$XS>~~o!#{nTq4SGS<{#z9sfq(=NjzE;(6pWqMTpVPFO zT)chqgP*Sf9z*E1@6d1WGzp1zCFoA&A>8>|IhSH)`7ls?xFmU-O}%j+<5M%0@J6|( zr@OnS|&A0X)7I`KG)Y`cmyeLNB!Usz&Qw> zl6OXj`Sf(9mm-xkXb@ti=*3l{ULNXmUY;H!W5W{iqkgLmt`7+{_`df%gPyezKa_nY z9OHc#jK8=z(H-==pLCa&o<<~Te=IBe*5B`{Kq*GcgT2VX0V^hI;MaBv~_*R(Gft`99V1@GpaTWEgQcukKjyFRS&L;FgH_4ch?v*mE#(MER{uCgrL)6Dl1@5)e(q}D#4%6Di{iu^2hsBNd4^P#iraraz=+m=_5eDuK4pu2{RuM!apXPQV%pZhPy$0y4q8@d7IzE6Miqp3>8+)0ydSrU`$gP= zG}-WiFXv?Ke#R!Ap=`(%mz>v7>mS86elrwqxPh_?2vIEMyemgJJ~?$m8~(oJCz~d9 zjg~%(n4~eRz*+P;M{G;PJ#_SYY05e47S{8_XCsHl!lko(T=5m8vnD5@1-;tU*p&Ld zqUV2oe~*UFuP@6Zgi-u)z4TLB@zw6zv@|rW%2x{g{XhHk-#OddeNpkf8`BM3%8+|16dZ?kn2h5wcp<;;KiXwc%l(uCobAf7m z%&=NP&5G@pzl{mfx#q)%@+XS}o3BN2wx$so`y*|1v?bolf;qjHlI)xejj@;~b|vQH zymq>9x$7BauF{p>sjz#JrWTzY{B^#B<3&2pshC0*N+pLq2njWKZO)lULa-RZwpUN* z>-qWli}ylK98xw3zrJaXKT2=_qqKXiOE%kx6{Xde>r#{k4(fBesC^Ovwb;R_w7Y)g z*zW4++R;3OpV4x@VQ-Ijh?Vody#ThEjYTnZJsR^{i$NXjQHgbLK8v?{IGjY&YP>QS z3@$m_x_m%U-Q5FSjxm)rY*xSZE7}kxjwTGTtFJH1wo1lo2MH#iw+IdM{Rk6vd3Zb;5#z zm`UeOnG_WI6ZvaXxEXMO(X0==*)J_EjdpeF$o?_eGljFbMY7o{EOYZm_aqO@5=rsj zbC%X5#3uIFN%nX+>^y@vPP8N?j58)z#kMW+B)BhbWJfodq?XOJAQ;USk#6of9`x8J3{nG1`~(d-!XjnAhDT1);Rd(Wn!Llil=U zlRE%TgPql7?q@F!1zC?O!s_Yn`iZZtZ&UL%2BchV?3|%|Puc5^#|9oe2s(WSz9t3< zHZx0APM+&!k(Zs_^nmEysy&wZZM+y5D*qQ0$V-Q-Ku|iGe7-PzeD&O&o`66Kj3HgY zc`)iIU+3ZlsP))5$J~Q+J+FM(2?z*Ei4H$q>tQc0Vjmt&wPogwTH$QXF}3?riq*yN z&7NU79t82bZ7>2`JuBtan3?1N5{brcub&{{G#}21jr(Y-`cwg*AmNpTJCKw2sbG=N zc2@aEAm-k!vZt0@QyHjz1NGC?ZW0X**2|jg53-S7R@%a~Z7%bUj7+=Wl-B)+4`}Gw zhRjTNWVGT*s-3UPkLLOwRae*Ir^L2Qsz^h+SQ$HbIGX`5PxrC3$~PW?H_{dr{~YPW zonP4a2257wZe-yHsMI;(TA;+ z76c-$^}`ri+Gq$AAc?r?qrpMQ&h^4LI{MeHeX2wOsAlvl zma1Q|B_;2Vx2Nb4lT*W8@W#`ZGC9OEaF}297n94ocPDGl+#)vnFPoIf4`0(1| zh6S%oWjL<8S-7Kvl{?b_HC4Xm^{j={+WW^&pnrbTGI9GJ>dE0hAAxl0^zeHIUWj?$ zYR(telkJ%wbd%*-*WvS2=NDc>R-IMp84-?z-hAXK{Sj_njmzRgpyBkg z#)T!o{b|dTbJ8!~GhnpxXN6Lt2Yt;KaQbkvG3~v#EU+Ox1z}NJ=oL>ymTw6^>sb;Nn{}*Qho~N3Fri`vPOSHOGH&3$mFnG zAxI|A#-gQ;H&0d1MSS;UL7h`p+jAzo{B$iEN;%t8`qUbcpnX@fmG0QLhTLx+sx0p2 zrWm2Z{XR!k=Y?2^LKYpj7tZY(29^Q3#Xymxni{X&S@s)sdVesPb2pv7F+O5>JFL%o zRBmpJ2C6@e;&J-!DS}md7wrlL;z*<-{}$V7{uA5E2~KI7cDoNONmqBYFEg8ewzIS= zmVt~bX^88*`F`l-dF=dgH=76p^V~*#koxy;TWqw_gP{`Pjg24J5EWIm8Jd?Oq_~Rg z!BS|Tj4B6jKS|muC=J`rQG=R?U{F$u&4>tt&R3=7fV1G#@^(EabX~pukv`H=?YqUb zZ`8rQkj%`DJ2~r<5Q|PJVzSLFlWQY8o%*-dPBfnNcIvnR3?BQ&lZeT<(W1KMi3vt? zMe=rzLIyUfxO+jqpIx1Qev@epxT|E4U~FimAoumog!bIXj}0%QLU~FJuW2!!33l1b z%<*-Q1UrB{0ckzu2kGYhi>TAn^ZEI8$+y`q6(b152X&1B9<;X-CfG04PD~F*I7Ah+ zWeKQK@o(d^IDnDDrE;1mgJMh-?-@Rw(8~IHNLCgft73U-S$))>LmL2D_lj#j&n8QA zo$Ll=YXZ(WfR8y~v*N z8pk~rNM8sCmvGznm!x~R_kU->g9`gyMd!|?Kj;GDP`B5w{{!S<8q5atHczl{ZV^&*^Bv&-WMb0|aJ_!amMFsMvWgJX2A0^R z_j5C<1BDE4SRfrK6M@fp*}}84H7jBJ^D3s8)~C(;Q7Cs!-PdaEx~lJm+AMh zkaW~|Y%Mq;#h>Hd_vyM%^N;*H61B%fw}qme8$sEYNu!*#cu4y4$0a2?x_)Lbwa^%w zAv=`PpoTWiZ7Zj1CfHR{i=VY@UDU`)EBZ*TX$|q;|LoWQ?E4BYjiwbF=TQ4;n7OmR z$COo6yHWH}s?=il+S=}6518w4^=VeH;m6hcogo6~*t&s!X*9azwmJ>&(UsAellNk! z0ICL-P`I0oX^RE=ulj;}KoDrjV79n~u|5mBm!!u4zOps2XQ^ZlQ39T?Y%;i+gNiJNNye6efy?`+UDo*=FDATk$QnT-x!likNrma z5p+=YTze=;W8MNNJS}=%|0Hd8a<+SS@Hu-CEGie%Z4I^cx@e^T6#HYv&XFg%K@vN6 zA2CE)nqh_2Cvcjt==X>fWzW{8&6Sg5v?BqFPVMLOsTTmSGw9BNJbykumtit%geW%R zA+oT^jzW$Yl_-H5Q@8u%+?#wZM<3buELcBdr?I~RKok>`Rj9)bVfH8v_$hS^4Gjh2 z3-JyW-hFg2lP~xnan<1g=f7=e4crSH^W^d!7_@GgpwJ3x6+kakFye03;CeYP+oC~8 zR+6B7qAI}dGbRtFlG}!c0@bYb7Y*g_dAY&9*$vY*I5#W5$!hNtWfw#e6&6-rEo`jN zqhdhC0EyWDO)8N8f6QEhjd@;4ilXNQCVz@C#Tp@iNzi_UeUDzjC|w1O@zIc>A$(6b zWq4w|p%d(t(*4Z92j>@_$?%4zzj)QGMeH1m5|xksj&vL)Sor!F5<>$K0Qsp*c{G9h zXA6hPAFAtChKoWS8`p?>#pAXY_*MJOgJQc+z& z)b|oFLvqsgarTe!swJw&pyhl#W@bbXk!}otk0whc22X}^;PQjk`1+&1Z}qSnmqK|t z1@Tm+-TkR?o9+V5vT#rj0oqT}-G2xu5$*#+bPxh__n#HZWSfcDz0N7^drgA>l%{>c zZ}ibiQBKJfu0qup47$bzloOy1@muRy*xE*nKBXWQ2da(gxLi5!OF%h;!irKh(L@AZ z`ZYKEFpbp~RVDl^m(z-;fdBIUCiz2OwIdu&UrPjojI7#i^_yHX*a?x8;kKEUQ4{_p zUA0h;Ek-9k>K$Dm!m<<_C4*R>sq=YIHYum*Mo8GB82;nu_pmTZkeZZzz{0O};v zx3;uVm6t~feZZvLj~?rxvt`*R;_m5jkX@$x%!)%~Z)U{8){>S*_&WfqAA}YkN6^to zd0BH?5(~IroFW!t2_l9~T$r9b1XSCEId{x4XYEK3Ajv_L%O6!F12vZxmq|q>PeerW z*CC4^Ti@|WD42+;og?9o0MmY?SRJiszgV_`*<=(4P3|+9SX;9&)hS}&77D{!Re0B_ z!d?14XH>abPELm!EBf+_80^$Og72%JAKG4Eju;~n*(h49FP*F^&L{t(5eek3) zr6)_ir1K1OIZa%(Ka*mpXWWc}nV1j(t!D-)Vj?6dXFJU&oU`lZTAn%*8XlLxe&CGg zMMw+rzUV>h@!Ya|@VDLg$*Jg-QCjNU1x6J_x-+ijPK;1GsYR? z>^~1ad+oi~y4QWrdClv(=Dpq;&yJ~Geu0v2e4v|*ptcpadSUKpGc8U+HU-1|TXRwJ8GDecZJfUK`n{e%AE0@hTt zH~F4?LAm~#CC7Un3u;7DN5`n8;cHN8r9Dygy=^L2v=TAIE)xYA_f2*+|A)ri<@IH; z{62jGa#Kg6s8Ba4+QYN5FEI&0k&$<(sGiF`sKd6_suVF$V6+^x`P&)9gmQE_?ASRu zMXJQJm~gr|NNw#OF4j+I{^-Y^o9lRyG0;0;tV|;2=MOCdP}%MPN&%7*@$F|x%y5Nh z*~RkJCNc2}uUSS^(Te)g`kFCc`PrROVUv;uoy#b}?mhndambgLPTBKzA= z$Ng#^3Ta>StZrtYWRKt`o}8OpUxljFU^eV!+aGqI4t-Kw-H!PK2^5(=lnck z_8RFj&W@LL6eOhaW|m)@xiS3TfBh2I^r4uJfP@70DU3RT#VObM4z8?n6#mhPoWXbANDTk{7RaF|qT=5S#$HNDB^||bU zc3fcdzL};VVJSt0_NIQWgCz}$v*mb5rBA)}87v>yHg;G>J|e;bu6cT6rasw=AB}*B zq~MgdosBuAIOVmNTynH?Ca@S(ES%!sFne`IRxKD?nCMM_sdm^sp@BQGy}b`qBzta0 zQ0UzTsN~XiP1Q=QXzmwBLqrBb`A=)hV*mELV%nrbg}IBE%Dnf~bH&2d!MgR#jQ`IAp$rsea6k#ZXP$x>ZY@8*R zx}58A@6=es*^4$iN5}8k#qrvSJ`XhoIRiu5RNhcMG&GCKJH z3&i(l$@}tZRR}sd(-Ze9-hxF3IP+9{sPWcLcQ_aBcbPWE1QB4NuaK!ov9MvtkiIA_<&Aw0d}aB%9c+8z!puK`1%{JOHgod0gz8X zL+tES4Z(ITCFNyX^A9wsXa5{kBtV(^s!H!BP!m=cTT_4x2ry@Xr%M~ZRwEcP44mOD zsfA*_7O5Y~7EmVgdhFb|voR6c;=D49cI)$kdJuOfQ5CsUk!iC^bZlkKKI{>(Hc}W7 zdMrf`6lj4-0@C*2J-*~tiCt;N`GM`_hK%{`=Ww-E)qGE!))2&#N6Vb~q{PI=&1D_< zU7EiEVA|T+rUJU3(6#!Cj{}%ev;yEEW4 z{i`wzHsu9EJju?^*vRN(c4Vgv`Iuvm}qW2EMC~{E2zF` z;>*(#kTP*5>nYs!tlbZR_POs0+2%Io6N?v<@x-v~>~}uD?22g^Ub>;m7U3|vGRrcF zGPw#}z6Y`{oJH$1RKqE`5u{@m)NabdrzGgt(DCl!HD64OCGzHV{URF)5~G6c!Jh%d zhQUhisd&W4A>DXBriFZXhdi^w2Q)TOYwx>+>J9`%MALIU=TI)5juy#gz>>oBvjhA@ z!@x^g-1sXc&-q|&SQ4y5bXb0N&R!QcX?E{(+I)4IbapB!1PW8aFL*IijzTE$$7snUl$+Sti2c>pwyK$XX>R3u zu1zMm636{@$`N!8HauRz(df0$S-_;I%0f1WVU;6v^#=qYnzxnINe;)YnKlLHk{-H0_*Z%wbwD{Xc@U#Ep z-y&O7PyZ=2|MmS8M_(xd5&!djpc`JwBh64E&VL@lV!pimb9X}y4838&%Bre`PHp%3 zM#prMj9|b{15sc9b`x`BgAB9@NmvN<_$B2$b~ED==qIPO3Y8hfw^}miR|NaX!+CG&^Cs#K1?5RXT$cq^?JKW@mduymLQc) zFHQeB$o0`Pv(;-l_{O3o20ItP8o;dkMZ*NGrSolUWdg2Ysu`J@NA4fzyd*X!e18{kkd z)_i1fLls)sm>XaVpgub6SK4kqO;v`oxax%_RLEnW3pR7se2qh*SM1w7#$9nw+Rv*W zBV{>}95*G*A?G#qwfQI4d!v$Q!^*8#`%WS(x9c<@I?b#s1nXp^)t32Ls&=N35_>Ip zX=zOy9p_&p0N;qB$>dm6%k&u3E3X4f{_doTsE*GMtc0F>ruYG|!ktSQ6;_aEBXzt#tg3c89RE@usT^3Hsxv4K{f{LnosPE$ZgKo@_$sg1nip14Trb2w`5q=E1;MYxc&0{PYOV( zct~YPK(I91JsFRQCFsr8saZh+UcQ5kag)d#wwU4JC(&pK3I>Mg!^@TY;|UudDoiw( zhD?;GISea4EDUV=2iQ~%&rxvp!?UNIanA;k2ds(SXC97WlKwUGCePDUik)X;5pn!Z z`111dN=b3Ty7Z-1|YFx2%odb`4;{!_> zR8w8nGdg}lL_rdL_W_HkUfm$h?8-{hcVjj@-23&zOCQ(W_)pY9;x#!ZrjKBhCF2LK zSl@bE07V^_h4_Rt8XT*PUOZ2S!Ucnqek8?kkiF=T*UovcU@mO{1m`(}V~Hxh1UUw~ z!>#Y>E44v0Nyzd=rjnJ_u>S*XKROWT{~VulZGd?{Dtuz00tE6|Y3leeC}31bJ@G=;C>q3kI+jHNND{g@l$Klx^lO9DwoHU}5P z7Vz<*Lz2Zq_x%U)mJ9w53YpZ@TyaccerO(3`dz;a3W11xTk#veGf_}~_pGX-0{1>y zV@t{@Au;j%Xqp3l1Pg#-%_1Qu=fOwiW@Lw(li??<`AOGI=}d*rI*7F!#OdqK#&uQRd7X+8Cm(aY1r-92S!6-u4&@ik{>|6RK;*r!4!=b>YW zi-X7qk?EsCrqN7jqHWr*=Q|7Erpa-r`EBHc{r$wD zF{2A2+{?ohSp+a7ZmTuAckxLiO~uE`2Qh?|02rHD=lHC+c_iXJcDVyt8tRGf`Q@jT z^IKbca~rvq#jQJw&(aiL3D~fg+i1-g95d9Nc)wy)hPeK{EL|Zc<#uGAD9l)|HlIfv z%RyIc!3e?ga~rn4x6vDGCLc9U;)v}?HJ-CwnA4ASfcp9gA8&`f_CcT+!o}qdq!Q!F z=TP`X(bC?y9TG~6_V6Jg5mXmX@L^+bFli&89)MKQ%VEA&yhv)oHlTdi(#k>sQ|X}W zzFRC_7`P((hg7cGE)H@l^cJH)otLh4WNQaYLdb~0!p;ZIUUslb12qgPaZ+yDr%<;5 zG*o~BkPTChvZk#zJ4dH@Fwee+ogKC+f2FN`<w(a@^!{s-j3!nA>S zT>V3~+v5z;9$BOHZ@!0K|4j$G&@a7oQKeI5jZc~VbO-r}r7hT5xu5&sszt&2VK z%fvHp=Wnq=-~j>1-KrHMF7B6^pH0alB%xq!t&MEYU5zvzg8dw61I1kbHcY=$yKp6H|7w3*8%BhN%xjsnHCOnt=g+T-Hq&;G?Y>;-Jb!$7)P;$Kz12eQ zbJaJ|hazn^5(gjGul`XdB-{jdB&20XT5mwB0WL|a$~NX(dNU;^uqhBPLXChTg>u&1 z7%S)VA5+bXx@i$|Yj{fI;g76}=7<2(#4OB_zAhkfQAnP8$Oq9jM3I`hvT}T#dL;qRBVmi*GO5RB+*}oUOu7U2H}P ztWAhG!7czzbZI!)9>ZHF)g`4oumGaMbl;EGf9(ub=}hF^9=}y3*wq3_{$*Q99*+&I zRz&X;US57h9v_CD!ka((85zmPBLsK#oHAT&ZH-)Aaa;wECJ#Y{ucX=CKD_f=k4s)t zyCrQmgPjOVRIIVc{T!b0oiT+XfvZi{n;wrGZ2LpRZflwvQGaeD_c)R@?wf!H>`ej1 zeb^+LBG`h0+T#R34+XlgzHKb>N7NIPl*x%e0KwClz$XdboS$Bv%bTn7HW%B8X}h2| zX(8>OrdJFODuqUcHXS?A#la){H8i1P=}*C$ z7l^z-`_OO+gnm9PN3(qSwmgJf{LTi-f_2T`PioT_$mEhycJqzlUF@r?PdXXsX<4W+ zfLDRJ&Fi*@*gW5{87baX)QBZs-dHh$>J``@Vk(hm3PcblU>lCQlVDzt75Y`4+80XF zBoO_MPL9J8BHET`{RxJIy$=r#_klk_`84i+WmljVv0HxV=ZBu^?4x>&yqwp)iHUhl zZ!@CpilV{)uH5eCXW@{6FTe!NVK)~^;-TU``#g?aZfwBji#R~>dmM*ZU`GJce)fZ9| zE(vba8;J&>$we|1I$Y%fMy$fh^&4ZbK&6dPY`*iC9Ow60Bil@l-OMi|&)vQzX>cON zh0nO5%rW570B?#RPjpKQlMz@`;BlaLjJ`_T_l$hn;cV_PZ+Cv3WO+x=d{6jc~9@PqXhmsqS@y1Jd( z&i~~V6ZeyNDQOHqt-$iM85Htaa)LnF?9x~E7#Jr#t4^>TSWnO3Gc{3a03=+4!f|$( zFyD>c*nqY6jj-e~;E=JMtFzwY%gynW8Spari!1R`It>gH%N3F3Y+z(sJ2?v@3__fH z)i{=ve);y5it`G9T*w?KEDJU>;t@!)FOdzuQlcPV)Rx77)$iA@6ly9FHP=)lio)Qb z;wgOugxD`JUppdhn=Y@f(>|e&gP$J#qpRqY2s|4^g@=SbpqJddi4~bp&H(nTAGw*S z;2#7+m|nXe96&pdO&J>A`K1jz{UV}q$vsVLGV97 zlNe`4QWTIeGaJ@U?D6Hcyugx!PDx&>Ap^7;plhBn;p01)=(7MVla`k59+~_ck|+!- zs6mgQxxU9@oPdld6^VS1>n!~(&=SZxjdl7{2G@iZSkozu$rzVGaA+=Yeb@0Mqg;Opg+np2lNkT(<2{Jlhs8AD41N`*0WL5 z3>-~?Vwx{1K_3GO^k`>SE;T~LW5ED?g>Wu(w5*?2T0MLRhST~i(nLQx+>)ecjuuWi z>r-__W89efieFv-#v52OVfE64*dbQn&O7)_u6iBNXn5e3YIG!@^QT3f&-x$kH1Yd9 zwf62YvO-3*uL*Dz@20o7$0{~skDkY=EhY~9>6@CO>u7|^;J<7bV{Q=kAUuBv*_@>| zl}roW5RV7u3|0Ox-v@t}F|e6!JJ#Xtn$iFSnCY78M99G%G?UYlG_(wCHs!y$Y%m*I z;nc8VjQigWF~{gJu`2+TuKB<385ju`OL>|R%bWjEHv7fw-z#d`>*C`6Y2CgI>BP$I zw0JPPK;=L`@c_sa#qO4%?-}PmaOY)P`&U9VkP`@&HcPjYTtiU?G}~oKz`tQXzkWCP zYwO^Uv2#HRDF;Yi(4y0RBJ}Tmg=MD45pDL`ni}+~736fcZL6HH?6_$ce>=!{?Qx#6 zWD|1AANC20h;W%vLXKnpFWbNBaZKc2cFM7GUyKA5r!9CLFbe5ED z0-%5%(U#31H5}r4VByi*B$F%JF&F&PaLgnwF78v1oWXpIDsPd`1FW!YUvOfg1c;_4 zF;v#|vlFzt*}|-LhF6l3qEHEP-!^zf)oa#Ycl_L+Jf+Ssv4^yY00Fn_?>w6nlPM^g zpnNqCu^~Q;lNmmTh*!$3%t7S`H{)A6`glg=%HiSuXvN1NCFKIEMxquRpc$dh0k!;- z`!w$TT4>_a@!B<=dk_H@zTlDT?y{(5u)wAfTv_@>Xx9St0=RpNyxPc@e4c$O zGi419SvAk`dHGBstNn(&qLc1QAF#n@@nx$G_$i#!LRL9pZBza70gVQf%mSgKF|CV4 zoE|7j2TUnk{R23WUmo%w6jc49{pM*AXlhutX!Q9%T^!Weo@$De4AFY~j8V0UqKby3 zHa~YC0O>LF=M7s=MFpy2XTG*J?nVbJb%eg!meT7ic|K>@e#WRoFq?vhHW znpT6s^DlVJ;rB-aMMLoBPG)w^3uE` zR%L5<*IsV`y8tT{1C91A!d^$)L;uPfSTu&{Q-x{CM5+N$Wn- zA_JrLA7FOU&M1nvy>4FpM6^4ZJ|L(U~SG<>=T#p9A z`VCC%4-!;$z}r7Rb%u@U{jy{Epyeo<~baJL7lbplS+YZp5M8zQ3x@7 z0R4u+L^mb6GBHsU%oM{W1!W!<%;Mr=whqO#qH#OuQBjYIVD;9m+}&!;w&7&&AmAhp z;p0b{A6cmU9Wp|2i4)(agyAWNHT}o{S}Cb&M<|nU&?pF)P0{AxV-5_&Q2omIP$zstj(Rn2R{@&vrgSI zp1-ZbA#APoephaU2PY{n{WDOWoPJr-i!F~3P$8-0O!`9aMQ#Tc3GY_g-X%VYW-k0k zlIf|KXqp#V$EF!Tp)J``VPJswF)%o+b;*g(&mTSU*3bSZDB z?>P%UeDvg6It%7?^bdbVSLfFQTDbI!?Z+nvrQKEXQV~bT*Skl0Ov1XeA?czdS0^V! zN5^Y$CSV!~dbpFyk>+emL1l>zMFmV+sn6k13Hv7D#J)G~>sc*@&C$k45|5)|*V$EF z!1-js7OiUZSC#F@{13)cLSpZD>`iBtE(3S^UjO) zHyt?e+-o{b9^5F1cL44#I9RsGYy9bjv~-Ig_x<8mfXu+si)z8(VU<`AgnYSm`$pXU zNkW3S!p2uR{RV|E#UiG^JVN;SC)kX2e)cG5U{lsNnimou2UWr#RbwslhXiiA0nRM1U(;%*c@$8dxAr2@ZTb6_B37(%V0I z43Wn4@PVeD0$N)?M!w2Z^9vJ~)pI_I`5CQ5#9kxKt&rB~hhPEbBuH$X~ z7a*p>ECt1h;i;;w&10aG8A}Ihe14gw0u2H*oqD>9@TCZlXG>-_Zh7`yzhWi?)DK>* ztgMJ>J-fB<#NAu?z4v;K#$k-i!7;>fF)^~{t094yus^<$BI_giYbibS4D68T)rv2$ z@a2y7PLEFRlHiJ&if8vX<-~a|%spsZX>Dz3Hi}8goLMG6(8CHUpq2KFtLRiup?t{L zl%5k=o*(r6TX-mZCU)*K%1RJbAv*H81Xdh~NmGCP`G%*u6oG|pOz8|JTwPgRH!-vI z#q&Re2O+wd54dOQcq}|rQ>`ag5r)z_2;3sXU16=K<;Q1z!ktHt@AYm|1Gio@^@(9{ zO0nfZqG|gY{IJ*#2VynL5n3K{S!BADLu$HOq(SJwBfy86J8|u3ulD07skz+5nvm>O z!&%?|v{@L4Oc*(zfN^D{G+F;HI9bzka$yleBT{iy2|r(}N`Phz@r_&9jm<;4DqY`= znOYL|ESA^Io@bC!aX!{nq2;6_UmyOFI(G*PtGizwHS>GR+!TNGTY!&IB5y-cO@yb3 z6Ep+z2+78{x47A{7d4v2-x9wg^Zh#yRC**{e?C_1ZUH?vGaDOEHB4BcE2^)P z8<&t&>ZRFxW(JDkL+sd?p-+8H?kB@?$$jSL<`xt}>`oke3vaYvd*APCK!6Vo{%4)u zqwdMk_Zg8xkL?p}Vs{)CkCyKEpz3=bpUZil%Py{dA-BaSOMwsfn#{@xQ zaoj{8ji{FxU7wwuEsa)4J`V5clppHivD*b@#8&_>yx*6V|^3r=RWk~L#+Vt~2)hvSr8!xQKW zuywQ-1715O;RTdP@SS}F$4?C15uTm>Y5A;PDCYj5jvm z!hge>sws^=`^6E*&C2z7a7^$){YsgRQWXy5Mrd7&q#@@b!U_xu?mRj);_;DVvjHoX*cEIn?C$X+$Lqf)7hwaIpuKjjjfq-H;~Mg% zO)5T~gpxojz&7yAlvip+2-Mct+7lJd#{y7bfY1dj(94&y4Q5<_=U+z*jWtIa`X5N{ zW8J~l2pe&8hh$3uITbpC46Gc(KYN5|--EA$ZoJU&P+7(2x#3aRIn_!~B!oqW`J=j^ z2ZGKjX{a-d?bmnQfJP{c>VQN7Hc+tq-2_HSLyTvn@;WdSvMxi0cRqrnDO91irIQ5( zM&Qgp{vkk-q#^m_{)g+~ZskBUfc5_^G^rW<`lyr9P~Y@kqMzGCVmOiqFki;w|AzLXJ|?inH5ImZeoeUwl*VlK~9nyv>NMCRyp9}WH47h zI=OCpx}Y4L(f0fIwc`)Q^vaCTvl7^{H=H|_;1bniCX&(vGx~Fj(X;hw5qk?-cDtM4 zABVUg=Z=)tFBE}k31K~s*UhL&K8+zRp4(_)u1l>8ALeIxI132uW9)&Nrx51QO-)UK z%mHJ&q|G7K2q}MYtA7tU0dS;f0`Km=2>hg zeiSQHoRG*6x778?X|;3trv5$73q=YXPbU-=aTL7c_2^1T85f8P;-Jd?#Z>^G+c?r8 z3@GlF8whz-#ZTa+BOGyf+11|I&=-&$*;?s#9;!41PI3S;ux`J`Yl^%yyCxGRnODFX!}Fs^D6m%BEbux?$aH;AsfmF0 zPss%qS_a;DXgCZe8D}BB;}M8B5TfHGL<7^cQ>pUNk%sC#RMg8>HnSHKv7mfOi6H<& zd%fm{$3DS4x*PfBcXu5^9Q)7WQ1>)KJN`8Y9A6?dQ4xB-lsity?oX4VXs!YtUSu6~ z{aA5q4-G28e$r3HWXWJ|BY>)q=jea4e@sk9M9s?*wiieOg^8AcOK%g^Z`f8`+X=-z zLG+PeScY1^Z(yXUu)*VXS>D=;Su@I|76;DR>nt++JYopM`Y=Hz;mG(;_g7^ye~SYV z;9)f~neQ3x{r#@R6k)=11+Xdx6pp_^si%HHnA0T#wwv=BL7o}$gW3k*+T990 za!av~xM4_UOU=QUc@TAfw`Z8uO90uYv3HIB0Bb1p7Up|QH6%V#uz zZXGuE3QZY*PhHa;xFN5g!8c2O%Lx7L;y>;i%@-D^nJ!K)EQp1||FFOCM3*AXf7a4% ze7RDeNGwiA=Y0|B)74^#0qo3n#0rWT1+L-sC)@1hD9yx05}TW85)X%9*eVYdA&t%)i8IT2=qo z6QR}P`ugY^rVA|;;UVCfgOabdWTjDYILyBTzR7x3SLquJU(VbK8A1@W0!CL9~P3go170xprh;SM_Xvo z249MIfq>1Ey7HhK81Quz0{_ix0;AINzt~a!b-(;imy0*`KaK65z2%=pMHu%V)%hPT zm!tayYPI~w{+s({>dO7% z##1Uvrs;vj4REZX{&4nz%bs|C{{1>?G`v9fVPMo0m6yNKbdw6zrzG!<+i+B&w2*r^ z**wHtdwR$9T(sp3x;Two1k-Nc#Kdki z;OT>ggGPr80+O}JR%j~Sj zM;BDbInd*&9DU8Uzsx|t`%>jUfa*AF+Qz-%y#~UhG#+}m~`EHm%NYw8A9= zdq^GnKW|hqO5Ltfok~y3OlZKU{XH@9?(CNWY`!qOe@s_Y1SO0>g-2g{a8F^gfvyW|#5Q z*~=t_nGCvWQ+g2ewl0ShbT+J(kFEaI>rA2`tV9mgN&-lRI-I|oJZLriyKzSm654X*ihF{o84vX1szH|>YKnsI5|n=+aDMKb z@OxGrUzI@XVxq4H7u6k~-F&cOe0Q8tz}`5%;`^oG1`N*dL5qJ;6|{Ja6f9>1Vq)1{ zv~OP`YxsSvSK4<4FTOI55Ns0124P(*CLk$}<<_I{D|r5gOWmDsqK~@|tX_*ML;cb+ z6IDKS=QD%-XWiwivT~;GFHM(lC`5ksGNWC2&%HK%9g|?Q$u&$>;@bj-zP`H7wR*LM zpSsGKYCAnpW;ePegw%HJ{+Y3*H+28TQ+xVmYD#+Ou-gJlx%VTWcW$Y$bm=}YdStZ> z9%(INJh~N`{rvlLY>FE=R}f2zgE^I1*||M$ymVdp73Pg;PPS%|y?=TPm6Ts?ObiYV zC;i2E;kD7FUw&$}oAg6I2+OHeyI8_hmNYE4kg{$zhAvEcv~>2+!rc5D^}UIXp_rge z^ZHN{(&1{(>7geA4<#w@2apLehmNhQXul5ni-!v!7!2qp41BaIx-Mh7qN1tkvTeQa z`#+YfYpItnYOZ|n^D|$FvqIt|r5?TMDo>5LXM8eE=acy=C9EcXKiXlz(rWbD`ow;8 zS9!iFYvRy~lVSKZFB~5cy~+9mL(%1@P$=hH12x(op8`lDdy&~jFz7wf1WaU z%cmw@?x@Cm5mI+6&yxx@FfdeB(O}N#%j^}uQ|h`bDUopNO}VN~_i~u{dFSq2X5YLc z-+p88<(A4EK8#7o<=@EGKXJ)6$m1}Vv5n1{nqLCiNOyJ3@^eup`yq>|4N|m3VgzDq z84a1IFRt@> ztW=DSYS2jB{6wXsqOpdBpq5*nt$8but5qs%QmhW)_4fTmdSk1YJl&eq*`>E*~+czaFe&j1EIR@TGmMWYcu6^m7;ZNu_;#eM!4r65S zo_6qg?iC-}oW6e=6EExUA{=kh-Z_}Ns_J>gS2m-TH)knIjV2?N@v>7UNQOASW78`Y zlJ-FFd^UdKm(;2A1zmS9p~$wh)*Xe$MmImJs1B3!_56#-3&&|GnS_|k@P0cBbL-v_ zn~>}UyHfi}ofNp~1LH=0m7H`+QLrc4p76ztkH;aec`KJTpO4sLXIwX!!o#^O^U5wy z^9M#pA4;@F2|eev$?pkXzf2#ck0JmaK54(j$*>Y!xWtHbl&LJn>k|{k5 zpVYUS+4tu@|3eDzj8ycI2F|n^d%e~wq*5u{meF1Cp`**{Hbz#=0 ziX0qHM|EWDXKQ$+rKJ|<3$JfsVMS0oIXW&aC3|U9y4MJuEVDVnCIGO`_W3YHLStgA zs-Qi5?ZDKqN`^K}p;@MTmhrOi6doskt5D6TP=ni`-z-<7SUpX<_Em6zoV<}y_^sR4 zhpxdIni?g$#d6_3i|JkGyi8L)A2w?T7JZJik+X${fBz1QkIy+w{i118{^BCVUv{Zt zoYsg6I-5CD-=V|6qWNGd>q!5r{g9P{v~(Qxa-W=cO4TS`mYY_ZobYi_o|n(lP{-w8 zgr%irj2<%z5(ymJ*QM-Xj9t9Y5urafl{GCb6UX*5kPdM^i+)XVFC!Z*_JwF4a!4A6 zHlM@~O~RU0m0WS%TsLN#?1^&=a9nM==T*7Nsa@$RySu>F6U({aT7Gkm(}*Lw#C+AC zi0p3WyHl6t=?iVR@DlyD(@Es^8UJJad!#AX103)P3DcsYp5$uPJbj(Z!dRs_J#jeD z_F&F-ct6tT^o}H1Y!;sQ9d~~;lFPoK^F;B07wm<08lhp?!^5rDY){rY&3@)c@9NGfjdj{+zgelpD%0Ys zxE#hw?Z%fJpQDnE?NcM}T&*4IxVEKwGNOB41B>5{-_+&y#!+DT=4%2GU6T%Nc)ss@ zvgWeOvq8t>i7|uODOgi{LsFG=m%Y0?1fLbX`!4u;paZU{N3>e6Q*w{b&$T#7v#5iBBY8Q5I?B+CL%5 z%FF4V$v>nwohOnxIp&g3a8mvNC2~g4X6+`!SMRLklHbS19uzYjkI@zUS(%xgDUY)oV)XjHFqmUPm9mZGu?)Qze6a4;fEc( zJv^3m8t()sIX>29Qpr{A{rKu+rA^q~^lTHKI5G)&aq6>EnV(ntRI_3*xX6*$olHVuWIM*a)w=bDm-RK`P{gGBFvAOvtG%=-7jQb__;raVy>ub=lnr5f>oy?Viy&U1 z7L84+Tu+sZaBuQ?wIlM!qoii{&aUbFPuK{AyZ8+R1qE%GM5QGU1CP*Ce&N&K8Hy8` zX=#;HH~Ta+WA+F7qFc3DBdyBBN}UOZ*d*XNw;Bo6vYE5AKWb`Z_MJ*CY*v}?`3&By zR*lLyJ-h`elRBdz`Q${yhQWTwc*Z@3aB|(bEj1z1e1#8FPxjzpM~e>X2)t(OVScp63^ZNTS#wuYpC^%?0v*3xl88Sz% zZOCEBYUk!-0k+iUj6P@u+nY9T&aJ7@#@a6xx_3=mR+P#l-CeA zU&`%O7+#+dkDfQL3*kiw<}WOyd%t@-uv+%V3cJS?d3iaRc0v1-UBY~p&b^#4mPhC7 z*B+QH6B$~(0IVz$1-z@2#&=iYw)8I<8MA3+K_>E%d@0=BGAQg=VgzqFwRxWJ;>v zgoiK>*xJ_IZV$-oW~6>i;o@=nSzc13*fE=Bnzn09BME40?SoAw#b)~9*imN-S;}{V z{>cU5uBU+IvKUW&UQcut&Z*be&)b`y5r^U5y~_}r`^s1lGh?ZPcvFl|?P`SK-l0CyH3O{2lKCgD{C;@SgR^lRPu@BuDC%Wt(8JG_berURBhl0iEHRS6D%o?=W z-2JALZ|naK_Ep}hk|2Hj6ao#5g3d&h-3#7I%b&ZrdkX-IKYtE>Win{B=>>I)g^f)g zAV=@95Ff)(T->k|?axJuhYo9we992g;Pc@^#xb{ct*@7mOT@(1sC|;4a++N+mQWBi zN@Z5bw$`d%Q|v$mq<^FS;zhHW^?^ZjhY2Ji!MwbFz{O0z4PJTvr2B1F#BDLR#O@tJ z%5LEplKkvYAHmLU=f1a9yXIWoDoMsjdoW^ZIulCrdbp^==3y5g>!J~&Q!E7R0$NJl ztjNCg{Mj=|FIzw0X&f1ueZ?iVE%x&hRU3qK0(M1*E)Xf*6?Q8^#F0_Gp$5hsaoM!7 zGAtcDK{ByPaI|L`!=LKRk=^@dv(@BF(CuMgJrN^llMFu&Z9Cm<38#Zz+`fRyK8MID z87YXPC?8`cu~<+cddO zd58;q1IFi&Yr8C^C9`;bp4OTcRrcaWKW~qT5>ke+xzyg0f~I-}GxcPYuC+ZT*F2h2 zS?A!TQ>h$2ES`~8mvEQWD#lhRWyr?MVH{jG7Y6bC4n;#=sIi0^tRo(&2K8T9gFZ}@ zZom-X)h1yNsZt!vr-Rq9tHnZOUx_VXPOvee4n}%iw-2W2n(Fjp*=)1oIpovye%AYP zgwz>s&x;q0^j`LU0J4|&T2dz65JW4h{YIAkf75JMPXneT>@77Gq#K)>+DtqSg4`(* zDa+f^Dt8|+Q8GxB=jp!s*qEj6u$Wz%_98+qn+$g2%e|L9C=m+tm9BUsr$sS?iI+yk z19|kWYukksy*o3nOw3TRITJ8&Q)=q5Qk+(er;eug-lDt9n4IHjlQIBbv%hngGA)1h z2)!xXXeUTw7t|>!nXRJ40!ebsZ90`KrHW-qc)MqhuOSfi?{E+ziF~G~iF|@>`BdKX zJ8n>Y?4=1Welo-;bv$Nd@$m?PrTv-w{_Y%>m{)8^!0nIj5a~Nmp^1ZEk z!FVCJlIG)ECw+Yuhymq$Ri4}YUVD8=75~0uDvU$-!*~H6Wti|Z64`^+2V+w<7yFk- zn8a%3%UwT($JU((lvFJ)H%POViq4Y8)(79z@JB>*YZ6Aon&Ev8MJ#;fXt{^~XYz56 zjUjFv7^ZdgJ|Q|)R0Y3`C(iZQfo7NL8g0(S_M!01X#2{EtSsif zNPb~u^~l*35_H>ze)hzj3qX4o9Zk6>jZ^0-lH`K@pf%JWv+3Ce61vKnptz}t2xEdd z5))(LRpXMeG38NqmNb{yKXNuHKDj$SET3UHrQ2P)$yU4dhy+D2L@^J_r*B_J52zj@ zj^SJHK)W1#Tqec)2qHn*$w@tFCmtSg#?P_GRTGvg+u{heU|uu?>h_-^}al4dIawgzHgi=_|Q+`TSRb@WDo=xl!!-B z((g|9oU09O@4$iAJ|x-TVcN&ubd3jw3Vm>LGA|f=QI8xQfglhiC6z6O$EzIZBV1p= z@4mCNwx+xRCy~U*7iVE@O}N&8*t(^TehMeb3I#}Pu7tk6{w=Ih#@{3lqkmLhMNF5@ zJ7+fxP*zVoy^hcmd5=I)yZNDa|GOw18%zv1f&a^E`hV>Z^jPx()R0ho>`}R*!}x!8 z3w)F6eIFwbzNTixXjk9-Kf6c&H?HR`&<$j3&*4Z{W3y94J~|}=CzZsxn)!a)zdKXs zTdc-xKfM0Vi@=u>Zd-lboR6xPS1z;4YPRrwI4{+9gVLxS*)k5JOHK1?W!k42*W#k&Vj~*WMtRlTqt? zhaRuQ!q+Wi2Ekmv+0$d;JrH2EP?(HknD;pc${$26# zf1WGd(LGc|L;S>5g7eI2?m=i#0#KDV*+EL|qPrSH#`dFTgfps>f5t|B<31eq{AuEl z3~Lt5l&Jk4m1M%JKkebv<)5PFfgi~g1jR61ay}Ng+Te(89<;Z2Vbz82d9chI+(sbY zJ{5kA8^c_e1W?$I=q-E(r~d}RS5NE)0`mphbu=w~`1x#nk<)hzHy(hVWPugaG#>pcwfw6R;T^YxB9 z6hG8Z%k$^8_y?+oQd0y7L{h-wQcvG8##`J7MBVCKC2N@ytaV=zLDT9twCFe`aJ@Q@ zyUt(u3}tf-z&9oJ-QJs9KD+uf1P9@&9ldwO>tsXK`Wd_vIE!&GeG}nJ2@AkA{(O4o zQc%0&CMs~8=oo~=cM3mBg>ewuQee6`t?I>t(ZLZwFL04^g^T# zra38A;p83;zZT*G^$wB!E?Vyj+%0+Ao9H@B5H_Ojz{driXOO$*!kye28f#318SFcR z5${#^1wL{OLMIx6Kx1j?>XIK0qOPqz&KEA5fNuq%LkTOnKBVa`jP#a56b1|j>Q$Hh z6haxie4oNuqF#D9@I$BTv*ER?t!2$t-dkF6C7Cbn?-QC?K1oz6RCe_j8y?aF|O`8Ft zL~bjHf4D>ODEK^wDd$LqzW@Hi2e&{C2!k7PC2BUwJ_)PR)&HV*rNU{I= zgVBv=e!u@e@2|3b>aE|{B-SG+*nWyhbsyzKQb^n1Sul#&_aMp)bloC)`=YX?e_rYSWD&09ptPRM2{XGCg*AoZ3&uzR{pmliEoSVYaRCssd`; zf+Sj{+`H0`O07@73tc$r`B4h*Ix6*lod+@YMFyoBrn`5nW7D-*uwF6FDQ2af-Ej=AG}0hQBP2YdB(2#|LR( z)SV4j1~1iGCe4cVt3YNZiz9uGjTr9m-A!^nvc?G(rI0POX1{LC1o-*&tC*qGAj+nO z*3)%x`vi4FDL4f68%FS{u7#&p**7wP>G{QZs zUO@^Lv^>U@PR0GQFks)5ZL|D}Ll!gt?Dr@p^F^=g z4^BfR*9r(q@p^}^KtSS&z0CSWsx_8!M0!ukZWp>SF1`kd_j@XAf@Grd2lNPE)U5R? z?E@f;<|n=cL;s%>e&q{|;T5P3QtxxeVwdysxGR#Jfha>%C?EfdG(Uuk^Ev9oOqVHr zM`1~#iOt1medI%e=q-&)Vs(jBCsE=Pe$`vB%sCgzLKH($7Zms9k_nn(|2_Zbh+-O} zcehC{Cct*%)&46iHx3*Joz`b^M!nW@)sGjBxUj9njYb(>8G6Be#BD@4auvVynN_|I zg`*y30F|nUtB#yhj^h4aNnG(V;FYP24B!#SO|Ypd_U`D&cudC(AZk-eIa~fTwK_}a ziX0#$BXTrhC(I0|Kc)dlh{jAR0xa%8cWVpCN%*2O=#(~GdEY?1@paYt1?$T zQH`>aEcoGUBG>?EiRWs`2aMHiT^vyzwHPTAs9sBlTAYw-@oU!iNtIuQfMVNw8?%Di z^;C@skLBm6SA$9KsH z%KPW5YDs_`Dz0QAa)&2l?-ue7D~>cp6#t>&{pZ+V$5lo=EWc2*j7ob{O+O4#SZ=OF z*e1Gp(Tr`)EYWr8p$d|-^lICvRLL=vhUYxQ6klN-_oB>tnu%lE;|bd-ufra+%(dW- zub#H%Sk2I?%%*-XB26jCscT&k#%HDh2T~%8Q_1iWY6bjZ5a-Jp( zZv&#i23OaoQ+XwaMn6`bK5@Qh9tQYZ?RYugG|4=KfacT*I6ygQYT<&G=_>;BP{JAc z;n7#iN|sJD!gBA-CvzUrKl}Zrs^2P=N2nvDq-Z$*5D2C1_a2}JnuS4Vhqz{RZW{}R zWa}?K7>DpKIK<4v!;jTdw8V3`qu(yE5|&&DYdZzIE=&Enr1~K@)iy;V$(?UT?0KGI zo|zi)Im)a&wi>(~%U@GW)HydxgfrvE6XtG?zcwcoJLB!hpLwp^CCW-jPC}Y}8SN%8 z<-Uo7U)vFFlF=^DQTL%8@hMv~8Xl_)F!_0gXZggHJ*&`H_V+$LpP}c+u80|v${G2^ zQ8P`KE?ZK%9esB^qXHD1^Wf(i(7Da?16TW5%ba-&ss;;!dc#*GBO3U?a9lC>pGD1? zc{uw68~wrCIq++;8naeJ=Bq6a1wu$)f|oeqO{zWB1mg3JuRnkC`SDRYviRL{#fRFD z%B!txzv=Si`Ra6l^vCXt(x~^Cg!p7S?>c%gYXRS>3?%9yR~_SNjPNoeWTBY&){@*p zJ(z;2MRPFoGXvN5+%a=s#Om>m}Ds=X{a!Sd5&@Smy~e1m)-R99Q5w z&;&Q<*elG6_U<5UH)z-6eWWP-p}hP#lKuN1o1%otAM?FOTBFxYxZdW!dwcPY3ql2_ zLpIeZ6B!kGdpSM2-lcpQ^X6ko4vmo5Es8Qk6Ti}tF?CkE1$1*GX#Smz=t}v*$MWr~ zil|#C62f@W>_q*Aiye6iZ?{8b^p;G@gX(p?Q0R{Is3#&kaoQYw$X-$GH?iKGI}@8T zqRVqc*BusXyz&H+YS}`5xoLGu{Hgplv9=_Ea@R;(b>M-Ea+E^}cScD;-~e%-8LJ6b z%J;zn3U&!B3-sKfZ>-5SU2meyiMecOm6D~;Pms1%ql#2Q zXtRaqFQ|{Wloimp!+O%P9y;9#W-p{>e>jEmIi2F~MASnvLCmMUr6m!lC@cxzRctju z!9dMQTIb~ZlZ7Ll!RzoKZR6WSZ724Bf*V z31uhvxcROiL}?T7bR#06Dqa>4`t2#);Pm`gSmh6nq5O^+C^YjZ zBWrs#TSVvjz-aQV0b{Ow9AoiaE170^ZT=_oGJwN@F@N}g)G!Wb)vGyS!lYVxGMg$2 z$=V4JHOkxr$4bJUPl2>VxtGs59eCmhG7u>1&S{~_VbM0zbvYH!Kg#@IA zG&t1RjQMSS!2)y;tNSP3IR2QgX1ecxeIi&!F_RydsgM56E87$h99i>EV$0QKJF*W}_Vl;%XSwywKwnKab! zc#}A^sn4d|TN?RH8lK3kQJ&I(f`+QX^>771wX-F6aS(G! z$zO8vVX%Z4?Hqrdw+<1t{weMhs?e%mq-1N@vYKfE!Y1S*#A4?q;CedJbi>YEM=oAV zdJ=DvEL<+1KH)gQ?B-DYjv8CjW1JDMiV>||HH-3)Yef<&nX#l4DGCs$C8Umb$kVn> zgNY{bC1Ic6gQ-Uv!=E}?dU;*%<~IK-QOwIA4yy`h?(_5eQjoTM;_`gFSmcMwfp3Mn zSuAT)zvhdS#!82i=~OEzkw;+Ry*-+0dbCa#ehnRp()QyKOmc!_L?b-~qRc_t^)^@^ z&FYr$?VRiQZ0DSp{n4++`2@3x4svNkm`Mh*;fAM_}@qR1Gs?A4a+9%Jc2wZW(hNR5a(nWG7*jp1h_oKMuYL?3s}CiCIOIVigLNAo`c0( zn6okes{WcJgG!NdwbEqV?{PKOB|S~7Z#K~+I<5pUgB(NYfQ8Fo?Q-*Q>L?D^=?Yr5 z5TvK6GV5}2v1a4UdRq1A>mLOpMElP1&%<9L5`N8}56BS?5$hGQwxhQ%SYB*OG7F`~ z%QWPAwtR2aE>6Oy$fz-PesYRl|G-}yd$@VgnpR>TgM$fQEytBus$8v1YleTZIr&G) zIwSw+JlQ}R<#!n$Qs_FK9a$gAuz2AfwYjWJglUzRXt;O$p5u*a=_>0Tj-lS72&a<# zr}$A^S`EUvMp|U;#%fX%NAJ3L>eThkuq`CA`{Zo!))8f7F`s`WF*~n0DOK%{aolOX zJ_a4*uZd$SG<)T$kx5hvB^oq}M3+^ZmU(&6#7~^qm8FS!i-F6QOAvs*NcPgb+E@}* z7BaU^b(wekPCtpI>@)VbIh<-#5;f5*;r?f}b>5e+T4$Qc1c1N6>{;45;%~v3l+mAj ziA8j|K87NJjyaRFgFFaS=`ln5jwgbm3MT(38mHpfG*Cm8l(QEZ=L=D8eUv$i?;q zE@Yilms|*5Mr8*SA9AQ~`^u(q-dAgu0O zK2dKrVi)6FkOQ;w& z1@4WaP}w;fFg1Sam#EHwCZ1p!`I7(Ya??zZWR4h%SS6Lo*$&F^MxqMOw)na<`^dPE zX(!CO-%q%bU|~)wy{`o>5EXEh)HH$pe{n4^7fO3{DO=l-QeOz04E^+u;VU^%8nfay z&z5mAepxJ2KiO(9RR5NJ)5bpGG;2LjFsE~hTb43<jnmg*mW4uH6169-BS!nvRq5wgIN}^; zXQ1k{;6$#-XJ8RA7G=gG`2p@zD)F`0-rn+i(Qte`G{Ljs1w{f$6uT_nDk`7jN(2x@ z;5}bZa1#8yZ^E`^G-%aux&*~8bNI8SjK=hLvK83?^IO)Ye>k{*g)e`@52xK|adZ@WwZoHSaX|!HK6dGh@zYUdGfX+u<}Xg}3thb-)=8mHibv3_XkE z*mg{Sv3h1DeIaA4vJANlUiAY*ZxFAmvj}oh3_R5)E~`gZMH$^u^B~II%m!GKpZBP4 zl9u&YjhxQKfxIzbQxd--vf!tXRWavV&a0PnjB#M(3D7*SU^x(=U8G81pw75-4nLi} zgo5oHLU7(gWepDdF2@TH+IE;X{H7KSr5z$XMw#jHQ04px!Z)I=2KBs}b{CaxIR~Z< zt)G9iDKdW4BImyP3ipbxAD0`>99^JBTe914e2gR(ZeFf4 z&vO2_33w}08v9WdQnx&zxo8{gq6*pR)T5?|=IEcA^_!vf6L90PZmLG9h}fj2v{!JTtag zW!8Ns*OB{v(*;E{gp&_|X%lTYoXh|TO_N3~$pCYS*0|&dC9`|7A;&^w=oW+X}zXyK1g^W}w zpsG;-rA0eW^Yo83yGi5Hv@8;xH+He+fJ3XvoL$7u!pWt{A$u2Yc*p%#FI8rU6_%*RirUcx1UrUh_WiMUrE*2pLy$;s z;yhNnj)1*JQi|a^+d$toTw}F!9E_M3>P;MTW>$4%cxu> zR;?LY2N$IUv@iR;K7bo$nGqZN*LwgT+s#={rL4(|*dzyJnMafO*Jn5Sd?o9AI2+R37XRf{S{67 zPVRT`2ob90X)KKUXU(u0n|Zsv6($;uy-jx1-m#O!xlFz7f~xE`mNf5cBpHTziL$9yisdZZ=5eu zto)(+d-*%6L{YoG26Z}ucJ)%eeVAp1t_7OZO2c}S+-VOM@6^AIUw?_&?LH}E%Socl zN1WzKip`eIa~y0)9z1r(ur(pi^QAGgAn8eno$_TBh}SRuu?BC~(I!Ps)W|feO4jpT z@z`1p^u69VYyXsqZ?Nw(Eo-&COm2_WuT^lle5W*`QboTcC`9E@0563eCsCR(HIdUa zH;WPnb&MFlW}{Ob3}Up2qf3zD@fdgnYd|fcm8rvVD8K1w(->3k+h4UKl(EOTd}PD) zn^)_Vi*>Et`(#4CE)jVWx!)=WBIhMvC&{~K*%KaU=j_yc0#&M(8THv_JGO>d4{cmu zV-U+D6jOq@jO=Ukvr?^_L+$GfbMRs(Li|cPjceQ;wC&C^M>Y95jCMKrocIqCx0+i0 zSIs$$iX^+ZW-%sz7VpCoW2#4CSYuas^ABZPC5=ryHa9O657S?qa#w$;+jm`>nX8TN^F;!~ri=zH-FMEle>LV5Mq-Q=J?T>Yy(TZB z$9b2nCr8>N$(mVebc=CvW!$J;*UlgA$;eLaaK})tOB~gcSvM3hf6%wO95W?(W2jH3 zyuirwqR&9ZuI_=LX9PD;uyOYLa4y2qhjos9FLJ_rl&bNlhN=A* zQM??>J zN6iVm2`=6I{o5*Ck>PwcFc8V>qf1|Oqln!(Z9^{2m zJNa2C1Fe{pa>Sv?KCaHz3)jDvuyi%5)&zen<&h;NETZ_}!cbM^$7gKJjqmSQi{#fV zU3Odn+HbrJDhLQC*rWUK@RfcRRguIFruce#6K*zKI(1%9sx}jx-?Zpa{#*KBnwZ!X zK1)-MYCIMuzK*asi9*mjLysPdhEVq*3tnbm<|*w&LPm{{q?Wik&7pB3qvjWz=@>^Y z(|(gtJs(K2kB3Tsae7RZj?cUlEeu0RZs`|s8|ueg32tO9nRem;DfF=A=;aIYwe2)- z42N;u^9_`PHEu#PI_x^ncRY+#<6O+!7hkYO^R(+UGsN;ZJjV`8|g;W`m~9(Y9?PH>QL|a^2+w?Yg8V7C^tg8LoU%|9r^Gb zNw$vgt)ED$aXaozp!R9fu^3c5Y z12UqYf`T^6Ms0GrB1AvoT#Xh`WF-)Ss*N75E4hK=IlOM|LPS& zbbEhvaxAXqN{}qD+)q5Fv1{UCz2Nd>9F2G@dzstk zBhA3gC0`4rV)Q~`zMH5or|Cj1+pPzO{ zo>KMq;zjZ9_LDnJcJMn{EfTKiZX3$M*rnk6ikw2t<9>TaWrBc7+YsmSz~0i|%x9BP zl=Kt`@GNd2NDPAEhJ~W6nB+Ogz|m{G>3$TNO*Xas7|g$8QTug8Aqj#QCH zCv2LY!7v^XA)Wv?^%v}Y9ZP>*NabDWO7F{b*<^^vi!{DKo@r)dc@)a=FEB%h?26iI zFq`g(G3AopAnffaLXc`mJx|o1on3gei^4A*`=yR&R08&;Qym$^+|n7nu9@)&pnSrU ziM=qgBl0Mz-aO(8?ZbGNO%Ec(YVuAuE{I!lbXpMi?>>JuO&)RMUmN@VnG9Vka5L}c zMxOTQ=T%m5|BP=3bOvtXh(4+fFZCc3HBMgfzODpAi{H%1!bCzL`@822%;l zZblljdxNNG zsoy%k$~P~hpaAe*;Z10s>G#QgU9ypuWJ_2>Bs*9b{H{+HyyO>i_C@SI+11TWX@z7p z27D5ZAA|OCGrNo_QY=!a{AEU1{F*X-vusIJ7Kw%yzVKRe8!mpiBY2;TP@7l2Nx0<{ zJcdN3uWTBg@qguS$*li76D#)rO@jCTA67J6;(sdyycnw4?pP6qFSUzdWBa|9Z22^! z-JkxGTQ_zBo%a2AEkNs0yF!;bdFt42h0=RBo*kIHC0lnt0|YYn+!51)MjKi_rCPP} z#nUG~ihtSq@DD~D1gsh3G=HYIK3O+I)92D>L#E*?UuTw^vE*lIQX~KA7c`Oo1NxsN zSqTpL!bY28=!4G=DSEZu`}zy>DU~OI-Dv)!BtCM*%95qaU<_lbge``5OsT2f)$O&w z|LD@v?nyHpQ>uqS7}>qazh0_FtIB3-XTfDLQ8WK5Apm`*@cY7w`Ttl?@V}Mx z_g^mG5{JV6&3dO;?org3?*GL&EF|rZ=+|)2EhlE9sCel}6M#~SR93Ro&8T2@_R1&~ ztR^dnR~CPEvf1@r4nMOcIfu~n=9_{&(!a?Eqj%Wu_f{%7i*@4B za|tUky!T1j<;KQa5%@+qEvEQK+{_fAE5g}@ASmo2h|f_K)0TAlSQDeaM2_91t8cgk zwrMgsxElNOs*iM9hMx}Q?9@SipT3R)Yrr6FuI4(=pb#goqmE&lfY(<{``ScLCx#!a zTi0zR6znkG)!%D0Hz6JXs*wp;20WDOSdY#`Ohvwk?-ajkPAL+lbG%Pz?Yr)9Z8w^% zd{-_F0t89oQd_(37@t^->r0;>4sZrjL6Ca}WU_o)XgY65K=-RMeQasFD&>S!3K|A6}K) zr7sF&rr6S3yGD_^DG<$VcHdEnZQA$677v(dA4 z^D-+4zB&|svx-Y4zwh>|XQFmcJm*7i>3}1XB*Tfb;*+Wf`4&bxwr5-Rg90PwbBtt! zg$<0VGqBKa;eE(pPMrD~el@gegV4Sdsp(z1=cjd&-fdSCe5OmH5_pbL?7AgTo4jcP zr<^^Sd$CA!g&|ifPTtast9!fD+u!n{LJCvJd0Q8W+i)a#ZZi+HSQ;&BE!I&ZKU0Gd>itIu0)b`m|DKeow}F3L7~q z&A;m}%DE)&QJubMZ#2HEoF9$t){h+6X__T!Ix%$BI~=Iixp#KGQK?jA)rJdx@p3OR zBbt#FvH4}1oc$TANo^1actS{J7^PfRwk z!X!V#NH+e2hLIkakUm+;LVDhSdIF$_UEl4GZ$huj{2L$zp@)1lCm`yg%h&{WT)?Zt z+x=yh=U?g0i#0b!u}E|J(sesSjfDw$;Ro0O(fCaJ_J}yYXA>gl;ru;k-ixOmCT#8tsP-_5HH39d&5>eKllmRrD-K^eoQX zTODT0l?T#ek(! zZ@&x?`w%(!t?B^YUZ12(XJM-N!Ma%r)HVxM+oi%UNN6<%Q(IeKsB@o@yI;=Vidt(^ zFa0h%)}9W1w7PwHFa0*3mKxkXcCEH5b_krO@GpDxfc?~~bVua5*M}VfZV0*TR{8;_ zll!+CwRTM8O~kX%x1QAKdF14>TN{phdy*1(n>zG*@j9$`KgWOGM(Zh^u{>LF7QPv0 zcXjianZejzzx2mNTMG~d=+>BdeG+;=j}^SvwC^}y08MS&)p+c>^0DH}ula!|Kiv!o zy*iNuJUfwiZuv8{ZJ{2uPiA|(+7CLfti!vztyk%IFlFoM5rMCF+dzYakZm;oZ&caa zf|q{GF_J;lIiBy-e(>H@HF{nwA0Az9vg!{Sg%J;~zU>=4j40Y~LjqnCZzhFF;}(G{ z%@$Wrn{PRrn_kp7Q6V?XZ7_`^8PK=vgu$QZ*pkXaroGbhFmX9hl3p4XEcuU(Y`fvd;8&m)t>Ia#n26wzKqxD^{mSChfYeNUQS^T$&?*n8t>#M=jdtr4W+k%sYCox7ku*1;L6H ziu36i+hS!{-)yDTsaBDYeliJC<`Wy)>OXABQ+1}eY3}MCFYx29-HJw4 zghSy%^Ix5e7&igV4GPbcn>QrABNKqdJd%)X;Jp2#AEk2^B*nSrG9{SxdeWTbch8&U zePShWe^e-NH>V;1>fg0pX)31#;5XVXvk6^qqs4iABK5rzQ4oTdE>vj&(d^rieojs* za0xuKXz1OAfEt%pTkLjmTQ>$P4Z2e7R{h^|Op!o6y^-%x5b53swTJsSQ^y&bw~r6t zIWf0r#*#~okV{}(G2oGX zZjZGTImtDKLZXV255qGaoZ!+Kn`^lcIcQrk)PnH>j#iX4{-5dHspoqA*q5EkuG*Dvh zYc#m?N$~k~lK+QVauic{_+gGutW6DM^x?VHc6ofF_1RQFBva8A6Y2#!?i#26qjDoF z5q>3_t1(6;ewFLqI%R%J;V&~+j#&XhV1_VKCkiOY0mktpy!jj)r|g-ZE==5BF0l?} z-4n?p6wb%$P5hX{!fGsp zz3owJ_V^1*5&L10LXM;Wkd$1pTxdtiMp$GI?DbG@T7m&hLTs@n9M%0PX26FQkw}m z`~~=cP1La(h(xo0joGk401*xOJ@ISI%%p8Ue$&l4{hd)qwl9^`=@BTKYBQ*?@`G`C z0>vmo-QDS8qyLLHmP9^Ono!UaxR~oflIr(B?&`t3eQNNw^3W6^ZajJk#ZVOuH$SNK zYg56UV84GT_We6pxsq&L9JOLjBN?hh#uzo4HCxNg`}@|LmewA>6;H8k^kY}+(Zd^B z54mdfT};w9JOjXiwtX9jO1T{CpR?!!Z;U+#Je%mV;>Qev%reGAnZTyx$EtI*AHFyePnh#s~@U28%t@~$u7&bGi-p^VXCD5SZq## zY~F=+@SIjP{%33Myzzhn?Tm{H`|h`{%a&&*oH#|mXI`A1#Zxg-JHQU;A&E^YG&4e$ z1y3A5hBZAyTO;vO#fH0uHD9T$8n0l+l0B5`q*TwPdMsp($!O6y*8wFFTZnbdT?c^1wkCy6`X9sa_}^AiVU$7Q8XOQbS+#7qiLI;Hf|;zTW>{(Y>Oh&wg) z4>_*2gY5I)YX;qKtoFV}w3T1-x~W;z3Bja$aGNf^$Y6%XU3xE!BB)G&@~PD7wu6-C&q z+gU}IGu9#J)#_H~wXwL}*RI>LRXsg!cCTm95Y$O$HQEzjZkwhZ~Cm={Nerly{wz#sSRlIe0)xwb?lKI95+ru>;wRDPP$4JJ2piHdiwq?skU z9JPrTtNjl{^E5i#GMo3`SnecpMdg6T^^Su!`eIbs<}Z(TD&4j7)&fswjYKYI_0Vnp z(c5P=!-3-ScA81t{y}EIxLxZ-=ZGM>Rsk&d?W1s!}MB3t^B?HTr~L^Ps`iq9zUv{=Yk$g@4PUK*)BRB=L& zG`I%O=DtFtP|wQIy6MC}E$1lY1=$Y<8nt(%))@hxLrc#i*Y&t(XE9fn_=Fanx%Nr##-4fP$#a zXLA@;;8~_6Te|7#LUonkE($}+0zH|7&+2O1Q9%@L(;5&>_!qMuWQ<3zCS{70uq$q0 z_pXI_c6bp4J=V+wF{MS%xK-@NnO0S#Gk5a_ys z1~jV|K=eF{f_D^9r*t#PpDR<`H>)Vjxht?jTT0x~AwRxXBm4|2@uTgm0d01DeS-82 z98fB^>)ye8kY=JSq|<1Q3N1Uz&nMdf@pN^q^4>Mg4u;{0veWwQ)0R#zE=mcIl=k%G z`Z5h=aN1}e++B0pICiYdEhyNUti%|3oSn3<&A&K#$i=!j4Af0O<)J?nMvP1h;^sI2 zsE1DPoc7|Sj2h3Gx$}n6S?d!icnTOZNbw$F;5#;r<-gz&dO4;?3In2`+}<>h8w`%= zyU$hKw7ouU0#EOpU+%cCR@kTZ{@HP2szI+A=_?}6=`FCwy?JeWn}<5vm2DGJd+9jY z?v~})hx9M{5CV;iNf#^cMu>ELN{Z#*uvf+{q+tXI5}WhireE_gStLb)6Kp6)@Jt5TAZcmxDHF%I6Cih_{6 zs?(Ni=aqW&)qdB_qE&fF%PCF6Q*MKR%oYbx} z8vmC{gBY}dw%5l~q!3Zx8=cLAITgkIrdh?q%*{s}Xh07Ily~1;0sy)o>T@^cC(9VQ+N`!#2AABj&lB8|wvB4qd6VKqXw0stuN z#GJ9b+1u}@7}|GtS=yGmXv7Oii-0bc9U+N-nn%y+=Zg-oz5>tod!gI>fc(>? z4q6|ep|lwk`{+Iff)l3>53y(Az?)Oa8vX=OU<3ULm1Xk6jT5>?Bz+kUv+zSY@EvX2 zja^-CccZ`bd3ypp>~K%<^hl8`|6DxXFQ?YYrGW+nirY7k1EQP-dtMiJm=RF+zZphH?tf1rDi|UY0)CC077$wItF>36Oz3@{uBK@jFaU%@m^ocNXSDwu zSktd4=|Mn%63$-~fAD`9fs_45CX=}*bjPQC|KBG+T)xG_mi&jhWl!u*_@9Gs;s49Q zH(oKZj@vjM& z?pQsSuWyg_ikFSo9`jm<`hO%GybhDzm~Z(qYC2!mUmF6Z)GSEb&Ju|N{?e+v_MlJl z+~{sxGhgb}K_c$8s=59RMzMymyzkYyqgHz`8qg7Xv+;27A=Ef# z4RC(kY{$98>+R5HOu)en!owA{&{%fQ3u%t`PCRG|jemz`!xgj&dE|U+VHOq4tKtPE z3qY2D90V~bQ%~NlPODP^opA-9F$Ev5grT8I`Fq3=e#ee3+w}$~gRq7%|9~gvk^P1z zzUU85&(fuiqvbY``^8eKl}qnUv)eoS-EQIaklEuMObz|{>#haM-!hb5&og1354}Bs zHF1hy;OSdpZy>Rc743bsM)oVg1+)l)ai~r(U%UD$k<>3&l@94oZy1pz8?UIbsb^dY zeZOonQ8U=)X=-VPF*C>FZksts_~Q92Pc2NjT3r)x@;fC6II0#lz1R_BUEF~7bzQiu zBC^D)QNe^Qo!4g_B5<>3qVhS*xc*zc$7&9WQ)+XgZIm<{YeTKrk^_;~oD*KmARJ%s zaxVWxWJSScuixoH?(=U=S9F-dk^aB?^gQ4@hXVcDo2Ae@pQ^Q&zCyOthe-V_pIaph<3Da*D}3VJV?hoP2zcGie!c-%z+8Fy zRq#q?bj?v@TcqVNUk|hppGAiv#Rh?I_@}siPr6>)Z9AD&0OU zD~a3q81H`5;?^C6cF#qi=@pj5>*!LYw@A!!;=VP&mg4auUO*;d^hb8WgCg?}ZJ126+g8j)1$YH9}|K_1{9HAaORY#Pfz* zSuV_mcNkJetU7okv7p0_fT?@jRynPfT}59?>Rji?2XAl77dQc^4i5H!A#nc$5X{eq zA1ejeU2J6|iks95u*h){Qm@3WT%Ww&r+@f2ZsE*u`sw6hIC-4p4^?>h$F?W5);Q9- zRHjp-buZix>4KCcW1P+?c73mXMiztP&iy7Lo@~hC-hq0 zQ@3DI;=LPQsMTOByqz;cIYPjpLHM%m_PxQ2?{n+FN&YhhuWg9MkgyL>!l6);!Es8@ z1LkT}Wzl&s{qTCirsrG!Zv=_$$SM7aTKldLF*N?qt*b!jrP<`e&^V4s$Ld{$n7Ru{ zXLEqN_NDLPP%<%sUdV;B2U=X!V(V?>y8=CZn3G(|bCY$02oE%E#Lw|OGa`8$dO0e5 zIf&#^52_zUgYjxi?+fAUq*Zq-l5TVxj*%~x(wJ4PE_nQ_o#E5 z{rJ2+X`oU&zoK2s=eW>*!+Wq#tyHb*xwjoq_v#Rk-e51}xJ>P}Q;)j)G(fMYH-<#r zgIqZv<8T?ZcGqE$C|#=U&#sXk-Zw0#~(IF`VrUH zWqHrS3*BjZ)9v^J&X;S4%v)9HaCjf4f%Pl4|BQIeXNvUa^6Fo}O3KLB?DbC2PV4Rs z0v^H9VeICbjQ6d~h}>#kiH)xRK5n4-)Ad@TBB*0?Z7>7VU<8Re``79&SvuY})K-jU zKTg4pSH|Ra#^_XY3Ee@MU4U+Hy~~H)fyHAQj@vpLBR5k*6X!jz1D&V(<8q7pFWI6O zy%=^UmzRaQboJL;Vu1(gwNSVV>Mumgr$Htr&W7>y^Y?v)(V=pUjrD^>2tba2zAyB- zhyM)3g}KeL^A2$J))i!G9PHqG_i@d0o!ik%AnT?5Bg`}>aq6m=23Xntd4n5r(ON@E z6ze!XrkM8G;0xZ)Gj~@=&+{=;_x=79CqIfskN=8~g1*oFDJ_<>@9C+*-l{=QhAq{E z*6Acd1`uA~?a}68pV|Jv#^99*yy=04+jaN(Iq(aN&6IA~Ch1=2X?HJL_nTb`!}<1Y zvjyz5B?piFg!J>}WdL-K=(1bbx0ySA2FowPUQN{M&nK+Oxvym;YPS1+;MNDDc0U$R zT`z?qcUtGT!G`=7ZK&NA`0aK z0yR4=`^dPn-6bJv_iK`&!%hXCLW-7Ms#WJ56Mpy4)Gg#%Df3ZkRx(BX$Xs=K;Elk6 z0z1Dq7(oB$FUS%YSPxISxXjKL<`x&}UhX_#0khXc2mkY0&&SrDgA!to->&y-FjcE{ zA%{8MS(gD%mw1H4`z1OalgAH`7a`~C)LA7BpyC?@1E%G&EvUbU@_8(-dkC%j2He!l zakC|MQw`7b-?ad_)C>&KEQRrLLJ#;AbP6}a!mo@So1P)fr`!gvq*M5WgvAxlSd^8E zA4(;}#S_w-qZ@Xm!dv(s=1P11)c*|l-fM9ctIu*i_&V6X!chNIPoVZ#b`!cznM`U{8%7 z9;OijN#&YtZmj!0od!%ekUo7l<+d+2o#!MmVu_U!+bWHX{Wu0HwVFDx-o zX=!J*L;ZG3O!739TMv0WXONcuVBVcF>1vlg`6$15Gl$u8kV^uAw~xzw6233r>WoSj ziCdlU=mv4aJfGkS??Xy+^UB(SGaZ(pb(Ml66K%sd^p< z6!A$3cgr`Ql}BQRpTv=3$EE*Vme!OcWUWOIhR)5ob_y|P6Q6U;EjBQ4lcrhb91uaP z-5SXs)>krQtZnE(-d#k(-r-kQh+oMIH8V0M6OvRneD5R#?75-)U1!%Rr+SSx;d9)$ zDO>$vHTM_vKj$Q+<@Gti!Tq$LySuyVBaa?Q2?(vPK6A`n^X;u`BAfg#ljfDHwsp@n z`?cNO&gZ__-qM>>F1!8V{FkQI<}L73c?FNWm>(*=M)ilFKu#O(tH~Talux(p)0;y# zif>d!<^}t<@&ijpM_Km{Oi*4}C^xPi#QN+nJQPc`H*@K4Cv$^XIgkA3=m-(ECwC!* ziUhI%baiV%NTn6*%+0xA8XOwral6JtLXvjj^AG$61I-ZTzxX%-LjM>Vt`9Oor==De zn&sK0zwrpP5tooij8B*Mmc+rpi0|w;M1!_#>tvJ(JYl(V4aE_gd(9w^n}3A)AVGh0 zasm}zcEY^P@$vD2?w?| zH3l<0tSzZxA}Dk@mpVLQ&cr%dtc&pMuRtO!I#SWxYZWp;nZ?AB3T(a;XDo08hs|}Ox*;VLIITDW#@-L7!#AiBw}G1eUTYmH2y+z^0U>B z|AV==fU2_n_C>M4AQS|orKP(|1wmQ_Y3c6nP!x~`>6VZVX^@ugF6nNNl7=(ax6gm? zeec=(j62R4_m0bOe0*!IcfIfP%$~nFpGo{)5laqTm$8XS%+a~&sCnv^GEF{%bYO7s zpVnL^8>4FtRNQ8+A&y&A9=7MR&JRK+rS0GG6p&Ki^TVpopRNDHUhlpo^n}SkgAA-j~_jH6L@btHx%O& z?tQUH^fM@ei0OM(5pi-~TkMd2 zX*qjQs-Cn}?C~N#6Ipa}TvkWIJ0&Hn&22|$4k?~;+c3@j=ojDOm5ROPxylf=jPpkA z{iFTbtGb!F`o1z-&iJ0@7HXIVavJY>vJ+uGLBxXO#BU)gCh9fhF33bx;@r9a@%e{$ zrlar}Gzj&OUO4Q3uD)NO!Cq3DS^!`l%cVSO--{WR}s2MY|*DxmBX{gRa7FYmD7u) zlXko)KPHK6{cpq!x*1!2^Bmo6Yi;qJnyOY8PT;q;>$G8e&-NkI^rqBBd2gbum=r44 zba8n4(&Jyhelf@P#4tW7C0qK*(sk;>BzRE8bSJ*b8!yPImN=MLkeQ{ufxqW_0tUKI z>(;?3T+OB-nU=cErlA%y9I~7+vr}*|$?ux5<hd91gXnFpp;%M*`v*kju@qPise1o8H31Ih?6 zZr=(uzs3E_58kx}NyEt1cfj0kl0il_jPm zCl9FcB6FB>;M(Lgn~%P}3J;||1%qXn?2;g0Su6fRn}trPP=B+W=wedV^GS_$&3IKz z*WQ71AI4`Z3jv|)J&X(r=LQkm+y}u!>d8jP7apC#B-;8N_QMKM;gN}50eu$^gEw)v zK554plOALWX=3#Z7w`VGb6+ahz!ir-|{@(=4s)(lKj2ZA+(9q{IeGl=xSYA3 z#GtKF4nP81}sED zDPP;%Bo!p3(VI9q5jpD}C36xW4iwe3N@~$T8-4vgtFFN3Fp!?LBx+#zjo8zN-}3Xl zQzLVk)#z>Os($vHvGk7ZrTNm(GeX35Prog5l(C^(KfSQfQ9{Kp&>wxYw?|=RHsCbM zGkikoaKiWQst)%UsR!dK2P0!?4X@5(27gNZ8&6NBd*Z8I`g(egxy;hO_n!Gh}P&e{2A5j08U~meI=2l$Qr7ZJ_)_f(TzZJ8tGSySeQ(_Ul*1ygrpb? zvyY{e8l@xD%Vh}Eo^U}LB)^ODa!s-*GD5GHqThB3=FvvMug zc<@oEoFzOqRwONyxg9-f!KCzopgtFULYG2VM1!|(1d|AKqj61(y1m3Kvfi7rpS^`; z-pQnW&2MPwgozpcLpjs){sXJsOOn;PbDH)bLaW!C zqbTMEZRuAntuSGnUTr(Ner@N^Sh*v}QZepS4K{50WG z8C(BhY>||TF$ttu#g`^-cXx90sMx%1TRERoXK_KL%z$XwP)s+z%Q>igQl(n^0e}Gd zRi}D-dUDn)OMxuJOaiYV5Yk&+dh`gdC3td|%+uMr{l|96do}|IAOgoWDcSf?P?4i> z^Yv6L1PuZxE17WPw%w#hr-q*kyE9<8Es)-i!VM3Nk$N$IpV)29wzQ(c2lcNFDa6#0 zeb>SHTr*N8s-o>RSw?&yZls=!Qckn-Jju(dyhCOBykMXkA7KTInCKpiZV!(r%sYhi zRihFMxPACKviVxFui1$GZLtB7Uvn{(uj<|Q9@4Fa^Hv{kd}QFn2D#o$q&{PU+tQY`!9Ep;N^AJKu`W>*(X z#H~Es4V#5EAEt?$wjF1DyEvLZmh=QcxGQ@x##Fi8dtSMhp?2@&76eLr-Qif1c?GnF zW1ID>1?R+1X=&pi{?c$i<%#R93pW_sWU^fqAele#+}C&WAX(1rbTS>wjV|?cubqZ% z?XCB@hgDqv;XVJmljJ~D@41J!Q*%u2w%+CWaY8R6Gc#cJawR$twfbcg9|W%GVyGDI ze?2iDJ?emj>eKn(H!2<`zccF(csz!jH!%ve%T!OdaIYSN{V;ST2)W!}Z9FCsI34%2 zYMVYTG2Y~i!{2mr+_m5|uVOj5+#Iz?Ps@*tTJbR+^ITA-shII_{6mFHm2@F^dg5u* zMRaThOV_sgmMl;`dly|&!=WZ(s^(_h;c`8clRtktKW1j`=Q5Xn9Bujq>TamWUYFXC zU5+~(Z11ioJ}qhC*3?Z)Q&37GWu-k!H9s??BbVj>`@o`hk+^);jV}!mF4HYf3sirY z=(^C;Zws-yZWC-tz9=l*mkn`qA01ykICrRSGX}pedzD2>3ZOb~&rB{A{Z@~P< z`iw%nL-It(^Aw{}z+%SjQeQQWz%X#Pd!2OwEBxfoEetSzMkZOS>$6w9da)A)cx-zv z{1;c=nN_Fdd{sxmu37X#Em-wej>Kn+O#9!3t|dJ#)+#dG44uX~7EgcnV_hHZPL(dA zJIvS$$;k~=sx#7d$`+sZC>glRO1_uIrVb&QuM2VentXlYmYgi>woxJtx51RvIE__7$I+Jr{5XxNDuGd_h*zu zQ3#_mZpzrS=0#yTi@1c~>Jjmy-UC@7Yj5)EGq-t3&H1^j+Jwqx)o;1eOUHtKU%I`? zsiHPI*>Dqu%D$>FwN*uB`Ne&q|1#zE5}zO=_={e-G6bSJ+h@|a`6E9S$Ia%=s!uu1 z%B^G~iPYAtL_|ac9}bI1i{Lab)?bVnXI>9v)<4(L!9>U|APt393Q8CyEx)d>y6O$J zz9l2%H~LV97*aXYu(+)EWr**Ji0JW}q*AfTVR1Y{{HU-;%zZ)pw5O)rUcEJE;?$9e zc!lD!(RdexQ6K#bxGJWdNm}R>wV6K;{QljX%OoIaDSMnZ z$*8Q+ozJ(s4B0pW`O>`DO2#81nlErAc`88u0JVQ=xIwb-5`A^9A+OC;>l+C~g)%aN z93$9`>y)OWa++$=dz~YV#%wM2DQiZ2$>$5n2fdTk+-`G35cf?v?~1i|c50is1;%yS zXm~E)X>DtJS%+)DUVKo1QB+fT8-QcbBFmaHGBkS*h^gnx`F7?9c9Sd(P6lK>@H1^g z$22^GCmm*ddkmUz9=$Ly;0$p)m{$oo;sM(#`?{}t<)f@e+`c@u)8Fhi>*nU-gB^_U zq%iNX)wJ@TUSl5D{END_A$Z^Pj#LX~9Ug%5Lap{0zuuW7{9TV5&ya9^sdU}2SbwGj zY4WGdbFjyOtvG1kn#sK+|dn~@fh=kbdHdxG+9>g zkOz{qlU(2WminthUr5-Iqivg;dzBSO&8Iqjq{nm}xz{$g=kwne%DuD3|Il~Y5zXVi z&)sFSFRtY^!Ybo7A_~gP4~-3N#22VN z(r9kGYMyQNmt8_(kT}7%ZUGMESI+k(C}5TP`r@vT$KhmphT)Ixj7hJ90L8r2jGP3L z%enZAm9gv2o{B9B>O!Os+k87uS&Z*p@2BnVecHVcFlXrDKj~kkPGasWHcy@v6Vaov zw!U{UD^~x?Q3<7D#u}rkN%&%}`nn-)_7cCh@rFhHL0uJ5$q#0kWPX{BID66|#fZF= zi|&qt2fdhMdQ>H`A)Xs03B1Cogni9KVu@B3c#`I-#Nt zCR&N&>*aE+8RyyE+-?NCLsgWDSx$|coB6ruXz`rmP)U?Gg*zhGuF51{JqNnAii%aO zk0v6O5T_l#r2?ZqBYUPPwn72s?8}$eGt&nskoEyUrjX=*=0^HoL5jjp8~Qx=pH(~7 z`nN3_e5()nz2P4k-21Uks?(-cnX)iBwkfqzR}2Aow5&TLBd&-K z3)7yNIl>2oHPJ@ixJ-5L)GaV5Wd8V^$6@Jdh{v(%$>o*GG3CR%a|bRwrJhWTWBprg zF38#0>l9QB^Fd=8dTwrk+G7uQYia{7mRpp2qY|r{r^d#*5P}Sw{Nr59J~}oyG$h?Q zvFLC%Y<-`KlDjKFac~mGev0ws7O2TWGM3pH43Avj*+_@Z+hG1VhagPLs2wja+r%V`no;mZ%w+=C@K|UP zi#0lHiS08XcP~J!AxJ=CWi81TQp39a20|Bs>Gy!^SZ^$`U}AnnG7u1rE|CJat}X+< z-&UuB?+FneV3-&(n}DuSb9r_a=jZoCB=a^Vdz>;En`Nbe%44-j;t}E9cq$+e-orKZ zx#`iZ4-EYL=~eNQ0=+*>pPfvs6E;{lCd^uB%C`Sa=)IA;jh>pC3e`XU!#2$X%y4o} z^bJ$P>GIiCU8`?GC(i!`!YJO=mr+>Z8~j(%UomfCJnU0Mo`&Sa-XKj^4-Rg_U!sa| zr8mupx=o`Jd)t4)HSK>Bv7jCv-w`4aviY(QnS0u)bRGONPJ)(B#`bL3kEb3_Yu`G# ztEet!ywXWjOw4O}e(EP0@+}q?Yb?J%ggWTAZ|13%1Y=X0dU5UkgMj*VsV>LLPub3j zK_(~)`~r}I=beMuLgl}MfgZ2T!uu}WdK46ObQiM=xUq`eJT;kEtoIuGgnJw3>T5Na zgoS&>lLca=SNz5ec~+0?Ir3DhAANwd84;%VbyE7wQ+^6JJKM74TJ9lPwp5@`!HPW&w8?6;xcm23htijvP~8xjoi6Z@5NYq$m^aF zBRQG}>7_aURjy}Rei_~eCbxCE#@*nM5IHsZj{Q_@;BFXTuw6|2_6`Rgv|X}$lU>~V zvu67G5@g2Ap9y_w4w$|=_d4{t3z9g_o+D9(`yC!iCAsgjeElll-mWgHr@)SeRtBm) zw|o3cP;9k=?VROjp8iV_ktJ4$ePgkrhs2$nZsT;FQilk7rFkr_de)Pgp78er2 z6;01GVV{Igk8$!TI2aOPgW#t>af#4m8D(F7elgtwswhiN9+mOdol7r3NR+Xc3>}$5^zY8UpMR;eiJH1*3XDxV=d0k z&%RH^rI>3jF~RM=ar?9@po8vNdP!PP-Hac;Zyo$sP&-^i^c9M!Cu570{`bN{-_H+x zI)Y_iqqeeRv-5ESmFo>+S|JYC;9WwbaK(Bd-+2KTxqZ%29FNM zB#aHu$Z!FmaLjV@K)go{{Vm7& ztr}moSb*_}nE2zrkTsI?;fU=i*Xy>b-7DFLkMO(!EIaHr1K0wHRV(lw_)$zjiT$C* z>z9^hU_k7;vS$0@(L>zi50H4OnX)AknQv8YGt%SGIaGflu=p7Xj^Jh7^In{T{|c_7 z;3=RNdgbOuW;$wt$|-y68K0trf&#mmWer|swC8uZc22+NGZNl&oWNoBe zXC;x5X}%b5id~3|*JGaqiAsPDf}5n4C5*Lp9g6MZDJ;x2Sd1bt;^nh*byZ{Y>yT{k z?!33|$rdijBU%#ahZbL8xV%wzFk=WeJY|mSS*h1td%9HXC;K{qwPt5|<>1uF)L3T- zNbfe8$gQIT9`@ln-ULMF(Vv?s?%xlXsBq-k-p(K2Mz@%BWg`*v;~<{MgG5f0jfXvQE>&K*+V9F3%=#sqgDaE=1zN6vn;HvQZIEd9jDKc zd@*X8PMp?)PDR4MnFSO6#`w^-nBlZ+qT%*e{K8PoRIPs9mp*Tm#)sY8+Q#d~w?Q}323>oMQ)%2UwSs< z8qMZ>yZV#T6=9_m-iUG}RNMjsQFYmUtS5V2t1K?5P_?xW?W6-S73JUc7ALrorKN($ zVy~==4LuDf9F5mAD5_;p`IuK-{&i$1<^wWA7cUx5in1|Nf2hlocTZbh7t? z)r&7K-1hhPxt;eZE-!D1h>6L)ee2btlaiNbmeLd-9YnyTQ>4sovvfBtEscVTs@P(h z7aYp=_VxpuF*w9yRi&Q5V{6d5jERNS(b<`rk}}_Un+jNF6ZzJQJer=4E}*!WH7-8> z#uI!SP-vQG&y?rdSK16p!V(g?=?ZIpt*t#nlF7tM8+h&JcHu?EZOg&T+|U_Gx4yQf zWo8D8K+sZ!S;A`R>*=M(FUa3B?CtFbMnFN`+K3Jol2v#7s@; zGG&t?zPkCjS)Vh0ePd%`Z6GZ$Bt*Aja-z$I z%U#h2XPbq-TZ?+Ys^+$~5|a^HbYgy|0r#HHPBM^y_V(94zP>a}Oc&#G^KdNNO|Z4K)vMzd&nX0d&COOT-FURLv|s%F z$%KTGD}(#IQC5EK?k)g59(j56{s93z4qH!_mzUxEvW=}RNHy9h=le<$SOCxl&a&<~ z@dL$t>2;Z(AdbGnOF}`nn9)(i;*t_^DJfK{yQ>Sd3=H3Y{){_0aoRsP$j;4eGAV;c z-g<7l{zz3#4JLD=ZL={ zTI8k(nq4)18~cH0CN>@T1OyY+j!cTVkqmG^6ZG;<_~#Db7>InsvW@jZ^F1?80y#N3 zq=?AKBEvpnI1>zAdfziLaH^++JM8LgigI%NXJ#~}EVv9xV!>AY-JO*MQD=+}ND~Xe zyn7p1c9Y7)va<`O+F2UH(HLMJGBUEkR5X14R#8#(?ORO5ftA0Lmeh1~blgHbJP@=s z&o}wv;p6LQX?^&Ff>CU@{uV0f%mq!p7(OC zvmt$}53XW+K#f5W5a-rodRAx-)YR0RFOSBIO-*&p%mRIUkok!*SXfvZ^?7-Dp=ayY z;@%rg&5!}3^x|U7!ZArTH3G0NkB`TBU$5O73oJm@AejG| zaM(2*pl6AdN>5LJ14hrzjvWP^@Ghfm0q2c|#XW!!g)w75NWdIHW%NF0$NdL<$*!^% zoCXz>2rP6Z-V)ufNsskTeAmRb0}%G*3I;0bZOd+^jO=W`j0`HEJRTlio@&|sw1Fpi zl>Ywy3kB6X_fLZ%N#N%vESU)G10=zUnY(ZG;Erid#$@!w==z?ML7*cqm?b!3U1GB= z5lk$=tMB3D#N8Fe&}318MMM-dVgi2|inm_@1Swc#>U3WT>>oJGX{o4httZ+N}fW` z;@DAV8gMFN!G!v4!SR{wZC$;+1}*;Bpxgt4gI+^C%~1^TOvZex3h&b9I&vn@1ZAe7F09pB?IJ@os+Y0xIR=`Ue3zD^~<27 z$8PO-4C@a);MZ!`{ zi7|2+>+f&)X}|d;B!rrm7miMjh9)Kw5$c=&-0m&ywQb{JVF`>c>fce#q%Map0aGl1#bcN@Jy!!7GCIq4MhwBQ@yRl!(tgW(Sf z3ThB3se~Y;82kjB?D7Gpm77bq6e6C}o@169uf!^?0;kPf1H_*E1;KMOwXr38~G&E2b zZ4%L}{y&a1XFic1M8zy=>5CKM#fEVc8XPXTK%`|FGK=x)6LB2AFOSNonB&;oOJ9nc zP_lG}o)Gm42bxXJaUQ#Gk%kyt{bQT0yJNW#5X={FXlo-cEHEss@Hoxs8b=Tp+aA6q z5KOjA5e_#^09>PFbCi*ix(~{*g2J-LCog>w;roO3U5x%A0U23GT#k`XTQz(Slso5z zdma$QsV@#!zFwhV>1h0k=Ahx6{h}iXwBqyHI`L{`G`@00qm0g1-IS)Vf9@R~Noh^U z+n=)}3Mk`RU&iun zlF}@6O=$uT8J4T8SxDg9RMW5B&LM;7hE{%p&w!`^8!R289G=}(v7+^Yb^p&IZr9G{ z?B&2q-=~Oo#-9B@3iO#7?2wANu?s49QV&$)HlEm^t2Y`gz4i9SQ;AY~ZRpA-+`F!M zh)?`T+`xetJ2Rx-(z=rr2ae@W;m+$8HYW3VtfRBQ z^4Xh(m0!fr)sz_-Nlc3Hp134)d_F{bgEPOI$Jg#6oqAK+IhJAJM!yDZY$P(%K;017 zVZA5bAQJxT?)}KCt>8+n zsp&*>sIW@;*=9Uhaj65=FMSgGgxZe1ijUv?(13!Bm6p3_=Zn6X9ru!fps_gZd!l@W zsN`>%)t^ec_2D@UA}=Gt5(7-z#m$fKcz?%>zm_276twl*;^2-$jhhtgn%Gr;m{f)!TQDuW%G2yl{vz-%tm^KtsY9BiQZ_iD{jm*jbU`XyU;?8->~xqO$KE53E|z^4#KTn zeZA&a4ZCeT;~}6Zni>5pG}rbBi*NfZWAUhReaEb6(HcUc%x(b45e{8g z1}ci5Zn-NcB{c6IBnFXwjB4c-6{Ete1?hqiNG@yuiGqSLrMiS@RZ9pebu&qfzt!Ts z?mc`i>xe>54pW?W^EOd$-@JWs7-& zpfA|)d?NQy$)ATN+G5*iUpF{?gc{yr1Y37bV=MT{RT-5&cY96^C1gM z#!dd}3fmc9;ALo?JktF9BV2kmuXQh52%%R8Z|>ZTj&ar){b%`~MDGRD$22wy60*R& zuX$878TY-+=|=(ZZ$bxJkNvWYP%aI{#5Z@hsc3n9PMY-quMZ0wNH<)b45{pAYOObo_Jk)0YnPjx6Q4TI-F{+r6d}01dmrt zkwCok80em|b_REtwLZcEyV<-A2j>o0`^O|rTsVQBaF4H1>0hIgq{k-&IT2=qf}wHe zON&ksW^$;Mgh}fwQ_7WMnZmJ8P--D#y`N_NmrCc-T>uCi9$I<3q=hx?n?}E^vCiDb z@8d))F$_3_EY@HM@1T5%c@Q!tTsmz%uw>2|O^yss?^Nq8@RAv}b8&+tO}OdgQa)bF z-o6}@Ai90<3;oniQHgXgl?mn4j&{_VynEt!Eor>N|TZyp!?bQZl5*9dD7(Tr#9P4Hoe6(=)3RBZg67S|{-_ zcYY6AU~+!shLI%|3yr>xUKumFZW=i|r^4cabj_0yP&e>daBC>#RJOGl71fAPLSKv2|H7p+5b@bzm6Z8N)=;BuTnw&*+2*64p_QDqZL zAD6UvO$x}UN$OgitW>QTnHvDh99*T^trl$Ud2|qQ6b6;BlhbE>b9MWdvK?kUCeZzt z5%}Dp>hknjrOC10*-EC%-k@b3V#wuI!Wq~#es34O*79(KvFV@a)_^%=^6LSg|U{?o({ zo>-xw)$L9`V8aK|L72?KicR;~Bt&Xe&v-;UYPILtPNuzYk~NI+#qZFt$nI-zcV`pH z-Tu)j=Iv@3My_fBht%C3t@;^dCJ6WLN;zVfz8NIT!U(1h-7ubcBc$@qc|w1B=D8=v ztxJJu`+vfAnat2WVpWj10sL*MM%#R>>SbFy0mxnR+mI9!Kz+=`7A=m zx7(X~7#hA)aD07dhKy~%)k?27nArGM)c%|&-9rCIMUxzq^-cT5W2UbaA&`)^CqRVy zC7>cSepRa}LqP(Ar*DSt3q3t(&d~Ha%CBbQ`%<>$_wOr#FZOI96PL32QA`mW*!`Li zolQFj1=d!za&n3F=^+OPx@~dZuK(y16uYwNlg|dNgsmEsf-YPb*Li~{L~%+T8ZHB1hlX^kC#e1 zc+7DG)s!p8KwASYFLD*d$IyDj1qGD4y1L;d;ohjP3Rt1Z2d< zuxprw*tpVXOu{NXKvtKQm#z1g#Lv!Az61xSrl;QqWLiaK;-xPa69Jb+GmO?+YJUWj z1gujJ-~n(qzb7Yg=?l;ZIOlAtxNTRuOApjkRi803Lhb2(bQd-&69-4+=;$b3I00}n ztOb0AdNDw)fM!BMjtq@DfHZvn_D$;}c|1vckEo3eYhlg)eSp}IxD#apMalQ}_8!E| zbsGRQcy;9w#rR$Vz#^-k5GV8SoThRpB9VX#m`bC8p^HYuFIRHnxPOpV)m;Wj|}F-8jx04M`pm}8}C_B-hy+yFeS zy}KKl_W`zP>IkP6HerU(+q=2|&m9~bgzm-mSI3L$XwaMafQtM1>t9G(WvVK*E*#<= z;wLqNzy%)nGj@$a+@}LDeKnYf z&x)H6iC(iVVNBE0U4j8kYIq_2`*-i=YP}B38V$=o+|(2lZxj?n0A_~x41h`iO*8Yl zEGlff7%KjBv-RE1gp)R*(b2eO$XwBjV7SPN->|oTP%qxtFoE4D!%!?gKfll3(wYef zWI8WzsfTM;4}d%1o)+^HB;_KVI~^Szg#1p-PPgi{n|wldnbgVy0n0$P{2>YOy14j! z!^c}&Gqv%1d)6>1(*^j$ELWnStlSO&jMG66mvxmopgrn#LXc$|8yRWAoUq3@ILP7t z9S~%xRao4a%b&I^vYZu!5`apzgSl0#tu+z9Q|S9@2fz`l=6wjf4uV9k4Co%qEJxuj_01LP9obcI&PM3^{{DZvo5Z+H*wf_>dXT(Gux7{ zC$YzPVch!W9x_0MTFg&x-`svV87PWxJbG|J$|m}{0SS|wNN{&d@-?sF3U58nOR)oi zG5bW@HX_HYq9W@~f@yNG;H=C{F*tbkyTmXADmn^p-aHlmUF}$i7{7&vj&5RRCdI%Y zwsd^HY*#m3H9j?!_wnP6mPH^oUDM0%8goMNG?OyMwg=(Q9%U5hwgu~J1ZY1&tdlHEoAP9gqUm3~0GNKZ<*_oEkrLlo zNep3rIR`g)%su)H`}1g?h1 zYzjEB{F+rZ1>T8?`I?xR3=a;b0(MV{>DT>--B`zy@%>MQkI$bACd)JG=C&w1I9h z=*M2sxdAiHpxl*sSOcAmY~?CyYPkUCN==kE&9|eXJ@9Sn?CTqYI)FiZhu&L_LZx*( z)p;vr5VS@utHC;MXY0@F3AsJ;$3s;Kgf5EkZ75p;CB@;_;N09d4fmsWP^JSzvKCm& zK&@Fgx!p^DaOxIYSTb>qgoIQj($IK^=hWvcC%53Oxp_Y97Kc$iE4Q#t70SLUXobb} zlAu<=YZ$I3Z*5%^2SW@;p?qwxas`!CBS6h_3SfTW z>X1J+9jmQJ2Go@3e4A1bw*|eSWn>)PU+#jkMHW~_1LANgsxpAwq2dew-a9Wxg1Sbe zcSm->@W^jaX2Zt8foW<5Z-Bomw5CJm$7be9Q+-fvy^s896_posL$%7}JEmWAI;jgR z7TyJlzVq;?Q_NGgZY9n%V$T89$yX^61^=9rpP$H%OA~*IfrJz)i9R%cqEisi&_Y93 z_-2dWm%ZmRj6-#<)nHI576BUy_;?r;TuUuy>$)c{V5DkxNr~;Cew`;`h^d>K zdTnj3iIGu1AkpvMzD*VOMb~F^PLTMX;eG`c9rOUPO>i}MJ}F=ZjP2|c21WW_gBa`T zrhzX;tPEtUWA#9PXTmnejyJ!cfH5*E%H(u^Ij68t2_al=2hv1B9_oW4Pd2x<6!i7K zLroEm=w|{3zCBaRH?(P8TmX~Tpl0`Cad8neJrfj;pEv}ENrQiVuzR8u@4h#bcD_f_ zDFGul^O~+w2eP7=Gz(w{vOg7$J6zA$IXJTG>NEz76o7!hb8z&)rKs86zM9cD&(dN2 z44QT7jM0+j=H@_O6La$(lj~bZ%#-{3H5&KG=;JEX~{bBJF*&~Bn5e*ZTwgVrsJ&=b75W~nPC z$uozXd*fwqA|ai_0zn)0oTPN+c6@!RK7RO=$3uvY{TTUiK+CXWs*)lv!w|(BJhw_B zlL0S-#`9^`^B>COVOA>!BhL$%MbK2}o}oT_e4mD&{i!g{JTlUUt^{LzRy}zA4R-7G z>v@6X&AZ&~!CbSM%Jdm0P6`jKOu}MOp^`awwx67WVvU^VkTgAFs03Y4= zE*BD#mTHEv2{+-_$?Xn%8u-uxKIBa-9$Z(CzJY|a!c3PKHPrFgatY@KiV6$rCm#69 zT%Od>-2L2kp8qW!{u?UI$wB5Wew(;@ZD{&cwKjHphPDKy-DxPQRN_UBQNP*wlVG4AK@LW z(FA^UDRO34mq=57$L>5>p(7?3^GlKm3Pd$bT0A;akb9TLZ&~-%?=v!rjFHth%irdl z^zXj|+6b9uZQW0Y6bj+@L~VLcd^%}!uu*Zkn2GQMz^~`NhZ_$b3g_pT;Ls+@WLH!R zw@~WuW1mHSX~U+cm6KJfekpuQe&Y}J$vc&IbkUP(BK#RMJHg$iaak!6jaq)FLkf26 zsWUshQfOZv-^Ix-t$E8BEmkxh^OJ9qT@WXdf|Xjk#CKDXu4DX%)I2Ghpz{hE4~sVw=7#8 z{0j4p+_Xa8W-BP3gJ92@RkkBBR)xJ*_E~>ZSNOD~o8;Nx$@p42SMhQr2k*d8wlK=y ztolN+vIn?b;j5ACdsNj09)6-^O}sWI(nod`uw02(l=?#!Y=p#Lg&uahSw8W(|KJur zI)=no+FYEhZw-a;@Un8kH)ONG* zHsLw+IXibzkXK?FVkrvp?^Fe?8J=-a$Y(%_1T*}@BOBFrVXU;DL_z=P=FySEX8Zgl zK02Doz=FO_)l{tcW87#2hsD&;lS+E91QIv4*ZV;~P>$;h-WZuYI(LA4)mPS5Bi2HlKS%N9VC`btpcJZw`z7H7(iM-rL@n`M2`1tKtN=M35&^{wO z5k=no`9GmPO{Cb^(GqcMa(<}3BeP?`)Pk_~A1>8=kLhV+9pal(UM!#AU$T?2Q$4$X zUtb)b$gh3g>Y1{7YC-R!zo^*bkhbCJk&Mzv#iz>b=B`8HR0|uM+i%GpDM9R0JhN`o zQA{5s;sbleMn~KD)5sMe^L-{KMS-X-#Dt#r5i!Vyo=VhxH}9|MgT)d+2vctUbXdd3 zD=d(Q_`{WY;Mu_1m$%tVJd>sLl8U?nd)nVAyLfk#-?4`E&kLUq!=m-bQeZ~|17G$J z+*Nif!iy&$kU?7g^^jvpgquA*Cyw{XuB>a>hORHZ@b97+wSa+}o7w)c?tm1NR1%lw zY28cgvs908BPv=M=4FMbVoMw_7R0sYHKNUrKS}5G5b&ERPO<@je!5d6|my{IRWfN``ua zXI4gk0y*@C3^;$Kym&W4&%fB$$u4zAvTM1cD|&KUE(y+Sys0qjR;UGu-WP3nArlyk z+Qp2zyo&pbNk}t|JgocOs0=IWV%{vq;jv7dJh^z>?|We^gv1eGE1=Wn{>64#B4|9?Dp6$fp&&>XAIZEkV@nnU z%wxj2W~0|f@JL9)yO!UQK_D38L({}>d;6}hZv;FV7G}r$9f(9h!zswv#7t#wxp00n zC`9&fBYnu2Cn3BKrLwm~sgYgUncvwzI5?}YLK3uO*@}1h0Gk$vpwH}hcx=gGwZp}9 zZT#dU#_i6PxH+;{i;e4k#8C2n>| zUF0A)V5^9f=~{Pl)fmb?XFhiU+uIxX;ZwprUli=SQO}tAa$h@b1PNV!Bs;zJ%BE_X zmWDy;h4yn{%lDM#M&D%bc)y5@c-OxDw|$jv*y|PA{oDS1m9-#sYinO9eFVu!q(b*wsLMQ3Mj#A=VnNgM@eRhiMA&FTFM zo1g0UZwEkp54sc~L5Yn|_@>9p1y~Nx%c?0BEqkz`U&qmA@U2kk`*I{`@{)tA!dul8 zcz}xGlc;EE2w7he%O>r+-?8EDb$j7G-~VRC5Z2U3OB_N2TXWO=sBTdq(M6Yedr1CO zS{f})ZbVx+wPl?wc4XP=J78`@6*y}iXsMC=En!U0nq%j(@h}~$Hj$Q=QQjW@K=|UK ziI4|{ZIlpkNOu0w57@GTqDEwF>Fn&7?Wnm=lW@*HwoGjG;N)~lvA+pJmKy!g{2Mzv zkv269!wvto){)8Sf?|K#NF_x&_HiNeXMFKss4v~8b8@o7hoIAgSl;lQrDbL#a%0^> zNyT}jIdVkGx3w*m*JJC)+iX9AG<08Iy|@f;Sdi^thXidpZE90u?y*@MsGEZczwe7u zrltK!270E6_K%~$6lB{;ET#>J3*}lFyZXpG+0`>1;@r{craCdszI{6M^x+#Ho}FsDgnTJ))M`mOWhB-YNeo7BUr{JaCAXw6kNOoSZ7sY1^$Ut!r={t~{A zCS99C36^XNLazjFgvT7?A{pmPn|y$Fq}gAq0v|EgTN#tVZ=~`U4RALkErQ#G|MTSw zMf$F{ygk@0H;@`)zYmR4RyjSi;=E0$M;R;CIcKpCo2Cb+&Dzlu8>UvH`$}gbKkD_9sST-U`5k#(^bVC3^rAbE-6={(wq3K3syFnto2t<@# z6_HK?vK6ID4blQqLx2b&lu&Y>-#+i1``+`;drz4;XXeh_znqZxOMdIO)>A&ucde&T z4=&{a>1&+kUSl=kCM3$*hkX$Xs~FpNA0fUn4&oaPUgkl>R1mY<%xisRKFl@fd$9xLX+3U%jF(}qH1Vv?oR@AybHAmT zYd}fEKlpWgAlu}DIB)j*`@4;mpwVd>oxcaHArac=P(dEF^OCy}#Kj6|ZLEfsEIJ_|?sR^fl0`qjQumW&ER_;%n9aVX>8u}9#40Ob7;}&m-Di!f+NsNoXF@Dr3V)~ngxTU zLpp7PZr)5o0Kx_|B};u5z-1RGIz0SZeE%*;%*`FENF-a(b;|W+I+*v7g4p4uzPZ50 zK#^wv>QLYz%~H~5&ct?7$7aN^0xt{f$DM`9cSaAX9l5hs&SSSJI&9Yir)Aqfwuytj zJK`7s8qlPpqo<(%muFnGR#ke}++fuQkdpE7@txfN>>h;}Fg-gPEAN{P85cS8%1gK% z8wEwh+_Ew=V7Y(zYY>o>51>@NOxNIGfx6$)iAbI7oE!|KsFC7>US#XO8ox3CpqZ-l zY9r~I#V8=N;+Q@B=q^aK$C)@eg=Dp0U-zmaA}bf*#xZ;Y46Vjr>|@FJ`2JnU;K1{Y z-fD2=%5%^U!Yn_I2|IYEBkH)`7-LmlMJ1PmlP4RJUtPaIlI=N)|NFqjHzE#k-QC@e z)Q$`moZNrL@wLyr?pza#a%`F)PbeH{&-{GE?cVL%W3PjrqV5m?2LLV2=eK!yfrEo1 zDm|~TQWtOrLd>+ZfevpZiz+N=cDE~miD%X@n7 z&TL?G^AD}omg#1emi?D!3CzRRe zVs&;`p@tBZ4qCnJjEu{XU$7HrK@{FY3|L#Fus0|OkAu_OPpxijI`(@g3FhYKcR{Bq zg1}a9SZaDvu(~Ms0HdEeaROS!<%wh5s^_1Acr6c7O=$IXtIziWAR1s{9h)0#(0yq` z7i8jhki|y97i}rz{w;=RR+3h5|fV zAXM=1F;NH+w6W1})N#UKp6%Yfdl8Ppr$URg*lL@iq4@}()T?5V-vG%oq1%aJ{{*aVlWW(~;%#skAl4@Ghr5|%Tj?yutVaenH#dl% zJKKUbJ%CzY1tnrUnN~9u5HtIrysApoV__1Sz2yM5>JA%H1lu4iXcYr>7e^2>M#pWe zPimS0zEl$?!{C>Iq#LLT@XM12X7D1Ksmk`>+uPHiesjjA`UX6DR*Vb04~qrFk5cbv zpmU4Kso2Kw18(pGUSAFqzrtmylW{!}Pn81V2D>eq7gGU@=VoW?0Q+u9X3BACxe-_I z+^K@`w5ar?3M^yH%;I~BY>Vtw5&Js&8%RKfE{UZ?hJzoJ-*8YdkfRW2xl{yFs-1@z&qpX;~X5O z4KuDc*KI)?ZG$n7i#sT!>h0W799{ob+~MhE=YjHT(xml;m{k|Xi^;jt zyRgTute>@n-wfLSamK1KZ2lWRdlytWa$9KWfT00r!exv?{Q%Ws?n)U#zsK&*&Nr~( zAmpNGcUM<7>~ZOETE^8_R6l&T9!T1~XV3WjLv(h-C;D=e{1um>YTpj`tWM=)cdu+| z4);_^p_(gEyKWYOI{;7BZenJgp(7r(i%ar(c)0#hxIjv$Is-&n7FiQR;>~m-IMxwri zLsF)GXL5(rn5T+liWJ8qMjg1B+{Al8 z1_v!jy8HTa!Jhl7r807*1$pvdLr+IBl-Qd0hVMZJ8}|L2u_}j%^R&mvHViVsV3*E^ zAa8a-^=>{SEF9;U6dmy$>KEzhW540! zfqlaxL!3;UYKj5aCfmga4@(W~wj`|WR4P9KGZ*}2w1xrC5$Gd>j3r_sVP6PHiX943 zo(P==%Kw7% z0HKYIjF3S9@PDuFx9uwaD?hi-MedRe%~2?Dx$a}Ooc=xo2~|4$ z94Q-tUA+b<8NOQ1BRu_?P14`McOvEs;siiEUGW7a(~umP-`v*LmJgFX5$J1#pmJ1& z#aND{bJW*#1Y>`^NP+@l31Dup*ZQhzE-EliP{o1iQvfHxoNU84i~?2dhW4cq&F>}v zcfW8}zh)roh5OvVtJ2b?=GZRSNK*7Ej6biu900+w zzIXQ8J$J<$K7TIpm^6UL}az0TlQh?#*>-(e9EGl)dshGJpJySp>M0u$zc$V~3XH!z{!i-W7^ zPpJRfVgpbUlJ!(~IjH3o%Mwf#6;BEtZgf%RA6{H*N1-xRHUi~Q>F3|-a4ykfWrZTS zFn{(Rdc6ZugIdL%N=S;}94vaD(X%ds{1Gb(HM{p|oCq0uNPxgo(N1{>_h857eUMDG zz`A%P^9shEc%TMJcqF!P)~?4GSjy@f0W*GV_wHA*kv+tUF)Cc~RHAtAaIu|v+;z7Q zUrtHQvz-4($!n|cBt7La-_6Sn=sf3@jEud@0avWDioncct7F4QPY?MMU@HC?y_P7! zc0u)qIwt*r*X9fRG}f|g?deA~{sSA_6z5>B+jiCP1UBtq)*t!hgTj!EJvo9Zg(Mn? zU&UZ*nCs~jgSPXRYu7)~QSQ%u^1l4hNsalmWzVDM=G2np)-XbnE}a|gv(9sr4Ebr} zpM2L7JUD8J`ki*}@~B?a-^T6V4C6n2`Tn!W&S_{iwrgWUQ!{(~wAo~(ASxjms$7e~ zBAe&W4f=PM(1dtGg?-2NZM0A}pNk{*I4#Ie$IP{Q;dw2M`nc^Bhsb(u_y^9vDsbU) zSByvj%WI2yS%H}iY=&h8niDlq4OO<|dT~gg*I3zd&ec@@aErg2d7SVX1rM9zXxHO* zq8Lx*$lGfJrJ6dC_aeoqb5-;nNzHi-ghMCx?wmR%vif^Zfo0YW zwai&*S28qDEQCrIrUTrVS6e9k8YG1{KO7w9?5~YPY8l^eqOb?I2{tP=6?aj5#K;b) z+UjDje$#*%dy!6iyn3dm${7rlcB8>@fk%@&Ih+g^yryjtF*Rg3khlHAp2bztYPAJV z+0-X~TeV4V%{4PZH^h>TUdx`e`37M#*~FOok#CgsSxR03#CDg&L@_2Kd9djDu3;`+Ft#XjO@W}BxXCO!ov5!HMP${QF~5=2 z#R+X$KYrYT8a7n^ETLS7qz2w|135ROyw6sllowMe0r-PbH?W_XFqo1Ea+!E!d@2JP zts1;^>&r(%(C-TlP#^7vaNP@JFUiab^})etBL0#X1Wo)_dJwO|Krm;uiRz9OHxD7j zT5thgD?e|luRP~uPUjWfZ=?AwB8Kqi(hENddvlpdH4MTvF1*o>m=58$`EucMZOE}< z05RIm8%$GViky;?>Y6xm&Itrp?>kQ4I`mmt#ACR23o_6K<{C;$*%0AM2h8hPyt@_B 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 cqcP9sxO{x%wK7;?9X!qN{0ELFsmjD0& literal 0 HcmV?d00001 diff --git a/docs/images/platform/secret-sharing/overview.png b/docs/images/platform/secret-sharing/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..3bdbe8878c0d883f2ebedbc588ee9309981f9b05 GIT binary patch literal 160467 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

sP*pI;zDOQhQt zOwT$!I|ViN6V&#B{K?Y+=Dbqo(4fAA@qotUjA3JgiDT zj!A)En<*!My4A`4`6X?{?47GH;={13G)BX1Vr|g*^SrtCI^WK<#a+0dQ1iXd=Fy?T zf}LOIrw%R)X@7>L9s4rv>-@Rhg6XfQw=(-mu4~Rh?g{ZU$DgPU=5zO_e0X7z^FOTj z$)fho<#s{>eq8DH`eXljwov^hOX{VGYv;ud-I}{gkh{6OUdVN;aAP4FwQ?1Cr(;pR zAjUxk5+XYUlwn8R#`hWQkN-!7|NRd&^wVuUnGf?P!E^gShMatq{e9CK58jJE2^c;X z1~4j*o_)@xr>}p1?GEBx?e;hNcNCAM{e8Y%|1E`cysCfH9#3Ia-QSFn-q!=LnGkD( zmGB=2l(sf>o@LjE*iS_H2i(i~Q8(B5^x+nyz0zyHv;V5bJk3ukcTa*#Yxjh_!m$Tw z#H#1d<{xS@y~G?_PApT)9zSF4#-iG}-abU}cIrF~To{Y1M9iKrHiCr7baHEv1Ex`AK%JT!~;!y|KS*$~g z^|!uyrLkR1_J7uM`3XynoN3Xd9AAq&v6!~<$04&n6LIDgwp(?`qgG8r0iB!siyqX5 z04ylW(dKX~;#Tzv^~RIWCtSu}s%WR%$;VC$r@KHNebQGCmtJ?mpVBbGzwkV<^0g;m zy#E@fS6Cg7oO1Qaune824z`6-*ZGciQC_@-R?-?3yCl7M7SFg!IQ#rCeIBUth67{& zV{fs4UHtCob-K&Dk3SQ+TBQm%ETh1o*BkpG>@1EIsqx$PTMe2j*%wQG>eX!-jTe}`d66Bs6Mb)f z*gM|LCV{n59jPs&p>R>)%Yp9miEq_jU9x=ebvcXuQsurYZ;xc|i}@U~Pv(Ho+ZU}@ zj%xJZ8+d)dMELOjcXz*%LLzS^hOr-JpS$cHm19DT$QHLJEQM3`JqW%dn^z6{<_v&d zR0T6BKuY&oGPTtVvHhH!b+b4LExbp@2(KYA2xpg`cr}Q$&j<8ZQ)Oy|!R3>^Jv}{S ztT20(MzBcO0;wllO7G4=<=ST@M+D*B-%?)bv=&&gj+*aTR|CC!3o3Syxir%x_iu5c zb`R$g;q-N_o9o|8o#{1on&D=y<>v~e!DT8&%9SVx5(ea>$=ql=sL%#AGg1Yd7V8j??H1Nm6x zO+%H<5ygZ8?k`rb(c}!&PD=bmkwll(E1dcxkxmN4PAF$S1-%KhP1n_|mD^PO?N>u#SK*XqeV3tola5%u2zY8Zs(hjnD{g z^1wORx>{n66mgb)d{!Y+Aq^+6n>T8#W5}g83;vr)QDx9z7EV7jD74#|i?iaseEi2Iu6p?Oft{8m+v{G<{M&GARMglK3rL+wTPUlDiu|y0ugN2 z2<9R5SZFIig62KSDY4-_-%$3%$idSe+v>5oB?|ML6EeVaF~%@i(hly>H{PKvr?^E6 zejdAxhGr^I4HI%xwf><7j}+;Zclhi8m;5Hdq?w!Ct_WkM6uoR_aWwm#RS@Wx=ls0` zg${Ux?A8#F;Zu;82O5oE_gJ8J*RC_*#iu#2Ix0C9!z%jb=5RIg71A*g`(V_xLKe1a z>=q`y+-c2S!?XaOxY*N@HUw5eBUXa zghZHQ(7)@*)=x34LXec&)^c$pjG$B`!(Mr#f4`Qa{bP-`J3gy(=4Q)zhWvI$$wzSj!xnw1+0u(wplQZ(FcQ9vaVc22Bzmim6rnex4>1~ZO%C}nn zV}TT}f9GI%eSco6@@C)blves`mZ|&D=}odTmn}27w_4V{BgS7fh3itesg-upenqfG z@!{m09X{815oB398s=x(j9TN*N!zP*jacuLP^cV0b?Aoj;=)&R;L`B=65o$#{{)4R z#cI-+vb3|`lhMUbE0iTQz2@Kria~zysw5d_^syFE+2rqNon9{zy4QbZZmEr~cc(Q^ zBV3u1JAOih`W=;)p4+&#-p}8->EHhHM49QJgn|v@=&;}BS&1zxG+z=QyPP@W+r!WX z`WMuQ8U(MqIrKb%ur-bIm`YQp>ZkD*KWGah_bS>srSYJ=3brc+y}G8`n_X3#5XAX( zo0+TsuJ~<#_=i_5eP**E?{!LJiw%{4LSF#A1X+Z^kfrUq&MR+?srkPfc$Tu>ViNa? zN0|}gBbl5TjFy=jLC4Z!IuzkU8O_w!B?5_vwWp_gvtUcUx&q{s?6o~?y6Lo({-)#( z?R8$1%yc+xZXlSHzte4!=(RhgurTCO@T|wL$nI>xM4hT3$5mAw#9~}xz|w2cDYt{l zzDs5vW~fNyZb~TLhQ$fNwXqajsn(&}4JHcHnMS8%iw(*A-U6OumK2;-Nvsk%KOvu#dj^QyU<}cQ5*3w)Ah!-RnkhbH>tD6r( z<>wFh+dD!bHY}=={iLPBOzTA1$_A(VR1G+K5RoYo7NM}Xpc_7uqn(S_!z}8cr`oq< zS}Gv6sED4*G$C6QCR^&?O=F|#tI5ATO%OD~Au4K4cy=Vp;3vWoa=-(6CEb&SMb5jG zaAr>&ZD+=dHd!o?)1xYPR|`@ccKS4}4hx$NR6XVO$=QeXz<+Q4oYu|;2)`Bom%~+e zhk>j(8V8t(JJKqKThYN&LxK&q7UiU!nuKHuG}=;ks|dTr&3#47&nn7@^lg56?VNI= zC(+v6ul=FShP&N>)z8b7^)(4~%vXz5ES1m{pM1=2oDp-DbH@Ho#%}qyRJpqxI%m;~ zsv~*#liqJmEoJrv8Yyoyzd{m;nbTF~dM-GKOFdX&S7}(O9HgA0Aw46i@4>X#uW0K# z=)PGbpfI*>K`onpr4TFCl>;-wym5&=(UN2BI$G;Kg2L1dKF8Pjer;4Jl`mebmm)Tt zMq0=zVe6tP>m$bL>O4B#`>agq-=l_eMxOu;F6KmilZ*5T+cDaX^Tg7FH)X0l3d63e z8nuEJHmRa_RKm`Z-RA{R_^7#7@h4FB+aPo@D6X&s-;n^ zr7QV@Bl0u_aah63vBw$>y@{(ki@ws6=b7#s(%x}?cT|1+qRNphD>N+?{(w5IgS5cP z^;V`l^j%TZXV%>fk6Fa&GhM{1>dP9;*IYXo#hLXfLG|k5V2tLb3fsd4c0r)Y1O^(j z`|XTY!$?jj|IW@H8~d;M&N<l7}TSM}hx;D)24DoiTbaYg{NmS`Lq9d^nQnRJQ z*iuDl`YthbT4LDa;EwHZdZG+uWA{eP&O1TOgMctXyG=>*6s!FLT$m0p{seGvf$1i$ z@CGuXk27`ZgTr%jQPu_8H5qpWJXYjZsNCh5=V$j!kC;hX8qaNl@dCU{xoOfeJ6Z|R zq3c$uVXq5cgas zcAsV%na^a%w7lc8(I#$;R!0q4^eMvN!>E{sk?&Ja8ADaxw=4wrt+UsW&is0e!Hd9u z`|;A>793<=z2})Kv~WFiN+qi^R4^!ko=NZU>Ei-pdxPs_Y2=gY_apNotewiB`Q!FE z4Z|TI$j!L~2K=qKz=p`)*RMKqjGIv(Bdi_L>)!{~9tMpX$8JgxVXKC}7wpq1__Ei_ zSg+CtUR{(o&H9bQSi-5)8#qtA*XJfKa1<>;(Xs=dvnW9?6#@?{!gg>_>!1QS8cqz; zQ`eJiBXjd}HKp3BzEiXl*KAD;*FeLA3TW)`4ce^KMtgc$0BLX2Zq6%MD0-j4)BLyaSI5qbS?y86Zfc-F_2*4dAoN1dna#PQDJ_EWv%D;}AZ>Ws zVdZZdf`}!y3TSO@Qq*4C^K&~1P9J3ZvrCuN`N6z}WEUyh!A&UyQS6vS zqM)Q{+IyUPq-^B8=A&MP$b9WEYbUBe8AizAZmBFw|FM6mY`+E3eu11Z-2%yS22`$T zj@Fx3e7HeqlI*EN_*1_|y3NI<){Av*xQ*L){(KL?WbNn`LUR6~JiOYr5-M+HR}iPv z-eJ_4GUmah57(D+o^hO?1MA!z(rSox=1OJtFj7wpj8hqj)_dW?o6m5sSdl8}AVpYK z{nY0+D~9_<8dFer9%ReY&!BH?P#18%F>PFtGb1wM5P7d7p5Q!6K!Sn(SO`U1qZ<-f4i?U5l z&Mp^qXfSD{EG3tdLHXb)p(3}{etFXY!ay`^cqy5F0y}LrVX*8vf3U%0K%TQV?dM#V z$G-4IcEXp(4sr2G+ohZC|9cZY%gzI0XXLVEOLrXl4CZAwEeWj5fa%3w`*;iSesCYZ z_kG~CPu%e7F3fQ1PguT>dq;0QOtiBtqmDb6)fyCQjohIXY|)-M&5_3DR69IHj_P3j zoJz5KR|Rze;ZwAmFy7e+`3pHJv#Y8@m2z`w+KJ5t1R`!^1WI@Azt-jSOBmSLDvrOL zEEK<mU=a+R1Tew^}7T8V2e6EgXI0TNl0p|bDamDTks1fH4UJL9;_H?A-(Y3!wplWs5q zE1TZHMf%Jq%V1J2g7|A}tv^zoY!qSasOinAy{e+o!j>`JdLbb5=ARFBgl#dIZh^Cj zDze8WR$QRn7PjvRS?iZik_5q3xJB%X4)>LTAZx(-v=L1Hz3PRRq=uWUMrrQ`BqlY< zf5!27VO&k=O$|LcU(XUVDKX!f!;-$9qwOjF>%i&jH z2@*r`02GmO*rel|&v*~5U?D#a6BaCSFv*}eF$HT+RoCtmPeX>=TNFGRiO~%xK^N6$ zW7nfZ29kPFs~q2V|5n~ei7bnQtWC!>H@5OJ?=@R4XS*}AvcCp>QPesXc*tp_=BEm; z;N@COf1+3Fp&@LK_0w|Q6S0R!IBK<)8bPF-nCmSNsa>>vWVstt_G&<*1K=WE?0cSk z#U!Z6CL|-wPM{HHK~^@O7dolzsTnr;fM7^6*rU<<~Al zCBqVgtW&L9ZkLgicRYV*Yz0^9_>56KLKY%tTAR3(EMsA#fjiVWR-n|z4MtSL*W>If z`RALvEr=Y__A`!VPh|{8{mGZR2y_VFaIV*Xjrf7WuJ9Pk@i$Nu!x z)YO;G2m5WMzxhj)%uGG)OmAv>kfO}wptv>*VCAl7-!X?*yVFD9ecRN6mkRzV#`?I5 zo68~JOrUOhWOGq1s;oRHNjM?NFwwfGGiKgh#L5XYFwfP*dR5q9sQQlToq^N{4iL+|lxXp}l?C1C`ejVU1fD!o3s~KL;DlptP(E3*2biP_8ha8LL?Pt>H2Q*C z;N>*IOfa}MQS5nt<*;X?b^7UZ_$Kn2Z&_L&QmdpEqc{LrxJHJ``A1e*cy=Xv^oYPa z+O~>Y5~H6ilo&OUjbT@a}=m}Y{>lQ!Di-1y$Ue-A>v2Egvv-H>&jnFoa3W3bqnyfcDJ zs@41IUWi>YRIZ*rlPRcTvJxv%Sm{d832wd&llsN0wIcSFw0!iFTDe&J zZv7%+FgzGlws~^cW7uwZZ9ohUGzcFV7$H{*IZ2DrS~Eq~Xa;ndZ@f{Z33#o9Yzbxa z*l?{_A&2+K4k4%5@!}#QJvUi+WJ3G@03S3BLabLAzEM=mtKX7?=`=N3hGa6{^O@kB zQ-q}cJfoT9$aTzgZI76_5|Gwi7^FTo8_N^AOHZMGP#j1EDzgxMqoZVZ4Y86e_>)Tb z%n>uZXI&x@&{WCE-M2|XPT7j;kt9a>H~YYPv8XazRT&VGfjV1Ldpph4Ci1sYWAiBf zqSN?57`F53PGeJ34RSf)W*L)vu-am=(o9A59=sYaZPnyKouAh=W7;*6Bh6<3h+aQfb)!ofKr)X6sP_Gyi};Nlw>cLS5c3v zejts}&`GR$CB2?jmwyv2fPR;il!H@PkK>T+3CDOpfa?p{=p%&eHNx39d41+pn@f6r zo~F~Vdy~f=R$ZtM{|xU)!A1y_H3=V&s5-{DE%=9kq}Tv(UvNcKQO zy>l9nkAwcYG*YlK(OgjFJwx>*IIG?{p*r%hkz7G7&oOscP%t}T`oNCVPWa)$zR9Oa zVDJ*nv>Bhlgr3G`X@?ORH0{-lk2JL_%6;|mr5vD1x~PPbU#v=x{QY|T(`egs%7%!M z%XU!_?OYn3 z4eVR1L1WddI#M;Lu&ZMrGSpK&zx0wY41QQV7 z4ePfRqt3p7J~b(xO3YZOoCu2q?~bir72F?Iw*ETu^imuq2jy}Gq3wFf;mPZ|JaY7U+{ zva!Qef9yf#hJO%MLqa)`In3$a{Nu+#ij*1pu@|(!N@a6jM|F|fj(~sVgNoryE8BK( zoRCDlE_hMJNKRnDtNY6(X*aZU`Cf^kQwlAIVCvCy8s^Z`q_tuZUiez5=#p5quot08 zM6Z^zn9QXtHL*-KDxjobNp-&zB=A!g=TL#DsP?U8u{PsmeAewk&nZL1>SxQXf8rNd zTaQzUFt6U%Y9bGVVIS$C$=R=Bl}7T*)wR1amVib(80p0(O~SNW>%z51zVpN!8`Q#w zv}}5fc6n`A#@8T3ta8cXNh@H;?PKBH-*K@H(?qQ)nv2h!U<#g|cis1L@vEi~2R(J# z(^`^OLzS6!8zr`Y_T6t~8we*5)S9WHGfW5$g)E7^3dugWHe>%7Rt5!b_m?SAZQ-%MCS2E)|bV^YH+ATwdqAeQ&O*n-Q9vk(W;F4g{_V_Ho zXKMr3&ME)`u4162n36N9>|wNhKOl#ln=i-I86K`f@R>T`wDQVUkIcCcE>W-UxsifJ zmaj5n;0I6~FEwYzYHGfGN!=lgoCEncm=uw%;{41t&MDmH(CG(H?2QVU%g-5isO${l z*XNvJZn9X1$TG30(nvi~SQMizI-7n2ICHvlI5lOvOpg3dBt)0|G!l!M%=hP5ASlYg zzkjGnOiW}z;~bKWRy~(&YiZ_M5Zt0xRw_LAbRDvXB|*X2S2-&$TvR44?0G{c>O3>F zo#Y?-wmX8WNd@SxkKCqXAqiTSMilbDOq2O{!gD*s#b?DKs z>_Xs-(c`D()|%}&$>gjx?Gv@>Xg(!s6Xn@Ox+P{xx%0oiKK|4rf=E&CRndot2*l0; zu4l7OQJA@W`I-O#q|rL$$a8p_bJr+q!)@+xg~FG6aPI?^St4gki`UzacI-~Ld2qCr zjn?Znv%tX+m1jxL{`LtJXmqZ>$9rybS2QJP0YJ~M-_Z&f3_je_p&_&LQdR)@qbiYf zT@8^+>;9;tL;6eb^2g<;@)!8*_ z_Sp4LU4%X_B*O<_j!8<^M)-!mt&R+5uB40ppInOVeke~HML`x`hn<=jMv$)T= zq?~3IW^0m~gdbmOF~DX|xH=N$Y*5$to(O@{rkQ78dV9ZL?~hUs+(=4J^B_uwT9UM5 z|FvOc^HsoDw`vAt4?hU&72Vi-JyN??odUooppnmx^TQ{kT`lq!@|$-KVW+NxGZtLS zF)C&pf;S%F>UuF%WHU^O>TVcvYfY_hZS`qK4Fa>V#p-{WcwMw;m%gn456V+uMz?vm z>)%=E9LnckbRmXszFSQ0m~vZHn4!+#LdkO$)ep%FzEvt~wN)A8pQP%^LgtDHz1hy# zVI`17y=&F9g|y+I7GN$3%s06Uy1MFv`^|ltrV{rc7WfSvIcf;!nu68p0G^fPO|Plc zm1~EjD{E6V#BiepX=XR>!u)7{!|p`gxlm6D@2&kQh@Dm4;ymq%VNW+9xc*YQhwx)u ztUwv^70Iui8}fUl3@+oEIn>pS9C&QnHUyrJ)z3u+OZC=n4j1ojr>UxoH`e&!hCO@s zam*Kcuc3-ZccS4sFd@@(9ZUlp zhHw8sWWa=|4=&3mmEFaDR~hly+wmf+Of*qzFO4MSe=>2QQ_Fp(6JWq3sr?Euw#R6S zpuxhG(OZUSKg(B5^EV8ri(RF##hw^2L2rKUDv!619O1DCuDPCr*m~*`TC4{t2r#$APrLopHz}szcoks zy+I#!t}DW{#)}dw%s*LLEU+o_}xSKy&1+ZDcj%U$6fV}aJ7bjt7OzeBumf~c)LjIx&T zUac{kEmLmx$W6;R7=@o6*bM1H1i&;m#R7|%<^XoZ2gi@{icINyh$*UeR)Nh}_=@0}o3{sKkZB z@n_@#0O1hYb)P6Vb(nFau>QR-o9<}8d>dh)Yq(kZq(CaZj>kkS5Di$;Ik)y0QJWN4 zdYVHdP}hfCj);BvTOK}F6mxqL@Bl(?bD~=3y5n#xa1`~p!ix!XzW9v0pJ0;JNt`P| z{C9>hEzb8M)agf-*&1P?QDs12;I5ub?ge;cMP#us_eM-Ka3oTmE4=m#m+I)D6bFdU z{jZ_&3hN>aYzcf)*{qcCw#iLM?f?i4bx^ZX8E>OFolw=!knxFc# zl4f_=-Dlcr&%WZOjh^hb{s)!0Bv}wm6%eB-T+FKtJ9jR zL!~rZVt(OMkie?N3k4GLGywG~2DhbPz6RmZ9_uo?{+ifPVfzs~DeDA;pzb}HD@K)HCdMx&8Uh0f@2G+RwU$E+C9`ssC zqL~y#H4&+0TAUdTf6s{MS!+d)T2aVX+Nv#`u5Faj8r0ItA;>o-x~hMNIRIPkA|XmyRWi&u}}@9cmG>NDfE$w@KyD z^+Z>C{w`(wQ9rThOAiV%inyp~1_%BiqdxnX9g#3lY3-C>w}W|1RnT|ZHBBvf` zK##&mV^9=^%u)jwYkl+glnxoRreG_Cio{#+Hc@4ZKpaZb+Od`eB0lH?UJT+|7T0SO z2mtclgYqBnhbW);3E}`yC20wrXvVZG+m}5W z%ajJlX6VoonC$#{F`PB13gk`Egx|~Z$xvJvrezXUW*=E(X$r(LpVv?Grgh90`;|WUm%3aB)c#^jlP4IHdynkZjm!BVZMo!@7B~Mehwu z5|1Dac_$f2`E*p?RLSG_Qf2BFlN4bSo?RQje%eKJ%_W3))G?b`2*${H1R8E#nY5}& z?cClc!&uvE2XyMd9sU|Yta~D|!`fv?_55!^=}iG*yaKZG<`n1Z2QqTU$YF|$>2%s& zMmd}e0AS@Tap`5yz-qrFT#wYQK!WSVreI^U9q*=rKm%QKW7JL{1Ma`@iKG6Fg=85R zQ}FlfJ%rZ?Cg9u4 z%79bk-xS&hFRsVH(#*5Ftsc-2Y0N?>im6ouEpOe(`FtcS4PQ;3%Za0uI}az3e3(($ zTqDKaBGxx+lY5WRsWvl(Ie_jaDQE&fufTVqqP^xDsyU`A|0j&#q&`m=xT^Rhh>JgW z6X2WpEaU3?09dskHh{Z#-)ZyorQMm9JU$crdNH1w&+D_+A*bJm4W+j~vHqpiFILBA zKqqrZmJSt#)&QJp6;;X`SREF47nY+4O92gpv3w6Y54$e(v?7J6y~ zHNt=I+($uPF9JTQthk<)xLCc1RNk4#@?C%Wn#Edeqt4FG`Z`}9XN;J8b)!}2Vxfbu zLMU?EhPmh!o?ql-KYEHNY|1VWNHCK`CzA?jF)@&;JF7LGwadE&e0Agwg&#MqWN7(0 zSB$AbeS_;?1Mu@tV-_zZcF)sPJR)Toka`rTRVJ(l&CQ!5EGLjt0P{Mvx4K>L(4C}( zU)*wKJe-(-7(9F|rS}Ch(ap=4%NpOjzTrOd@=F8&hHsEAn$Q3r4%TFue-m(MfIg-Q zm5fV|f3q<^Eu1kpE9LFq&@h(wea?HDmxWDDeFfdB-|IO6a4}B-^^MSIw0j2twl;;2 zf-SbbMmX5nb&c$;>oCIgMQCb*j3=7PCbU~RdGUAGmn_%BeOObk5+8(on6&RDyL6q9 z^HXnT&Dt_IRt_>6!Je@*ppG4s>FHr5bseR;+dA!a_fMmIQ42~RpATP{s4LzPtk(>3 znW6Vl9{UP1*_l6B-abEoOBV#dv~?Z-+uKB6@a~QU%eF4{IZzif(Yq@5tn^(y=n3R4 z_4;kXNb8bEJ9(3>;k%@jz!9XYGDJ~yoh63 zqBn|j8tBD_1_DI$mqC2118wWQTFnjy$eLUxi&xpBC4;hph*M`>m9p=ZbMDob(;~jT zle)U2*=N2cNj$8sMP5J%k_FR}i#aftPFQteIpnxenj)=RgwI;n0S@|1=6!AAsxp8_D%c{?)YQPJg2%)ZR|fl7Vp0 zFoZ#_rzXNNWObDrkY>R>87);B2c*^~6lzY-pYBL1o=NqsD;D$>*pv1mJd)qj-v6a} zoUcj)IxJOZgnxuAR+F)uL(Ta%m*>$!C1sH7Lgubt9#gCK+?X@>7l)X+r!L0ruIciPv|5`|9HFR(Ku-<5$_s{ ztSC#52ujYjpGie8hDEuz<*3iK36N(u*iX-yqDS&ixtz*Wgvv>fhBzqec~O||g{)}@ zf)!_ZxBd0ER zC^_WY)<4$G@UmR*+`ojjs4ua96*jav!}olkT6}X4t5q~3VQ{BIVZJ?> zKHMGb(YKy9H?TM??MiH6Q2J{~D&U%??^(GtbkHgH9&ZbB@+t37)$wM92@X+*mUnV? z-Y)c({?#6MCBkT`t{p(RtONj#iLe#u`)|eR7zMzuo;|r8KMf3E&hV>!A)+#}vX3Ga z6cyLUk1gd5d-CVSLH$59QjtCw9EZo__ZMqH2J8V>Xm@Rwz~?*Z<-QIzcVIRi-^O;_ zo$+JtGTuNjL#TR&!`^A{fYdpG%cObfaEKg!-atf_1bADtPGIu>wdEGUSMBSpFj z0RaP+v4pBrsZl8bLXi?mD6xz%ihu;^37`a!5>P@YfxtKjNJ&CV0zp7JA@mS>xr;ex zfZx6Mk9&E16eaGx_S$QG<^A6GTT5Q}E)~lvt(kNBrFPjVin}jC1D@56PAf$)3zMa| zh(o?dHu`H0_*C2ajTK#AUHeyP|4EBw8$mI0K7uqiE^Ao!^_mT4 z>KE~)p^u_arzdfdmrd%5=A7o8wVB=F2e5I-n&&7mo6sRtSWf)jL->e zynU*^xKHyFjlgA#efG zy$|Dck*AmW5U{`-7*n=+fyYX0rj@sOnhc$@~jv%iD_q0YH?&Ywhn{)v4D+G@=Mk&9p+275!ILZJJed z4r>LJR{E@RDeerZU|zc>b0+$NXxW;RxZl8lhN6G;1mCi_@zIdi#_bEANz!*S$YYkK zA=VuqY@reQocuFct6^I2qCFIt;<{?FsT-V!3Kka4pBiN18=bje%giR$Q@E46ikxO1 zD!2seMO_v=-QQ5^&5HdUa7M;aTh8! zyJ67ov7j>J?%iFyWkuBvz5NT!16s-nIJegXMOyi&Pj^LybP#A1HFo0i$3( zhwXV43!SEw)NazA)N9g4J}rK)k(Nq&*AlXJ^ra2Us2M=VIr z0erjzd-;5pigDlsnJrl9)y@nG`BT-6LjWEZ9jImnQ%j5cmkTgv zZwPGi5W2j*Y;`yFLrZGkkWPWnq0=k1aH@@EPY-cmzSF$gdtz)X(4Ajt2gxb7QP#}( z>QohCP$o3tGUeLZG3*Yg`<;H>74wViHAqppG5CRH%LVI|iSn=_e+xJs4_OZn%U&uA zgiMvq5-y46jq?Q8W9Ax>huW|tY3^9flaZ;8_Z0;F=Q!2P8i9s&wU{Qehh=Ks1jh-aB1fS31X=|A-Sfl=snhYu6bhQZ?i+kJ|)l1%HdT|*9z;E43+wQPM`%5e| zuo-dpzbTfFzl#DV8lcyg9G00A%Bbe6d&dsI7c0z&w#3OvK_oApXvHQ1z_pg8`}L|7 z+AZHls6LhwOL%&$8oCvA0fM+$C8rcUFNB78mq}7 zE|v=iX%-Y){gt4*ZJBz_FLkB4dk>Xxd-igCKEn{)aZ_cVsaE%h%T9%v;=P1GDF#*o zRSf;K13)aHgDB5INT3m1u_I=367>Sv$aE_X-)a z(k~%MOicID{y~UwWrxOEZk;xr8rIhs!I4liH$*ncmqhl#<=%~81LgcO0|s;fmto+A zRb|KDH^~puE=_x3re~m{3a4%O0V^2X?)hHTKS#3<8+9P-`Zb5sVumWXegtG9Q z1i7j{UvlQ zIK|-v8%}`peF4k!UpxGPRv-L`(LzVzPB@y1Di2p{aJzcVs$cIR7i*wcP-lmvT@EeW5>IP9?=yYBYM+^3%?PIf)->u(u@C#`kB^?m6Y%e`d*{=Yg1 z|2wY7=uMgy$do9@Hn@f^&g!?}YYp*av_KR({g*3r=Cd)UDEqZnDQNp*H2|8lA8U<$ z0|_JM_vN7Wy7JG7H(xZXF6Xo_`IeQ0lQUQiuaFPoF&7dx+KiRx<}E&H#T1 zoL=^fQoivP#p^MV+{f1OrL#0(<#lQy`Ecqkb|0tthY?bz=p+X7lT<;P|h);+VlLc=}3k19(vv zY?BHU@_j2zJ0FpY1=tuOS**)Jzts$0K#_2xb%tgg4N;hh8{K4d27UEdtD6(JhwgAH z*;i-to>{E8emQ`jc{d=t0hwf@GnC70XZ@SiFr3*moGFqX1!$Go9oL2Ha8fg!R=IDZ{$u%~G27J}R}T2{wX?e#@N(6);6 zuX06}l8*@9)ptI6TFgPi0RMaw0iXcg06 z6lQ|B2+=Q8%id7Ae!mO3Oz+siTa6cenSECvbg{co+SvxidZN=Rb;x|LB1~*Zr;sw1 z2ntLfFQ#B~VIoCBhKEC`5Pg;u{zO>zOlnGq0c$H{Pg4XUJ5@!^1S#$bt#m=||9I9?Ze#PcmGeLK7yCzQCml8U@lyQ(6O ztSKjKf${H=KMXjBWDEMu7mQj5{H--;y72MXUfu8l$p z*||7g(%b(Be2+*;8Tgp{4-ySZ$+$HQr7ZB*}gidpe9R%tk)C^ta!<|e7!u2kO~$!+$pTUazszu{)BB($5PpzUB~K$mh*YLn270jx8s(@(9j%pxC?t60@C z+a}FB;7{i|j{B%4(>6Qbk;SDA1WD?Hijy-7s$O$YA;A6&=#LWv^VVT z(cV$v6ezs`Tj$bRw5!m8sJ1;)fF}*->m{~~ms#X09Aic(bU}!Dcu@y+`uO_^R2P^$$dlk=jxS zPBu?OJX123}QLBnzorD5$gOe$>5)Rk1p5@B}M;WtGRNEn}QK@aO7+hoRlz5gPWz{kkay*c;tgE4` z{bap0$R%%08uR$!#-~4)x17qC%{fBEZ^>n%D@t+0J@+-2S9+o-vC z4fW*aEP-Ck8;IeKP1RMjrylA5K1%06j z|K1r(qPxq#+T*r%19RX>Tg8S-y@f7@-ZuaJi>1e#vqD_cFo~7j^RIdR%k1sjgd+LK z*d}EI&znQf>5JobK232)r1Wy)9TJeddK;yr=S4!A;&#>Tf_~p-GpMz`snR4l?m>2X z$ZVFR&9i8g{0)_^#PgT+PfqRuFn{XME*I{9Q$^TD_SSN}LUnp=y^p1XC4DUT5g#k* zkS=HiR!o3BO!~9}VG!)|%ToeN!Pc2L)d|c_GT3;ne7l0om*5yhM>-U;X=*L9+6Zw?TD!>Q!x@^#vDz_=;7&M*)VFAbpvNv8;!>tr{WViz2r$f_a zet*pyVvAKbtJTgWu7wcwbZ#%k=ZnT2nB~HBclVWkdgnHsV5bgd7zoDB^mT8M39g7c z{U|(QU2kOm<3)|!m%2|m*o;1&G+Pj|M^!3|`w&0f!kQjCs7PK?ah&^b&S>pn(e)^EqG$I84 z@1%eC9=@yCTQ%u?H_MM6+N<65ntTfT|Akm^y?tyewz*|tXWAa15vDg^_@-uV&}sHqW$b7yp}scyZ^6#<@a zHtW~mR<%uikg(>q262m* zr%12*tt05#W{J@GeNsrg1-5GnFe_xAY_!4 zdCn71XENHRE=(X}hq^zg{?~+^T@zb#Say@bJZ{3AA3FT+oPCGN{&e(Pt{bSncTzH9 ziee{l6C)CCLRexxx`om?w#6|B(Pu5gOaXW9ovOd)g*~+9IFCXTpBO{~xe+ZmE z5nHxP)%{z%wNlx7T+gQ5rTVLXagp2fs~!*k_eo^iB6n-5Y?W{6FU3B{>A6(a0`7}2 zd!3^Wgr5Hm^As(TvkkX~*Z%x_px9FZV#5I}DYiZLhLI}mI6aTVoWMm;EsM^qG_yB& zM4u7YG_aGl0tSue1(}2NP7p=Thwf-9`1Ll<>U5e?AI71Tlw&8Y7J4;zno4s?Fk{%|@ z!#E+GSCK4z9oDj;veH166w*kwPj5_VewWKUugq@{4dQ}9%j{nBt(kO<)dAcBFLKgg zo|PN6um#;2L&{IIU3~-zHe%&jb)oYKIWjc%uXQJ0ix*wQ@Gf+lC2#W#!rG_gwk}m{ zDfH=t@ueS~KyE0+?+17iLYn0b*Vd;J9(ee$-Aa}G%-TYfK)HX-R7nQLGZ;3DqtHxO z{!ht7ZycicYBErQ`8aO;wPoDX=nfq9u2c}C)SIPWXL@6ctHw-Y2((#9y?Xi+psd}D z_lN@Ii?)LpV~{F_xL^sJ0;P-KxSjufJzkF4lt?{l*2;a^s8JjIvukN&c?#(C@&A)Z zz`GPoUys2&U;%<5Fs3(soA;zDs)v>Td!O(Q_zJ8|+PSvPS&74Vlw8Wmgn@pOUC zZG~#=`#&Q6;ahy*8KOf@VzzVqwyPD*yyNLiF_E~U61I300w$RE8pv8BX zb~}hOE@61mI4%O#P7&G^7*ChngmGHc|JtTbeAiyJXW?M}GM?1w_gB(BV?XLF#02d= zB={TkRqh5!0yPkpYr(q#7h4c~rsuf~ih5=dZO5los{hHhe59P+>NzU^tHEECbfz8z z_4!ch_H)7$fuS3(XO;rtDNM8*nyjU61v6sB-j6tas(egR8nHqtX>Tk%z{0;FW~Nxt zOFsb~OO||f8#r3TSQ#o#{xB;^mxbSQ{msnQ&!hh*4#lLmYP`QSCLc6bu z4?nC`%`RelQ&lTdWXe*?BQ?vCh``t_yX@upKWU4z)=$+U+nf!gHb`bXqE@O^`Yc0} zpnFdzv*%A|A-}A5c>Wu)^=sh)fdCVY*@6-#J+DX<`E?Nn`2gwL}6+8c9P( z|4S0Wz^yc3NYQ5TqT;sL-}P^^YB931dMu6QT-hB4kJ9#&LCu~Ub+(QPN^`EfR}Ejk zM>c9{)FEFy_}gg>C$4|g&SzraFDe*mP>hA%m)a*72A_&KmUI?rgQmmDNgaMzU zKhZ>Km-i*EPRSm_s=Z1Bfa#hDxK;2wra*@poUzot$o|p_A3VLav%VVx&QN&@M>F$C z23kfb&CR6ULTtPs$NqonIMYq6VMLX$W~w;f3uMR&He-7$ z>LQ+GDr|1d3=br_foJ+}0QeDfx=?=LpEQJw!LK2f0BuT_^FM_*xbR~)-Ap`*DUGm$ z|EwXW3kVJly;pfjTuDiDnsVU9l4Ae>u_)ge@r}h4w(PNEYzBZsIr%sFYCmAia=5rlQsim5Lm4esP4}CIg*Os#Y>`pywY74#b+EZp7#TW4cVH~p$EV; zo9bQ{Y~hKO@U<(H&`$t1P?iKIj_SwENp4%9I~zJ6-1(f1Y$s1h{S)1}nUQ+1MRfZd zx$LAj2Z?>`U%HmPQ*L7Dy=Jl1CRSM1<$)bZ#o7g5`kuWyu@cZ-1;zB7{=&$5*w;by zFx|p?#0@3r#}c`r*)Z4uVI`s<9yQ`xWVek|m5^hVujY$LuDM^q-h>+MM#uDt`pZ$MVb%SVj z+n=Hu0Rt@MDbaVtbyc{-iR#qaZo?SYF0=i5k6{b4QPKSP;8GWA@Ku%d z1k~MP`|&AD9e^6Em-t3#KHj+lD2xB^kz0=iaDVLS{L5`QAchF`V&R)n!Hs|lnhX+a zDPYd1gM)dPs+I@tDrHGhU~ON`%^p$x6$bu~+N}GzNs*ts;HI!n`Fh)(E9la*)xkW4 zRgu#Ni-wLq1Lo@h+mkKFMp0`IwEMA@C7JxoN>~=4~64?)oBc z*2%Lq&zHuPWxe;hq6Ao=-SbxUR|uqfZ4{%)ph1j5D<`ZJxC~yh;BSn`iAcw#{~I@y z6g2T+sEPAGJ+f=zHai$4?KzSMw8F8>E)dMSx7fR40352(CSkV&eSduX1z2CF`BUS- zIvOrc{f+vExZE$63Xs0}IixA;{&=F}NZyEl)3%uXyAIGTCbCBFv?js^X35@vH&7Le zC+&Kj7t1So5D=dOLe#Z{r~&%7iO+M+KoGw(zQTw0Kgz|KDHICzzq2FsUnvf%m7%}i z1Tj;Gkb4*ev_)u{bL)pbcBo<3Bgli3@%NOv>75OgnH^HPSl{sRG;)U3v#kH7r$nc{ z#HC7mz4D~BGT+Tm>mLWRikY9(x}392-`GG(ooIb~aZFgH>_1=Soa|N|V@E|=<&HEr zcA)vs^FJwkco$1O#v%8N|3E< zw13LX4{}Vko-p)crSO9+0`2p9-L*>UEpqMiR~{m@U=|DYoz|&Q-9er87D)G(xn;N+ zm<9jRkKi|_vTa`Dk-UezKb)K1EjkPTU@3{f7e<$1Gddv(BTM5^sf-}s8e4u)=hfTg zOY&x{FbN_*Xnq-xOUGuCq6RN79We(QuIyk~gN9PGDOQzSCa;xoPu@;1Us>?=vV&Io zijwS>G2Z|A@jOoaPYGi1m1gx$7t6PyS}^2gIDb?zUA>u)ACqu1yT}C1Ymq2b(22b3 zmvWhP3ZP}N2UKCm#5{fY$&vm7;~hHJ-O^Dhq>B{@gEt&Ws8FB(4 zdU2m;|7h}I7Bi>}O9bQNaCt$yy1iA+vA*X5>6t0XYIq&IDKiyZu_5B zdc9dP*~zxgy6m%=l{#+87)EDPVM;)yb-me$rOjl&OKpR7Q#>`w^a8UxsMc;!lsMd& z_=c8ViX^4I`d9!(xWyC(NFnen#L8~6MXDXcVh5nKo2IJHGpP_uAmk;VDjFVi@txXS zU6m3J6NgD={7bYE98Uiv^IZZG?n*9oDF%q21@o$I14VCA*wl!H@+yvkb+&U)u(+}^ zx?WpzoA&LfbmP6rm^|miPgm4B|NaUy%X)m@D`ot1K0nB;&P$fUp~XN`15#FpNxH3$ zd(YGAO&4SuDgg((&6`Eb_H4ZJFBf1n66&-9l4Hyhdc9@aauXCmLN|*>xqVbD_t39p z)Vl<4&Gxz5HTC=N_+DW!Bdm?-ZzS9_5}c9~RcPAh`9iK()fIk&8jRM^R@S-mK2i68u@6rqx5k;5lv4*-YhHplMZ9NA}SzFh6(x1p!p$4iGo%e ze}O!bXH%$BwS>bK8hn*@whPv27}iep>@sflW<7XfLG_GDmMs1_(KqJPWuJVZSD+sJ z0Eeby6Sr*nIoCNHgl3oenw-p_1erU*ER@l74G9N6tX2xHnv(JW4=N)!ud&t-Y{hVo ze=vRwMYQpSd>NfS*VyQyROzavact3&gaiKG(ExnRr+HXs5Z)Jxh!Od``qgn9&amL2 zI)h(kdzV;k6Oi{CeLs&Qr+WN~E#jgR+#Fj~HvVc-TZD0%0>IRGGe&xx*?`UcJ1Q}c zwniMaD`Yta`|dEvN2D54NL#tt`3^d&|x{E~L;Z zggg0z_o(3ydG{G3CayG{cf-**l;vYoi`r7L{!EEBtn)HEo`2wh`N2rAIEG{1phUYj z&TlQhM@e4bCU^o(u{cEwW*Oz?i5iV5;_~7=uq+%?zDR=Tb`gSXvW7?Q9+J-#_QA4N zpFh%L4a3(Mm!W(#ZQmB1{<|Z%%i!GUx=IOXTOQJExQBEi(4K}sHGSoGNacQXGI#YQ%KpdmMLs5@II5!Pkt!BbbYkaRoiz4hS!;SFPlQ*g-T`(POBr5j8d6L?V9(ZcPR)#;`?YzfdMeyg_;BH6f4x)GJcGin=TMO>8yOd;O`syE`ZT|Cpz` z!Mv{iZjiKfOCu%@Q+)j}w9BbMF@^3}Qg9*zXHS!sNyb~FVsI#((P8CODlm}9B^SK@k7^?r@kjqyfG^4x$jjm-ylvR})1y&!WSm^%2(F^3 zgHw3ZVeT-4{${B}vn<_IP+k-JodqWNuJ?=+F<|k!Cz^Q4-6; zGPUi;fA917@0*OytA?$Xh_hiJ&cWLQ`~50~#NzSH3t9de?(A()`)M?3#MO7=i+-Gv z&CQo0_HA~GGXcw8V54M4IiJK2H)bX9q=b^oJcgZ2t;tGtWywnBV9GA2X)gg!7%cYC z??A(GJhtdWdi9~d^gY?0YX+WxMVKjQ*;e$WeNYDnUqty1W%(#HDt_X`54zH!7jNc% z&Le-Vx895z39ec-tnsCC}D~ zqp<)Cwvc|nCzhb^rWkH0bFA@r3{MZLX2|v0UPBMY5Dbfz-<b9*CjaUY#?yDWC`Yl&L1lMAs_IVg1-V8=ZJP-Af1x|$Fp=DxBOk&hZgU+ z6w(Pkz6FXnY~HtNcuC7scXp^3A9&rSC*AV)QuWgyS3wbYETul+tF$h0-qfXQ6}Z_H zCG$dNnOS^!sY`%rfP}O60uH4KKLz6qz8Ff-PVLX9J-t|)mqHpwNvDdjMH*YYS@|7E zWep-@{(y@md=`Sn*L5iyXkbftXAa<3d*npcA*t25H1o%J_kL*h*fkA-(Ruh zvZ|xOz(rebzu)~gKOTfWi1^Bk^m14(Y_u6}e#;N?g}Se(rt(+Uczu1OvHhPJlUG4Cp#mO@ew&)V_Xzns%L+~$?cTiXmAe`?k*ZpMu_#mb{nloEd| z*4dLh(s;64B8-ToEYai3=2u6QQ%gXt00zgFgJg*%1GbfDvc2nASpdF%B-rXc{m_?- zFtPBVlgg29AAtk8@vpV}4oBZZ7|CO(>Giz(?dZ{?_?M7fyNB!zqYQpGe7{0sjBe8d z9v$PEGc2Om=~yfyJ1gr}ou($U?XY-)?c2Xj{5>%9zO*BYA+*55{rvsfP{#$qe9Eh; zL_>zf-ECUXIiIyLbt@yIcZ}caj;e>Onh-_Ko%?uCuVr-K4Q=R|jp;tXw)AdiG84^> zSX{?%TZ24zuxBpSOk6P{Y7toj zY_Y9wI;UqVlNd<`$=uqsf4|*b&yQN^=MM}Hkp_Mi5>u65N6z|tMb(E%^UZhI|Mrm- z(v2H8#<(wpX*o}R01s(;*VA*AJzP8@AH5BbD_=_ur0dLdef;5((o*t^FeZ1$T&cFVmp^_rOjTLU=f3MM90U?1UG+p>5GqN7-)Z|LT1(zZ@T4}7d@V}=(yZGi86 zC!I#{;SG?DB`T-NFa4OU)_2IIv5VA?n1ZB~QkdkL_E+b(_ZiuPUJ5;h<|_;N%+&*7 z=nG4H|I66Am{W%fhEAenF#%gI^0?CpD1w%LcLTWpwl`rVW7)}1HKrS@*iBi&rCkVm zkbc>tKZL0iOC{HpbggDx^wsah(FJV*3o*CI9y~Pl!_@nE@rlNyZn-ka>IG57# z!%&2-%525Y*uT-djl5Qlx#4Y%G>0m`a!kChcDZ%=UXLf8TIy-tE0H;Y_pYQX5lv`w z0Xb!qo4J!o1=90IY2q4ZRZz43u}7*j+Ydw!R*uN4iEMEdE_wS)f?PbSWpT9NK~kZ8 z*8CJkR}NvoT9sBEi^!z9paY1B*oolnmskmQwEWhVnW+rG&SL={;*WGsUHdDbe*Uh6M zBU7!|NdOI14>Na}uYQ57SWuuA_GMA1j=!%`Tf64Qd%*SjY-yDUVviFiJ1k!`ZbrR# zv8|*(l|T2HH*EDwd`~7baKU9GPBIBPm4)WUmK0TG-&KP8Cf7#Y#<(k=vduMLw<|~z zRU69=7;wPd!1`RpPlh~9w_S>&&Y-la^h)4b*JLTy2QcjSVPiLM-+)-I-ke>D8L$*C zw2!hFIIjFE+fDxF)|x$%c?O&u)(z@W4{}m4S(QFTSCuNfuE$L>Rxi>V{viL0wdg9jc%p{C$=JU2jrXbAJawaCLi2Lj=WuER}iS}-OSo?EQ;pjev zs*IaYn$3vIG&3?@+oEJ+dS5rH<~+ATtZ1=C6E#tTcky>AOYtWgr}HM;XLqB5T%OBT9#ZW7sUx%#3#G?BQTT3Z{6Zt zk4!|@;5L^21G{CHcrC5B9#GfAV>xRxpzTfZ+L-L=w*^501JiYyzv(f^7ybCJ@~5ZT zo?LHz({NWbxKBMNn+l7q&IrymA2YWShE+|qX2f7}#H!HgE@okn^{GrJ!r$QG-o~x1 z|Iz;Fc4{#4-49PZMJ*({?`d0{H3%)5M;LOSFHj)k-_9{tXH|n8mXEACnI~)MTF3jb zl~{!$6!TScycwf)bXF%;1aj_;HG*xhHmBK0F1JEkh>;(- zmt|U;rejNPxy(bZaz|CyT!zq8-)kmz_E375iRS6SFR^(8ZE;)5^I}WknFJ?g&)|c2$xLb zksTNIWuNorVP`!>q1LToXQ*9AF%!+ju@p6n`|{CR<3~@V*LCmMtUrobeh5QI31Ir%b**MsW=Ph4icMXw7rV#C@uxUUFVi zRhda_jEB+CpqQz#hE)j^*@M3KF2TuWQ5@b3()Z@~D3pHqyKrmVb6QaT*u9er~YE?P3{1&R9`Pk=Q%^C_0&QV~227v?tCe-6N3 z{uv{&5!W94TS%SVkj*2#lOySS6aww9-~3cqK462AYpEzMmy05BM{wcYwR~-7!NSPJ zl7ggyu&F9otWCM#^Si7$PIODs%76pqqe)q(t!~)bvW!%H%;*K)g}Id2nX($Kt;arR z-Sc~+E^OFyI*>l!dp;sBkCkzwT#&nWish!9&xG_^7F?GOa}IKgxS3Eqsde0_%M*6C z5ycIdVc#@>zeA*AYz=8EsiF%t{=cZqairY3sc<*R?|1)l<8LhiPCYqU1Z%Q;DmQTP$JiiN#^it-dgC?WT?=J2`~?$!Syv8RSL_r% z!}H_d%J;#Oi<67%Q@%O&i|4uih${DLD zUBl;|QHzs}rTTBd2e0>$2g74!m9TS@a_F}Ys)U1%H2=wWJ!T@2jhN2Q5Gw;1w_rQW zy7EBQAj>fQK^5)4`h_6cywXT2z0Bt-} zH2$WJOCTz19{*$ZieT5WqiII|+K7YYWkteYgJO_LLhHV-)nPs+t)sdg?P?w;GO@@p z$YhKn_i4*=>zoF)c=AsJA6;3BiSi`Xm^1&hc$gB08Ed^i2DUbuvBl{+qEaxZD8rkv zkIZ@=vv;nm<`DOJiQ#B#;)2V}uJAb;=a-2<&+KEDE4zMM>&U=sSLhz1mcqM-1WDRc zHzU>uQN*?NZnW3JKJj}CZ_FmNB!Xw8x&;xU;+CkAW5lk4e5?+$_u>r^f15mRg$~mi zVqq-BeqS;A=e(O0@kR-QowN4B$g|Pd@`DrEcE#z<*l>4lIq&9sH@=s`J&OJ6OwLb`oZoz}L3W3g5l#NVVzYV^;4LYcV z6|$j;eph1?)p=b>EAwd8p={*mp`5CK!Xi{g%EldRs7yNfk@>Tf-V1stZ%1bx=XhaP ztNa^P9ZE2b>15Dh@;}nKAuM|#q`#4vP~B+HTArC}M?reEA{#WLbe>y}rSPNUebSJB zxU9QpRvx*O7QutF-wvEL3Aj$pr%IfkW?wv1hW(g*H&I>CHfX+;Nj%n?wf6DM&_Ai< z$LQ<>4g79xtW5u^bO`bMXHpTxGulNf1m@TC!K6TF9{N12tKcH;j#ecnV`9 zH%)8t+p|yBzirvHJy$(vkJSu!9jo(jlaKD&wI@Y-rdoH6qNja@&tH81)zoV1qd3+{ zG@T=j_S?y#LD#A5ey=jmFjd%Cjs8FwZ+ZW{NYKQDqF<=T&cK(@%$E z$Dg9>AHMGXF|D9q`{O1me7w}X6Uir$~^bz^<|FIU} z^tFD`*4qhyse->;f4sxJAyOaO5$kZEHY|Vs(!-Al*ecmBxX6yYn|@9moKqm-_~c1k zERGiYM)JZIlOWq7$pb3H_Xw2M&%)HZH=l}psc=lqLFaorUI0$qfR{q5N#*PIJ#*o`lFfO~ zvFbizoxVTJa&NF3_DI5cSo}$6Gu<>xb5l2?QT(V(qWS)uWjS{4>d;NdX)ROl;l8K5 zxrrrn?jl`idC8;4c(K%QBr^HEGigjPVWlDXR*-yDDeETlBmV@n?RZ>;*3z?~oMkV( zV~-V4H>CU;vZr{xV%Oo}vB)Z+oFz56{e|b{GB)`IZ9BrqS84<(qOq#dq*qwQX-%3* zDVBYI|F5jb5;Z59H*Npd)yI=%8s}0ST{;_Job_-uRDDU-*tdpTMcnH$k1VLe?S@7* z=c?Mp%~mvpEH|#DbIKc4)>e9rYw~Xu^~Zh~RARSxl6=-2?2g>Y;w-qat16q{&%47$ zOtaVH(E1gndf&r;?>m%4Uh710hGZi|O(qClsMV^doCkyANpMZub-(#@rm}MpE$vnw zOu<0im($Md6a`IGg?nU!=rLZR+HcrZ*(%34N2Y1^9KU94NrI3`6f1J}3wtNqhFZWF z##d0y-p=wM>rd0@g5aDugh{bazp6cFptA<;=(l>(rHZPD z+UVU6EzE{OvNqo7nk>gVLP=zc2`cu;-IVzCpZ?_n5HhYJ%`rI~rIWOKaK_Aszx#gw zZT@x`=g|1wQC@Ew6rTDvGY;Z%0iRIik~x`Zli%zuSM*lWCV{-6Rk|c^2;I5Ff@cBh z*BR*h-JH&PPBulN=w{<-+jli`e)Zn*p|)Ht}Zl%q1h zg0*hgyj_{B)LmF}dd6wUM6#F;nfq3AQq;r?~)#7{A z4gV*{F0U4hy{Fj5&|{8FL`&>;86N9Gg;19o_maQCC);NA#d8v%hHVX!GO~hYll7r} z%RX)Up|juo$U(QVYT57t7x+CPZ7U+Q?l%|P;MB_G^z(AC7F*bp7fB{8f~mIkyP95j zMjXGOWlqK+k~iuaY#0W%!6j)=gQEk4M_CPur^GOyGz|u7ZyrIHK<(&XZi$Z_G;tn_ zulq6u$s4MMx_oWR|7yX0ZwYrd`2x>)aa60Cr?u3W#p~*Q4^A?S0?KL|%xQzuJAms; zEB_K$Hvb;JL-!@X6qckfq?eH_p}_jXfe%;?$Pj z%Y6B2e?9>#tABjTxUsQ|2|5Z!pQUjY$1UAFxNnZMq#!V9l8o^?qxVc+`ZzICRI`2Z z8Y;|UM3+o1WLtjHhGZ`thP{=V06FGiB-WujEk{=OXb;JzT3&q zq}&`gU*Bc*{BJTj)0H%rA9tGuI|R7IeZi>aT=4AbpDv%`KJrY|VR%=(J0=W}HM!laHPVe9<7med;N@P@FAkpES9qZ%N{& zHLUwahs+LS0O-w{R*`RZH2tI&n?M&v{r>Xk!DVBmqww>l{0*)~gnH|H{c=5_@a~Y) z24_EhK191z`-*Y6>t4jaUhKPbdg_7nq`J~4w8@ht5h|8pB|p^g%y+77UOYx+ zgOy?FYjc~p*Rs8Wrw_r{H`u3$wBMe}a@m&^b#&>2Mfoq7mBt*%8q(PGuBvsVEvzPF zsfZEKB59iBQ}c*i*^%dOQD&pBABLjEOF1{uX)X(UjvTy=za@0z^P_U%Q{l3|!g|sg zo@&LKUQUztIByd*nHDtm=7{M?R;Z7Y$3q|alUAc#laY_@2Vc(5-L_2)GT@DNXT>d~ z=Tw!NXq-2Se>K@0$RNvVkPVKG+^$nnWS33QTpB5;M<#F0&3Mt;|1mMU`}SqH(%l*d zHZRgyxqW?B7P{s^6y{pM`_FMl9O6yi2iFOcZK3-7EV6S=+@0m%lHRbk+l3>pW9G4| zeTk`U+w_ueuQuzl!xFmt7zESyagq|u2dvc5gP8o_mKo2RR0+eIpteJP;Ne%xP@ zA0tS?qBWVG_oFm~$L|gtlUW?nEE?stLAVh|T^29ZVV~Nm%;WwP_Vv-(fBR+5S}f>V zpMHJax9S)@wLo3Gk?d&bHEi9xw~Hy14I(2Ng9dfl4l!QqK@re=G#wpEQI$(w{l4lQ ze!?Zhjl_bky*FFCWnv1?iR&%xlzt#S0X5HX;C6AB8gw&zvtv@qvKAFh8t_)t8WWrni8^L9+Pu72U_ZE@<)&$Y(e6F_6nMV_I+HkW&> zdN#K|v@FS6kdVjy`>k)VY*pwAsi&c%YK#IC<$IEndekaTMqqA7#|c?dCG&EuhIy0& zF}XfV!IvT~&Ese-JBWVI>)X9my8~6t8J%YiO~)Fxy$f5n5X4Kq{BzwXLL6cp9aTMc z!JXax4m$O_DawYLb8~4(iO8DkREBVWkeQ7)2<8OlH^@E32JMe5V9)KB=|6DpkwIjc zQbHO`#5bqRGhRd3@A#=RkjfU>UI()1)YKg$GOIz#I(ID1a5k!?y?~h`pQQJT}&~J zCc8JjzS9nQ(?jw1zw_xn_?1}uf6?{UVNtDL*f1!e2%>aj(JkGAgmia9M@dq$$X3z6H>t1W!t27mdJnm{$Pw3w@ z+@4#(W-vm9JxfOFy*||kE>LMIe*TBTB&vUYC^*ZI z#ioyR+O(aRB;D>=Jnbjl*YxXGF7_#uR*NU+i!8VZ*1{P~&lNnslS21^+@vY#Bh8`N z^I{GQ>cw@VG(#395nD&Xv#>xUy;376-73(j^=xkrCZhrlOt6}-(2T)+gpd zMR%l2DvN^H{09CE$7TAk*Vm3%!Wb$y_m1FT7j0(U&Q3`iJ+lI@k3^KHR}%1XT5cck--v$?l=7jo z`2+F7S7GVz+j>MOx(I6cqRAaya5FhrflA*kK?Spak}ooWY#OqA|F%%#dZ%?2$?*$6 z_zhm#dGx@6X&%xOPFE#BG$oKnR%=0{fz^kF=Oi>{JDOtg1Fg`cAl~%F*;~^-QQy5b z-zcU`-p!W@2#bi^^!#p=47mmC1=Zi1fZ0o_a^$my=p6M=vbcP18FO(wK9|Li;j6CD zV(eJ{l?wtsk`uk?q=v9<&m!i-s~v~Ap_F42!mZfN)_DoH_E|fh?)w`mplcZ#LAk<& zoHl?~S@<_A(22PWu{`1Cy~9Z}5pr>Mm7Ti%?^B_3e|I-|vwYl5VAJGn3KyY>tKu4+ z;vaq|)d6KFY^S1O%P81^%MuArpIbC|7QHP#^kQ_y$)n)8Wgb^bDRAkPtVX1|Hig~_ zlE*8{16q8SQ%_DWf@}5pAIZeQg8?V_C!v?^nc)q>W5<11#k0f7 z?2-ve<8w(s*MH1FB$dth8Au2EoGAXV&*u^``BMMp#>2MBz9eDZ-;mM^#e>+viBA(Z z91e<_Iocht6(kW?%(SiFnA3!Ys|7Lt% z$c_A(UaAN)$;jC)rOJ8Z5+gKgFji)kMj;+4f2%)#(g7v%&5~;?gfZi%LziQ#QG)J@ zL)7A_IS_)vo!B1Dn-K!hQ9%w*GjcMd3h#kB}>js1dq1|ly<9ZOmx+gN*eC`>eu#RIPoT>2vQ7>l0yxc zytweAUc=t~JN0!JVgFIL3kWA1T?O-mNmz3C;e>Y{fC|56-DhR2;85{!4qY zMTV`-b{w9bC$}y^%#z)~R%*L?No}j-Pn+GO?jo-7^IwAU-FGlgwzv7*{%+@O==kxV zi&lV5qdI>GQpZ z5+{pSQ14lETYH9Gf7nbsbBhpAO3{XXu;KlGxi1JjnQ@z2aYfa&^&XGK7S^EvaXZzu z@LAq-icLS#L?b`w4u=?IK)g}q5skl$Uo)qgR)$Ji6~t;ji`)`CRv$`g-PR;NR6miK z2e!+D5QI$@)M&y?m?s7qXokOD(T>%>wOHMJGMx)bw^kLHf#Bh@4y}T>6jhRUMSD&V z(6bFe2#(Xp@!>*l!+}Yb(lX9Kz2H@S5@!Cd;Z&AvThxX5JQ5y(JTV&iF}uUt#v!Lx zIGKOUp)!=8qP-Q1-2z<~7UFHb_0_t1bphpFohYPe-n3zBK5x)(F4WK>?6aIq;@@G@ z^3ak>39Ofjpj{}4Zb>h3x_cY1pJ7x&cg`_+rqW|~sRMZ>_mRns_ikr-<_g-Sf5dTa zbJ5~a;6Fi~oUkQJCCWssqdYcs->zy6dv_ed1-aXxG8!qD>u;%f^Qif*Dp|f{K#k`|vYlUL58j`J9q?1aHmxro zIDn@zMQNppqN<>U7nwx3%vJ-qu5rjQY-c?2 zZTP8tEI#GfQAVBBo|^R}yN48=M>S;s3sFFe+(5=VbzKKq&puiJ5<*V%^>wP zR~a-5-QYN|bLC%CgC^R=+a@WH@QUSQq&)Lke|`YsTn2MJ#+`94ZB7Uh?d4hcR$b)l zY~f(cC}!0=70u(B_gsEL<36kbsn#knYsg-Pj6UFo20%rL@^ZUns5}O?@TNGb2_5sk zI%?JV5@tb-Bb$xD*zn1v&?6Z7-jJbLY%@8LX>u9&idttgf7@-V*W+=CK$?oKlcU{O zC%9I&pWRMpw}H)e`YO*8_IX`5{4_>ue_)gsv630$x9WBg5xr}w<{DHWB+g4@7&ke< zashu-Ah25bt^IDkumC|aNglmBYSBw9Jx&+}InlkGinYEL&EPLs@=-@QbO8NHgT)Wj zo{@c1LHIGqia&*`KbW?aZY^lZ|&&FU5Mk`fDX~l^U-f7LBi}@Uu{9 zHR|lKu714KC~$wtTqry2HL=}nvgg9CYE`D6vJH!)wng>6oH@*Pat@Z`$viOqRWVz2 zjj5_Olc?b-cqput%lLczj}b1*!egtoce=4~Y%Nb^-^7ZClZ6MbH;v0Kwgip~PlL;u zdFSM(NFOjSX_6k`?T)s*YdgW)efX_#FSRooELM~wDiI&Wr)_qFgMppPoU-CB*8IVw z*;+TN1|S>vSM_g8*@V0#i`jcUnit9``161ljH5`c=q|dWwe-}Y18{xCwl!nK3ryuM zVHFjocM6A1W*(n&O_LD9Pc=Dpiw4U)CKo*5)Fn{mM2bFwZZGm}55!#7 z{buw3_mNXQLV$F}SA~^&O2wARzDNPszD?hO&E@~y$&3DRzNmS^unvJ{WLCIc<7g{S zrcO^n8rM*0tn9@(Hi(JqC(h+%)-l;QjJi9CEuA-hg76+4 zz=aYo5_T;3LTVR)9(A)D%Y1;lyCo-=Ltk*4u&ZflY?A%N$kQeGo^dZ&qS#8A9Jfn z|Ak}++p3Rd^b{Oy=*P#uJ5DS-O9<9K9jKRzS$5OX)`!G8iscyonHV#{#JA8qWdxu8 zSYK%?b+uqSToi83+vMQVF=ydd<)Z-GQ1*Kh6Tp_;acDnzIiA9UNcTy;XsQbrX_QF` zgh@0TC9Y(P-nq572CHuLE}TNemW&OzEYzO@^3JSP2lm_H86B>g6AkO`hWMzdZ; zqj?pA$u4&m$T3UB?yCmIO~PjX0_E_Xd&o%sA9RKMKa}7_ zaZYDQebg4!1+kj!Zi;?QwS<}6an$fb+yYHtnqs_03^N`*dgi!#hru4ikTwC_Ob$E${IoU?{<=_-0MqGPd`E2_~`) zn-+I)<$of8#%bM%xUJwK_k-v84du~}ykP*TIbW|L`8TVeQSJ73f;{en(|_7-xKJRe*9|Ci6S%hpRNno85XXCh3i$e_ z&;FG$vW|AZ0SPP!vXw`nT7xkwaZ2!6kr#VuD-x9)XlA`RhT z7YgzBhb3YK-skPdKjVsN<|q5%Q7?hJB+M_{>b3Y%eJh|qKlq{KUpu#UZ4_@T_S}FyLxl4%#4ot>_SshbL`Lp zJ-@Fvjseh!JDp(%x70tgfXXjLhxDXB%FLHtfcl<^yYxyfmDqZ}fN+0$CRcSXB=ZJB zKAdSoj&{-_y?s}$wC*+Wi9C%;qcicz2JEp41huXd#pOd3_j)o`SHae{)We6Bz5%+T zw6`HgGk{Fj+e|TzCE}(j)j2+;SWuyvdFi9vy_m>fwOGL6>&6mYu@A8b&Ft1m|?$3W~hsv>RnUVL3$INcmwyfh$B4Y zY3MfPGrUB6l6`<_mEp)f!U)=y$x*1WQ>l46>M|~)fq_IEy3m=}mSgNADt(#CkRY_! z_(w6#QjuGq-(dO{n=;YH@lUiF5~er{latTWSGhZ30V3Hqh!X?Q?MX_E0}wAHE-8+o z=Dyx zc8|;-HbT3Xyx$7a6{#)nR1I?Hh7d&PjQgo~-Om zAJLlreZ)ij?eeHXoB#n!b-Z1W{PIous)^k$SthJzdi_W_%OvHWTaO*GH8}kxby{z%eP`g_w zs)vW=lXHFAtr`r}*2EH8 zuo^8WP!Im4&pSaYx{>{@=hT@&Ph>BiKPS%m*SD0@&ab-)MD%!0R)!BF3N<{&H1E{i zTzK++*?lkhX+^rQ68t_!1d;7I;qUp-NaH#0s*OpX--gfLf{F=;%8Tjb+X-()XrITG z`3djq=DpsZx_-YX--GoO6?@Kp9*I8{IesCBAD2D^lw?Za+5PBwq{T(eCbW#~07{wg={9%Ex^A zQ&?Ag)x!*9zHX)%rX!q!*5=4dH!uD77AxiNF)Wm`QT3QN<(-unceHGecpRsGEjG8% zo198Xm8bEsWO8|QaO&ettf9D|>#s-*imPEiBa2wluCa_}C=jLT$O~KTAqboK4hUXx z{|Zk^-xQQ>sjkE^$UAd(yWaa@bvajAnY=wP z(8I^^e(RBE(qcR?^)!wlS3CEudXARjR+wxpB%Fa4si;5PC7dz8-)+d(2aNg{c&6QU~Ili!Ua=0mn;m%DQ(Qyacm$%el)b9g-s_5GhVKkSl8!o&pJep1Y;cjf zj}BNWh3TqXHx4kVLxpLD8#iO6+lEWt2!9Fwxwfu+cDe5{mt#`N6sRZR)o(X@w?!B{scrmt^9Vaf7=2?^w?pf+;M^1Db82C z2R5kVsmAR_9RyeXu9SZICRJCx`Fv_{Cgaa7PXQ`^0Y=W1>O0T}v%)I5C^nB?{!4C6 z9}}^dl0$~~cSulrQD1_G9{;9qoE;CThQ@A;rDKMnMK??O-p#TZ@w|6V_`L7xf->_@g_b`hlmbfpp>&?P4}Cw} zYgd$%%dCtrxauaj>lWeiA*i`RdN-1LRF7rQ(BbGO1vjikMa3&#Q&9AEuPKol6yqf1 zNxEDvw9>roVsCip_$!6Iz%rLQs^_ObBZFV_7+0k1>$C=Cuz=<^CIg~lbA<5w1o z9f4iyl)R#JT}2wC{Og4TA)iW9l@-3hyjea5(iE2n(5R5e#No}|-u!kV)uazSYO^Ux zD@iZ7y_tY<590xWVVm?Tx?x*AhcHn-Y3htsX<*dxB~`}7YthAx(JIjGm+d4$u>`;F z)#@?F^I@xgbvII`@JH{yJbQBw;|*)4enCKgAKig4t$D*!^4NG7x>oDSDwCC^OlK73 zQ@sqD#&a#$UzsaByo8%1HFHS?FGO}(sBbzx8a%&#tIz^xH)DA5&y`Kgn6qgQimy_j zBcG&G*_eF?j6KVHIZ!wM*&E{4eXxL%*7}8;x_#5x);d;;Ir`Nwm_Ew>rF2f zu!=PHWHZKGe)C_ZoNl*nWSq&Nln@RH_3h}=@J?>rn)RYJ5q`iFm-^>&pR8LK1-&)X z%Kh<)eK=F1Amj=|6tw)=BI#kg0bL5A876T#v);VyQ=JAG%2k@$;kx-C_4usiP_t0& zJF@%1SfaYKE}PW12PPUT*JdGJkK`FUPD0>JC(R7A%Y#D7FDMcROI~u}dv&~6h&T=K zfRi_?tldNe+|9-pRc^9A{pT8{UQReqRU%H8lwKK92vU6=+m6}aD4!puONL(Gf4@dq zUxQY``yk;j91s`||6tsh^nM;&6V)kz>lF7A#p1L)ZN1_}Oo^QXoBg?-ag>co3=9i6p(n#YoI zY9ND&R~7A$F_0df6(Q|9MrGlu6ecs@s{aGYN)&1$u+s5YBJX%nu$^19-n~ar*E3j^ zgSm1mUtg!&49ea*f3Ch1i-yd)J&?t1>g3`( zDAV69PxaoG%r;yqEANYpu!6fOwuJo(H{maF;tH7-Vf3O-1&SWx3O+GLfxaKiq;$#R zXk14YdSQI@_rz?X>~H!s_=yI;ELKE6f>(U`Xx5(; z*;>b<$OZH7XAZw~vCHW2E7VrMdU^1&h#r-mr!oEuYNs$4Sg9QB{GExT)?6^4!xiYv zfz15(;m;?#OCI-|n6CdR3c6v|e1x%vYrkM&K52gfyVpE=NC8ik1`IN8WZi}B^pIAD&^cPD9eGnA(j<)uWD()Ar zk*OGz*r%sW2dA6p)iAi$rn+E*41qj^KcAz1Rbbg(NZH;*PT0g{-JWa+XN5w}W}Yjq zckxG|ab@owTrh$%&k9*EP&UQue$veLw(U!|L7J&J*PPhT_^hC7(SK-bCYbfB7`(-c>|sN%v_wv!`(Ts))o{0>_oHI0Y(&rn+3SKy zU}#{QqL zs~1OV36w3A-3rseIFrg2FDg#WEq`wJYiBHiI!e|t&7uKuY||fr!=g4z#nI-)=)s3> zYQS8y$*u-XKM(Crul#diydnVuT*96lSueG*+rIWWJV^@{_=SOOwjzO4`vK1u1M~?3 z9OrB^W33`SN9^J|f|F@R48bF`-jv0B(e32K?98lvga3*PA8jQx2{I^O_0_xgdy60K zD}fmB!37eMmNQ4^Mt4`o;hbcI*8-xb9vNSnz(RNE_o=kAj+-5M1yVrG_Zd^@wI3}A z=9+wL!gy*EDr&9A|0ifwxe~9M#Kl)uY5@g*=GuNjFPVpo(5vT0@wl+MiLNVaf#L2g zQf8!Rx(M)fzZN5pmf-H7V1v0%`v>jR8%?!RewWo9f#j&yD~!6S!x-7!b@PslR4PLA zDSTkPHG@(k!x;pb*#nBeo>YWu&JbrO9=_qqjCxJe{?}6a`I4`HisTpVACG+pt#p7V z5yARvEWC|P)GB4F62x|kf~R-4h1zZHoUzcIxU#mqcum6zNyS@)Ql14f@CRD&IxiO5 z9^FU78e&Jo)XWDRwFw8IHfc@T*X=Y^nck>=!T#&?Mn+Qx(hK`OTJwIm%7E2d`yk-$ z>(%&r-o~6S_rsOZgmB?@Sm<^O9|%4dxa{m!)4+zy&Blumi6kM&x1*U=qw?B40}6GSvOiNb&!Gs{Vze27J0M zLXr!uTdtsU>}V-R*ky6q(ff>|^W^yI6V}HfdWu@C$?aE`^x>_MCQTHWRe|D~{3uu$ z;phHm*ilwmXu9siP=V_qnZ3Enrwq}H7|%G((2{h!1=2suFco20$UxaS$j@oux%c>t z#v6y|5(!r^x%;R&8fBAi!bx?6I*m2|vx+?pc!0H)VtTSM&PYP3x-0cd0%n%|N&7}# zGx!Z}LA~baYjgidq4@Hhs?SP!p$K8Z&|>8wn7MudA0Y zI!nI|G|s%o+*D8MKiX!V?n+Ny)9%KZ`(Tt7_N&;{i+tk8f1sHfG<}|$=AdVU4Chq; z6zlj#;Yrd*h!UG!DydtwI5b4U(RmnRh6g2FubVDypmE}fzGp3|h}T`Pc*s`}PJC`v ze*?m73sf*+BA?vD!6=sS5UHC`La!KVb`e%o$NzTl1+#~Gyc7n{QZ$(Am_wQ z`(LKiyi2NO)Cn^v$g8H&S;aLFPN3;&MHiXOtBu`11(6D^_p3hp9%TZf6L_=`Ars(w zLl=h0X(pfYI9@xMmd3xodad(=UrZ2NV8CV>x4V15vqn~zGO1k3D z9~UHh-k)@PJ(w{-%~C{Q9JxFi@g?6RPPo$bPpq}hRX9yW-k(N|!+;~VnHNV`M_lO> zU%cNF&MY3}t|ooMUe5dk_JQ%0?#2|>ERh8JoQ-#}L>`m{BGd}wWE^}1nB}MK87F= zE<`wHwW$GYG8i#pmyGHDJ50YcK}W~XQq#-!S4G_5;mGw+;k>D850=}TmOB%(&Lxh! znwHKmLWZD)^2$XP(04lSJG*`wmh<@kxLN}J0Kr-B%f~7TbBIRQ*Qk4DKQ?kzDNEFd?T^|OUKVK;Az%KVW zv6}PR68k1kcRjy&Lmf>m9J0$_l2clWU)pp=0U5W!ef&6Eb4PO2uG_7z7Nkvl*nCdo z3G6saBFE}RE1JEGZtY*CU&thK)kD6tl1a3Exr@QfzH%I@@JF)c9YH-3-Ld|QjZ7O( z$sSqbbWgA<+yp`O2W4~zxWHdE0-AWjZIG!l&+_#2v{gUC78YLE zE2nEWJUSZ0W>B4J$ZX;7PqjIi*75V_16vqHauj{wX%1~0q)X8OYao-NrlH|clV}rT zJad`0TInR0sA!l>(_=ff62s=m!yBYY2P9h?nxo3tdXmi9omo>uD!Psn9(>PsoLo^w z1$e28l;e#~`J*PNuNu3DM6q;}aZhI_M)Cl?W)v74v}QPN(kEctEzlrTpPTIQSh~8d z9Td;|Zpz?Xd!yq&5{gLBgX^7BCAaj>zkG0*{RDm~+~bqpT3Y>$@srk5Mjo-C_U-4C zCE`>e&K?;f8tZ6i!Mwpm7J3sk-QkzfG4owG=c^MP?QE}oIgpn~Z ztEIO)rDawF6xR!fH|!#_or~84i>B}2lK}(J+g4*}+hSkJmf4JwJirYJ2|@Jp8}~Rx z2Yd+&dnj@`^cHmn2)DaC5%{L5rF&|MQ9hU8F^$LUfwt)%$a|XSVfNqD^5J(LW z`buwn_-@Cm=JQAd_0x+QatgSuAW=ZTM^76Gq&k{ZHTTU29k2yc|S@ zy<_7gRpJ<*Bi9NBu_YUiWixTfGRAP&YiZaH_16UmdqdBPCqyd_hP+~s4UJ}1U zL;6y~^zk6!R)9wf3kSY{Z{$@l8$1s~U^MmN((Ybft4W~rwg`?uN~AAdBD;}9)=+TJ zId$g*TMCy(@k$52cxN)q&gH080{1aqwk~V?_j`{Q@6c|yV(!RpZiJoJkBK9rqRb`_ z=BHY~w9M6SkH z(pqV}QPJy#^B=|CAP^6rX2mi=^YU(SlJ0DuRE=5DkNbKxfv*j*CM7Wo{48dM;heK4g+Eny>%HNLi0X;<%8Al5JZ2~94+{&%kx|hrq2kxi zMc^Ge&DWOx>ntX1u{|+M`QkTB%IP9u2M3PVw}*FP+Q{Pen84GQ{x0jULqbB!n!wna zykrK$T6^t5p|nyeD)TE_;8UE*2@|vSuZbA985yiV*4Drgvk=Upwd7j zbgIdXVIkn$==yq7yytX`h{k8_ssD*rAU06zfnn@-!>g#Q2<*bjS{Nbfr~}_+1tt5$ z;)oQCAobqL3Ux*unNf)cQsID=&D+DRAH_EIt-ObA%X8<;>;2pQDE3xfx7TmL)JYV0 z=IW~WtjNlPuU6QKno8Q}Ugkp!3bK@gj$J2}r64Z`mwi{fxHud*g*&mrRE5OR(6XZl zA~$NPuI7{Eq=1wNSkACCa+e=>!T*XPnmVH!Nr{Ej$9saG`?}22=qWbMR(H$orS{%j z<`awIkv^R{$h2vgIin_z3+63B6OP(P0Rv6qC@aErTXz$YU7e2R+sj=61fu7OMOl3* zevHWR17Bv~d@GPqQFRUtJ=uxE60vh}vwkw^WEj(KtTJBO9sCjYrfC?>w9My(#D1|E zkCel>ld{F1dOr9?UVh%P4^0uw+LxvX`HW<$%7^gs>PihdesrwBu^dOpkclQEE5j)w z@_8X0he87Lu%DwPQob(IHz)eu2f)6_nrJ6$gEVVxv3sCrm+iC_ym?hL5pDauvW0#5 z{H?yY3GRV_S=OmJ?)(f}-TYvG_WQIyxR5U-ra%@zqS!O_P1z?Hu$_>q%7G4iYiUdx z9I_PlW$eY4kCVof9jJnjo5W_h4^;4q99FvV@Dtg`5W}*gsIUc>Ipe@4V5)Z>FE^#6eB%(bbExp(9di^=c^xlJmRmKO@^Z>x4>f z<^_Kdoh|o*CRZZhcBtEPj+Ijoo}!PD^^9WyQkBU^wXofeg3Kr?Nv=(nRwWa9jCmV+ zcp!V%ZCbZdAU}a>0kP`MJsn43OVH}WW#Ws>ai3f}76(HBnUq;BnlS}a?$NRm+83Lk zLv78*S2`?O+J=TWX@rj%&-Q1722%LVCrd;H{O|6g5;Jb7#P2RRvYC9+H^B^J85!a~ zu+U4ugGuD#?rda1NJ_pX_}w1dWoZc=ccC#14o`1e?@ufT9U6<=pBs4rhJg97?eb$sBT>+0o zX@GW6`5AcTuJxY@a3`Feh@3|id!KIeGI|uZ<(_ynUXR$MifMEy=HO2{CLm~UV@AoS zL_eP|Hh+RE>v_wVHFTGGR4#cnpFMdz-$IjTN3aQ3UdaVFhxI4ct2z-OQeq&e@dflo z)Ib!Yr=ISE&Uc)2A1Plcs2ZjGqD;$;e2VRvetBb*^&$3C#wgbFBHBHZbk^w9U=VTDli3;Nri%#iEC3pUF^K!Eetj44E8pL?1KW6A->UQD7X39Ab z*s+^TQ7501i|ZpE<%GpZHLsy}y;0MGD94Wg*y$w=n(UKeF)M%OQ?hnTZbBdhCGNpAeavW?N|8tcS6&Y8UGVi{Ffj zcO{S89rZy=m*P~Ev-Q*3j*d8sw0Kfz8uLtiX03UKPLowFT#z$bsls5A*=o^<%?vQj z+m|m3ChY`{rz}u|5sMNq{jT90TB-QP2|l$w=FI&3NWiLE1#-eZZ1Q$sKf+upwWT`8 zBZ=KI&U4DeTBMZLRY|*M535wHd5@LiIbo~m#d_ZO=!V<$|F_tCg0mNTpP2O+szyu& zEna@g%3?BXRt@G;V7w>bUHizyx8##+9o8^CuE-nKYDa?W18@yadhv2@VhER@)<-1H z2gdq_9f9MY%-74bjy((1STa`EOH=p$5;~)0T~RP$TW$~LDoAi%^##z5q1?tVgVrMd zvf0W+Vj=!YD|_N3k-9n^Q`1y*_dF910_tckzf~WUShsiPC}I}bZL3Vzh}s1^7GqhU zjql((KA!9Rcpv*Hjnt%bRW`bn2=_5nEh)d_T&t7V<%1jx3kh!u%{l$9sVRX4zw>~- zsb*?ye45UdtBgBpD~Oi;LL(+5+@u+yfICO^LDJ>+1U|gjLI^&>27hQv;V*aC)pqwv z9J1$8D;>|N(}g>67V#Mi>jHVm641;4&@=ONK!|V7&od!dCoy#`^)*D`+q2I8Y3OuS zfs*I_i6AE5sfyf3P(M*3Vn)ViWoWE86CE2!lDkVv1LqA*yo}U}vK0;ye|W;{X2fht zSxrlH1<&)NrAccNQ!`c8G3TRZUdDK=;iG!h6!vUm{tsUWE3uYs1SXxyw|_OVU1Y&X zHsKkvqjoEO>;0;*@5#ySg&O&)Oo?3F-1p&jk^n%jy;4pS3QkX_QB+ZStHmYC8^xWG zCQ)eEt_a)FS-AI|jJ9W6BY%0CUIhL&N3921+8n;4NPKm+-%*d;MaLAoSR+yn@Wr8R z1QSi@|2ExFh*jVw*(T#q5Sy5o3jt17oQl{-r4;@gUB;yow@v4rQ5D3l$sI+M%zb{R zg-(^gOAWwFiPNp|WUF?Z4&eq3F7?H;cpvvNI3q@+c~bDiih?8lmkR(q7b9z0XbNG8`DP2)TUX2f}q?9o(6a4t{M>lmk;hgZWN{b(zV(>IsO!CR&Zxef?WIJCeoPK}c3CEUcr^jBAW; zvPhN4w~;N4C#_MGD7mAHt*wH)=>hcXJ7G6lxDBr`i|B$sz)3v^Lu)UCXbiZHYy zajHC@M~)`BqbRQd037Yg0g1t*Dq5mD|(k(fj3wHB>)NAN2JQi_HYRaMO)X|6fCj`cpv)E zU}1-H3J74Rf#s~UB9fA9Pu+`QWE2$gqW$l??6a}$y${t*`Wqp;>#yeBJe5VQ{|t;< zcX7RNF&T4rF+TS2(HaV`&&om{dzLha-UR)4MQa$Nt~OL=nJTE$Dt>2AMq1)&F|ylU zrOn9$!vV6EyTF&X#8jdaotingqvNf4#h)Z?u#~pjrypU7quO|{Yjk9t-Rz02$|$s$ z%$&0yakTJ#u303PecS)!Wo>>-Bwk9ms&}A?&iMPnQrfFQn$9p8rm8O|agBXjZmX<0 z_Ng}?y{G4_@0@9C&lOkhUR}gBmQK%(X2@{{3b530ICJ(ts~r&J^T1mk_Jn?&p;{`EPt!d<}A6X}%{-||CB6`%na@m^<{-MoS!sFQd}Y84R=d}ALQ zf>l!1?z~6d>+v?J;$Wly{KN` zSjPUmQ|i^zsp@FHNl;o#URj2colKjDsu88;M963_gf^EdhJNA~! zYFChw-Qm}NLR=x1<8IZk`qvvW>Sk&-N9@K6x|lEM83l;H*q9rD@fL4J(@-sU9pr{I zY-X+%UsS{n+VdIMo@uD^mQ|B}kS-Va65!WxBz`k{ReskjXKxUIujux`sfjzp7xoDe zHZE{c9;%|OD5*rP?PvPDEco7KIIsWBHZK5ljzkd}Xpyuf(po*;7rhOVN{%L`4-52) zZhx#yj$igafmU;y)aj@MgXLbT^&dqqe;joX30*w&Sm}qOP|Zs4#}#L44rl zi}*C)xi}u(^TxIOsB`l_Y)Frunka~yE_tZCU1(g=g+L|H5-+&|`)>OxWA$>~k!M$W z$_kws%N%1qSZJc8aHX8#^2o_}D#Fim?0NS}IyL5XZ^nN6hM(iofR3ZN{euGj9aS_E zOfp8r@{sY}{G&Oy-J|P62Wc<(XIdG3!g)3$)7E`WJ~F zj6+>js4>Sf)88zatzI%UqV|=%x12G17HC^@;i8c$dSfY{7I4Y}WP!i0q&=TEky5O$+_w4vO;Vfyrxr)Vb?YN1tpQqo~DjxP!*w8+9j zrpUd`~7M z)a7JDiDw6oC>(3H+OeY^W;a|g>2lFWtf;IcDfQbe2RZ?M{sNG3MECg}vxlvJZ7{Jwahz!A_Jlc0^`CvC$k~M6953R(cCEB7V+RWd6&g6I!rSRMU zDuH5tvYOGN%Zd?S$T!s!#6%{pfcHt_VFC`;5-qlr0yfJv&bWEu=N?+{z27uKXHSor zR@Q{1*$uO{7E$EK)>cRqvwsxfuaJJ6M;Lx*du>jl=Tv!lc|-H_Q7QaRE5-baor=XF zi@pbfziGHQ4UH#ghmBY4gQ1{Y*xefy>$7`p(IxI^YEa|d6f@#c|%ij5%MP+Ms=4A}X`!d2HD1PwsTHqqDVGejgrqp=Uo` zPdwr4jam*xgX8$rx|CGt*P}L@> zl_`NgnK?%MhDM3>f=wHs*?J#;F6RC@4M1~odLGP$@!Cx+Z2@G9^OEszPMeH|rtQF}q0AS_ z><=_p@ZS4rF;(xu(%mgn4uaEYGK&fzxAVO(xAVC~1%s24nEC8=W3rZ?0|75{c)BQH zli`VZ-!XPFdLHckUWnfjiZtOX#HC$nw&p>1C0q=!GRVhvl>iD2^RVek>|nZ@T9(ES zmmjNSbtG3o4Xmrx#gO42KBGuXNVsavLkSpl);ttbm0tMW-QCV-d*pz9Y}n|HjxT=A z2~gAi*9aF)s8*zkV&<|>!Q?K$e6FspqAuWI^j+R^k6rBoX5f$v+w){QdkWebF#XB( zNO@7c1ePoibEM0+ALdGOwE1n%j>5r4u6~8?y;eKzLr=|D+2u>cA>t1XV}Ch>dEp_i9OQ?V~=eUTIk z08a%RaeRO+2uoiu7P;KYsSUglQqH)=&B@7`s&S$X?|K2S+E`eQOE>3>J?~D8puCjsSDga{aL_n;cs}RI#;i1XElLAi?_-)qeC)?mQdz2d`naJ14xsLQ4Fx_;AP~kh>S`T8*X*;5jE>4OF743&y&pt4m_#^O zlO;wSTU(41r6w^!*pE>PtSXAFCnAx!F{Z#PsLRQg=Act=k|Mcvf zr|poQM*dUz7&+BF;@u1#^a85|atEa^m1j7CiaXpbCPlPE`ea;;@%78Rl#GcD<-np9 zFi#X4#Hf2cguGG7{R9I}uTEl1D+(n5II=|HnD)9Y=s@hIqv@PR3Vf&h+i$hzL3^re z$MyPkWNfS%5YYM^D~r>JBcr7a#!?XQOAl?!l2BAq&gSC|3PZ>h88tl4b>#=ZDH4?K zLowkCL_IiVR5?Fw@4N~L4IQ@TSt;W|Q6M#$QTtB*_W>?vq2bWX)|LQ>Y~-r*YdTbc z0Z-7E#+2>%vDh0`$x$o)KV^M)T+;a;zt^y?vaX@#NV_X7cMedTO+7U<_g#uOEN%;Pd{xdB0!t`C5}38ZCO5 zykBmVu#r->`D0@ZeAbfSZqs{rK0FyeR2Vuo^%iGl7=)rl^I4a6GeXr25^`_)#%NAcoe*ds)YL|kY2S(A^_(6P}l~jozg;kU5 zQPFMC9FMbjvb)7`9|{G6%+3A_wGm{s`oG*OpU)RbMn*+9nSb8$WV(%FHS#Q*^GB_} zOO5ELaUvk02?Zv4d4_-o*qPh^F2BSn0^5Vg z$WxPxhu1T5a*hFhF_VI80&I)?zVC)oivN5?XMcZK@Mc2rcTgzp<9CS!pb!BoUD5$T zd&=d`L!rCdYZ<2E>0L<4Z@-lJi=X^Ce=8x4j;wi6w2gMIG$Ms&hIDpZW=M$f9x2M6 zdNpWM=eFjyhD?|zSzJW(DQ^vAJV2Drr8r;b;&?5f@(R#DSY_XHfQUKX%L_=V!_60K z)&>hUzQxA+d|fW0im&RDm=BJA>^1eNafj`u+!rk zOVPhSw8cRsq)uIYwAgE)JKp*3j)K?h#kIMyu^FSVH0phWFd775hL6?}6qNdlEb`#OqPp#*# z-B3}9O3^ynUt|LW=B@& zuDG{Y9kw{KQ1m%};`*m8&eVrToSL?b4|9HupdjP#dX^l09#r;pOaQE4Vk%T%=YWn} z59p(nq=`PYe0kKx@E_CSYsx6-Vi zN(-C6R;WUx-%w9uG_a6z`N1aH& z8xPqCPtE^aoc;7?=dpp?IJ#iJyOx?bs5#B_`i4q)<$dLsw|}8z z`*#e2f$^UgrYkzGekh6@IvbbZYSAARzEpWMi%;IQVfxD=_O%<%szLy;u(9h)2hYmG z|ANrN>x&7Bn0)G_?U5@S2(p0R6sZwCDu z#zC3>o8RjZ*hWgY&aD*~c}L&KjLRhrT>O}Sujk~t+1`XTxk2o`KS{Fn74<)RZ07{! zqK}ySle{P)YhL;{#gUy#ltVYtgEsQI1Ujz|X-jGs-r^KKxBbF>LIvvTvUzzFbi59C zT-nH!pm#$|Lf!~FzLPxsv|K3Ve9x9y`&InJqo^yym2u}3l(JRSq0c@T^Tq|f&>Ut$Heb*eO%FyL9gaF$K&r8i z?`7>>;9x(-Ow5bZlRP8}o<4kXAWfg^W*PE{<;&csimS;kASY8HtZBCCdA*#_)VoJN zpD+#a*?gq-wCqNSe&e??Tla_T>|9)jIPN@7v~?jVbZss()mRBL&K!@0v@~|1cGuC? zFCoDlJ5CQPmO+J2pq{j-7SF?TkyDXPF)|;R~MI?b+-mN1iESx3eoNZtMl{1ikC> zojU03pB>>zZ=*gYj?St$BpiE|_7`7&!N%U0fQI+F-LQACT9ua7ji76TY27kB-Xa&& zn`%03yatM4s|B#nbP zFVkJVkWiA|)!n3*D-`6JBYo&>eVdWcsg37Pz*TjTs_)0UD`PBarnb+go=@7pxpySi zz{s**CY15^*)1XL$3Mn?jS4c~{!sqLg@lnWuNIW66nKw^KL4vX*=WcAhR%S8yql_L zQ2H|^bp6fU33|MALd+jUi^==PXY^O8qK-Tr|0ym(=B420L}9GM?L)0c?A~$OI#uzd z2FZk%&*S_+JOzV+Ke+p(;%|>UOOO-V;h}bE?uR^lu zuEUvp17I=#O~7|6Iiq^MQ=agdAHlQ?|cu8|6GVYE&(8kXJK&TwP6O3vdC zTTe_!_WUjEOis&}Z51~mhhU=FEvXwV809k!zT7@&Uye;wZuylVZ- zXLY2e-(JWRt>APMeSA$ZqC!SW>YKfosOg;=xR$4fF*WKpLYE_!-!5itCGd6?@xs#as zD_A3Q&=xw}Q>;%jGU! z1EoS%{h*E<=UI)W6*9dru2x-Wj8X29W24b>B-HZS5p+{rTIfkQR)i6q!_b4U-a&d zxHxmwOI!DMY~}5D=hz*)?V8c19o~A9opXA8b=;c$UfGW-R=Vrvcb*UEo447)F~6Q; zp2$&$rj7*nT~1Gtkek2%@Rx62_08i`y@JTaYxgL;ojl88Sc?ixjI(x&lsb9;utDEO zvGi)nL9Jq(4Ozij1;v$3z>;pU<((5Ji=DW_jz1RR7U*Cqjd{&{YWPth;zlBryGmFL z#wl#NW^x{gRl#qtVfRX2DI`V;%MKAON2_ zy1*@WpOxJ+{(vR^YI>fjk8rP6Sm?VNtxbVkTmJflhyHT!*9`-w{bO9jzyBLqn?J5c z2FT!VVBYyw6@Qs}=n2k~$Dh|_gIOPHN_WmKBgB-lVs=`UOgz-x4mUmFlF0butV|oS zKVAI+n?K-ocqpzJ;8u8|?9%K|k{AHqDbjXvZCqFLVgrj!4Ou77K&>QJ%GGhU+ztp`o{ zX1i_)i^9j`MQh-8pY!)sRf``R)3QT|U{uBN(#J2=W( zu5n+}yH)+MCDsU{WO2s)KuOXc=G0d}YQE`3+fASqNSXE>*@vYby2BK+&{(bYZ!2_h zo|gRBiI;J2?984dn$n2U*FGFhYcTEV46n;y^1SLKJ#s|SQnq4Bx%H-DpOuMsJcC*@ z(ZAU5kh>!D@tmQ+wn_YK8zT16w_od}Znoo}`R9LO}U%O>|?P((AH`!sajwiCkAE~;rrLI1f6Xy)ESAf}kdOwZ&bXak&iT4-2|beP^7jzzjm^Ek<*O2YQ++k8n$Js?NGj8S zx2u@ls4!cAUZ^|viwA9QqCJhVS?lENTtWI zsEp#=rye@}RP#|Di9RK!0uLeUq^Z2T6^hU5uglei@~)?xc^oN~;pY{z{YkG3{=jgy zk-%q?riLNFy8}PW&9_f9XLQ?TiHpGwMzH2j-IITjjMMjmtYcRVPQa3%mw}B`7!>*+g>;-2E-4*iI%fSpV18de;r_ zTka3VXnC7LwA6u4nfo7hN`n&(>@a^y^-L;l6AU58Zlz~dcxuJcbqw>W+OHqu zBwtd-EdKh6{c|yi86fd(;EB#pfyV!(UBB1&((@zb^Ldf3Y;>Fw;C$+K$lQA$0+k$4 z^WT|jsNJhMHZJ)Hdr786`&hvk-bBtUX(l^y9vV4cZ*V(*A|O6U73Irz>jsl_#cGsK zJdR)Ok()`b%kSe?;x=m8kCrG#m&u;;2m$0f;;Em zOa;6*$_ZmG=cN(zXPv#>s6*-E;PuWMJEVNd+_wO#wg6nZ60=OchTiFQ*oe|HS_|EF z+PU;3bz<%>rT>OLrssQrO5&>Z*+%=LP_y43RXyk4LtwC?ZTe>g&vE~m-Bfq__Iulk z^03Pp?G=|8@uZxr=@7~@!m7ap{`nU;j&QGdWhO_5g!8Y1Ny4vSxfE^?w zJouRY?>T}W!n2!tOY+Y@xNdlqmtU}4n?oO>HtcSZd;1+j@-v2Ck*5lR(r-PJZDgL1 zPvpH8KsR(#FaFE*R*;b6byr^ps7l)Gjlsb8UCyqR3*!ab$l*EmryPfvD=$7Ly*t17 z>JMvCMc?FcS>p;#29m;8{$o<7p%op9DATg6H!vOE2cgXyCnAqeOLdB(z;e@2|d0yoAJRp zFh_XJoKfahnrc{Gkis&>$EDH@yCo;;BQGD2Cg~Q)_!Ru_MBikkU&V}%2H8KVv6sxa z8g0-TdE~qs<2Jta9?w^9SOELWOE=E>1Zu zhr>7@ki(B~R?b&kt-M^ycN*UN`HxF7Cu7L1*@A=op1o?o{GPRiB-H|?s+t6)#b%{mx^_hLCX++KEk3c;@htF8Y!wE@E4A{9u$4w zH)~$yCq3DPZKDF!8xcVFCF|mMPpt<^8aZ9Q3{n&AK07NmpMu-VnF)!pQs*Vc!``?Y zcNv^hWjeIp3@ksXD|xLje3$iFSDb6)eZ3p_q@2+uel>Xb^X`r6PW@Iz@)NEHYHVCD zbD!M~sb+jCpCMp9%eMta#f}=<8QMjrSr-%CUN>yg0iM?8I~c{lSyt50krjFGiiAx0 z3`t(stUZDx7f`06!@>jiCHeV7qvqZ4 znqg?ta<>FMrg!5>JjZL{VVa`5JS|9|ud3?V6Yb!E8&_Sd8Wkj5xzvwjHSX-6{%_}i z>3P|f6#No1ARMfB`~1k%xmQ+J*DstP8Dsphu0gvhGcIpTcG2s;ztdR(DfD+#hmPup z;NE5VPe0|()I5|4NXF4;CyW;Rn1rLpEbofNZOdPHS@aWuXo#twY@n@SIV5TTTVu03 z4v!0VY1JC+tw;Zdp*VA!QtD_@S*W+ch2RU#dz08;j4$anwnkJb|*Gsm!gB`gpxPYYt-3TqG5E z-e%DFGd-36bBlbl9Z|H9srJ{g`jw%9PL_bwM_dj1^rzk_1qS(&rF13nv2I? zT4gEnu2D#EjbOF9jfs;$*h6>=3A~%_$?~UPm7i?fI4!6e3527?71D@vOZ+Z2ozwqu zPx*KE=SH?s=iznqrRb~eCMAy+2Yxw~xGgb!?3{3toy;}33*0M5r_W_BxDro5iQ;8j zuf}T1d{e*t_sM5RuG~-%2IBi%@9p!}k5P?nQi7^1Vx-=W6^r)An(7BvSx|J(2nO~) zrXgYdX3139V%ITWi~eBC!8i=%TdW3eYGtPE$OuFK391~i7)eUy)ekl?79}y3YWb?R zKK})~q-n9n82)U)J2-0OIIh|{L%U`Yhk27}?5yT)4UeAfJn766mm19+B^GS`Q9>*SKG^U*Bx48ChR-cr&tR1zm5$v+@nEjw`bq(`FL6P z*S9*58-7{!fEl5;bW($S?mR+;Zctlz+vj`hxMg|$Kdk6HE(;uUaoj0QIg?pHcAn{b zmzvW5Cb`y${MOJ%G2gW~C|&8i&}3yzU_s)B$^wJYy|}oz99oF+e^h?fq2WhAJ)|n) z1`3?9H=^`*cPZOt_u{ZHW^ex0UggHv-25@W*UUbXP&xnAOS_If<_v1FiKI<;R-?`8 z8t(a8YHe;Z-ejeJU0n{t=>AG=uk!J#Zyv1|o2$)j*T}>y>?e$-i02{td3Gnd5sG`W z&=G9zq(0iRdbO_1X`#}@BX>1^beC0u7WZ`AZ?Eru84)J8M!LkwpNC~oMy)2RwkWBf zy_&S{h#18+r+vzq)lnNYz0xdQdeC;2jv$b{8R+bETNm*-(}Eu6b$$EE-FupCD~|i5 z7 zc*|DvJ!#^Yf2T7N+l`?7~8L~$?6V|EM z;;KQ$R0pfX-pOl1&NHLu+)tlG3)JN#J=-0m8gD{rpLYi#^6A3{{XOPe1n(QTH?DQv zrthvojz$IgYG>e-%GN(ej$87sr)TR{o00cQ z`%z*CY1`Vevt!xhVuGQ$xOvzJz1u^l60SjT^{#dwiz7U8xQRbA+WmO*=Bno02t$kL z^eu^bJj;y8CBtC0v6HiIEo_d~`XA=Q$MlYkx$ZC~uQtL+l4|q84f?S^hM2HH+vQP| z`l3Ge0MZKs7fql9K<3=aGb;}}6V+8M7J-K(!C3#7Zu4TEy86kqCUsNU}#>emu2 z$h?-iZ{|9t)7>|+QMfK7n}#Y*)*H(>vpT;WEoTuU6Oyo!${o;hz2Em7snESrGkHKM zv*;L^P#>&*rikpfN4;q|k8=FvpVB_{*4eqw+k0Mozo@?6rg)!W;XbJxyWi`|{1jY@|wKW%B^>k%gz415xG9@>vlDm6sJ>OL(2OHc{cLPV&PpGP> z>c(3!T%;Uf*%y^; zvcrCX>vY_tKd5sEH$SID*q>$kO?pHNy9O6)+I;em%*nAhGySd3#r~?j|CyO@52~9N zR63Ec9MbOmnXSzwRRa8~{orb2xn$N!JX(T#k6 zQx2D93=C!!N%rgd7i9jmEo1VaVMgC3I3Y8#ik&>Y@zk)RtN=*p>FnpC2JJ4pNfNR}!@B>dy!*PEW4OI#X1}n3$0VC`Gn= zxJ-Q^AXnFgtcC7dJ>xnvLG51&n|c&A9U*381omABOkW=)F?T+XG5^$1pW4Y37zxl# z-7i_nA;Qd$d5*7#jN0e~;_7#&LWObbLOB?DFGid}egD3KQSZvM$<|5}({Hcc#B*Mr z8?;aHIZSr9zEY`|EcoU6`jgQ`AI%Jtu^u9zGG31D>w4O2p_4Cm(f4bLN{?!W5+`nR zENrgyz6DB8vl6UdDNhEd3hpnTx~*oT9o_Hg@eggX6>8+&35$jhIz3T!qL` zVzYQjP~hrR!WN@l%0x)a-G$X%|7vj`X#Al0WCw)hAvqH?fv}E%G7=Fp9{Dml@x5JE$fZ}giba7{w13+l z)6V~oiR!I5Z_Y)gN=g6QaoqMwgfuE1*rUU{)Z(m`{)xhK_FsNT}5@;79&> z!_&BC;1)P;{5$5=mSsm1FJb@h@xw@4Nw7{C6qm!1$@_4LpuvCx8!3_Q?ZjGT$sPum ze90CUl>4zZ$2EzUAowo-*oib)-5INNo`3s>I%qkH47>s*tR)8hDi^tMhYP{(EP5~F zhlEcHmmp!Soan6t;H9P_Ye{&wq1k^HW^)h*?u2r4rGrXP5c~0M;nnYdyurc%e&E=J zfm^Ya*ic0RPyF-CfekJU-cA-?P*C4`EX~Ue{a#zmeOEqJ?Vle!r5QDKn4$e|); z`kg%19h(j##cK-@${w4rET3ifcgGkx+Wp?uVYdH+k=W1%=CAtSuF7w=O}$rCR5IDx zdCHMhi@)>vp){p~S|a$*M%m)Z7_>f<<$Ph+i!?hJ_^NYNIUmstLx`3PieDP5Z+0yQ z|3UVuuU&6{n~9W1F~@UE?w`mBldBCYajK5XWFjruXY{ATR&BnZN(yxFl$ zJ-k0H3d5c3inuR~h)1&~}wr+0ksty({UV@sTWZi4!P`gC4CNXYSf4&IcXd-B; z@Ua2di8bJ{)92K7@L_=A3y0~vwMleUE?IcSa!voGl=D(jPOLsk2S@v_04MzO9yYl_ zG#TjAhU7p<78%7-yjPhIX~+^chTls#AY>27$dYmf7J_*!TY)}btcmeJfpk(9^lYrV zlkg3+LJ4wjO{CNNEmqTVW06Y!%#2mWa!df!t)^zNKFqv6dmxx&6jVbU{EOJ;D(R2@ZXq!D!2TC{Ns!8oX* ztO_+D2O&zdGjs{N=2j!VafB^^I`oWvt&Lbp*?7YsVY(mv3+%U zyq-HHw8uUv>yR~K-QuK4FunG4a0;$<=r83S={es$!01V;u!AfuckngFfkt6Y&c36l zGh}T=6gbhyO_hmIdgSFRdh8aH#lJxYP&2vQbaJ7?mb;>eElN!gd~k&dOm6jakmQAth0 zYc4r0%qTg|@=E4(zISRT7_9WQp=n2UP)6 z*)SOf;>lp0f(wX|gXUIASP=OsPC(5GHMqCuSDaH`^A$8ev9+GV6lk)Z7vmNXuM%F{ zSwMZYxgCakqvB5d^X{js`C0m(P9iq?y0LL^oQ!kP;PNc-ONp{SisA_l%`U90baD{| z?n>P?1C%Yohb*bG9yfEAb+|+7M5z??yp1A7xR4}MYJV?2OYDmy8T>iF?4!^%|_PK00xn#}rl|2bcdl<)G)d*g%KV<(gIfo4$T?|1Wiq!M6G!bMxy~VM65R)aA%-#1b%7rnANn3;E z&G4o#Hv%$Cih+2=Omah1g#x;BKXT~nwuOy#FAP!QD^L$XC>o10qJA*o$0{yG6s3+@ zwS+FC5h+nana&*m7eWX7oXbO}jEa>4Vm)!_GPlg<@;?+48?+gqhygiIc^!mf8+vZI z(qMayBd?;uBt{Mb$r~T{_gk5Mb4_aI)Ict?RQ{S6WG0!uTAlD}YXc`GH}7X&L(ARW z7>DYjCS|w$Vrjn7g2{AO_H9h-+INYzS)T3kp6KQ8vbgXrJ{$S=Du?+&PeK`xC?<6x zN^)f;0ABj{RTbamyD?>f+g__{Yxy{wQB%{p6QU@)+Vk6T0Yh*zY;+%JW3|;?Ey<|3 z7O}PC+AnABgp}FI)T?t7&!R@Ft@vQvN4oQ$PTUFt6lJUmG0%PwmZ zrRB)QS7%|yqJZI4x|Fw3J(jDlsBh<}?*cEK=M}(cW4YH>TcR8eDql7x^izkKw*gp7 z0&1=i5)u-VDQ2R&j3ilCt-NACb_@hGKIneV;dLW)k`Q)pmERw#rX-VgEH$d_*KZJ~5tL3bKasH)745m(V#aBJ z8@VjktTOAX1l^}*8A{a9@`XU-9v)bnFXYHt1wz|m-j`kOHMB7YLGDPC| zMdHjmzwJt`n7L`GpyHSp6<7$XFT=eU6Ah#IOv6;t&X&EsYh9kMpy$j$u_R)s34>+~ z6<@L#ijyEad@CrZ+Pp61Sn#?o$ZSYpw6mw~@ZgN!PIFVhR81B8YWGYA?=U6rzON2h z;0&{!uL7h>zg|086Xc(s>neckdlTa9xAW&9!M~u}&uD-5Gq$KE@XlnP1tKumIG9$r z{u%=|>(AFjw6Pxj>z~|Y6}ZumrtRJJNqi&U0_Y11*Y|fSuff;9N;;3#Spl_R5xz2o zZY+Kyi`Y72+~gO%=-1W?S#xUEJ=LkI6w7RlJ8&t+R1e;7y+=cIYyOr9!N}ihH%&}% z$I9TO^Pt-rC|OA*Q*dnGn!LM7GJrz8^MhM-4INa{GL)9L7?XN&k?ZN1@E+fpkAI(D z(V1SmYqzPK8g-hPv|z3D`bw7N!siKn(Hw%aYrViOQ>7MUU`!uPSZ(jQ1_JGsx}&tC z&rEmK@4c&l@%K*(ikJ*%PZneK#x~$vEpd8NvMP!`<3?7>2AyMSBuCPl-YSC-XB$RH zMa$b%DaXQ9H4o+ecY9us8ogE4V5p64CztY2*NNt#4p1o(%c0s|p2sUMHH*3+6@9?l zCQ6h+_!bc1BaLYMa$(UCO%W9-WgC|cEs;x#9uLCK2*zhl5vhZ$ZU$saYOKhfCzub$Q5@DKjM^}>%6&b zHG*M*;6v4YDO!lH13dQg!@Vv0{Cyp_&F3!ZkNZM8kEB#?R~C7vbhVlUD*lYo(j-kVRBPX6PDHPJ1ed$-(66k6ye4Ycx4NtL9cGs7reLBA@V$nK z$syS)8~)z;*S`j`h-cao4D@}?$3}Si8cf(%A0l)hnodc5)81!5vh+W-Ocr#$?s6d7 zC^G&O&?LCi*2;VmZ10SzEC`JA2qhj(Mzp1{%?(<_^yOhHW@%u(#Q>FEpMzX)hHjWH3UK`cTk;`}^ zrP}$WKbbMd?AP5Y&s+EkxulZPzetGoV1+>zDnH2omT==OaH5DiJ3xGZ|I|zR#f4+`H^anEbBf{$JoEJ zQkJ8~*KradS%qp7B@&$&W}~rhgRHHw{b+qrBV*tBXR5y2C!?y@6}eIR76twIfce*A zQbJimaqaUb0owRt=ghNve<4WecNLd@1h)=iY~vcQ;BZ!X%b3$}Y2+EJF9`RQl$5Z1zW0ey zvv+XT`^nK49<|LS#xFsRu>sJfHn1aK7m}m>ByHLA^AC##1E>0cA0+^y@Iyqhc*tF?VGbu@%%9 zNMiXZCYe;$L(L#@{aHPIN%$l%!9Hu*9R2r&L zel|4OxqF!9OC+lqlsXqETJSs8xl7DQTyiq8-mJMIL4YT~KPtM9Xf^r6_Xodz13(8v zFRaKa28Or-BeA1mr%J9_Dz8IZj}O5gSsrg?D6w(s7giJ+EB zVA?ibg;%j$!vY`k-a^i2*=Tp7@fXjm=a85(XR_WZAuBT;$2(Ymhnm;or@TP2>HPNC zTIG%gp`rqc!{OSLQ}y4~nyBblpQM8AExJdUV&uGm!Q%6DNycK4wey^ViG@ajpSJ)d z=}w^N-i`cUuVwArw`R=rtQB4*I1M$Z4AK+5*oM&h(HLI4Z3csJBD@q)g zYO!%J5{)w=*WF>DnpYf#^_(8wJ+nOI@pVAQGuuFa2z*Jo%wR@PfbqtThBKsIAbGhM z`6JAeKKmp5T?>k#M@R7`TxB@~q+=U9YdDy^XQXAeymLP_{FCpqcxQzJdK; zX-jFx6j^Rwzm-y%{&^9+Z$m8`iO|8wrzB*u4`~U6L-yXWlG+oDl2nmB~#rspm5wd%yYK8 z*mHUFQtf`U1=_r>4iXix_DoCTHREeng69X>g8yqZt$mfP4felpuerHx!|>Yowep#i z7bQ)B++0o9Swp=^=8Em_vjtv@_|Lu%s;IR}suY9?*BbZ-tjQh?7(r^a%PLC;l*0+E5*T9dROX% zA)@3pLRmAke(m?#W!F3Cov(sbAR}F!mHw~jKT2zLWiW}v_=EbiSSTRWeg#&L;B5_Gt|W9p%@&+exp}dgXe3KgnH*fZ z$M2c~bbmRnBSC+G1IJBD+0>5j8IuQ9wn2&Ki$xH1sy*9?py2zyT^QUvbG3M_K5VgO zu~_JJEVnlo5?g$$9Ke+SkyAHW+LsgqhRyPdMT#mkEp)B1Fs2h-XdgZC7}}Y;<5zTT zxi7r9qON9oXKUU@!na_F@a3Eh;?zIScNUuSQjx3XQc&}SCBCstXgu8&9qM>L793=a z&CXjm1(-_UpwU4&M`n9Lj%Kwvruv^p*-ZJuVI*VuT+sqwVaF?&_W%@lpYoPo+2yPA zi4j=j%#Qq@!?8!a8T=hf+FHKfQbykdJl1|c*7MCirsG|M^3fVUd4mvHY;D1QC35gz z+@pdWK&;77FC0Wg}PXgq+)qQT@9A1K==%Qa|uOHl|5LEtTO~ z6e_>{JYC*9gZ0?T*>{a-+>*$x@NmRe6P>lEY$2>(aDCkNd|xyOriCjFw-35SlhBLZ_!__$@e-5ALUpcD(`T> z%YNF|7lV|&UZ}~pX1PssT2|&UM&afBWaWJV{A0URC&7!eroL;4Vs9F98Swf;9RYYr zkm zDcdbO{JzFY226?@?nGfhs>!bO)FxkbHva;{*>7+;oz?Vu;i91I)Mm6J>7+kSg)F5A zKz{+ki1*41=DV0>+Kc@_4d*m}7Bn?A)Az^L2fmz=g?~RSZ{b$3A10BOrb?5FMB#^dw6$@e7yOs-&+y@Dp_B&mX9;G>Z)ZwHZ z(Z4XQYS**(l=p=*aS&vk&i*M=@038+&|B_g8)l>heo>hfIh6SwenmnDn>(;kZ78*b zgG}l&0w5uy!yx$!02xt+Os&+QX2AxYI2b9Em_pcBL6&D91YiLy$G4}i#>{XZaIIkl zxS2{`-#sP)*F`i~ul&>szyj1^+-UJM%+b`k23Dd*_9)CHTKS)+dh9#~fbv>R^n1Mt zImcKz`yZ!XvUCIG)rTotTHXPV0a1vW)y_Jyt#FbswZlqLeFL3o z#+w6iLcq|=F(fPpZD{#Eu|4-YQZjn?HA&XW+lL7@Gm!T~DJn~CtpAoHf{~M|(L|86 zt17kr4forkq~+jKW(7zLP7__Q`i%-!;_I^Ha2W+DN>x=>`K-SC4iw`lCO(uw^!tXI z4@BxB6<+4s}IRGrZA&Bp4)DV9UM)d*kNdbV9Ale2o*d?%46AbSM zZ=|HqRn(njZJnXOiS&-H$XSJ~6M%m;$V#uvR#5P#_zOOV#N(q&sa4&+t#E~&eje=p9%aZoCKwyw*QqH%Nl@EyR>%{^SKCY58M1Gi*CDQjguuw%=z><_C!4Rf+IZf*w;t0T{ z&d`zE=1dWC{Y;WF*<&uQFP^)c%8O)dVH(GMY0M}9&vgQvkWcLqPTlMa_}vAvuud#k jJUZ$}DCKF?%>H4ww>Ei;^W#^)%O1^pI(Lh1+dlt4s1{|< literal 0 HcmV?d00001 diff --git a/docs/images/platform/secret-sharing/public-view.png b/docs/images/platform/secret-sharing/public-view.png new file mode 100644 index 0000000000000000000000000000000000000000..f1bd9482f7e94beff541052fa3fc15bbc70a1b2a GIT binary patch literal 226338 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

6mDvpD2Dg9#|;13$JT3OQ&?l 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

+ + ); +}; + +export default SecretApproval; + +SecretApproval.requireAuth = true; diff --git a/frontend/src/pages/shared/secret/[id]/index.tsx b/frontend/src/pages/shared/secret/[id]/index.tsx new file mode 100644 index 000000000..7f53d962d --- /dev/null +++ b/frontend/src/pages/shared/secret/[id]/index.tsx @@ -0,0 +1,24 @@ +import Head from "next/head"; + +import { ShareSecretPublicPage } from "@app/views/ShareSecretPublicPage"; + +const SecretApproval = () => { + return ( + <> + + Securely Share Secrets | Infisical + + + + + +
+ +
+ + ); +}; + +export default SecretApproval; + +SecretApproval.requireAuth = false; diff --git a/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx b/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx new file mode 100644 index 000000000..74db4f909 --- /dev/null +++ b/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx @@ -0,0 +1,31 @@ +import Link from "next/link"; +import { faArrowUpRightFromSquare } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { ShareSecretSection } from "./components"; + +export const ShareSecretPage = () => { + return ( +
+
+
+

Secret Sharing

+

Share secrets with anybody securely and efficiently

+
+
+ {/* Add docs here */} + + + Documentation{" "} + + + +
+
+ +
+ ); +}; diff --git a/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx b/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx new file mode 100644 index 000000000..39e026f63 --- /dev/null +++ b/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx @@ -0,0 +1,283 @@ +import { useEffect, useState } from "react"; +import { Controller, useForm } from "react-hook-form"; +import { faCheck, faCopy } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { AxiosError } from "axios"; +import * as yup from "yup"; + +import { createNotification } from "@app/components/notifications"; +import { + generateSignKeyPair, + signAssymmetric +} from "@app/components/utilities/cryptography/crypto"; +import { + Button, + FormControl, + IconButton, + Input, + Modal, + ModalClose, + ModalContent, + Select, + SelectItem +} from "@app/components/v2"; +import { useWorkspace } from "@app/context"; +import { useToggle } from "@app/hooks"; +import { useCreateSharedSecret } from "@app/hooks/api/secretSharing"; +import { UsePopUpState } from "@app/hooks/usePopUp"; + +const expirationUnitsAndActions = [ + { + unit: "Minutes", + action: (expiresAt: Date, expiresInValue: number) => + expiresAt.setMinutes(expiresAt.getMinutes() + expiresInValue) + }, + { + unit: "Hours", + action: (expiresAt: Date, expiresInValue: number) => + expiresAt.setHours(expiresAt.getHours() + expiresInValue) + }, + { + unit: "Days", + action: (expiresAt: Date, expiresInValue: number) => + expiresAt.setDate(expiresAt.getDate() + expiresInValue) + }, + { + unit: "Weeks", + action: (expiresAt: Date, expiresInValue: number) => + expiresAt.setDate(expiresAt.getDate() + expiresInValue * 7) + }, + { + unit: "Months", + action: (expiresAt: Date, expiresInValue: number) => + expiresAt.setMonth(expiresAt.getMonth() + expiresInValue) + }, + { + unit: "Years", + action: (expiresAt: Date, expiresInValue: number) => + expiresAt.setFullYear(expiresAt.getFullYear() + expiresInValue) + } +]; + +const schema = yup.object({ + name: yup.string().max(100).required().label("Shared Secret Name"), + value: yup.string().max(1000).required().label("Shared Secret Value"), + expiresInValue: yup.number().min(1).required().label("Expiration Value"), + expiresInUnit: yup.string().required().label("Expiration Unit") +}); + +export type FormData = yup.InferType; + +type Props = { + popUp: UsePopUpState<["createSharedSecret"]>; + handlePopUpToggle: ( + popUpName: keyof UsePopUpState<["createSharedSecret"]>, + state?: boolean + ) => void; +}; + +export const AddShareSecretModal = ({ popUp, handlePopUpToggle }: Props) => { + const { + control, + reset, + handleSubmit, + formState: { isSubmitting } + } = useForm({ + resolver: yupResolver(schema) + }); + const createSharedSecret = useCreateSharedSecret(); + const { currentWorkspace } = useWorkspace(); + const [newSharedSecret, setnewSharedSecret] = useState(""); + const [isUrlCopied, setIsUrlCopied] = useToggle(false); + const hasSharedSecret = Boolean(newSharedSecret); + + useEffect(() => { + let timer: NodeJS.Timeout; + if (isUrlCopied) { + timer = setTimeout(() => setIsUrlCopied.off(), 2000); + } + + return () => clearTimeout(timer); + }, [isUrlCopied]); + + const copyUrlToClipboard = () => { + navigator.clipboard.writeText(newSharedSecret); + setIsUrlCopied.on(); + }; + + const onFormSubmit = async ({ name, value, expiresInValue, expiresInUnit }: FormData) => { + try { + if (!currentWorkspace?.id) return; + + const signingKeyPair = generateSignKeyPair(); + const signedMessage = signAssymmetric({ + message: value, + privateKey: signingKeyPair.secretKey + }); + + const expiresAt = new Date(); + const updateExpiresAt = expirationUnitsAndActions.find( + (item) => item.unit === expiresInUnit + )?.action; + if (updateExpiresAt) { + updateExpiresAt(expiresAt, expiresInValue); + } + + const { id } = await createSharedSecret.mutateAsync({ + name, + signedValue: signedMessage, + expiresAt, + workspaceId: currentWorkspace.id + }); + setnewSharedSecret( + `${window.location.origin}/shared/secret/${id}?key=${encodeURIComponent( + signingKeyPair.publicKey + )}` + ); + + createNotification({ + text: "Successfully created a shared secret", + type: "success" + }); + } catch (err) { + console.error(err); + const axiosError = err as AxiosError; + if (axiosError?.response?.status === 401) { + createNotification({ + text: "You do not have access to create shared secrets", + type: "error" + }); + } else { + createNotification({ + text: "Failed to create a shared secret", + type: "error" + }); + } + } + }; + + return ( + { + handlePopUpToggle("createSharedSecret", open); + reset(); + setnewSharedSecret(""); + }} + > + + {!hasSharedSecret ? ( + + ( + + + + )} + /> + ( + + + + )} + /> +
+
+ ( + + + + )} + /> +
+
+ ( + + + + )} + /> +
+
+
+ + + + +
+ + ) : ( +
+

{newSharedSecret}

+ + + + Click to Copy + + +
+ )} +
+
+ ); +}; diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx new file mode 100644 index 000000000..971b77261 --- /dev/null +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx @@ -0,0 +1,108 @@ +import { useState } from "react"; +import { faPlus } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { createNotification } from "@app/components/notifications"; +import { ProjectPermissionCan } from "@app/components/permissions"; +import { Button, Checkbox, DeleteActionModal } from "@app/components/v2"; +import { ProjectPermissionActions, ProjectPermissionSub, useWorkspace } from "@app/context"; +import { withProjectPermission } from "@app/hoc"; +import { usePopUp } from "@app/hooks"; +import { useDeleteSharedSecret } from "@app/hooks/api/secretSharing"; + +import { AddShareSecretModal } from "./AddShareSecretModal"; +import { ShareSecretsTable } from "./ShareSecretsTable"; + +type DeleteModalData = { name: string; id: string }; + +export const ShareSecretSection = withProjectPermission( + () => { + const { currentWorkspace } = useWorkspace(); + const deleteSharedSecret = useDeleteSharedSecret(); + const [showExpiredSharedSecrets, setShowExpiredSharedSecrets] = useState(false); + + const { popUp, handlePopUpToggle, handlePopUpClose, handlePopUpOpen } = usePopUp([ + "createSharedSecret", + "deleteSharedSecretConfirmation" + ] as const); + + const onDeleteApproved = async () => { + try { + if (!currentWorkspace?.id) return; + deleteSharedSecret.mutateAsync({ + sharedSecretId: (popUp?.deleteSharedSecretConfirmation?.data as DeleteModalData)?.id, + workspaceId: currentWorkspace.id + }); + createNotification({ + text: "Successfully deleted shared secret", + type: "success" + }); + + handlePopUpClose("deleteSharedSecretConfirmation"); + } catch (err) { + console.error(err); + createNotification({ + text: "Failed to delete shared secret", + type: "error" + }); + } + }; + + return ( +
+
+

Shared Secrets

+ + {(isAllowed) => ( + + )} + +
+
+

+ Every secret shared can be accessed with the URL (shown during creation) before its + expiry. +

+ { + setShowExpiredSharedSecrets(state as boolean); + }} + > + Show expired shared secrets too + +
+ + + handlePopUpToggle("deleteSharedSecretConfirmation", isOpen)} + deleteKey={(popUp?.deleteSharedSecretConfirmation?.data as DeleteModalData)?.name} + onClose={() => handlePopUpClose("deleteSharedSecretConfirmation")} + onDeleteApproved={onDeleteApproved} + /> +
+ ); + }, + { action: ProjectPermissionActions.Read, subject: ProjectPermissionSub.SecretSharing } +); diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx new file mode 100644 index 000000000..88902ecc3 --- /dev/null +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx @@ -0,0 +1,146 @@ +import { useEffect, useState } from "react"; +import { faTrashCan } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { ProjectPermissionCan } from "@app/components/permissions"; +import { IconButton, Td, Tr } from "@app/components/v2"; +import { ProjectPermissionActions, ProjectPermissionSub } from "@app/context"; +import { TSharedSecret } from "@app/hooks/api/secretSharing"; +import { UsePopUpState } from "@app/hooks/usePopUp"; + +const formatDate = (date: Date): string => (date ? new Date(date).toUTCString() : ""); + +const isExpired = (expiresAt: Date): boolean => new Date(expiresAt) < new Date(); + +const getValidityStatusText = (expiresAt: Date): string => + isExpired(expiresAt) ? "Expired " : "Valid for "; + +const timeAgo = (inputDate: Date, currentDate: Date): string => { + const now = new Date(currentDate).getTime(); + const date = new Date(inputDate).getTime(); + const elapsedMilliseconds = now - date; + const elapsedSeconds = Math.abs(Math.floor(elapsedMilliseconds / 1000)); + const elapsedMinutes = Math.abs(Math.floor(elapsedSeconds / 60)); + const elapsedHours = Math.abs(Math.floor(elapsedMinutes / 60)); + const elapsedDays = Math.abs(Math.floor(elapsedHours / 24)); + const elapsedWeeks = Math.abs(Math.floor(elapsedDays / 7)); + const elapsedMonths = Math.abs(Math.floor(elapsedDays / 30)); + const elapsedYears = Math.abs(Math.floor(elapsedDays / 365)); + + console.log( + elapsedYears, + elapsedMonths, + elapsedWeeks, + elapsedDays, + elapsedHours, + elapsedMinutes, + elapsedSeconds + ); + + if (elapsedYears > 0) { + return `${elapsedYears} year${elapsedYears === 1 ? "" : "s"} ${ + elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; + } + if (elapsedMonths > 0) { + return `${elapsedMonths} month${elapsedMonths === 1 ? "" : "s"} ${ + elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; + } + if (elapsedWeeks > 0) { + return `${elapsedWeeks} week${elapsedWeeks === 1 ? "" : "s"} ${ + elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; + } + if (elapsedDays > 0) { + return `${elapsedDays} day${elapsedDays === 1 ? "" : "s"} ${ + elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; + } + if (elapsedHours > 0) { + return `${elapsedHours} hour${elapsedHours === 1 ? "" : "s"} ${ + elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; + } + if (elapsedMinutes > 0) { + return `${elapsedMinutes} minute${elapsedMinutes === 1 ? "" : "s"} ${ + elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; + } + return `${elapsedSeconds} second${elapsedSeconds === 1 ? "" : "s"} ${ + elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; +}; + +export const ShareSecretsRow = ({ + row, + handlePopUpOpen, + onSecretExpiration +}: { + row: TSharedSecret; + handlePopUpOpen: ( + popUpName: keyof UsePopUpState<["deleteSharedSecretConfirmation"]>, + { + name, + id + }: { + name: string; + id: string; + } + ) => void; + onSecretExpiration: (expiredSecretId: string) => void; +}) => { + const [currentTime, setCurrentTime] = useState(new Date()); + + useEffect(() => { + const intervalId = setInterval(() => { + setCurrentTime(new Date()); + }, 1000); + + return () => clearInterval(intervalId); + }, []); + + useEffect(() => { + if (isExpired(row.expiresAt)) { + onSecretExpiration(row.id); + } + }, [isExpired(row.expiresAt)]); + + return ( + + {row.name} + +

{timeAgo(row.createdAt, currentTime)}

+

{formatDate(row.createdAt)}

+ + +

+ {getValidityStatusText(row.expiresAt) + timeAgo(row.expiresAt, currentTime)} +

+

{formatDate(row.expiresAt)}

+ + + + {(isAllowed) => ( + + handlePopUpOpen("deleteSharedSecretConfirmation", { + name: row.name, + id: row.id + }) + } + colorSchema="danger" + ariaLabel="delete" + isDisabled={!isAllowed} + > + + + )} + + + + ); +}; diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx new file mode 100644 index 000000000..eac3435e3 --- /dev/null +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx @@ -0,0 +1,91 @@ +import { useEffect, useState } from "react"; +import { faKey } from "@fortawesome/free-solid-svg-icons"; + +import { + EmptyState, + Table, + TableContainer, + TableSkeleton, + TBody, + Td, + Th, + THead, + Tr +} from "@app/components/v2"; +import { useWorkspace } from "@app/context"; +import { TSharedSecret, useGetSharedSecrets } from "@app/hooks/api/secretSharing"; +import { UsePopUpState } from "@app/hooks/usePopUp"; + +import { ShareSecretsRow } from "./ShareSecretsRow"; + +type Props = { + handlePopUpOpen: ( + popUpName: keyof UsePopUpState<["deleteSharedSecretConfirmation"]>, + { + name, + id + }: { + name: string; + id: string; + } + ) => void; + showExpiredSharedSecrets: boolean; +}; + +export const ShareSecretsTable = ({ handlePopUpOpen, showExpiredSharedSecrets }: Props) => { + const [tableData, setTableData] = useState([]); + const { currentWorkspace } = useWorkspace(); + const workspaceId = currentWorkspace?.id || ""; + const { isLoading, data = [] } = useGetSharedSecrets(workspaceId); + + useEffect(() => { + if (!isLoading) { + if (!showExpiredSharedSecrets) { + setTableData(data.filter((secret) => new Date(secret.expiresAt) > new Date())); + } else { + setTableData(data); + } + } + }, [isLoading, data, showExpiredSharedSecrets]); + + const handleSecretExpiration = () => { + if (!showExpiredSharedSecrets) { + setTableData( + data.filter((secret) => !secret.expiresAt || new Date(secret.expiresAt) > new Date()) + ); + } + }; + + return ( + + + + + + + + + {isLoading && } + {!isLoading && + tableData && + tableData.map((row) => ( + + ))} + {!isLoading && tableData && tableData?.length === 0 && ( + + + + )} + +
Secret Name Created Valid Until +
+ +
+
+ ); +}; diff --git a/frontend/src/views/ShareSecretPage/components/index.tsx b/frontend/src/views/ShareSecretPage/components/index.tsx new file mode 100644 index 000000000..64a0c2774 --- /dev/null +++ b/frontend/src/views/ShareSecretPage/components/index.tsx @@ -0,0 +1 @@ +export { ShareSecretSection } from "./ShareSecretSection"; diff --git a/frontend/src/views/ShareSecretPage/index.tsx b/frontend/src/views/ShareSecretPage/index.tsx new file mode 100644 index 000000000..fa8198494 --- /dev/null +++ b/frontend/src/views/ShareSecretPage/index.tsx @@ -0,0 +1 @@ +export { ShareSecretPage } from "./ShareSecretPage"; diff --git a/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx b/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx new file mode 100644 index 000000000..ab34a8a14 --- /dev/null +++ b/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx @@ -0,0 +1,113 @@ +import { useEffect, useMemo, useState } from "react"; +import Head from "next/head"; +import Image from "next/image"; +import Link from "next/link"; +import { useRouter } from "next/router"; + +import { openSignedAssymmetric } from "@app/components/utilities/cryptography/crypto"; +import { useToggle } from "@app/hooks"; +import { useGetActiveSharedSecretById } from "@app/hooks/api/secretSharing"; + +import { DragonMainImage, SecretTable } from "./components"; + +export const ShareSecretPublicPage = () => { + const router = useRouter(); + const { id, key: urlEncodedPublicKey } = router.query; + + const publicKey = decodeURIComponent(urlEncodedPublicKey as string); + useEffect(() => { + if (!id || !publicKey) { + router.push("/404"); + } + }, [id, publicKey]); + + const { isLoading, data } = useGetActiveSharedSecretById(id as string); + const decryptedSecret = useMemo(() => { + if (data && data.signedValue && publicKey) { + const res = openSignedAssymmetric({ + signedMessage: data.signedValue, + publicKey: publicKey as string + }); + return res; + } + return ""; + }, [data, publicKey]); + + const [timeLeft, setTimeLeft] = useState(""); + const [isUrlCopied, setIsUrlCopied] = useToggle(false); + + useEffect(() => { + const updateTimer = () => { + if (data && data.expiresAt) { + const expiryDate = new Date(data.expiresAt).getTime(); + const now = new Date().getTime(); + const distance = expiryDate - now; + + if (distance < 0) { + setTimeLeft("Expired"); + } else { + const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); + const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); + const seconds = Math.floor((distance % (1000 * 60)) / 1000); + setTimeLeft(`${hours}h ${minutes}m ${seconds}s`); + } + } + }; + + const timer = setInterval(updateTimer, 1000); + return () => clearInterval(timer); + }, [data?.expiresAt]); + + useEffect(() => { + let timer: NodeJS.Timeout; + if (isUrlCopied) { + timer = setTimeout(() => setIsUrlCopied.off(), 2000); + } + + return () => clearTimeout(timer); + }, [isUrlCopied]); + + const copyUrlToClipboard = () => { + navigator.clipboard.writeText(decryptedSecret as string); + setIsUrlCopied.on(); + }; + + return ( +
+ ); +}; diff --git a/frontend/src/views/ShareSecretPublicPage/components/MainImage.tsx b/frontend/src/views/ShareSecretPublicPage/components/MainImage.tsx new file mode 100644 index 000000000..49a7e17ed --- /dev/null +++ b/frontend/src/views/ShareSecretPublicPage/components/MainImage.tsx @@ -0,0 +1,14 @@ +import Image from "next/image"; + +export const DragonMainImage = () => { + return ( +
+ Infisical Dragon - Came to send you a secret! +
+ ); +}; diff --git a/frontend/src/views/ShareSecretPublicPage/components/SecretTable.tsx b/frontend/src/views/ShareSecretPublicPage/components/SecretTable.tsx new file mode 100644 index 000000000..f459b9547 --- /dev/null +++ b/frontend/src/views/ShareSecretPublicPage/components/SecretTable.tsx @@ -0,0 +1,89 @@ +import { faCheck, faCopy, faKey } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; + +import { + EmptyState, + IconButton, + Table, + TableContainer, + TBody, + Td, + Th, + THead, + Tr +} from "@app/components/v2"; +import { TViewSharedSecretResponse } from "@app/hooks/api/secretSharing"; + +type Props = { + isLoading: boolean; + sharedSecret?: TViewSharedSecretResponse; + decryptedSecret: string; + timeLeft: string; + isUrlCopied: boolean; + copyUrlToClipboard: () => void; +}; + +export const SecretTable = ({ + isLoading, + sharedSecret, + decryptedSecret, + timeLeft, + isUrlCopied, + copyUrlToClipboard +}: Props) => { + return ( + + + + + + + + + + + {!isLoading && sharedSecret && decryptedSecret && ( + + + + + + )} + {isLoading && ( + + + + )} + {!isLoading && !sharedSecret && ( + + + + )} + {!isLoading && sharedSecret && !decryptedSecret && ( + + + + )} + +
NameValueValid Until
{sharedSecret.name} +
+
{decryptedSecret}
+ + + +
+
{timeLeft}
+ Loading... +
+ +
+ +
+
+ ); +}; diff --git a/frontend/src/views/ShareSecretPublicPage/components/index.tsx b/frontend/src/views/ShareSecretPublicPage/components/index.tsx new file mode 100644 index 000000000..5a7b53a0d --- /dev/null +++ b/frontend/src/views/ShareSecretPublicPage/components/index.tsx @@ -0,0 +1,2 @@ +export { DragonMainImage } from "./MainImage"; +export { SecretTable } from "./SecretTable"; diff --git a/frontend/src/views/ShareSecretPublicPage/index.tsx b/frontend/src/views/ShareSecretPublicPage/index.tsx new file mode 100644 index 000000000..778e8ee58 --- /dev/null +++ b/frontend/src/views/ShareSecretPublicPage/index.tsx @@ -0,0 +1 @@ +export { ShareSecretPublicPage } from "./ShareSecretPublicPage"; From 4e51a3b784d53878a198851ff111148894820373 Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Tue, 28 May 2024 17:51:32 +0530 Subject: [PATCH 085/101] fix: input type & docs link --- frontend/src/views/ShareSecretPage/ShareSecretPage.tsx | 3 +-- .../views/ShareSecretPage/components/AddShareSecretModal.tsx | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx b/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx index 74db4f909..d6b2b71ac 100644 --- a/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx +++ b/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx @@ -13,8 +13,7 @@ export const ShareSecretPage = () => {

Share secrets with anybody securely and efficiently

X+IMv*Hr=P+-kJ!r>~I7iv^ z^vJ~itS*btbQ6O^jAkq|!XfyS?^;N>J5B2k!eFIAz z1kT87>-{b`adGfRwN(5qcpSuUOX|!N2Tuqm6a-B6vQAb=jJ_M&`gAo*T%imSW~E=p z#8%W$D*$;ZT2wMZ*wh|&cek|V%E1vLV*Y{4qr&THd;-uxb1fFL zo8m^#UAA&HokC7admmt_rz`>W*#Ia<__jb(;lP>cT<;PC+dTbl79x}(WY5z^T?HxLT1(D% z8qEYfUK{2~e8F-z&#$h$`J$kHcN_C-!=gl<3a%a#=k zqy32$GA7IYJV&8@W~|0)OWpr+XZC!w^z7(D>Gp@w&5;~{6*bE-uUxtVzEb;dI9%_3 zo}~vRDR4M6A2S*nL6atiaFR5VUO$ggb1R66S!t-@E-U?bm^)-KWO5t-+1eykUc&#j z@FtRhH3t08vV?z*{~vrEMDH_laNUPkB%q?|^xH~9TG5faFWFjmiOzKFj>2(DuWX+8 zC-ce6y+8$pQR0%epaxL2*wfcPG61d_Vpk~N75q;;=Z2Z zAA&g0z0!yfmo7--^qp$X{W4R{a;Cc{t&34((@6vNuZOcWgrYzgLtK#tjQlQ2Zyk(wNoL)JiSMB&b>>GcClj|e<_9U(4QFz^I2dw@c^MR>Top?U+Ze{mv| zn8DYb&mwFCgbPau4ro?M>wdF2RvJ6i$U?hF&8BKPc4zz()3&ZIb*TpwO1IutS4>)P z1qG^4q-Xb)8GZxmH0A<9eX-1P<~$_nkx7r6LNGT3{QoZ|6R20=AqSnN6L2#%(W39O zEv_u6+sgx;o2Dox&D?_GqZI(vpe=BoM|Y`<2FTs>55P^Bl5ZuIa_FNWx1stzwX~5c3}|KozMAiooa>YH}ZCk{5n$dahQT*LIt9^4V8* zh{Hf(GS9j>&Vicu772NA9}9>QT^f;w{L<*cJ}Xul(MZiSp2_wqrbKjQ?~E>`BlU?z z_s2~q&K@&H5kpA9S+I{WFQ^jP4?sW&FP>roarD&ZZd)ak(BZlO1HEgE(JI1*XYEVP zrQ#XTWHzfb4ly~#Xf2vbn@>4`v994SCo~ic{#N51{<`w7_k0?uQu0C5-c9)NhWs@7 z4K?t|1j6zC8TUjIBOknQ2%g!`9&u(8C8Y##6&-b>*IS@a{{!InYK)F^jQmJGxe4u? zZ1oQv53t=vQDe4i0+uBvTWZ25h8#>ab7j5ii(uU8DNig~Fep*TXL5HV@U-es{(zyL?5S#3v6zEJ<bDe>iKD+a#Qrq8{c+Jgbxx11&Pa#W&wApHyS(!d2& zvy8CVju@H0EeX1^t>!R0({Op|hsyYDrxKb#{B|L=(zZB?w}NZ_uGbX012XITU7K4G z?J<6&{i3XUWvlUq>41(z?yyy4$hb1;JR`$5>{^0UspNuns-!MF`!#_PX0V&H59PfP zS7HE-n;6PJuT`Q0mgTBb+GqPhM2Ex(moxTOdZUs;D;+7y7!GI-2V2MrCf8~Dl||TGmAkAi2cXoj8;3z9fry`dGR^aKUpl!-12W zbII;qR!a7BwyrL!Fj-+DVxQk^!-xV+S6o`Pkk(1aZ((YYyhJBL=~m)n=Ni9NWxI@f zvs+LEXR|Xi*XS8xeuVIre?m0tFJISJ2?ns2TzhE-GRT^Xm$Q7-##ie>F9g(6(tlp* zG;f4NJFVf6LQmSsBj^tVHMf1bNL!p(DzyVqs1}NlF~n5MjS8&-dC$Qunn(0>iCR^- zy-%Um@ImW1Ik;|5j(RcQ1C!P(8|QVbHm(U9rr-wr7>8KOoKC_|Wbk7`!tBOVUD;<_ zUh88RXE%8vV~w+Ni(q) z0Kh=~I1s;W_ifHmE#+Sv0m?7^CO+FJpPtt-Dz~F^wD7|rh?x5D&k#l!am*&90~<|G z+UVtSY~!J#3dsB{uJE`+kHs_I`{OxblDR9dpGOLIgJwU)F-#m>2dIy9)ZiL1MvHeK z%NiGU+wmvO#w4w4l@@`>qk~E(3pv^5pk};zXP@0V5qCrs)85!0cpiGOCN8;1+NOv? zz`y$Q_R7r4456q^QA$Cf{kFSb^pv7XB_HLC_h?ordM;(7)r!+BP&a%cqRS$?r0G*k zPPq0hytm(7wU9`tmdawIMsh~GY8D?@hI9k*@(HjY4;f1?EJ+i!W#(e+POn~`SaEY~ z>($Y(aMrY#fqN89!!N}1s?dwK6!?_5+%M0D>6G{ZFYn(x@6>;J@M5->2_5*67tJe z{S}Q2v9f3p`|)(jMyDCCDJ-dShGlxRR>!5A!*;)}|I)7Q18u>4{od2Y8Y=*X~q5Xy2Ob#_@F7qxuUNPRsZ1W}3aH zl4DD4^Xkjva2R zWy~CX5x8CDEjE+_+1%%E+)yoX1i{Y zf-T@iiqcNu5hUgMjgY!QtyY_RzDrk0TWMNVh+9_)&DsB<>n(%gY?rNJf+R?Q-~@Mf zf?I+nIKkcB-5E4E1PJaD+y{3jxXa+~?#_GX+2@?S_gD2*%@p&St7Y}-)!jJwXY}*O z8c-j@shTvmfAwNWbfoc(aEk`0HxB_=B$;y*gDQW%T3w9!?5FHyIzOGYkmrKN21Q*x>{0L z)B2~a!H}?)s{6#KQW6RP{6DHE4=ggsZ-6I!*Lb?lSG6#_aW9pZ~wz`k$hj6b+V3khL`90$1 z#SihXeC`o3$%*c2uWIb7+9z3?6O%d|o?FZCe)Z3|;-+!Rj>(OOeZEQ*@lzMLys+Se zbx#JD(j>UE$84v-8*U=0o1w7~%4nzLd_{siXQJ4mw&)@^&b@2iG$Q&pnX?*t4^Hun zsX#(JwKoX{NI4LI-p_Yo22;inrJNFbEcOyZu^c2$poaV*+ZAmL2&`dFuN! z5X={07AFkD2bi4-x;5Bk6XTJXGe&}N#zsqBpUedK>IqHy69TN3oqP#3Q5*p7C;HWz zFst@+h5!f}yc;>Tl**WIb2|eR2{l6HMHU8^nx2qKStQHT=kv{EZ|!O?ajLv@7I!lr z_YI}ztGRkK#2@!SjjUgl(r~r`c{*hl9APAWMbLd*ssLmZe0JPrUZE(&P->D?o2%CZ6Zz!0+SJ4tcS=RYT_J2Rpg3tRq8KSG4$iEmB}y|Rk8w~sEq=cCe7&_-pmj_0;` zapomN>1Pof2fQr|U0n57WsXP^;<)@=SGJR$=UxW_%1O!2+6%_ff<1+4;}f(hRV5*S zLGD7y3zJyL6ty+gw$?97a2)PuklvJ)-Ob9pn{Tog(&RceJ?w)4AbCJ7VX;NQC~kUr zA>r7OI|dCt-GGA1sdAAN{du?>BW!>cx20m00&~>~VOC4?r z!bq++LwAQOx2bn!x|;-fh4>2fSaZFky(50c+ht7cgNgP^UbK1QarHj0_qsKG?V~K& zaXju%yqwRqMYrZpQlHzK?cm5309Z(_Ns*?&b~gU+R}dEQQW$2ncXmm zuaK(`1E*bQse-QTr>et zLHrz}35tz@x3F5Q$t=Ua1)J_F+#K-_W)gcKjQbRTr^=#D$MDC7c{cY(YmyC7}8_W{goy`&1C zOO2D4iuSXCL!UpZ8P9SiqaXXdQCA1jGuskhAI~?JUgB>Z57Sl8w+!*&RZU@R0|bbD z)h=0&3~_EAUuvV77f08t#}9I3M zMyQ3i^!ADg=576(fWxhV5_y7I0!jNyb^U#_Ahx+RSXI?hhw95?&X*?~A>zkEKGPKd zog6Kv2%KF=wxQYEsSaPy)aItTDb{uWaL{x95k05U&Z4>VRkrIAc zSp13ou_vv0b%0>l6G(~_%_?_sd(}q&cbxk>$q%ORoUqxBS40qvM%ie)(xxylomK;# zB4rrYeu*a+sDeLl)F%%zN>+3V&}!JYE&G;7p<^lUM+avY|D8ElMS} zbEO}(R?cxP>7+w&WMY#|LQ}~?Lz#)7B)8hhjtLvIrFhSO*3G+zIXo)3I?$ued1EaX z45o&(j+R9r6OpsDEaHlsVu8=iP8ymEN}Ba%|6&Y)=i9@a&bv|1{Pb2nO~B0@npYU+|mZUBZ@6fb0^mmE(x5Pj-1kE zgP9yFhGeH)GYX7$P;sVABJ~$aS?vOD_~XAr(orm2Pr18B0if}4j-0$r2nhA)Ybxsu zTCnG%h%_TcZ1e##1X!iO!@hEqkuEWXRSN`6bD`ALh5nuT8{;|-fMkbU_7`Z9$mwrah!FIEStao; zgR2+BJW$^0%ERc{R3&qr|5ZYbE!K^b^g`!8f($en+E<&4o*Kd|ww&Nb=FyMznX`v^ zA=GMo z!gu3G(IUcUN<Q!p{P8+R6ddmZh>Lru@s<@FcN&{?`#@%)JqspWs+DifYwuQAaeu3xPWZgB|? ziccId-Zpl8GygOz$XU8Pl6rV^b_T=z_bbn;54&5DG;ohIvejZdH9D*5^1bY({8-rL zZc7rVSsPvxeWn`BO)eyY}r}%Wf z(OQ>2ZzSV41{2&8D6==_>glqb$M$P3i*`*`+}g9!W~m5v+Ad4`{VJMsXZzB?)m5?# z3N)csW|Y5-sEPDyYD9VlKFj-TDAkHNR>#qXG<$>1bBgAAVw2k_^1r=NwhQEl!Rz=<6mRaeHcVW`<=YCxbZWgpP1MV}mnpR1${)1!ttEjZcHey~FY1e}-%P!ZC=WcwKp^HA< z7u<^=K)_faCPVxB^NM=h^F3~>I01V)?q%&wJu{*7dfgswBG(y?JeNvQi$lX5` zd`&d>&=#~9l-3-Vqrv@M#vxqD=%TT1Ndf(W9h86_(o2G^IC%?6?SzuWX-F$}IfYJ? z5?c*^vhE7RgvJ-9A)(uMxiRl|=H>2THt<54Pc%vnqd4kl5)ZOL=?<){|U2>X%Rcix+Ip2An)VQiNXSh6*oGd zR*?=D+uYB(fp2ytFaerH{4clH$@ezV0vNNh8G>QSV0v5t3jlL{clBf1Z#sZ*V72T< z0e%|ybpv|Zh!Mwf6RnarIG?;36Td99c zq~qm+f%P-L>2{&+8Lgqo`}#bTBIx)YgDSDgv>%PB&437MlR9zJ5^>Ez z-Ao!4;U~O>t`(d6P$(zS!QAsPWy3J4U-WpfJU3?W)5#@O=mNJZMHWCYR`*ekyO8 znr?erojzyYKBlrNR+6hEBrosPpaG)w4T=nLM} zohRKnaiRSfpE%x{S-ih8cMqTWgbpDgH7D+Il*m+b>RTi@O`0To1YsN zjRA{+San&k8UO~P9>Fs<#u*1GtR=}1B4uYp5B=R=GNVCqy5tf95^O>tn%VJeL80r5 zXYq010q;f`zHHEH`CLQ)3pGAjFEmsG>0$Q4b^dOr*~;ru8>*C({cq9a-y4_A4uS?0 z6l)`ne=E1fr-LAn%fEe$>|gphtk~F#o(7J-RvM!s+~Ac5}j$ z;qJ3iU39eS_#VnJ8`~|oxDH0|BC4nU`rKy$eA1t2Z3=b;9ev`W|HLUt|L+-!5XHYO z7CpjZpw8-5So-X+=k$)~qAp_(Z;(n8<4)%qZGP`mpD{8;{=9ucxQ17Aqr z56Sd!QE8Uo;9)3|tLK6C*Kw)0_wjWe87*E$DYe5V>6c<*r~L9aM>}}&317odW%)eU zkFZpm=38icTJ9UkQ)JU^O}CwObUdad?&RTLAArnLlQ3M>B&**H?U9&4R33@Sm*Kx8 zB;yCwu)MH2|50VQ&+yw*+lM#0go_&a7~z>uj*$3Q8s)vQelM1Sf*LRFG z(+Yxv9ZPU;#iQ8d1s6UmD2#zjawjmee@b%ap`(~bYkJY55QaF~fzp^O2+-qmXRwhffkN;v>nwECA0k*|*>|HUUs!Wk+mjc=P zNqePX9WJXgyu}DMh6xxgt~XHD)g_8Dy!V$m-x3o+m`SmPtIZUhW&P8>GSTx?2^7%$ z?#V04P2y1rw$63)iLgjr3H!* zYB~IW5NVwO)lXz|T`v>z_Qu_h`O?HAe?iF;7JD*SkL;OoeB`d0@IEErS2W!)Kk8dy z(Jt1mZ1|h~1+}KmfWyxd`n2iddquX_i*46{Hf+IuD&5<2to0JO-S9u%>>fR!R!`$_ zOu&kjz9#aAAIb2D2NC{3<_%cXIB%VmZYgR`$V{i-`xKL_e?VOJd#?%I1uN+tL(;OH z7Ui^geQY)bHBtF~%~l81W!a(z&@aH$QvPMWy)@Bj62EFK>+sAVumiSxtAzPyh<$t^ zwr799TEO%E`u+%lo3ms0D`76RDym+ej?=j)iNh^oPny@N@3v3uY_zjI~pTA(Dr8rID?HVD>5DCfASuNkW7%q>qTe zGc?*VgPHZQVJAc>Ay^K$HI`o5$If!7^UmFytR{5Ca@5Pq>zghq=SdHO}c3E_j#_G33FdqX?r?n2( zmvXK#znrU6R;);~P4aq|%YuehLI+RzR0P`*@hceqwz3%$lNa~6B#=&>K`qAzN!9L? z?Xv6Bvkh?SUpNBg)`~(UOKU1_4ClBbx0WMi;&>gL0F-5a8yr7sJ^xlhi=2dO`~54x zx2DR5zAq8jiUGUBn9>6Tt!89%RiSIn+t&^A{1JlgdwP@Vqa5|&lktpur=SHg3JmI3 zgMsGe=&Fm0#^l{Y-BlSeF;>5y{v$h-JAATBAZX2dhMeoiuRj(+F{T%gQ+J@|F_F3j zF@QUd8tqU1J^6r(2q=nRN=5KD;Y{n7m=gjQvLv-X7=#{)i4>@3Pa_1~WaB#!S}VBw zfNXpr7b(#@iK)Dd5XEhCo03&E?}!J`^!X_D5Vvifa7->p_wmFd-W9*;MB-WK;43We zTXPtk!G(f(^ToxtwD80zijRK~5G$B^*qSU)SMxtCJ*vc}nj8+)JAwgL@OQGpEU6kS%YXJHT=^=R5dKX&r8R@4yhpD9@T;C9S&dbhQ?T?a>A14j<10=f4c2t^h$ zitPwTU-oTR1V^naQ{CSN=vanZu{xW_TYW+qZjY5sjKoSD*6*csgkqcr##&p z#%-W@Tcbkb2LDo907<;-A8v9sk*Wd+Zh&LaCWn2`fB9tVRFuD?NxN0;Em1i%Kz*JJ z7hZ6MJ1Ka(rTKKQE5`~nRe|cN7YJlVvuXAP*B&00hEGpZ_y}*wr87COeOFf=8Kz7k zpgROj-q3xRfA+s=+2CJ@YDw1tg9LA>%aUqcbXl8SSI3`){ym*wQ24j$nRNu$Oi53r zcb@SC?F2G2Q{)+kedkSATSm8x(`Sy6Zc=zgH%zBYv%i~lA$>=_;8sYeDfqZ*#uFr8 zx9RmK5L~O^Rq^R^^sdVX*`ym`-mb-RZ~o~!#ySikOqCzJaqV0-`##N!8SQoSEINSH zv1HI}Bh1&2l*Q%?_?k+Sr8`eKsqg_5kTH{~v+-EjPdsg0r+{}3y~lQvzp0IpUA zL#5bG*rGIju>Rt@=PBSfUBFN{Va3#P=NxJRD{ zSaws@N~8Pt2@IK|ONwT$OAC{ZEX~$KUtaF_fNg7&Gt$X|c)E^1Grdj~h`e{0$Q0!J zwW3lYHWwdIG1G}|ujmWicNPmSIbB4ujRIftcKO54M5OQAXUS;Imhh}OF+g{Rl7oiEkjhqzKSUV;O&5@j8aI=*Hd8*3VyAE@4FV4c0cavTF|Accd@UCXV)|^ zx8T-%$erM^>se}0mkP`mT9~6aBbXS*i1Pllro`KC)3EP%2?AD4A1xK-7NJ>j5+>?6 z@FePZd<-Ac?D-S34MkwBAuB21?!2g1#WM_ywR{dKDOV{fSD9}qdhX$vE-~S7-@N3h zYJ3~e>+AXJF`~X;57X+N)5@C;G$%a$l_UYdp_>u%nM*NwF=x4+z=moP7$82#Zmre{ z?ltUAL$I+<65wR8!N-m!1Z$@5FkBnR3aL7Il+kguGFyD7Tv|%NSoq;>Eed?RzK}5z zo@n|ProXj_?nehip9-!yw>Ja#_e?GKD2yG~^8?IwfVe+Dt3&KdHd0C1Zt*|{pwZ~c zrdgN&h3z0>Wa;_Uk{#$*0o}wT#%D(|cFhO|ZNY%wL#9v~Zc9XyHUP}$w4Rr8R>oi! ztPef)K12g1fDBf;zA-fF@y;#Vk=A>y19T7`r1FGtMWa3#`S8}L*c|z-w=BmoSG%V` zR!~hvYfCyck#>KD&kY4e!7uO@G-IANz%s_QNp#Mhz}(I0taOs2R_ISBkqJ64ZbL2I z?|a^l0V)JExeHlEp82q|Q@1dqJgm8CDS0Q4t{J{bP43IFr=!N!*Od`$Ls^z)+tUws z!GDiC{R`4<5CHWf?q`kh-&}jRT+NT+3#N3K!L<_Kttte-NO6mn$_M_m<;lg}&Ifb9 zA4dRtT)rlxgQ>5bymQ)>+*Cy7SzN@kv~aCEe?3Zf^;&ZEe$8Cv+ds*h;w_uH`gyEY zXV@!iMeXtfK}NXK=z|%$B)U(~=d7bid33XT)`hd&@yW^R1!2EmpEY7x2=Ih|upjlD zhip?aBTFSXX%yIddV@e-r_DBI8RA{L$-x&h-u|Z56kk3`)}GH%<;yefWXh ztvglGk^Q*$tqOsepzOjt72Umx*5;@T+e~U+0x{Vid4xU&A$Ou_7l-t0IWiFgkC5-2ge%D?o`UFSy8fNM+9vo&77k=;L99#!k@4V zXGyOjs^w`;dh^}%!qxOb0?kP(LD`Vm*?`_YcDFJ)aOscR Kx9JLNto2z5?t2V8 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%0DTLpPxZnuym4MUYM46lU?X%nmiQhQ?V?m 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 literal 0 HcmV?d00001 diff --git a/docs/mint.json b/docs/mint.json index 10416eb55..96637bfb3 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -137,6 +137,7 @@ "documentation/platform/secret-rotation/aws-iam" ] }, + "documentation/platform/secret-sharing", { "group": "Dynamic Secrets", "pages": [ diff --git a/frontend/src/components/utilities/cryptography/crypto.ts b/frontend/src/components/utilities/cryptography/crypto.ts index c0e5d4c21..c8383d617 100644 --- a/frontend/src/components/utilities/cryptography/crypto.ts +++ b/frontend/src/components/utilities/cryptography/crypto.ts @@ -224,6 +224,76 @@ const decryptSymmetric = ({ ciphertext, iv, tag, key }: DecryptSymmetricProps): return plaintext; }; +/** + * Return new base64, NaCl, public-secret key pair for signing. + * @returns {Object} obj + * @returns {String} obj.publicKey - base64, NaCl, public key + * @returns {String} obj.secretKey - base64, NaCl, secret key + */ +const generateSignKeyPair = (): { + publicKey: string; + secretKey: string; +} => { + const pair = nacl.sign.keyPair(); + + return { + publicKey: nacl.util.encodeBase64(pair.publicKey), + secretKey: nacl.util.encodeBase64(pair.secretKey) + }; +}; + +type SignAsymmetricProps = { + message: string; + privateKey: string; +}; + +/** + * Returns asymmetrically signed [message] using [privateKey] + * @param {Object} obj + * @param {String} obj.message - message to sign + * @param {String} obj.privateKey - base64-encoded private key + * @returns {String} signedMessage - base64-encoded signed message + */ +const signAssymmetric = ({ message, privateKey }: SignAsymmetricProps): string => { + let signedMessage; + try { + signedMessage = nacl.sign(nacl.util.decodeUTF8(message), nacl.util.decodeBase64(privateKey)); + } catch (err) { + console.log("Failed to sign message", err); + process.exit(1); + } + return nacl.util.encodeBase64(signedMessage); +}; + +type OpenSignedAsymmetricProps = { + signedMessage: string; + publicKey: string; +}; + +/** + * Returns asymmetrically decrypted [message] using [publicKey] + * @param {Object} obj + * @param {String} obj.signedMessage - signed message to decrypt + * @param {String} obj.publicKey - base64-encoded public key + * @returns {String} signedMessage - base64-encoded decrypted message + */ +const openSignedAssymmetric = ({ signedMessage, publicKey }: OpenSignedAsymmetricProps): string => { + let originalMessage; + try { + originalMessage = nacl.sign.open( + nacl.util.decodeBase64(signedMessage), + nacl.util.decodeBase64(publicKey) + ); + if (!originalMessage) { + throw new Error("Signature verification failed"); + } + originalMessage = nacl.util.encodeUTF8(originalMessage); + } catch (err) { + console.log("Failed to verify signature", err); + } + return originalMessage; +}; + export { decryptAssymmetric, decryptSymmetric, @@ -231,5 +301,8 @@ export { encryptAssymmetric, encryptSymmetric, generateKeyPair, + generateSignKeyPair, + openSignedAssymmetric, + signAssymmetric, verifyPrivateKey }; diff --git a/frontend/src/const.ts b/frontend/src/const.ts index 68ba1c497..4d13b4602 100644 --- a/frontend/src/const.ts +++ b/frontend/src/const.ts @@ -23,7 +23,8 @@ export const publicPaths = [ "/login/provider/success", // TODO: change "/login/provider/error", // TODO: change "/login/sso", - "/admin/signup" + "/admin/signup", + "/shared/secret/[id]" ]; export const languageMap = { diff --git a/frontend/src/context/ProjectPermissionContext/types.ts b/frontend/src/context/ProjectPermissionContext/types.ts index 79c8f2d30..bc383de26 100644 --- a/frontend/src/context/ProjectPermissionContext/types.ts +++ b/frontend/src/context/ProjectPermissionContext/types.ts @@ -24,6 +24,7 @@ export enum ProjectPermissionSub { SecretRollback = "secret-rollback", SecretApproval = "secret-approval", SecretRotation = "secret-rotation", + SecretSharing = "secret-sharing", Identity = "identity" } @@ -51,6 +52,7 @@ export type ProjectPermissionSet = | [ProjectPermissionActions, ProjectPermissionSub.ServiceTokens] | [ProjectPermissionActions, ProjectPermissionSub.SecretApproval] | [ProjectPermissionActions, ProjectPermissionSub.SecretRotation] + | [ProjectPermissionActions, ProjectPermissionSub.SecretSharing] | [ProjectPermissionActions.Delete, ProjectPermissionSub.Workspace] | [ProjectPermissionActions.Edit, ProjectPermissionSub.Workspace] | [ProjectPermissionActions.Read, ProjectPermissionSub.SecretRollback] diff --git a/frontend/src/hooks/api/secretSharing/index.ts b/frontend/src/hooks/api/secretSharing/index.ts new file mode 100644 index 000000000..177955438 --- /dev/null +++ b/frontend/src/hooks/api/secretSharing/index.ts @@ -0,0 +1,3 @@ +export * from "./mutations"; +export * from "./queries"; +export * from "./types"; diff --git a/frontend/src/hooks/api/secretSharing/mutations.ts b/frontend/src/hooks/api/secretSharing/mutations.ts new file mode 100644 index 000000000..a3566282c --- /dev/null +++ b/frontend/src/hooks/api/secretSharing/mutations.ts @@ -0,0 +1,35 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; + +import { apiRequest } from "@app/config/request"; + +import { TCreateSharedSecretRequest, TDeleteSharedSecretRequest, TSharedSecret } from "./types"; + +export const useCreateSharedSecret = () => { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: async (inputData: TCreateSharedSecretRequest) => { + const { data } = await apiRequest.post("/api/v1/secret-sharing", inputData); + return data; + }, + onSuccess: () => queryClient.invalidateQueries(["sharedSecrets"]) + }); +}; + +export const useDeleteSharedSecret = () => { + const queryClient = useQueryClient(); + return useMutation< + TSharedSecret, + { message: string }, + { sharedSecretId: string; workspaceId: string } + >({ + mutationFn: async ({ sharedSecretId, workspaceId }: TDeleteSharedSecretRequest) => { + const { data } = await apiRequest.delete( + `/api/v1/secret-sharing/${workspaceId}/${sharedSecretId}` + ); + return data; + }, + onSuccess: () => { + queryClient.invalidateQueries(["sharedSecrets"]); + } + }); +}; diff --git a/frontend/src/hooks/api/secretSharing/queries.ts b/frontend/src/hooks/api/secretSharing/queries.ts new file mode 100644 index 000000000..33ffddfbc --- /dev/null +++ b/frontend/src/hooks/api/secretSharing/queries.ts @@ -0,0 +1,32 @@ +import { useQuery } from "@tanstack/react-query"; + +import { apiRequest } from "@app/config/request"; + +import { TSharedSecret, TViewSharedSecretResponse } from "./types"; + +export const useGetSharedSecrets = (workspaceId: string) => { + return useQuery({ + queryKey: ["sharedSecrets"], + queryFn: async () => { + const { data } = await apiRequest.get( + `/api/v1/secret-sharing/${workspaceId}` + ); + return data; + } + }); +}; + +export const useGetActiveSharedSecretById = (id: string) => { + return useQuery({ + queryFn: async () => { + const { data } = await apiRequest.get( + `/api/v1/secret-sharing/public/${id}` + ); + return { + name: data.name, + signedValue: data.signedValue, + expiresAt: data.expiresAt + }; + } + }); +}; diff --git a/frontend/src/hooks/api/secretSharing/types.ts b/frontend/src/hooks/api/secretSharing/types.ts new file mode 100644 index 000000000..6afbe34ea --- /dev/null +++ b/frontend/src/hooks/api/secretSharing/types.ts @@ -0,0 +1,27 @@ +export type TSharedSecret = { + id: string; + name: string; + signedValue: string; + userId: string; + expiresAt: Date; + createdAt: Date; + updatedAt: Date; +}; + +export type TCreateSharedSecretRequest = { + name: string; + signedValue: string; + expiresAt: Date; + workspaceId: string; +}; + +export type TViewSharedSecretResponse = { + name: string; + signedValue: string; + expiresAt: Date; +}; + +export type TDeleteSharedSecretRequest = { + sharedSecretId: string; + workspaceId: string; +}; diff --git a/frontend/src/layouts/AppLayout/AppLayout.tsx b/frontend/src/layouts/AppLayout/AppLayout.tsx index 2fcdc9339..60c31b72c 100644 --- a/frontend/src/layouts/AppLayout/AppLayout.tsx +++ b/frontend/src/layouts/AppLayout/AppLayout.tsx @@ -531,6 +531,18 @@ export const AppLayout = ({ children }: LayoutProps) => { + + + + Secret Sharing + + + { + const { t } = useTranslation(); + + return ( + <> + + {t("common.head-title", { title: t("approval.title") })} + + + + + +

- {/* Add docs here */} - + Documentation{" "} { isError={Boolean(error)} errorText={error?.message} > - + )} /> From 3b40f37f50664bb2a3b9d39c7ddb830bdab357a5 Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Tue, 28 May 2024 18:00:16 +0530 Subject: [PATCH 086/101] cleanup: console logs --- .../ShareSecretPage/components/ShareSecretsRow.tsx | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx index 88902ecc3..8d3b89f23 100644 --- a/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx @@ -27,16 +27,6 @@ const timeAgo = (inputDate: Date, currentDate: Date): string => { const elapsedMonths = Math.abs(Math.floor(elapsedDays / 30)); const elapsedYears = Math.abs(Math.floor(elapsedDays / 365)); - console.log( - elapsedYears, - elapsedMonths, - elapsedWeeks, - elapsedDays, - elapsedHours, - elapsedMinutes, - elapsedSeconds - ); - if (elapsedYears > 0) { return `${elapsedYears} year${elapsedYears === 1 ? "" : "s"} ${ elapsedMilliseconds >= 0 ? "ago" : "from now" From f85a35fde8a28102d027e986a5533f2f1e096779 Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Tue, 28 May 2024 23:40:50 +0530 Subject: [PATCH 087/101] feat: move feature to org level --- .../ee/services/permission/org-permission.ts | 10 +++++ .../services/permission/project-permission.ts | 11 ----- backend/src/server/routes/index.ts | 3 +- .../server/routes/v1/secret-sharing-router.ts | 22 ++++------ .../secret-sharing/secret-sharing-service.ts | 40 +++++-------------- .../secret-sharing/secret-sharing-types.ts | 2 +- .../src/context/OrgPermissionContext/types.ts | 2 + .../src/hooks/api/secretSharing/mutations.ts | 6 +-- .../src/hooks/api/secretSharing/queries.ts | 4 +- frontend/src/hooks/api/secretSharing/types.ts | 2 - frontend/src/layouts/AppLayout/AppLayout.tsx | 24 +++++------ .../[id]/secret-sharing/index.tsx | 0 .../components/AddShareSecretModal.tsx | 7 ++-- .../components/ShareSecretSection.tsx | 26 +++++------- .../components/ShareSecretsRow.tsx | 12 +++--- .../components/ShareSecretsTable.tsx | 5 +-- 16 files changed, 71 insertions(+), 105 deletions(-) rename frontend/src/pages/{project => org}/[id]/secret-sharing/index.tsx (100%) diff --git a/backend/src/ee/services/permission/org-permission.ts b/backend/src/ee/services/permission/org-permission.ts index 9fece040b..d76406cfd 100644 --- a/backend/src/ee/services/permission/org-permission.ts +++ b/backend/src/ee/services/permission/org-permission.ts @@ -21,6 +21,7 @@ export enum OrgPermissionSubjects { Groups = "groups", Billing = "billing", SecretScanning = "secret-scanning", + SecretSharing = "secret-sharing", Identity = "identity" } @@ -36,6 +37,7 @@ export type OrgPermissionSet = | [OrgPermissionActions, OrgPermissionSubjects.Ldap] | [OrgPermissionActions, OrgPermissionSubjects.Groups] | [OrgPermissionActions, OrgPermissionSubjects.SecretScanning] + | [OrgPermissionActions, OrgPermissionSubjects.SecretSharing] | [OrgPermissionActions, OrgPermissionSubjects.Billing] | [OrgPermissionActions, OrgPermissionSubjects.Identity]; @@ -60,6 +62,10 @@ const buildAdminPermission = () => { can(OrgPermissionActions.Edit, OrgPermissionSubjects.SecretScanning); can(OrgPermissionActions.Delete, OrgPermissionSubjects.SecretScanning); + can(OrgPermissionActions.Read, OrgPermissionSubjects.SecretSharing); + can(OrgPermissionActions.Create, OrgPermissionSubjects.SecretSharing); + can(OrgPermissionActions.Delete, OrgPermissionSubjects.SecretSharing); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Settings); can(OrgPermissionActions.Create, OrgPermissionSubjects.Settings); can(OrgPermissionActions.Edit, OrgPermissionSubjects.Settings); @@ -124,6 +130,10 @@ const buildMemberPermission = () => { can(OrgPermissionActions.Edit, OrgPermissionSubjects.SecretScanning); can(OrgPermissionActions.Delete, OrgPermissionSubjects.SecretScanning); + can(OrgPermissionActions.Read, OrgPermissionSubjects.SecretSharing); + can(OrgPermissionActions.Create, OrgPermissionSubjects.SecretSharing); + can(OrgPermissionActions.Delete, OrgPermissionSubjects.SecretSharing); + can(OrgPermissionActions.Read, OrgPermissionSubjects.Identity); can(OrgPermissionActions.Create, OrgPermissionSubjects.Identity); can(OrgPermissionActions.Edit, OrgPermissionSubjects.Identity); diff --git a/backend/src/ee/services/permission/project-permission.ts b/backend/src/ee/services/permission/project-permission.ts index 8deb6f57e..b24024bd4 100644 --- a/backend/src/ee/services/permission/project-permission.ts +++ b/backend/src/ee/services/permission/project-permission.ts @@ -26,7 +26,6 @@ export enum ProjectPermissionSub { SecretRollback = "secret-rollback", SecretApproval = "secret-approval", SecretRotation = "secret-rotation", - SecretSharing = "secret-sharing", Identity = "identity" } @@ -53,7 +52,6 @@ export type ProjectPermissionSet = | [ProjectPermissionActions, ProjectPermissionSub.ServiceTokens] | [ProjectPermissionActions, ProjectPermissionSub.SecretApproval] | [ProjectPermissionActions, ProjectPermissionSub.SecretRotation] - | [ProjectPermissionActions, ProjectPermissionSub.SecretSharing] | [ProjectPermissionActions, ProjectPermissionSub.Identity] | [ProjectPermissionActions.Delete, ProjectPermissionSub.Project] | [ProjectPermissionActions.Edit, ProjectPermissionSub.Project] @@ -73,10 +71,6 @@ const buildAdminPermissionRules = () => { can(ProjectPermissionActions.Edit, ProjectPermissionSub.SecretApproval); can(ProjectPermissionActions.Delete, ProjectPermissionSub.SecretApproval); - can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretSharing); - can(ProjectPermissionActions.Create, ProjectPermissionSub.SecretSharing); - can(ProjectPermissionActions.Delete, ProjectPermissionSub.SecretSharing); - can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretRotation); can(ProjectPermissionActions.Create, ProjectPermissionSub.SecretRotation); can(ProjectPermissionActions.Edit, ProjectPermissionSub.SecretRotation); @@ -164,10 +158,6 @@ const buildMemberPermissionRules = () => { can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretApproval); can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretRotation); - can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretSharing); - can(ProjectPermissionActions.Create, ProjectPermissionSub.SecretSharing); - can(ProjectPermissionActions.Delete, ProjectPermissionSub.SecretSharing); - can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretRollback); can(ProjectPermissionActions.Create, ProjectPermissionSub.SecretRollback); @@ -227,7 +217,6 @@ const buildViewerPermissionRules = () => { can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretApproval); can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretRollback); can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretRotation); - can(ProjectPermissionActions.Read, ProjectPermissionSub.SecretSharing); can(ProjectPermissionActions.Read, ProjectPermissionSub.Member); can(ProjectPermissionActions.Read, ProjectPermissionSub.Groups); can(ProjectPermissionActions.Read, ProjectPermissionSub.Role); diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts index f8855d11f..582f70d5a 100644 --- a/backend/src/server/routes/index.ts +++ b/backend/src/server/routes/index.ts @@ -201,8 +201,6 @@ export const registerRoutes = async ( const secretVersionTagDAL = secretVersionTagDALFactory(db); const secretBlindIndexDAL = secretBlindIndexDALFactory(db); - const secretSharingDAL = secretSharingDALFactory(db); - const integrationDAL = integrationDALFactory(db); const integrationAuthDAL = integrationAuthDALFactory(db); const webhookDAL = webhookDALFactory(db); @@ -257,6 +255,7 @@ export const registerRoutes = async ( const groupProjectMembershipRoleDAL = groupProjectMembershipRoleDALFactory(db); const userGroupMembershipDAL = userGroupMembershipDALFactory(db); const secretScanningDAL = secretScanningDALFactory(db); + const secretSharingDAL = secretSharingDALFactory(db); const licenseDAL = licenseDALFactory(db); const dynamicSecretDAL = dynamicSecretDALFactory(db); const dynamicSecretLeaseDAL = dynamicSecretLeaseDALFactory(db); diff --git a/backend/src/server/routes/v1/secret-sharing-router.ts b/backend/src/server/routes/v1/secret-sharing-router.ts index 6a7f95565..f5f47d345 100644 --- a/backend/src/server/routes/v1/secret-sharing-router.ts +++ b/backend/src/server/routes/v1/secret-sharing-router.ts @@ -8,25 +8,21 @@ import { AuthMode } from "@app/services/auth/auth-type"; export const registerSecretSharingRouter = async (server: FastifyZodProvider) => { server.route({ method: "GET", - url: "/:projectId", + url: "/", config: { rateLimit: readLimit }, schema: { - params: z.object({ - projectId: z.string().uuid() - }), response: { 200: z.array(SecretSharingSchema) } }, onRequest: verifyAuth([AuthMode.JWT]), handler: async (req) => { - const { projectId } = req.params; const sharedSecrets = await req.server.services.secretSharing.getSharedSecrets({ actor: req.permission.type, actorId: req.permission.id, - projectId, + orgId: req.permission.orgId, actorAuthMethod: req.permission.authMethod, actorOrgId: req.permission.orgId }); @@ -72,8 +68,7 @@ export const registerSecretSharingRouter = async (server: FastifyZodProvider) => signedValue: z.string(), expiresAt: z.string().refine((date) => new Date(date) > new Date(), { message: "Expires at should be a future date" - }), - workspaceId: z.string().uuid() + }) }), response: { 200: z.object({ @@ -83,11 +78,11 @@ export const registerSecretSharingRouter = async (server: FastifyZodProvider) => }, onRequest: verifyAuth([AuthMode.JWT]), handler: async (req) => { - const { name, signedValue, expiresAt, workspaceId } = req.body; + const { name, signedValue, expiresAt } = req.body; const sharedSecret = await req.server.services.secretSharing.createSharedSecret({ actor: req.permission.type, actorId: req.permission.id, - projectId: workspaceId, + orgId: req.permission.orgId, actorAuthMethod: req.permission.authMethod, actorOrgId: req.permission.orgId, name, @@ -100,13 +95,12 @@ export const registerSecretSharingRouter = async (server: FastifyZodProvider) => server.route({ method: "DELETE", - url: "/:projectId/:sharedSecretId", + url: "/:sharedSecretId", config: { rateLimit: writeLimit }, schema: { params: z.object({ - projectId: z.string().uuid(), sharedSecretId: z.string().uuid() }), response: { @@ -115,11 +109,11 @@ export const registerSecretSharingRouter = async (server: FastifyZodProvider) => }, onRequest: verifyAuth([AuthMode.JWT]), handler: async (req) => { - const { projectId, sharedSecretId } = req.params; + const { sharedSecretId } = req.params; const deletedSharedSecret = await req.server.services.secretSharing.deleteSharedSecretById({ actor: req.permission.type, actorId: req.permission.id, - projectId, + orgId: req.permission.orgId, actorAuthMethod: req.permission.authMethod, actorOrgId: req.permission.orgId, sharedSecretId diff --git a/backend/src/services/secret-sharing/secret-sharing-service.ts b/backend/src/services/secret-sharing/secret-sharing-service.ts index 7fdc8f6aa..a4952586a 100644 --- a/backend/src/services/secret-sharing/secret-sharing-service.ts +++ b/backend/src/services/secret-sharing/secret-sharing-service.ts @@ -1,13 +1,13 @@ import { ForbiddenError } from "@casl/ability"; +import { OrgPermissionActions, OrgPermissionSubjects } from "@app/ee/services/permission/org-permission"; import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service"; -import { ProjectPermissionActions, ProjectPermissionSub } from "@app/ee/services/permission/project-permission"; import { TSecretSharingDALFactory } from "./secret-sharing-dal"; import { TCreateSharedSecretDTO, TDeleteSharedSecretDTO, TSharedSecretPermission } from "./secret-sharing-types"; type TSecretSharingServiceFactoryDep = { - permissionService: Pick; + permissionService: Pick; secretSharingDAL: TSecretSharingDALFactory; }; @@ -18,16 +18,10 @@ export const secretSharingServiceFactory = ({ secretSharingDAL }: TSecretSharingServiceFactoryDep) => { const createSharedSecret = async (createSharedSecretInput: TCreateSharedSecretDTO) => { - const { actor, actorId, projectId, actorAuthMethod, actorOrgId, name, signedValue, expiresAt } = + const { actor, actorId, orgId, actorAuthMethod, actorOrgId, name, signedValue, expiresAt } = createSharedSecretInput; - const { permission } = await permissionService.getProjectPermission( - actor, - actorId, - projectId, - actorAuthMethod, - actorOrgId - ); - ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Create, ProjectPermissionSub.SecretSharing); + const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Create, OrgPermissionSubjects.SecretSharing); const newSharedSecret = await secretSharingDAL.create({ name, signedValue, @@ -38,15 +32,9 @@ export const secretSharingServiceFactory = ({ }; const getSharedSecrets = async (getSharedSecretsInput: TSharedSecretPermission) => { - const { actor, actorId, projectId, actorAuthMethod, actorOrgId } = getSharedSecretsInput; - const { permission } = await permissionService.getProjectPermission( - actor, - actorId, - projectId, - actorAuthMethod, - actorOrgId - ); - ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Read, ProjectPermissionSub.SecretSharing); + const { actor, actorId, orgId, actorAuthMethod, actorOrgId } = getSharedSecretsInput; + const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Read, OrgPermissionSubjects.SecretSharing); const userSharedSecrets = await secretSharingDAL.find({ userId: actorId }, { sort: [["expiresAt", "asc"]] }); return userSharedSecrets; }; @@ -60,15 +48,9 @@ export const secretSharingServiceFactory = ({ }; const deleteSharedSecretById = async (deleteSharedSecretInput: TDeleteSharedSecretDTO) => { - const { actor, actorId, projectId, actorAuthMethod, actorOrgId, sharedSecretId } = deleteSharedSecretInput; - const { permission } = await permissionService.getProjectPermission( - actor, - actorId, - projectId, - actorAuthMethod, - actorOrgId - ); - ForbiddenError.from(permission).throwUnlessCan(ProjectPermissionActions.Delete, ProjectPermissionSub.SecretSharing); + const { actor, actorId, orgId, actorAuthMethod, actorOrgId, sharedSecretId } = deleteSharedSecretInput; + const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); + ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Delete, OrgPermissionSubjects.SecretSharing); const deletedSharedSecret = await secretSharingDAL.deleteById(sharedSecretId); return deletedSharedSecret; }; diff --git a/backend/src/services/secret-sharing/secret-sharing-types.ts b/backend/src/services/secret-sharing/secret-sharing-types.ts index c08f42612..643aec230 100644 --- a/backend/src/services/secret-sharing/secret-sharing-types.ts +++ b/backend/src/services/secret-sharing/secret-sharing-types.ts @@ -5,7 +5,7 @@ export type TSharedSecretPermission = { actorId: string; actorAuthMethod: ActorAuthMethod; actorOrgId: string; - projectId: string; + orgId: string; }; export type TCreateSharedSecretDTO = { diff --git a/frontend/src/context/OrgPermissionContext/types.ts b/frontend/src/context/OrgPermissionContext/types.ts index 95a9d00ac..d51191ece 100644 --- a/frontend/src/context/OrgPermissionContext/types.ts +++ b/frontend/src/context/OrgPermissionContext/types.ts @@ -19,6 +19,7 @@ export enum OrgPermissionSubjects { Groups = "groups", Billing = "billing", SecretScanning = "secret-scanning", + SecretSharing = "secret-sharing", Identity = "identity" } @@ -34,6 +35,7 @@ export type OrgPermissionSet = | [OrgPermissionActions, OrgPermissionSubjects.Ldap] | [OrgPermissionActions, OrgPermissionSubjects.Groups] | [OrgPermissionActions, OrgPermissionSubjects.SecretScanning] + | [OrgPermissionActions, OrgPermissionSubjects.SecretSharing] | [OrgPermissionActions, OrgPermissionSubjects.Billing] | [OrgPermissionActions, OrgPermissionSubjects.Identity]; diff --git a/frontend/src/hooks/api/secretSharing/mutations.ts b/frontend/src/hooks/api/secretSharing/mutations.ts index a3566282c..e21cc08f6 100644 --- a/frontend/src/hooks/api/secretSharing/mutations.ts +++ b/frontend/src/hooks/api/secretSharing/mutations.ts @@ -20,11 +20,11 @@ export const useDeleteSharedSecret = () => { return useMutation< TSharedSecret, { message: string }, - { sharedSecretId: string; workspaceId: string } + { sharedSecretId: string } >({ - mutationFn: async ({ sharedSecretId, workspaceId }: TDeleteSharedSecretRequest) => { + mutationFn: async ({ sharedSecretId }: TDeleteSharedSecretRequest) => { const { data } = await apiRequest.delete( - `/api/v1/secret-sharing/${workspaceId}/${sharedSecretId}` + `/api/v1/secret-sharing/${sharedSecretId}` ); return data; }, diff --git a/frontend/src/hooks/api/secretSharing/queries.ts b/frontend/src/hooks/api/secretSharing/queries.ts index 33ffddfbc..ad5bbee74 100644 --- a/frontend/src/hooks/api/secretSharing/queries.ts +++ b/frontend/src/hooks/api/secretSharing/queries.ts @@ -4,12 +4,12 @@ import { apiRequest } from "@app/config/request"; import { TSharedSecret, TViewSharedSecretResponse } from "./types"; -export const useGetSharedSecrets = (workspaceId: string) => { +export const useGetSharedSecrets = () => { return useQuery({ queryKey: ["sharedSecrets"], queryFn: async () => { const { data } = await apiRequest.get( - `/api/v1/secret-sharing/${workspaceId}` + "/api/v1/secret-sharing/" ); return data; } diff --git a/frontend/src/hooks/api/secretSharing/types.ts b/frontend/src/hooks/api/secretSharing/types.ts index 6afbe34ea..ca9cb76b8 100644 --- a/frontend/src/hooks/api/secretSharing/types.ts +++ b/frontend/src/hooks/api/secretSharing/types.ts @@ -12,7 +12,6 @@ export type TCreateSharedSecretRequest = { name: string; signedValue: string; expiresAt: Date; - workspaceId: string; }; export type TViewSharedSecretResponse = { @@ -23,5 +22,4 @@ export type TViewSharedSecretResponse = { export type TDeleteSharedSecretRequest = { sharedSecretId: string; - workspaceId: string; }; diff --git a/frontend/src/layouts/AppLayout/AppLayout.tsx b/frontend/src/layouts/AppLayout/AppLayout.tsx index 60c31b72c..1b5df0037 100644 --- a/frontend/src/layouts/AppLayout/AppLayout.tsx +++ b/frontend/src/layouts/AppLayout/AppLayout.tsx @@ -531,18 +531,6 @@ export const AppLayout = ({ children }: LayoutProps) => { - - - - Secret Sharing - - - { + + + + Secret Sharing + + + {(window.location.origin.includes("https://app.infisical.com") || window.location.origin.includes("https://gamma.infisical.com")) && ( diff --git a/frontend/src/pages/project/[id]/secret-sharing/index.tsx b/frontend/src/pages/org/[id]/secret-sharing/index.tsx similarity index 100% rename from frontend/src/pages/project/[id]/secret-sharing/index.tsx rename to frontend/src/pages/org/[id]/secret-sharing/index.tsx diff --git a/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx b/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx index cb4c32866..4ffe1408a 100644 --- a/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx +++ b/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx @@ -22,7 +22,7 @@ import { Select, SelectItem } from "@app/components/v2"; -import { useWorkspace } from "@app/context"; +import { useOrganization } from "@app/context"; import { useToggle } from "@app/hooks"; import { useCreateSharedSecret } from "@app/hooks/api/secretSharing"; import { UsePopUpState } from "@app/hooks/usePopUp"; @@ -87,7 +87,7 @@ export const AddShareSecretModal = ({ popUp, handlePopUpToggle }: Props) => { resolver: yupResolver(schema) }); const createSharedSecret = useCreateSharedSecret(); - const { currentWorkspace } = useWorkspace(); + const { currentOrg } = useOrganization(); const [newSharedSecret, setnewSharedSecret] = useState(""); const [isUrlCopied, setIsUrlCopied] = useToggle(false); const hasSharedSecret = Boolean(newSharedSecret); @@ -108,7 +108,7 @@ export const AddShareSecretModal = ({ popUp, handlePopUpToggle }: Props) => { const onFormSubmit = async ({ name, value, expiresInValue, expiresInUnit }: FormData) => { try { - if (!currentWorkspace?.id) return; + if (!currentOrg?.id) return; const signingKeyPair = generateSignKeyPair(); const signedMessage = signAssymmetric({ @@ -128,7 +128,6 @@ export const AddShareSecretModal = ({ popUp, handlePopUpToggle }: Props) => { name, signedValue: signedMessage, expiresAt, - workspaceId: currentWorkspace.id }); setnewSharedSecret( `${window.location.origin}/shared/secret/${id}?key=${encodeURIComponent( diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx index 971b77261..e7311ee85 100644 --- a/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx @@ -3,10 +3,10 @@ import { faPlus } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { createNotification } from "@app/components/notifications"; -import { ProjectPermissionCan } from "@app/components/permissions"; +import { OrgPermissionCan } from "@app/components/permissions"; import { Button, Checkbox, DeleteActionModal } from "@app/components/v2"; -import { ProjectPermissionActions, ProjectPermissionSub, useWorkspace } from "@app/context"; -import { withProjectPermission } from "@app/hoc"; +import { OrgPermissionActions, OrgPermissionSubjects } from "@app/context"; +import { withPermission } from "@app/hoc"; import { usePopUp } from "@app/hooks"; import { useDeleteSharedSecret } from "@app/hooks/api/secretSharing"; @@ -15,9 +15,8 @@ import { ShareSecretsTable } from "./ShareSecretsTable"; type DeleteModalData = { name: string; id: string }; -export const ShareSecretSection = withProjectPermission( +export const ShareSecretSection = withPermission( () => { - const { currentWorkspace } = useWorkspace(); const deleteSharedSecret = useDeleteSharedSecret(); const [showExpiredSharedSecrets, setShowExpiredSharedSecrets] = useState(false); @@ -28,10 +27,8 @@ export const ShareSecretSection = withProjectPermission( const onDeleteApproved = async () => { try { - if (!currentWorkspace?.id) return; deleteSharedSecret.mutateAsync({ sharedSecretId: (popUp?.deleteSharedSecretConfirmation?.data as DeleteModalData)?.id, - workspaceId: currentWorkspace.id }); createNotification({ text: "Successfully deleted shared secret", @@ -52,9 +49,9 @@ export const ShareSecretSection = withProjectPermission(

Shared Secrets

- {(isAllowed) => (

@@ -93,9 +90,8 @@ export const ShareSecretSection = withProjectPermission( handlePopUpToggle("deleteSharedSecretConfirmation", isOpen)} deleteKey={(popUp?.deleteSharedSecretConfirmation?.data as DeleteModalData)?.name} onClose={() => handlePopUpClose("deleteSharedSecretConfirmation")} @@ -104,5 +100,5 @@ export const ShareSecretSection = withProjectPermission(

); }, - { action: ProjectPermissionActions.Read, subject: ProjectPermissionSub.SecretSharing } + { action: OrgPermissionActions.Read, subject: OrgPermissionSubjects.SecretSharing } ); diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx index 8d3b89f23..e4a104f69 100644 --- a/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx @@ -2,9 +2,9 @@ import { useEffect, useState } from "react"; import { faTrashCan } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { ProjectPermissionCan } from "@app/components/permissions"; +import { OrgPermissionCan } from "@app/components/permissions"; import { IconButton, Td, Tr } from "@app/components/v2"; -import { ProjectPermissionActions, ProjectPermissionSub } from "@app/context"; +import { OrgPermissionActions, OrgPermissionSubjects } from "@app/context"; import { TSharedSecret } from "@app/hooks/api/secretSharing"; import { UsePopUpState } from "@app/hooks/usePopUp"; @@ -110,9 +110,9 @@ export const ShareSecretsRow = ({

{formatDate(row.expiresAt)}

- {(isAllowed) => ( )} - + ); diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx index eac3435e3..4d3321eaa 100644 --- a/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx @@ -12,7 +12,6 @@ import { THead, Tr } from "@app/components/v2"; -import { useWorkspace } from "@app/context"; import { TSharedSecret, useGetSharedSecrets } from "@app/hooks/api/secretSharing"; import { UsePopUpState } from "@app/hooks/usePopUp"; @@ -34,9 +33,7 @@ type Props = { export const ShareSecretsTable = ({ handlePopUpOpen, showExpiredSharedSecrets }: Props) => { const [tableData, setTableData] = useState([]); - const { currentWorkspace } = useWorkspace(); - const workspaceId = currentWorkspace?.id || ""; - const { isLoading, data = [] } = useGetSharedSecrets(workspaceId); + const { isLoading, data = [] } = useGetSharedSecrets(); useEffect(() => { if (!isLoading) { From b5b778e241565557b5191066bd2abca9f08187b9 Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Wed, 29 May 2024 11:00:24 +0530 Subject: [PATCH 088/101] fix: minor ui changes + delete expired secrets + address other feedback --- ...ng.ts => 20240528190137_secret_sharing.ts} | 2 + backend/src/db/schemas/secret-sharing.ts | 1 + .../ee/services/permission/org-permission.ts | 10 -- backend/src/server/routes/index.ts | 3 +- .../resource-cleanup-queue.ts | 6 +- .../secret-sharing/secret-sharing-dal.ts | 19 ++- .../secret-sharing/secret-sharing-service.ts | 15 +- .../src/context/OrgPermissionContext/types.ts | 2 - .../components/AddShareSecretModal.tsx | 29 ++-- .../components/ShareSecretSection.tsx | 147 +++++++----------- .../components/ShareSecretsRow.tsx | 69 ++++---- .../components/ShareSecretsTable.tsx | 23 +-- .../ShareSecretPublicPage.tsx | 42 ++--- .../components/SecretTable.tsx | 9 +- 14 files changed, 174 insertions(+), 203 deletions(-) rename backend/src/db/migrations/{20240426191241_secret_sharing.ts => 20240528190137_secret_sharing.ts} (86%) diff --git a/backend/src/db/migrations/20240426191241_secret_sharing.ts b/backend/src/db/migrations/20240528190137_secret_sharing.ts similarity index 86% rename from backend/src/db/migrations/20240426191241_secret_sharing.ts rename to backend/src/db/migrations/20240528190137_secret_sharing.ts index e9bd89f9a..c602905cc 100644 --- a/backend/src/db/migrations/20240426191241_secret_sharing.ts +++ b/backend/src/db/migrations/20240528190137_secret_sharing.ts @@ -11,7 +11,9 @@ export async function up(knex: Knex): Promise { t.text("signedValue").notNullable(); t.timestamp("expiresAt").notNullable(); t.uuid("userId").notNullable(); + t.uuid("orgId").notNullable(); t.foreign("userId").references("id").inTable(TableName.Users).onDelete("CASCADE"); + t.foreign("orgId").references("id").inTable(TableName.Organization).onDelete("CASCADE"); t.timestamps(true, true, true); }); diff --git a/backend/src/db/schemas/secret-sharing.ts b/backend/src/db/schemas/secret-sharing.ts index d53f34c4e..532f1e310 100644 --- a/backend/src/db/schemas/secret-sharing.ts +++ b/backend/src/db/schemas/secret-sharing.ts @@ -13,6 +13,7 @@ export const SecretSharingSchema = z.object({ signedValue: z.string(), expiresAt: z.date(), userId: z.string().uuid(), + orgId: z.string().uuid(), createdAt: z.date(), updatedAt: z.date() }); diff --git a/backend/src/ee/services/permission/org-permission.ts b/backend/src/ee/services/permission/org-permission.ts index d76406cfd..9fece040b 100644 --- a/backend/src/ee/services/permission/org-permission.ts +++ b/backend/src/ee/services/permission/org-permission.ts @@ -21,7 +21,6 @@ export enum OrgPermissionSubjects { Groups = "groups", Billing = "billing", SecretScanning = "secret-scanning", - SecretSharing = "secret-sharing", Identity = "identity" } @@ -37,7 +36,6 @@ export type OrgPermissionSet = | [OrgPermissionActions, OrgPermissionSubjects.Ldap] | [OrgPermissionActions, OrgPermissionSubjects.Groups] | [OrgPermissionActions, OrgPermissionSubjects.SecretScanning] - | [OrgPermissionActions, OrgPermissionSubjects.SecretSharing] | [OrgPermissionActions, OrgPermissionSubjects.Billing] | [OrgPermissionActions, OrgPermissionSubjects.Identity]; @@ -62,10 +60,6 @@ const buildAdminPermission = () => { can(OrgPermissionActions.Edit, OrgPermissionSubjects.SecretScanning); can(OrgPermissionActions.Delete, OrgPermissionSubjects.SecretScanning); - can(OrgPermissionActions.Read, OrgPermissionSubjects.SecretSharing); - can(OrgPermissionActions.Create, OrgPermissionSubjects.SecretSharing); - can(OrgPermissionActions.Delete, OrgPermissionSubjects.SecretSharing); - can(OrgPermissionActions.Read, OrgPermissionSubjects.Settings); can(OrgPermissionActions.Create, OrgPermissionSubjects.Settings); can(OrgPermissionActions.Edit, OrgPermissionSubjects.Settings); @@ -130,10 +124,6 @@ const buildMemberPermission = () => { can(OrgPermissionActions.Edit, OrgPermissionSubjects.SecretScanning); can(OrgPermissionActions.Delete, OrgPermissionSubjects.SecretScanning); - can(OrgPermissionActions.Read, OrgPermissionSubjects.SecretSharing); - can(OrgPermissionActions.Create, OrgPermissionSubjects.SecretSharing); - can(OrgPermissionActions.Delete, OrgPermissionSubjects.SecretSharing); - can(OrgPermissionActions.Read, OrgPermissionSubjects.Identity); can(OrgPermissionActions.Create, OrgPermissionSubjects.Identity); can(OrgPermissionActions.Edit, OrgPermissionSubjects.Identity); diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts index 582f70d5a..1593515ec 100644 --- a/backend/src/server/routes/index.ts +++ b/backend/src/server/routes/index.ts @@ -794,7 +794,8 @@ export const registerRoutes = async ( const dailyResourceCleanUp = dailyResourceCleanUpQueueServiceFactory({ auditLogDAL, queueService, - identityAccessTokenDAL + identityAccessTokenDAL, + secretSharingDAL }); await superAdminService.initServerCfg(); diff --git a/backend/src/services/resource-cleanup/resource-cleanup-queue.ts b/backend/src/services/resource-cleanup/resource-cleanup-queue.ts index 3c8bcb1f7..afae2677f 100644 --- a/backend/src/services/resource-cleanup/resource-cleanup-queue.ts +++ b/backend/src/services/resource-cleanup/resource-cleanup-queue.ts @@ -3,10 +3,12 @@ import { logger } from "@app/lib/logger"; import { QueueJobs, QueueName, TQueueServiceFactory } from "@app/queue"; import { TIdentityAccessTokenDALFactory } from "../identity-access-token/identity-access-token-dal"; +import { TSecretSharingDALFactory } from "../secret-sharing/secret-sharing-dal"; type TDailyResourceCleanUpQueueServiceFactoryDep = { auditLogDAL: Pick; identityAccessTokenDAL: Pick; + secretSharingDAL: Pick; queueService: TQueueServiceFactory; }; @@ -15,12 +17,14 @@ export type TDailyResourceCleanUpQueueServiceFactory = ReturnType { queueService.start(QueueName.DailyResourceCleanUp, async () => { logger.info(`${QueueName.DailyResourceCleanUp}: queue task started`); await auditLogDAL.pruneAuditLog(); await identityAccessTokenDAL.removeExpiredTokens(); + await secretSharingDAL.pruneExpiredSharedSecrets(); logger.info(`${QueueName.DailyResourceCleanUp}: queue task completed`); }); diff --git a/backend/src/services/secret-sharing/secret-sharing-dal.ts b/backend/src/services/secret-sharing/secret-sharing-dal.ts index 696719a1e..6b5090d66 100644 --- a/backend/src/services/secret-sharing/secret-sharing-dal.ts +++ b/backend/src/services/secret-sharing/secret-sharing-dal.ts @@ -1,5 +1,8 @@ +import { Knex } from "knex"; + import { TDbClient } from "@app/db"; import { TableName } from "@app/db/schemas"; +import { DatabaseError } from "@app/lib/errors"; import { ormify } from "@app/lib/knex"; export type TSecretSharingDALFactory = ReturnType; @@ -7,10 +10,18 @@ export type TSecretSharingDALFactory = ReturnType { const sharedSecretOrm = ormify(db, TableName.SecretSharing); + const pruneExpiredSharedSecrets = async (tx?: Knex) => { + try { + const today = new Date(); + const docs = await (tx || db)(TableName.SecretSharing).where("expiresAt", "<", today).del(); + return docs; + } catch (error) { + throw new DatabaseError({ error, name: "pruneExpiredSharedSecrets" }); + } + }; + return { - create: sharedSecretOrm.create, - find: sharedSecretOrm.find, - findById: sharedSecretOrm.findById, - deleteById: sharedSecretOrm.deleteById + ...sharedSecretOrm, + pruneExpiredSharedSecrets }; }; diff --git a/backend/src/services/secret-sharing/secret-sharing-service.ts b/backend/src/services/secret-sharing/secret-sharing-service.ts index a4952586a..d4b40d309 100644 --- a/backend/src/services/secret-sharing/secret-sharing-service.ts +++ b/backend/src/services/secret-sharing/secret-sharing-service.ts @@ -1,7 +1,5 @@ -import { ForbiddenError } from "@casl/ability"; - -import { OrgPermissionActions, OrgPermissionSubjects } from "@app/ee/services/permission/org-permission"; import { TPermissionServiceFactory } from "@app/ee/services/permission/permission-service"; +import { UnauthorizedError } from "@app/lib/errors"; import { TSecretSharingDALFactory } from "./secret-sharing-dal"; import { TCreateSharedSecretDTO, TDeleteSharedSecretDTO, TSharedSecretPermission } from "./secret-sharing-types"; @@ -21,12 +19,13 @@ export const secretSharingServiceFactory = ({ const { actor, actorId, orgId, actorAuthMethod, actorOrgId, name, signedValue, expiresAt } = createSharedSecretInput; const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); - ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Create, OrgPermissionSubjects.SecretSharing); + if (!permission) throw new UnauthorizedError({ name: "User not in org" }); const newSharedSecret = await secretSharingDAL.create({ name, signedValue, expiresAt, - userId: actorId + userId: actorId, + orgId }); return { id: newSharedSecret.id }; }; @@ -34,8 +33,8 @@ export const secretSharingServiceFactory = ({ const getSharedSecrets = async (getSharedSecretsInput: TSharedSecretPermission) => { const { actor, actorId, orgId, actorAuthMethod, actorOrgId } = getSharedSecretsInput; const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); - ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Read, OrgPermissionSubjects.SecretSharing); - const userSharedSecrets = await secretSharingDAL.find({ userId: actorId }, { sort: [["expiresAt", "asc"]] }); + if (!permission) throw new UnauthorizedError({ name: "User not in org" }); + const userSharedSecrets = await secretSharingDAL.find({ userId: actorId, orgId }, { sort: [["expiresAt", "asc"]] }); return userSharedSecrets; }; @@ -50,7 +49,7 @@ export const secretSharingServiceFactory = ({ const deleteSharedSecretById = async (deleteSharedSecretInput: TDeleteSharedSecretDTO) => { const { actor, actorId, orgId, actorAuthMethod, actorOrgId, sharedSecretId } = deleteSharedSecretInput; const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); - ForbiddenError.from(permission).throwUnlessCan(OrgPermissionActions.Delete, OrgPermissionSubjects.SecretSharing); + if (!permission) throw new UnauthorizedError({ name: "User not in org" }); const deletedSharedSecret = await secretSharingDAL.deleteById(sharedSecretId); return deletedSharedSecret; }; diff --git a/frontend/src/context/OrgPermissionContext/types.ts b/frontend/src/context/OrgPermissionContext/types.ts index d51191ece..95a9d00ac 100644 --- a/frontend/src/context/OrgPermissionContext/types.ts +++ b/frontend/src/context/OrgPermissionContext/types.ts @@ -19,7 +19,6 @@ export enum OrgPermissionSubjects { Groups = "groups", Billing = "billing", SecretScanning = "secret-scanning", - SecretSharing = "secret-sharing", Identity = "identity" } @@ -35,7 +34,6 @@ export type OrgPermissionSet = | [OrgPermissionActions, OrgPermissionSubjects.Ldap] | [OrgPermissionActions, OrgPermissionSubjects.Groups] | [OrgPermissionActions, OrgPermissionSubjects.SecretScanning] - | [OrgPermissionActions, OrgPermissionSubjects.SecretSharing] | [OrgPermissionActions, OrgPermissionSubjects.Billing] | [OrgPermissionActions, OrgPermissionSubjects.Identity]; diff --git a/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx b/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx index 4ffe1408a..3795bb3e9 100644 --- a/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx +++ b/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx @@ -19,11 +19,12 @@ import { Modal, ModalClose, ModalContent, + SecretInput, Select, SelectItem } from "@app/components/v2"; import { useOrganization } from "@app/context"; -import { useToggle } from "@app/hooks"; +import { useTimedReset } from "@app/hooks"; import { useCreateSharedSecret } from "@app/hooks/api/secretSharing"; import { UsePopUpState } from "@app/hooks/usePopUp"; @@ -89,22 +90,20 @@ export const AddShareSecretModal = ({ popUp, handlePopUpToggle }: Props) => { const createSharedSecret = useCreateSharedSecret(); const { currentOrg } = useOrganization(); const [newSharedSecret, setnewSharedSecret] = useState(""); - const [isUrlCopied, setIsUrlCopied] = useToggle(false); const hasSharedSecret = Boolean(newSharedSecret); - - useEffect(() => { - let timer: NodeJS.Timeout; - if (isUrlCopied) { - timer = setTimeout(() => setIsUrlCopied.off(), 2000); - } - - return () => clearTimeout(timer); - }, [isUrlCopied]); + const [isUrlCopied,, setIsUrlCopied] = useTimedReset({ + initialState: false, + }); const copyUrlToClipboard = () => { navigator.clipboard.writeText(newSharedSecret); - setIsUrlCopied.on(); + setIsUrlCopied(true); }; + useEffect(() => { + if (isUrlCopied) { + setTimeout(() => setIsUrlCopied(false), 2000); + } + }, [isUrlCopied]); const onFormSubmit = async ({ name, value, expiresInValue, expiresInUnit }: FormData) => { try { @@ -195,7 +194,11 @@ export const AddShareSecretModal = ({ popUp, handlePopUpToggle }: Props) => { isError={Boolean(error)} errorText={error?.message} > - + )} /> diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx index e7311ee85..4ccf4e6fa 100644 --- a/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx @@ -1,12 +1,8 @@ -import { useState } from "react"; import { faPlus } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { createNotification } from "@app/components/notifications"; -import { OrgPermissionCan } from "@app/components/permissions"; -import { Button, Checkbox, DeleteActionModal } from "@app/components/v2"; -import { OrgPermissionActions, OrgPermissionSubjects } from "@app/context"; -import { withPermission } from "@app/hoc"; +import { Button, DeleteActionModal } from "@app/components/v2"; import { usePopUp } from "@app/hooks"; import { useDeleteSharedSecret } from "@app/hooks/api/secretSharing"; @@ -15,90 +11,67 @@ import { ShareSecretsTable } from "./ShareSecretsTable"; type DeleteModalData = { name: string; id: string }; -export const ShareSecretSection = withPermission( - () => { - const deleteSharedSecret = useDeleteSharedSecret(); - const [showExpiredSharedSecrets, setShowExpiredSharedSecrets] = useState(false); +export const ShareSecretSection = () => { + const deleteSharedSecret = useDeleteSharedSecret(); + const { popUp, handlePopUpToggle, handlePopUpClose, handlePopUpOpen } = usePopUp([ + "createSharedSecret", + "deleteSharedSecretConfirmation" + ] as const); - const { popUp, handlePopUpToggle, handlePopUpClose, handlePopUpOpen } = usePopUp([ - "createSharedSecret", - "deleteSharedSecretConfirmation" - ] as const); + const onDeleteApproved = async () => { + try { + deleteSharedSecret.mutateAsync({ + sharedSecretId: (popUp?.deleteSharedSecretConfirmation?.data as DeleteModalData)?.id, + }); + createNotification({ + text: "Successfully deleted shared secret", + type: "success" + }); - const onDeleteApproved = async () => { - try { - deleteSharedSecret.mutateAsync({ - sharedSecretId: (popUp?.deleteSharedSecretConfirmation?.data as DeleteModalData)?.id, - }); - createNotification({ - text: "Successfully deleted shared secret", - type: "success" - }); + handlePopUpClose("deleteSharedSecretConfirmation"); + } catch (err) { + console.error(err); + createNotification({ + text: "Failed to delete shared secret", + type: "error" + }); + } + }; - handlePopUpClose("deleteSharedSecretConfirmation"); - } catch (err) { - console.error(err); - createNotification({ - text: "Failed to delete shared secret", - type: "error" - }); - } - }; + return ( +
+
+

Shared Secrets

- return ( -
-
-

Shared Secrets

- - {(isAllowed) => ( - - )} - -
-
-

- Every secret shared can be accessed with the URL (shown during creation) before its - expiry. -

- { - setShowExpiredSharedSecrets(state as boolean); - }} - > - Show expired shared secrets too - -
- - - handlePopUpToggle("deleteSharedSecretConfirmation", isOpen)} - deleteKey={(popUp?.deleteSharedSecretConfirmation?.data as DeleteModalData)?.name} - onClose={() => handlePopUpClose("deleteSharedSecretConfirmation")} - onDeleteApproved={onDeleteApproved} - /> +
- ); - }, - { action: OrgPermissionActions.Read, subject: OrgPermissionSubjects.SecretSharing } -); +
+

+ Every secret shared can be accessed with the URL (shown during creation) before its + expiry. +

+
+ + + handlePopUpToggle("deleteSharedSecretConfirmation", isOpen)} + deleteKey={(popUp?.deleteSharedSecretConfirmation?.data as DeleteModalData)?.name} + onClose={() => handlePopUpClose("deleteSharedSecretConfirmation")} + onDeleteApproved={onDeleteApproved} + /> +
+ ); +}; \ No newline at end of file diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx index e4a104f69..b0ba810f5 100644 --- a/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx @@ -2,9 +2,7 @@ import { useEffect, useState } from "react"; import { faTrashCan } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { OrgPermissionCan } from "@app/components/permissions"; import { IconButton, Td, Tr } from "@app/components/v2"; -import { OrgPermissionActions, OrgPermissionSubjects } from "@app/context"; import { TSharedSecret } from "@app/hooks/api/secretSharing"; import { UsePopUpState } from "@app/hooks/usePopUp"; @@ -28,38 +26,31 @@ const timeAgo = (inputDate: Date, currentDate: Date): string => { const elapsedYears = Math.abs(Math.floor(elapsedDays / 365)); if (elapsedYears > 0) { - return `${elapsedYears} year${elapsedYears === 1 ? "" : "s"} ${ - elapsedMilliseconds >= 0 ? "ago" : "from now" - }`; + return `${elapsedYears} year${elapsedYears === 1 ? "" : "s"} ${elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; } if (elapsedMonths > 0) { - return `${elapsedMonths} month${elapsedMonths === 1 ? "" : "s"} ${ - elapsedMilliseconds >= 0 ? "ago" : "from now" - }`; + return `${elapsedMonths} month${elapsedMonths === 1 ? "" : "s"} ${elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; } if (elapsedWeeks > 0) { - return `${elapsedWeeks} week${elapsedWeeks === 1 ? "" : "s"} ${ - elapsedMilliseconds >= 0 ? "ago" : "from now" - }`; + return `${elapsedWeeks} week${elapsedWeeks === 1 ? "" : "s"} ${elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; } if (elapsedDays > 0) { - return `${elapsedDays} day${elapsedDays === 1 ? "" : "s"} ${ - elapsedMilliseconds >= 0 ? "ago" : "from now" - }`; + return `${elapsedDays} day${elapsedDays === 1 ? "" : "s"} ${elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; } if (elapsedHours > 0) { - return `${elapsedHours} hour${elapsedHours === 1 ? "" : "s"} ${ - elapsedMilliseconds >= 0 ? "ago" : "from now" - }`; + return `${elapsedHours} hour${elapsedHours === 1 ? "" : "s"} ${elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; } if (elapsedMinutes > 0) { - return `${elapsedMinutes} minute${elapsedMinutes === 1 ? "" : "s"} ${ - elapsedMilliseconds >= 0 ? "ago" : "from now" - }`; + return `${elapsedMinutes} minute${elapsedMinutes === 1 ? "" : "s"} ${elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; } - return `${elapsedSeconds} second${elapsedSeconds === 1 ? "" : "s"} ${ - elapsedMilliseconds >= 0 ? "ago" : "from now" - }`; + return `${elapsedSeconds} second${elapsedSeconds === 1 ? "" : "s"} ${elapsedMilliseconds >= 0 ? "ago" : "from now" + }`; }; export const ShareSecretsRow = ({ @@ -110,26 +101,20 @@ export const ShareSecretsRow = ({

{formatDate(row.expiresAt)}

- + handlePopUpOpen("deleteSharedSecretConfirmation", { + name: row.name, + id: row.id + }) + } + colorSchema="danger" + ariaLabel="delete" > - {(isAllowed) => ( - - handlePopUpOpen("deleteSharedSecretConfirmation", { - name: row.name, - id: row.id - }) - } - colorSchema="danger" - ariaLabel="delete" - isDisabled={!isAllowed} - > - - - )} - + + ); diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx index 4d3321eaa..75fcd501f 100644 --- a/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx @@ -28,29 +28,22 @@ type Props = { id: string; } ) => void; - showExpiredSharedSecrets: boolean; }; -export const ShareSecretsTable = ({ handlePopUpOpen, showExpiredSharedSecrets }: Props) => { +export const ShareSecretsTable = ({ handlePopUpOpen }: Props) => { const [tableData, setTableData] = useState([]); - const { isLoading, data = [] } = useGetSharedSecrets(); + const { isLoading, data = [] } = useGetSharedSecrets(); useEffect(() => { if (!isLoading) { - if (!showExpiredSharedSecrets) { - setTableData(data.filter((secret) => new Date(secret.expiresAt) > new Date())); - } else { - setTableData(data); - } + setTableData(data); } - }, [isLoading, data, showExpiredSharedSecrets]); + }, [isLoading, data]); const handleSecretExpiration = () => { - if (!showExpiredSharedSecrets) { - setTableData( - data.filter((secret) => !secret.expiresAt || new Date(secret.expiresAt) > new Date()) - ); - } + setTableData( + data.filter((secret) => !secret.expiresAt || new Date(secret.expiresAt) > new Date()) + ); }; return ( @@ -77,7 +70,7 @@ export const ShareSecretsTable = ({ handlePopUpOpen, showExpiredSharedSecrets }: {!isLoading && tableData && tableData?.length === 0 && ( - + )} diff --git a/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx b/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx index ab34a8a14..703b8faf0 100644 --- a/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx +++ b/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx @@ -5,7 +5,7 @@ import Link from "next/link"; import { useRouter } from "next/router"; import { openSignedAssymmetric } from "@app/components/utilities/cryptography/crypto"; -import { useToggle } from "@app/hooks"; +import { useTimedReset } from "@app/hooks"; import { useGetActiveSharedSecretById } from "@app/hooks/api/secretSharing"; import { DragonMainImage, SecretTable } from "./components"; @@ -34,42 +34,46 @@ export const ShareSecretPublicPage = () => { }, [data, publicKey]); const [timeLeft, setTimeLeft] = useState(""); - const [isUrlCopied, setIsUrlCopied] = useToggle(false); + const [isUrlCopied,, setIsUrlCopied] = useTimedReset({ + initialState: false, + }); + + const millisecondsPerDay = 1000 * 60 * 60 * 24; + const millisecondsPerHour = 1000 * 60 * 60; + const millisecondsPerMinute = 1000 * 60; useEffect(() => { const updateTimer = () => { - if (data && data.expiresAt) { - const expiryDate = new Date(data.expiresAt).getTime(); - const now = new Date().getTime(); - const distance = expiryDate - now; - - if (distance < 0) { + if (data && data.expiresAt) { + const expirationTime = new Date(data.expiresAt).getTime(); + const currentTime = new Date().getTime(); + const timeDifference = expirationTime - currentTime; + + if (timeDifference < 0) { setTimeLeft("Expired"); } else { - const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); - const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)); - const seconds = Math.floor((distance % (1000 * 60)) / 1000); - setTimeLeft(`${hours}h ${minutes}m ${seconds}s`); + const hoursRemaining = Math.floor((timeDifference % millisecondsPerDay) / millisecondsPerHour); + const minutesRemaining = Math.floor((timeDifference % millisecondsPerHour) / millisecondsPerMinute); + const secondsRemaining = Math.floor((timeDifference % millisecondsPerMinute) / 1000); + setTimeLeft(`${hoursRemaining}h ${minutesRemaining}m ${secondsRemaining}s`); } } }; - + const timer = setInterval(updateTimer, 1000); return () => clearInterval(timer); }, [data?.expiresAt]); useEffect(() => { - let timer: NodeJS.Timeout; if (isUrlCopied) { - timer = setTimeout(() => setIsUrlCopied.off(), 2000); + setTimeout(() => setIsUrlCopied(false), 2000); } - - return () => clearTimeout(timer); }, [isUrlCopied]); + const copyUrlToClipboard = () => { - navigator.clipboard.writeText(decryptedSecret as string); - setIsUrlCopied.on(); + navigator.clipboard.writeText(decryptedSecret); + setIsUrlCopied(true); }; return ( diff --git a/frontend/src/views/ShareSecretPublicPage/components/SecretTable.tsx b/frontend/src/views/ShareSecretPublicPage/components/SecretTable.tsx index f459b9547..97d7deca0 100644 --- a/frontend/src/views/ShareSecretPublicPage/components/SecretTable.tsx +++ b/frontend/src/views/ShareSecretPublicPage/components/SecretTable.tsx @@ -4,6 +4,7 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { EmptyState, IconButton, + SecretInput, Table, TableContainer, TBody, @@ -47,7 +48,13 @@ export const SecretTable = ({ {sharedSecret.name}
-
{decryptedSecret}
+
+ +
Date: Wed, 29 May 2024 14:09:23 +0530 Subject: [PATCH 089/101] feat: use hash as pw & move to symmetric encrpytion --- .../20240528190137_secret_sharing.ts | 5 +- backend/src/db/schemas/secret-sharing.ts | 5 +- .../server/routes/v1/secret-sharing-router.ts | 26 +++++-- .../secret-sharing/secret-sharing-service.ts | 13 ++-- .../secret-sharing/secret-sharing-types.ts | 5 +- .../utilities/cryptography/crypto.ts | 73 ------------------- .../src/hooks/api/secretSharing/queries.ts | 8 +- frontend/src/hooks/api/secretSharing/types.ts | 14 +++- .../components/AddShareSecretModal.tsx | 34 +++++---- .../ShareSecretPublicPage.tsx | 25 ++++--- 10 files changed, 89 insertions(+), 119 deletions(-) diff --git a/backend/src/db/migrations/20240528190137_secret_sharing.ts b/backend/src/db/migrations/20240528190137_secret_sharing.ts index c602905cc..c1eab2ea6 100644 --- a/backend/src/db/migrations/20240528190137_secret_sharing.ts +++ b/backend/src/db/migrations/20240528190137_secret_sharing.ts @@ -8,7 +8,10 @@ export async function up(knex: Knex): Promise { await knex.schema.createTable(TableName.SecretSharing, (t) => { t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid()); t.string("name").notNullable(); - t.text("signedValue").notNullable(); + t.text("encryptedValue").notNullable(); + t.text("iv").notNullable(); + t.text("tag").notNullable(); + t.text("hashedHex").notNullable(); t.timestamp("expiresAt").notNullable(); t.uuid("userId").notNullable(); t.uuid("orgId").notNullable(); diff --git a/backend/src/db/schemas/secret-sharing.ts b/backend/src/db/schemas/secret-sharing.ts index 532f1e310..a412221b2 100644 --- a/backend/src/db/schemas/secret-sharing.ts +++ b/backend/src/db/schemas/secret-sharing.ts @@ -10,7 +10,10 @@ import { TImmutableDBKeys } from "./models"; export const SecretSharingSchema = z.object({ id: z.string().uuid(), name: z.string(), - signedValue: z.string(), + encryptedValue: z.string(), + iv: z.string(), + tag: z.string(), + hashedHex: z.string(), expiresAt: z.date(), userId: z.string().uuid(), orgId: z.string().uuid(), diff --git a/backend/src/server/routes/v1/secret-sharing-router.ts b/backend/src/server/routes/v1/secret-sharing-router.ts index f5f47d345..67751395b 100644 --- a/backend/src/server/routes/v1/secret-sharing-router.ts +++ b/backend/src/server/routes/v1/secret-sharing-router.ts @@ -41,16 +41,24 @@ export const registerSecretSharingRouter = async (server: FastifyZodProvider) => params: z.object({ id: z.string().uuid() }), + querystring: z.object({ + hashedHex: z.string() + }), response: { - 200: SecretSharingSchema.pick({ name: true, signedValue: true, expiresAt: true }) + 200: SecretSharingSchema.pick({ name: true, encryptedValue: true, iv: true, tag: true, expiresAt: true }) } }, handler: async (req) => { - const sharedSecret = await req.server.services.secretSharing.getActiveSharedSecretById(req.params.id); + const sharedSecret = await req.server.services.secretSharing.getActiveSharedSecretByIdAndHashedHex( + req.params.id, + req.query.hashedHex + ); if (!sharedSecret) return undefined; return { name: sharedSecret.name, - signedValue: sharedSecret.signedValue, + encryptedValue: sharedSecret.encryptedValue, + iv: sharedSecret.iv, + tag: sharedSecret.tag, expiresAt: sharedSecret.expiresAt }; } @@ -65,7 +73,10 @@ export const registerSecretSharingRouter = async (server: FastifyZodProvider) => schema: { body: z.object({ name: z.string(), - signedValue: z.string(), + encryptedValue: z.string(), + iv: z.string(), + tag: z.string(), + hashedHex: z.string(), expiresAt: z.string().refine((date) => new Date(date) > new Date(), { message: "Expires at should be a future date" }) @@ -78,7 +89,7 @@ export const registerSecretSharingRouter = async (server: FastifyZodProvider) => }, onRequest: verifyAuth([AuthMode.JWT]), handler: async (req) => { - const { name, signedValue, expiresAt } = req.body; + const { name, encryptedValue, iv, tag, hashedHex, expiresAt } = req.body; const sharedSecret = await req.server.services.secretSharing.createSharedSecret({ actor: req.permission.type, actorId: req.permission.id, @@ -86,7 +97,10 @@ export const registerSecretSharingRouter = async (server: FastifyZodProvider) => actorAuthMethod: req.permission.authMethod, actorOrgId: req.permission.orgId, name, - signedValue, + encryptedValue, + iv, + tag, + hashedHex, expiresAt: new Date(expiresAt) }); return { id: sharedSecret.id }; diff --git a/backend/src/services/secret-sharing/secret-sharing-service.ts b/backend/src/services/secret-sharing/secret-sharing-service.ts index d4b40d309..85cfe97f6 100644 --- a/backend/src/services/secret-sharing/secret-sharing-service.ts +++ b/backend/src/services/secret-sharing/secret-sharing-service.ts @@ -16,13 +16,16 @@ export const secretSharingServiceFactory = ({ secretSharingDAL }: TSecretSharingServiceFactoryDep) => { const createSharedSecret = async (createSharedSecretInput: TCreateSharedSecretDTO) => { - const { actor, actorId, orgId, actorAuthMethod, actorOrgId, name, signedValue, expiresAt } = + const { actor, actorId, orgId, actorAuthMethod, actorOrgId, name, encryptedValue, iv, tag, hashedHex, expiresAt } = createSharedSecretInput; const { permission } = await permissionService.getOrgPermission(actor, actorId, orgId, actorAuthMethod, actorOrgId); if (!permission) throw new UnauthorizedError({ name: "User not in org" }); const newSharedSecret = await secretSharingDAL.create({ name, - signedValue, + encryptedValue, + iv, + tag, + hashedHex, expiresAt, userId: actorId, orgId @@ -38,8 +41,8 @@ export const secretSharingServiceFactory = ({ return userSharedSecrets; }; - const getActiveSharedSecretById = async (sharedSecretId: string) => { - const sharedSecret = await secretSharingDAL.findById(sharedSecretId); + const getActiveSharedSecretByIdAndHashedHex = async (sharedSecretId: string, hashedHex: string) => { + const sharedSecret = await secretSharingDAL.findOne({ id: sharedSecretId, hashedHex }); if (sharedSecret && sharedSecret.expiresAt < new Date()) { return; } @@ -58,6 +61,6 @@ export const secretSharingServiceFactory = ({ createSharedSecret, getSharedSecrets, deleteSharedSecretById, - getActiveSharedSecretById + getActiveSharedSecretByIdAndHashedHex }; }; diff --git a/backend/src/services/secret-sharing/secret-sharing-types.ts b/backend/src/services/secret-sharing/secret-sharing-types.ts index 643aec230..2d14ed12c 100644 --- a/backend/src/services/secret-sharing/secret-sharing-types.ts +++ b/backend/src/services/secret-sharing/secret-sharing-types.ts @@ -10,7 +10,10 @@ export type TSharedSecretPermission = { export type TCreateSharedSecretDTO = { name: string; - signedValue: string; + encryptedValue: string; + iv: string; + tag: string; + hashedHex: string; expiresAt: Date; } & TSharedSecretPermission; diff --git a/frontend/src/components/utilities/cryptography/crypto.ts b/frontend/src/components/utilities/cryptography/crypto.ts index c8383d617..c0e5d4c21 100644 --- a/frontend/src/components/utilities/cryptography/crypto.ts +++ b/frontend/src/components/utilities/cryptography/crypto.ts @@ -224,76 +224,6 @@ const decryptSymmetric = ({ ciphertext, iv, tag, key }: DecryptSymmetricProps): return plaintext; }; -/** - * Return new base64, NaCl, public-secret key pair for signing. - * @returns {Object} obj - * @returns {String} obj.publicKey - base64, NaCl, public key - * @returns {String} obj.secretKey - base64, NaCl, secret key - */ -const generateSignKeyPair = (): { - publicKey: string; - secretKey: string; -} => { - const pair = nacl.sign.keyPair(); - - return { - publicKey: nacl.util.encodeBase64(pair.publicKey), - secretKey: nacl.util.encodeBase64(pair.secretKey) - }; -}; - -type SignAsymmetricProps = { - message: string; - privateKey: string; -}; - -/** - * Returns asymmetrically signed [message] using [privateKey] - * @param {Object} obj - * @param {String} obj.message - message to sign - * @param {String} obj.privateKey - base64-encoded private key - * @returns {String} signedMessage - base64-encoded signed message - */ -const signAssymmetric = ({ message, privateKey }: SignAsymmetricProps): string => { - let signedMessage; - try { - signedMessage = nacl.sign(nacl.util.decodeUTF8(message), nacl.util.decodeBase64(privateKey)); - } catch (err) { - console.log("Failed to sign message", err); - process.exit(1); - } - return nacl.util.encodeBase64(signedMessage); -}; - -type OpenSignedAsymmetricProps = { - signedMessage: string; - publicKey: string; -}; - -/** - * Returns asymmetrically decrypted [message] using [publicKey] - * @param {Object} obj - * @param {String} obj.signedMessage - signed message to decrypt - * @param {String} obj.publicKey - base64-encoded public key - * @returns {String} signedMessage - base64-encoded decrypted message - */ -const openSignedAssymmetric = ({ signedMessage, publicKey }: OpenSignedAsymmetricProps): string => { - let originalMessage; - try { - originalMessage = nacl.sign.open( - nacl.util.decodeBase64(signedMessage), - nacl.util.decodeBase64(publicKey) - ); - if (!originalMessage) { - throw new Error("Signature verification failed"); - } - originalMessage = nacl.util.encodeUTF8(originalMessage); - } catch (err) { - console.log("Failed to verify signature", err); - } - return originalMessage; -}; - export { decryptAssymmetric, decryptSymmetric, @@ -301,8 +231,5 @@ export { encryptAssymmetric, encryptSymmetric, generateKeyPair, - generateSignKeyPair, - openSignedAssymmetric, - signAssymmetric, verifyPrivateKey }; diff --git a/frontend/src/hooks/api/secretSharing/queries.ts b/frontend/src/hooks/api/secretSharing/queries.ts index ad5bbee74..b4cf71531 100644 --- a/frontend/src/hooks/api/secretSharing/queries.ts +++ b/frontend/src/hooks/api/secretSharing/queries.ts @@ -16,15 +16,17 @@ export const useGetSharedSecrets = () => { }); }; -export const useGetActiveSharedSecretById = (id: string) => { +export const useGetActiveSharedSecretByIdAndHashedHex = (id: string, hashedHex: string) => { return useQuery({ queryFn: async () => { const { data } = await apiRequest.get( - `/api/v1/secret-sharing/public/${id}` + `/api/v1/secret-sharing/public/${id}?hashedHex=${hashedHex}` ); return { name: data.name, - signedValue: data.signedValue, + encryptedValue: data.encryptedValue, + iv: data.iv, + tag: data.tag, expiresAt: data.expiresAt }; } diff --git a/frontend/src/hooks/api/secretSharing/types.ts b/frontend/src/hooks/api/secretSharing/types.ts index ca9cb76b8..2fbddfb35 100644 --- a/frontend/src/hooks/api/secretSharing/types.ts +++ b/frontend/src/hooks/api/secretSharing/types.ts @@ -1,7 +1,10 @@ export type TSharedSecret = { id: string; name: string; - signedValue: string; + encryptedValue: string; + iv: string; + tag: string; + hashedHex: string; userId: string; expiresAt: Date; createdAt: Date; @@ -10,13 +13,18 @@ export type TSharedSecret = { export type TCreateSharedSecretRequest = { name: string; - signedValue: string; + encryptedValue: string; + iv: string; + tag: string; + hashedHex: string; expiresAt: Date; }; export type TViewSharedSecretResponse = { name: string; - signedValue: string; + encryptedValue: string; + iv: string; + tag: string; expiresAt: Date; }; diff --git a/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx b/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx index 3795bb3e9..2bdbfaf99 100644 --- a/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx +++ b/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx @@ -1,3 +1,5 @@ +import crypto from "crypto"; + import { useEffect, useState } from "react"; import { Controller, useForm } from "react-hook-form"; import { faCheck, faCopy } from "@fortawesome/free-solid-svg-icons"; @@ -8,8 +10,7 @@ import * as yup from "yup"; import { createNotification } from "@app/components/notifications"; import { - generateSignKeyPair, - signAssymmetric + encryptSymmetric, } from "@app/components/utilities/cryptography/crypto"; import { Button, @@ -91,7 +92,7 @@ export const AddShareSecretModal = ({ popUp, handlePopUpToggle }: Props) => { const { currentOrg } = useOrganization(); const [newSharedSecret, setnewSharedSecret] = useState(""); const hasSharedSecret = Boolean(newSharedSecret); - const [isUrlCopied,, setIsUrlCopied] = useTimedReset({ + const [isUrlCopied, , setIsUrlCopied] = useTimedReset({ initialState: false, }); @@ -109,12 +110,14 @@ export const AddShareSecretModal = ({ popUp, handlePopUpToggle }: Props) => { try { if (!currentOrg?.id) return; - const signingKeyPair = generateSignKeyPair(); - const signedMessage = signAssymmetric({ - message: value, - privateKey: signingKeyPair.secretKey + const key = crypto.randomBytes(16).toString("hex"); + const hashedHex = crypto.createHash("sha256").update(key).digest("hex"); + const { ciphertext, iv, tag } = encryptSymmetric({ + plaintext: value, + key }); + const expiresAt = new Date(); const updateExpiresAt = expirationUnitsAndActions.find( (item) => item.unit === expiresInUnit @@ -125,13 +128,14 @@ export const AddShareSecretModal = ({ popUp, handlePopUpToggle }: Props) => { const { id } = await createSharedSecret.mutateAsync({ name, - signedValue: signedMessage, + encryptedValue: ciphertext, + iv, + tag, + hashedHex, expiresAt, }); setnewSharedSecret( - `${window.location.origin}/shared/secret/${id}?key=${encodeURIComponent( - signingKeyPair.publicKey - )}` + `${window.location.origin}/shared/secret/${id}?key=${encodeURIComponent(hashedHex)}-${encodeURIComponent(key)}` ); createNotification({ @@ -195,10 +199,10 @@ export const AddShareSecretModal = ({ popUp, handlePopUpToggle }: Props) => { errorText={error?.message} > + isVisible + {...field} + containerClassName="py-1.5 rounded-md transition-all group-hover:mr-2 text-bunker-300 hover:border-primary-400/50 border border-mineshaft-600 bg-mineshaft-900 px-2" + /> )} /> diff --git a/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx b/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx index 703b8faf0..e3d6fcabb 100644 --- a/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx +++ b/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx @@ -4,15 +4,16 @@ import Image from "next/image"; import Link from "next/link"; import { useRouter } from "next/router"; -import { openSignedAssymmetric } from "@app/components/utilities/cryptography/crypto"; +import { decryptSymmetric } from "@app/components/utilities/cryptography/crypto"; import { useTimedReset } from "@app/hooks"; -import { useGetActiveSharedSecretById } from "@app/hooks/api/secretSharing"; +import { useGetActiveSharedSecretByIdAndHashedHex } from "@app/hooks/api/secretSharing"; import { DragonMainImage, SecretTable } from "./components"; export const ShareSecretPublicPage = () => { const router = useRouter(); const { id, key: urlEncodedPublicKey } = router.query; + const [hashedHex, key] = urlEncodedPublicKey!.toString().split("-"); const publicKey = decodeURIComponent(urlEncodedPublicKey as string); useEffect(() => { @@ -21,12 +22,14 @@ export const ShareSecretPublicPage = () => { } }, [id, publicKey]); - const { isLoading, data } = useGetActiveSharedSecretById(id as string); + const { isLoading, data } = useGetActiveSharedSecretByIdAndHashedHex(id as string, hashedHex as string ); const decryptedSecret = useMemo(() => { - if (data && data.signedValue && publicKey) { - const res = openSignedAssymmetric({ - signedMessage: data.signedValue, - publicKey: publicKey as string + if (data && data.encryptedValue && publicKey) { + const res = decryptSymmetric({ + ciphertext: data.encryptedValue, + iv: data.iv, + tag: data.tag, + key, }); return res; } @@ -34,7 +37,7 @@ export const ShareSecretPublicPage = () => { }, [data, publicKey]); const [timeLeft, setTimeLeft] = useState(""); - const [isUrlCopied,, setIsUrlCopied] = useTimedReset({ + const [isUrlCopied, , setIsUrlCopied] = useTimedReset({ initialState: false, }); @@ -44,11 +47,11 @@ export const ShareSecretPublicPage = () => { useEffect(() => { const updateTimer = () => { - if (data && data.expiresAt) { + if (data && data.expiresAt) { const expirationTime = new Date(data.expiresAt).getTime(); const currentTime = new Date().getTime(); const timeDifference = expirationTime - currentTime; - + if (timeDifference < 0) { setTimeLeft("Expired"); } else { @@ -59,7 +62,7 @@ export const ShareSecretPublicPage = () => { } } }; - + const timer = setInterval(updateTimer, 1000); return () => clearInterval(timer); }, [data?.expiresAt]); From 1068e6024d12b989d79600ac10c1d7d03e73a75b Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Wed, 29 May 2024 14:20:40 +0530 Subject: [PATCH 090/101] fix: page title --- .../ShareSecretPage/components/ShareSecretSection.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx index 4ccf4e6fa..aecafe5c2 100644 --- a/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretSection.tsx @@ -1,3 +1,4 @@ +import Head from "next/head"; import { faPlus } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; @@ -39,7 +40,13 @@ export const ShareSecretSection = () => { }; return ( +
+ + Secret Sharing + + +

Shared Secrets

From 686a28cc0992d56e08475f6f7092e0d9a35fd8e9 Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Wed, 29 May 2024 18:05:51 +0530 Subject: [PATCH 091/101] fix: remove ghost users being added as seats in stripe --- backend/src/ee/services/license/license-dal.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/src/ee/services/license/license-dal.ts b/backend/src/ee/services/license/license-dal.ts index 4e70dfb5a..cf7048801 100644 --- a/backend/src/ee/services/license/license-dal.ts +++ b/backend/src/ee/services/license/license-dal.ts @@ -16,6 +16,8 @@ export const licenseDALFactory = (db: TDbClient) => { void bd.where({ orgId }); } }) + .join(TableName.Users, `${TableName.OrgMembership}.userId`, `${TableName.Users}.id`) + .where(`${TableName.Users}.isGhost`, false) .count(); return doc?.[0].count; } catch (error) { From 8f778403b45427ff9f5900148928422484536861 Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Wed, 29 May 2024 18:15:22 +0530 Subject: [PATCH 092/101] cleanup: secret sharing perms --- frontend/src/context/ProjectPermissionContext/types.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/src/context/ProjectPermissionContext/types.ts b/frontend/src/context/ProjectPermissionContext/types.ts index bc383de26..79c8f2d30 100644 --- a/frontend/src/context/ProjectPermissionContext/types.ts +++ b/frontend/src/context/ProjectPermissionContext/types.ts @@ -24,7 +24,6 @@ export enum ProjectPermissionSub { SecretRollback = "secret-rollback", SecretApproval = "secret-approval", SecretRotation = "secret-rotation", - SecretSharing = "secret-sharing", Identity = "identity" } @@ -52,7 +51,6 @@ export type ProjectPermissionSet = | [ProjectPermissionActions, ProjectPermissionSub.ServiceTokens] | [ProjectPermissionActions, ProjectPermissionSub.SecretApproval] | [ProjectPermissionActions, ProjectPermissionSub.SecretRotation] - | [ProjectPermissionActions, ProjectPermissionSub.SecretSharing] | [ProjectPermissionActions.Delete, ProjectPermissionSub.Workspace] | [ProjectPermissionActions.Edit, ProjectPermissionSub.Workspace] | [ProjectPermissionActions.Read, ProjectPermissionSub.SecretRollback] From df38e79590826d2c1ddd61ffa962ee906524acb3 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Wed, 29 May 2024 21:11:03 +0800 Subject: [PATCH 093/101] fix: addressed type issue --- cli/packages/cmd/secrets.go | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/cli/packages/cmd/secrets.go b/cli/packages/cmd/secrets.go index 649d9fa3d..423fe1657 100644 --- a/cli/packages/cmd/secrets.go +++ b/cli/packages/cmd/secrets.go @@ -229,8 +229,16 @@ var secretsSetCmd = &cobra.Command{ secretsToModify := []api.Secret{} secretOperations := []SecretSetOperation{} - secretByKey := getSecretsByKeys(secrets) - personalSecretByKey := getPersonalSecretsByKeys(secrets) + sharedSecretMapByName := make(map[string]models.SingleEnvironmentVariable, len(secrets)) + personalSecretMapByName := make(map[string]models.SingleEnvironmentVariable, len(secrets)) + + for _, secret := range secrets { + if secret.Type == util.SECRET_TYPE_PERSONAL { + personalSecretMapByName[secret.Key] = secret + } else { + sharedSecretMapByName[secret.Key] = secret + } + } for _, arg := range args { splitKeyValueFromArg := strings.SplitN(arg, "=", 2) @@ -262,9 +270,9 @@ var secretsSetCmd = &cobra.Command{ var doesSecretExist bool if secretType == util.SECRET_TYPE_SHARED { - existingSecret, doesSecretExist = secretByKey[key] + existingSecret, doesSecretExist = sharedSecretMapByName[key] } else { - existingSecret, doesSecretExist = personalSecretByKey[key] + existingSecret, doesSecretExist = personalSecretMapByName[key] } if doesSecretExist { @@ -780,19 +788,6 @@ func getSecretsByKeys(secrets []models.SingleEnvironmentVariable) map[string]mod return secretMapByName } -func getPersonalSecretsByKeys(secrets []models.SingleEnvironmentVariable) map[string]models.SingleEnvironmentVariable { - secretMapByName := make(map[string]models.SingleEnvironmentVariable, len(secrets)) - - for _, secret := range secrets { - if secret.Type == util.SECRET_TYPE_PERSONAL { - secretMapByName[secret.Key] = secret - - } - } - - return secretMapByName -} - func init() { secretsGenerateExampleEnvCmd.Flags().String("token", "", "Fetch secrets using the Infisical Token") secretsGenerateExampleEnvCmd.Flags().String("projectId", "", "manually set the projectId to fetch folders from for machine identity") From 40e7ab33cb5a3e8a45b08aa2789303387495ff12 Mon Sep 17 00:00:00 2001 From: Akhil Mohan Date: Wed, 29 May 2024 13:35:32 +0000 Subject: [PATCH 094/101] fix: resolved lint issue --- backend/src/lib/api-docs/constants.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/src/lib/api-docs/constants.ts b/backend/src/lib/api-docs/constants.ts index d84f68d7f..30c6b0309 100644 --- a/backend/src/lib/api-docs/constants.ts +++ b/backend/src/lib/api-docs/constants.ts @@ -225,7 +225,8 @@ export const PROJECT_IDENTITIES = { roles: { description: "A list of role slugs to assign to the identity project membership.", role: "The role slug to assign to the newly created identity project membership.", - isTemporary: "Whether the assigned role is temporary. If isTemporary is set true, must provide temporaryMode, temporaryRange and temporaryAccessStartTime.", + isTemporary: + "Whether the assigned role is temporary. If isTemporary is set true, must provide temporaryMode, temporaryRange and temporaryAccessStartTime.", temporaryMode: "Type of temporary expiry.", temporaryRange: "Expiry time for temporary access. In relative mode it could be 1s,2m,3h", temporaryAccessStartTime: "Time to which the temporary access starts" @@ -242,7 +243,8 @@ export const PROJECT_IDENTITIES = { roles: { description: "A list of role slugs to assign to the newly created identity project membership.", role: "The role slug to assign to the newly created identity project membership.", - isTemporary: "Whether the assigned role is temporary. If isTemporary is set true, must provide temporaryMode, temporaryRange and temporaryAccessStartTime.", + isTemporary: + "Whether the assigned role is temporary. If isTemporary is set true, must provide temporaryMode, temporaryRange and temporaryAccessStartTime.", temporaryMode: "Type of temporary expiry.", temporaryRange: "Expiry time for temporary access. In relative mode it could be 1s,2m,3h", temporaryAccessStartTime: "Time to which the temporary access starts" From 71d4935c0fb263aba66285ef0989443f201d7503 Mon Sep 17 00:00:00 2001 From: Sheen Capadngan Date: Wed, 29 May 2024 23:50:36 +0800 Subject: [PATCH 095/101] feat: added support for configuring trust of custom SSL certs --- Dockerfile.standalone-infisical | 10 ++++++++++ standalone-entrypoint.sh | 2 ++ 2 files changed, 12 insertions(+) diff --git a/Dockerfile.standalone-infisical b/Dockerfile.standalone-infisical index 737067534..5c1f15ca3 100644 --- a/Dockerfile.standalone-infisical +++ b/Dockerfile.standalone-infisical @@ -55,6 +55,7 @@ VOLUME /app/.next/cache/images COPY --chown=non-root-user:nodejs --chmod=555 frontend/scripts ./scripts COPY --from=frontend-builder /app/public ./public RUN chown non-root-user:nodejs ./public/data + COPY --from=frontend-builder --chown=non-root-user:nodejs /app/.next/standalone ./ COPY --from=frontend-builder --chown=non-root-user:nodejs /app/.next/static ./.next/static @@ -93,9 +94,18 @@ RUN mkdir frontend-build # Production stage FROM base AS production +RUN apk add --upgrade --no-cache ca-certificates RUN addgroup --system --gid 1001 nodejs \ && adduser --system --uid 1001 non-root-user +# Give non-root-user permission to update SSL certs +RUN chown -R non-root-user /etc/ssl/certs +RUN chown non-root-user /etc/ssl/certs/ca-certificates.crt +RUN chmod -R u+rwx /etc/ssl/certs +RUN chmod u+rw /etc/ssl/certs/ca-certificates.crt +RUN chown non-root-user /usr/sbin/update-ca-certificates +RUN chmod u+rx /usr/sbin/update-ca-certificates + ## set pre baked keys ARG POSTHOG_API_KEY ENV NEXT_PUBLIC_POSTHOG_API_KEY=$POSTHOG_API_KEY \ diff --git a/standalone-entrypoint.sh b/standalone-entrypoint.sh index 3f88260e9..8fcdb26e7 100755 --- a/standalone-entrypoint.sh +++ b/standalone-entrypoint.sh @@ -1,5 +1,7 @@ #!/bin/sh +update-ca-certificates + cd frontend-build scripts/initialize-standalone-build.sh From 30039b97b56d0172e1dd3770f01c46620668a55f Mon Sep 17 00:00:00 2001 From: ShubhamPalriwala Date: Wed, 29 May 2024 23:01:23 +0530 Subject: [PATCH 096/101] fix: remove unnecessary useEffect --- .../components/ShareSecretsRow.tsx | 2 -- .../components/ShareSecretsTable.tsx | 15 +++------------ 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx index b0ba810f5..204aed59b 100644 --- a/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretsRow.tsx @@ -101,8 +101,6 @@ export const ShareSecretsRow = ({

{formatDate(row.expiresAt)}

- - handlePopUpOpen("deleteSharedSecretConfirmation", { diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx index 75fcd501f..166554c7d 100644 --- a/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx @@ -1,4 +1,3 @@ -import { useEffect, useState } from "react"; import { faKey } from "@fortawesome/free-solid-svg-icons"; import { @@ -12,7 +11,7 @@ import { THead, Tr } from "@app/components/v2"; -import { TSharedSecret, useGetSharedSecrets } from "@app/hooks/api/secretSharing"; +import { useGetSharedSecrets } from "@app/hooks/api/secretSharing"; import { UsePopUpState } from "@app/hooks/usePopUp"; import { ShareSecretsRow } from "./ShareSecretsRow"; @@ -31,19 +30,11 @@ type Props = { }; export const ShareSecretsTable = ({ handlePopUpOpen }: Props) => { - const [tableData, setTableData] = useState([]); const { isLoading, data = [] } = useGetSharedSecrets(); - useEffect(() => { - if (!isLoading) { - setTableData(data); - } - }, [isLoading, data]); - + let tableData = data.filter((secret) => !secret.expiresAt || new Date(secret.expiresAt) > new Date()) const handleSecretExpiration = () => { - setTableData( - data.filter((secret) => !secret.expiresAt || new Date(secret.expiresAt) > new Date()) - ); + tableData = data.filter((secret) => !secret.expiresAt || new Date(secret.expiresAt) > new Date()); }; return ( From 285c4a93c6e3bfd6ebce50773afb536cad3b4272 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 29 May 2024 20:34:08 +0000 Subject: [PATCH 097/101] update secret sharing time stamp --- .../20240529203152_secret_sharing.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 backend/src/db/migrations/20240529203152_secret_sharing.ts diff --git a/backend/src/db/migrations/20240529203152_secret_sharing.ts b/backend/src/db/migrations/20240529203152_secret_sharing.ts new file mode 100644 index 000000000..c1eab2ea6 --- /dev/null +++ b/backend/src/db/migrations/20240529203152_secret_sharing.ts @@ -0,0 +1,29 @@ +import { Knex } from "knex"; + +import { TableName } from "../schemas"; +import { createOnUpdateTrigger } from "../utils"; + +export async function up(knex: Knex): Promise { + if (!(await knex.schema.hasTable(TableName.SecretSharing))) { + await knex.schema.createTable(TableName.SecretSharing, (t) => { + t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid()); + t.string("name").notNullable(); + t.text("encryptedValue").notNullable(); + t.text("iv").notNullable(); + t.text("tag").notNullable(); + t.text("hashedHex").notNullable(); + t.timestamp("expiresAt").notNullable(); + t.uuid("userId").notNullable(); + t.uuid("orgId").notNullable(); + t.foreign("userId").references("id").inTable(TableName.Users).onDelete("CASCADE"); + t.foreign("orgId").references("id").inTable(TableName.Organization).onDelete("CASCADE"); + t.timestamps(true, true, true); + }); + + await createOnUpdateTrigger(knex, TableName.SecretSharing); + } +} + +export async function down(knex: Knex): Promise { + await knex.schema.dropTableIfExists(TableName.SecretSharing); +} From 1990ce8c7d31b26b8566b1fdbd89d045a4d794bb Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 29 May 2024 17:06:24 -0400 Subject: [PATCH 098/101] update secret sharing texts --- docs/documentation/platform/secret-sharing.mdx | 12 +++++++----- .../src/views/ShareSecretPage/ShareSecretPage.tsx | 2 +- .../components/AddShareSecretModal.tsx | 8 ++++---- .../components/ShareSecretSection.tsx | 6 ------ .../ShareSecretPage/components/ShareSecretsTable.tsx | 2 +- .../ShareSecretPublicPage/ShareSecretPublicPage.tsx | 8 +------- 6 files changed, 14 insertions(+), 24 deletions(-) diff --git a/docs/documentation/platform/secret-sharing.mdx b/docs/documentation/platform/secret-sharing.mdx index 1b26c0d8e..4e4761924 100644 --- a/docs/documentation/platform/secret-sharing.mdx +++ b/docs/documentation/platform/secret-sharing.mdx @@ -1,10 +1,12 @@ --- title: "Secret Sharing" sidebarTitle: "Secret Sharing" -description: "Learn how to share time-bound secrets securely with anybody on the internet." +description: "Learn how to share time-bound secrets securely with anyone on the internet." --- -Developers often need to share secrets with their team members, contractors, or other third parties. This can be a risky process, as secrets can be easily leaked or misused. Infisical provides a secure way to share secrets with anybody on the internet in a time-bound manner. +Developers frequently need to share secrets with team members, contractors, or other third parties, which can be risky due to potential leaks or misuse. +Infisical offers a secure solution for sharing secrets over the internet in a time-bound manner. +With its zero-knowledge architecture, secrets shared via Infisical remain unreadable even to Infisical itself. ## Share a Secret @@ -16,8 +18,8 @@ Developers often need to share secrets with their team members, contractors, or 3. Click on the **Share Secret** button. - Infisical does not store the secret you share. This is a part of our Zero - Knowledge Architecture. + Infisical does not have access to the shared secrets. This is a part of our zero + knowledge architecture. 4. Enter the secret you want to share and set the expiration time. Click on the **Share Secret** button. @@ -29,7 +31,7 @@ Developers often need to share secrets with their team members, contractors, or tampered with. -5. Copy the link and share it with the intended recipient. Anybody with the link can access the secret before its expiration time. Hence, it is recommended to share the link only with the intended recipient. +5. Copy the link and share it with the intended recipient. Anyone with the link can access the secret before its expiration time. Hence, it is recommended to share the link only with the intended recipient. ![Copy URL](../../images/platform/secret-sharing/copy-url.png) diff --git a/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx b/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx index d6b2b71ac..c4869bded 100644 --- a/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx +++ b/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx @@ -10,7 +10,7 @@ export const ShareSecretPage = () => {

Secret Sharing

-

Share secrets with anybody securely and efficiently

+

Share secrets securely with your teammates using a shareable link

diff --git a/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx b/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx index 2bdbfaf99..00ee27b44 100644 --- a/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx +++ b/frontend/src/views/ShareSecretPage/components/AddShareSecretModal.tsx @@ -168,10 +168,10 @@ export const AddShareSecretModal = ({ popUp, handlePopUpToggle }: Props) => { setnewSharedSecret(""); }} > - + {!hasSharedSecret ? (
{ Share Secret
-
-

- Every secret shared can be accessed with the URL (shown during creation) before its - expiry. -

-
diff --git a/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx b/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx index 166554c7d..6b438f17a 100644 --- a/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx +++ b/frontend/src/views/ShareSecretPage/components/ShareSecretsTable.tsx @@ -61,7 +61,7 @@ export const ShareSecretsTable = ({ handlePopUpOpen }: Props) => { {!isLoading && tableData && tableData?.length === 0 && ( - + )} diff --git a/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx b/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx index e3d6fcabb..618859a80 100644 --- a/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx +++ b/frontend/src/views/ShareSecretPublicPage/ShareSecretPublicPage.tsx @@ -1,7 +1,6 @@ import { useEffect, useMemo, useState } from "react"; import Head from "next/head"; import Image from "next/image"; -import Link from "next/link"; import { useRouter } from "next/router"; import { decryptSymmetric } from "@app/components/utilities/cryptography/crypto"; @@ -90,7 +89,7 @@ export const ShareSecretPublicPage = () => { Infisical logo

- You’ve been shared a secret securely with Infisical. + A secret has been shared with you securely via Infisical

@@ -108,11 +107,6 @@ export const ShareSecretPublicPage = () => { copyUrlToClipboard={copyUrlToClipboard} />
- - - Check Infisical out now! - -
From bdff2cd33d5fed6d0334026c5044115cdadfc7d8 Mon Sep 17 00:00:00 2001 From: vmatsiiako <78047717+vmatsiiako@users.noreply.github.com> Date: Wed, 29 May 2024 14:13:38 -0700 Subject: [PATCH 099/101] Update secret-reference.mdx --- docs/documentation/platform/secret-reference.mdx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/documentation/platform/secret-reference.mdx b/docs/documentation/platform/secret-reference.mdx index ee9ea5a7d..119a8cefa 100644 --- a/docs/documentation/platform/secret-reference.mdx +++ b/docs/documentation/platform/secret-reference.mdx @@ -9,14 +9,6 @@ description: "Learn the fundamentals of secret referencing and importing in Infi Infisical's secret referencing functionality makes it possible to reference the value of a "base" secret when defining the value of another secret. This means that updating the value of a base secret propagates directly to other secrets whose values depend on the base secret. - - Currently, the secret referencing feature is only supported by the - [Infisical CLI](/cli/overview), [native integrations](/integrations/overview) and [Infisical Agent](/infisical-agent/overview). - - We intend to add support for it to the [Node SDK](https://infisical.com/docs/sdks/languages/node), - [Python SDK](https://infisical.com/docs/sdks/languages/python), and [Java SDK](https://infisical.com/docs/sdks/languages/java) this quarter. - - ![secret referencing](../../images/platform/secret-references-imports/secret-reference.png) Since secret referencing works by reconstructing values back on the client side, the client, be it a user, service token, or a machine identity, fetching back secrets From 73195b07a42f2eba4162cbe38523b46ea6ae9e16 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Wed, 29 May 2024 17:15:50 -0400 Subject: [PATCH 100/101] update secret share text --- frontend/src/views/ShareSecretPage/ShareSecretPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx b/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx index c4869bded..e1636446e 100644 --- a/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx +++ b/frontend/src/views/ShareSecretPage/ShareSecretPage.tsx @@ -10,7 +10,7 @@ export const ShareSecretPage = () => {

Secret Sharing

-

Share secrets securely with your teammates using a shareable link

+

Share secrets securely using a shareable link

From cd2b81cb9f1a98fc057abcda915ab5d9d6a2c87b Mon Sep 17 00:00:00 2001 From: vmatsiiako <78047717+vmatsiiako@users.noreply.github.com> Date: Wed, 29 May 2024 16:14:45 -0700 Subject: [PATCH 101/101] Update navbar --- docs/mint.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/mint.json b/docs/mint.json index 96637bfb3..5c5097d42 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -124,7 +124,9 @@ "documentation/platform/access-controls/temporary-access", "documentation/platform/access-controls/access-requests", "documentation/platform/pr-workflows", - "documentation/platform/audit-logs" + "documentation/platform/audit-logs", + "documentation/platform/audit-log-streams", + "documentation/platform/groups" ] }, { @@ -137,7 +139,6 @@ "documentation/platform/secret-rotation/aws-iam" ] }, - "documentation/platform/secret-sharing", { "group": "Dynamic Secrets", "pages": [ @@ -149,8 +150,7 @@ "documentation/platform/dynamic-secrets/aws-iam" ] }, - "documentation/platform/groups", - "documentation/platform/audit-log-streams" + "documentation/platform/secret-sharing" ] }, {