diff --git a/.env.example b/.env.example index 5434e09a6c663550d900224de4d37d61fa66a33f..c3cd2caa3094daa00407959cfc222e7e39e601c5 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,7 @@ LEDGERS="BCOVRIN_TEST" IDUNION_KEY=#add if you are using IDUNION as a ledger +IDUNION_BASIC_USER=#add if you are using IDUNION as a ledger +IDUNION_BASIC_PASS=#add if you are using IDUNION as a ledger AGENT_PEER_URL="http://localhost:8001" AGENT_NAME=EXAMPTTLE_AGENT_45 diff --git a/compose/docker-compose.simple.yml b/compose/docker-compose.simple.yml index 30d614e481ab7e208ea86f184cf39f4fe029c862..5508f648a5d3d4fa4f0c5e372b7387fd57e73fae 100644 --- a/compose/docker-compose.simple.yml +++ b/compose/docker-compose.simple.yml @@ -1,6 +1,30 @@ version: '3.8' services: + + builder: + privileged: true + image: node:18.16.0-buster-slim + volumes: + - ./../yarn.lock:/app/yarn.lock + - ./../package.json:/app/package.json + - ./../apps:/app/apps + - ./../libs:/app/libs + - ./../nx.json:/app/nx.json + - ./../tsconfig.base.json:/app/tsconfig.base.json + - ./data/node_modules:/app/node_modules + - ./data/dist:/app/dist + working_dir: /app + command: + - sh + - -c + - | + whoami + apt update -y && apt install python3 git make build-essential -y + yarn install + yarn build:agent + exit 0 + pg_db: image: 'postgres:latest' ports: @@ -12,10 +36,13 @@ services: - ./data/db-simple/:/var/lib/postgresql/data/ agent-issuer-simple: + image: node:18.16.0 + volumes: + - ./data/node_modules:/app/node_modules + - ./data/dist/apps/agent:/app/ + working_dir: /app + command: node main.js container_name: agent-issuer-simple - build: - context: "../" - dockerfile: "./apps/agent/deployment/local/Dockerfile" env_file: - ./env/issuer.simple.env ports: @@ -24,12 +51,17 @@ services: depends_on: pg_db: condition: service_started + builder: + condition: service_completed_successfully agent-holder-simple: container_name: agent-holder-simple - build: - context: "../" - dockerfile: "./apps/agent/deployment/local/Dockerfile" + image: node:18.16.0 + volumes: + - ./data/node_modules:/app/node_modules + - ./data/dist/apps/agent:/app/ + working_dir: /app + command: node main.js env_file: - ./env/holder.simple.env ports: @@ -38,3 +70,6 @@ services: depends_on: pg_db: condition: service_started + builder: + condition: service_completed_successfully + diff --git a/compose/env/holder.simple.env b/compose/env/holder.simple.env index 8928d0564da69e5b9af00c27a7c8cd4e6f2f1086..6fb198c52bab9de6d815468f737c1e3c5abfdc5d 100644 --- a/compose/env/holder.simple.env +++ b/compose/env/holder.simple.env @@ -1,14 +1,18 @@ LEDGERS="BCOVRIN_TEST" + IDUNION_KEY= +IDUNION_BASIC_USER= +IDUNION_BASIC_PASS= -AGENT_PEER_URL="http://agent-holder:6001" -AGENT_NAME=DEV_SIMPLE_AGENT_HOLDER_OCM # this should be changed to company name -AGENT_KEY=DEV_SIMPLE_AGENT_HOLDER_OCM #example random string -AGENT_DID_SEED=200000000000000000000000TCuste21xh #did private key seed min lenght 32 +AGENT_PEER_URL=http://agent-holder-simple:6001 +AGENT_PEER_PORT=6001 +AGENT_NAME=DEV_SIMPLE_AGENT_HOLDER_OCM_3919 # this should be changed to company name +AGENT_KEY=DEV_SIMPLE_AGENT_HOLDER_OCM_3818 #example random string +AGENT_DID_SEED=jhPctchKaUfyZ1ioz6Fjypoasdhjahjsiscdkd23ozxflxkaKD0RR4TICwx AGENT_DB_HOST=pg_db:5432 AGENT_DB_USER=postgres AGENT_DB_PASS=postgres -AGENT_PORT=8081 +AGENT_PORT=8080 AGENT_CONSUMER_NAME=agent_1 AGENT_IS_REST=true AGENT_MAX_MESSAGES=10 diff --git a/compose/env/issuer.simple.env b/compose/env/issuer.simple.env index 465996055c663cc68da01f3dd997f54f61404aa9..86e1d2bfc69f5b3d6a3309f5adb9f7278ecb31ac 100644 --- a/compose/env/issuer.simple.env +++ b/compose/env/issuer.simple.env @@ -1,14 +1,18 @@ LEDGERS="BCOVRIN_TEST" -IDUNION_KEY= -AGENT_PEER_URL="http://agent-issuer:8001" -AGENT_NAME=DEV_SIMPLE_AGENT_ISSUER_OCM # this should be changed to company name -AGENT_KEY=DEV_SIMPLE_AGENT_ISSUER_OCM #example random string -AGENT_DID_SEED=200000000000000000000000TCuste21js #did private key seed min lenght 32 +IDUNION_KEY=6eb8859f-dd7f-445a-bc37-ba986145d3b6 +IDUNION_BASIC_USER=idunion4ssi +IDUNION_BASIC_PASS=7eDZ+LrUbV5bCRwe6Ki0Gw== + +AGENT_PEER_URL=http://agent-issuer-simple:8001 +AGENT_PEER_PORT=8001 +AGENT_NAME=DEV_SIMPLE_AGENT_ISSUER_OCM_45 # this should be changed to company name +AGENT_KEY=DEV_SIMPLE_AGENT_ISSUER_OCM_45 #example random string +AGENT_DID_SEED=Cd0VanW68R3HCaskjdakjsNpiuadscmsBBPP3DV6pMdwDFdHvPasdasdas AGENT_DB_HOST=pg_db:5432 AGENT_DB_USER=postgres AGENT_DB_PASS=postgres -AGENT_PORT=8081 +AGENT_PORT=8080 AGENT_CONSUMER_NAME=agent_1 AGENT_IS_REST=true AGENT_MAX_MESSAGES=10 diff --git a/libs/askar/src/agent.utils.ts b/libs/askar/src/agent.utils.ts index 3eae5e959a039310952d4bdaadd5e631d6e54827..30de9c76e6f7304812caf2060d5e391e770dc9ad 100644 --- a/libs/askar/src/agent.utils.ts +++ b/libs/askar/src/agent.utils.ts @@ -3,11 +3,17 @@ import { AutoAcceptCredential, AutoAcceptProof, ConnectionsModule, + ConnectionStateChangedEvent, CredentialsModule, + DidExchangeRole, DidsModule, Key, + KeyDidResolver, KeyType, + PeerDidResolver, ProofsModule, + ProofState, + ProofStateChangedEvent, TypedArrayEncoder, V2CredentialProtocol, V2ProofProtocol, @@ -17,6 +23,7 @@ import { import { AnonCredsCredentialFormatService, AnonCredsModule, + AnonCredsProof, AnonCredsProofFormatService, } from "@aries-framework/anoncreds"; import { @@ -31,6 +38,8 @@ import { indyVdr } from "@hyperledger/indy-vdr-nodejs"; import { AskarModule } from "@aries-framework/askar"; import { ariesAskar } from "@hyperledger/aries-askar-nodejs"; import { Key as C, KeyAlgs } from "@hyperledger/aries-askar-shared"; +import { IConfAgent } from "@ocm-engine/config"; +import axios from "axios"; export const importDidsToWallet = async ( agent: Agent, @@ -126,10 +135,140 @@ export const getAskarAnonCredsIndyModules = (networks: any) => { }), dids: new DidsModule({ registrars: [new IndyVdrIndyDidRegistrar()], - resolvers: [new IndyVdrIndyDidResolver()], + resolvers: [ + new IndyVdrIndyDidResolver(), + new KeyDidResolver(), + new PeerDidResolver(), + ], }), askar: new AskarModule({ ariesAskar, }), } as const; }; + +export const svdxProofStateChangeHandler = async ( + ev: ProofStateChangedEvent, + agent: Agent, + config?: IConfAgent, +) => { + if (ProofState.Done !== ev.payload.proofRecord.state) { + return; + } + + const presentationMessage = await agent.proofs.findPresentationMessage( + ev.payload.proofRecord.id, + ); + + console.log(JSON.stringify(presentationMessage, null, 2)); + if (!presentationMessage) { + console.log("No presentation message found"); + return; + } + + const attachmentId = presentationMessage.formats[0].attachmentId; + + const attachment = + presentationMessage.getPresentationAttachmentById(attachmentId); + + console.log(JSON.stringify(attachment, null, 2)); + if (!attachment) { + console.log("No attachment found"); + return; + } + + const email = + attachment.getDataAsJson<AnonCredsProof>()?.requested_proof.revealed_attrs[ + "email" + ].raw; + + if (!config?.agentSVDXWebHook) { + console.log("Agent SVDX web hook not set"); + return; + } + + try { + await axios.post( + config?.agentSVDXWebHook, + { + email, + connectionId: ev.payload.proofRecord.connectionId, + }, + { + auth: { + username: config?.agentSVDXBasicUser, + password: config?.agentSVDXBasicPass, + }, + }, + ); + } catch (e) { + console.log(JSON.stringify(e, null, 2)); + } +}; + +export const svdxConnectionStateChangeHandler = async ( + ev: ConnectionStateChangedEvent, + agent: Agent, + config?: IConfAgent, +) => { + if ( + ev.payload.connectionRecord.role === DidExchangeRole.Responder && + ev.payload.connectionRecord.state !== "completed" + ) { + return; + } + + await agent.connections.addConnectionType( + ev.payload.connectionRecord.id, + ev.payload.connectionRecord.theirLabel || "svdx", + ); + + console.log("connection accepted", JSON.stringify(ev, null, 2)); + + const connections = await agent.connections.findAllByConnectionTypes([ + ev.payload.connectionRecord.theirLabel || "svdx", + ]); + + if (connections.length < 2) { + return; + } + + connections.sort( + (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(), + ); + + while (connections.length > 1) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const con = connections.pop()!; + + console.log(`deleting ${con.id}`); + await agent.connections.deleteById(con.id); + } + + try { + await agent.proofs.requestProof({ + protocolVersion: "v2", + connectionId: connections[0].id, + proofFormats: { + anoncreds: { + name: "proof-request", + version: "1.0", + requested_attributes: { + email: { + name: "email", + restrictions: [ + { + schema_id: config?.agentSVDXSchemaId, + cred_def_id: config?.agentSVDXCredDefId, + }, + ], + }, + }, + }, + }, + }); + } catch (e) { + console.log(JSON.stringify(e, null, 2)); + console.log("failed to issue credential"); + } +}; diff --git a/libs/askar/src/askar-rest/askar.rest.module.ts b/libs/askar/src/askar-rest/askar.rest.module.ts index 7390822ad25c59d12e428ba08264ddc9bd9cee82..6aff9fe7d2977452b6a685ddcba21a21537042e1 100644 --- a/libs/askar/src/askar-rest/askar.rest.module.ts +++ b/libs/askar/src/askar-rest/askar.rest.module.ts @@ -1,12 +1,20 @@ -import { Module, ValidationPipe } from "@nestjs/common"; +import { + Module, + ValidationPipe, + MiddlewareConsumer, + RequestMethod, +} from "@nestjs/common"; import { AgentService } from "../askar/agent.service"; -import { ConfigModule } from "@nestjs/config"; +import { ConfigModule, ConfigService } from "@nestjs/config"; import { LedgersModule } from "@ocm-engine/ledgers"; import { APP_PIPE } from "@nestjs/core"; import { RestController } from "./rest.controller"; +import { PassportModule } from "@nestjs/passport"; +import { BasicAuthMiddleware } from "./auth/basic.middleware"; +import { IConfAgent } from "@ocm-engine/config"; @Module({ - imports: [ConfigModule, LedgersModule], + imports: [ConfigModule, LedgersModule, PassportModule], providers: [ AgentService, { @@ -18,4 +26,17 @@ import { RestController } from "./rest.controller"; ], controllers: [RestController], }) -export class AskarRestModule {} +export class AskarRestModule { + constructor(private readonly configService: ConfigService) {} + + configure(consumer: MiddlewareConsumer) { + const config: IConfAgent | undefined = + this.configService.get<IConfAgent>("agent"); + + if (config?.agentIsSVDX) { + consumer + .apply(BasicAuthMiddleware) + .forRoutes({ path: "*messages", method: RequestMethod.ALL }); + } + } +} diff --git a/libs/askar/src/askar-rest/auth/basic.guard.ts b/libs/askar/src/askar-rest/auth/basic.guard.ts new file mode 100644 index 0000000000000000000000000000000000000000..354ea9ed785a36ed534e5536493034a23a7099f0 --- /dev/null +++ b/libs/askar/src/askar-rest/auth/basic.guard.ts @@ -0,0 +1,9 @@ +import { Injectable } from "@nestjs/common"; +import { AuthGuard } from "@nestjs/passport"; + +/** + * Basic guard is NOT currently used, it is left for the time when we implement jwt auth for the rest of the routes + */ + +@Injectable() +export class BasicGuard extends AuthGuard("basic") {} diff --git a/libs/askar/src/askar-rest/auth/basic.middleware.ts b/libs/askar/src/askar-rest/auth/basic.middleware.ts new file mode 100644 index 0000000000000000000000000000000000000000..25099e3a334f4c8448379ac88ed7673d3a1cb158 --- /dev/null +++ b/libs/askar/src/askar-rest/auth/basic.middleware.ts @@ -0,0 +1,48 @@ +import { + Injectable, + Logger, + NestMiddleware, + UnauthorizedException, +} from "@nestjs/common"; +import { Request, Response, NextFunction } from "express"; +import { ConfigService } from "@nestjs/config"; +import { IConfAgent } from "@ocm-engine/config"; + +@Injectable() +export class BasicAuthMiddleware implements NestMiddleware { + private readonly logger: Logger = new Logger(BasicAuthMiddleware.name); + + constructor(private readonly configService: ConfigService) {} + + use(req: Request, res: Response, next: NextFunction) { + const config: IConfAgent | undefined = + this.configService.get<IConfAgent>("agent"); + + if (!config?.agentIsSVDX) { + this.logger.log("Agent is REST only turning of basic auth"); + + return next(); + } + + this.logger.log("Agent is SVDX turning basic auth middleware on"); + + const authHeader = req.headers["authorization"]; + + if (!authHeader) { + return next(new UnauthorizedException()); + } + + const [username, password] = Buffer.from(authHeader.split(" ")[1], "base64") + .toString() + .split(":"); + + if ( + username === config.agentSVDXBasicUser && + password === config.agentSVDXBasicPass + ) { + return next(); + } + + return next(new UnauthorizedException()); + } +} diff --git a/libs/askar/src/askar-rest/auth/basic.strategy.ts b/libs/askar/src/askar-rest/auth/basic.strategy.ts new file mode 100644 index 0000000000000000000000000000000000000000..f454f0af8b0af6da4e6f71d3b7cb3319b22e4b1b --- /dev/null +++ b/libs/askar/src/askar-rest/auth/basic.strategy.ts @@ -0,0 +1,30 @@ +import { ConfigService } from "@nestjs/config"; +import { IConfAgent } from "@ocm-engine/config"; +import { BasicStrategy as Strategy } from "passport-http"; +import { PassportStrategy } from "@nestjs/passport"; +import { Injectable, UnauthorizedException } from "@nestjs/common"; + +/** + * Basic strategy is NOT currently used, it is left for the time when we implement jwt auth for the rest of the routes + */ +@Injectable() +export class BasicStrategy extends PassportStrategy(Strategy, "basic") { + constructor(private readonly configService: ConfigService) { + super(); + } + + async validate(username: string, password: string): Promise<boolean> { + console.log(username, password); + const config: IConfAgent | undefined = + this.configService.get<IConfAgent>("agent"); + + if ( + config?.agentSVDXBasicUser === username && + config?.agentSVDXBasicPass === password + ) { + return true; + } + + throw new UnauthorizedException(); + } +} diff --git a/libs/askar/src/askar-rest/rest.controller.ts b/libs/askar/src/askar-rest/rest.controller.ts index e0d3b06e1e4e5c302dc973c559b3fcbb6e1d99d7..53c82aa8e4766e73ed88f97bd58377d6f4800d24 100644 --- a/libs/askar/src/askar-rest/rest.controller.ts +++ b/libs/askar/src/askar-rest/rest.controller.ts @@ -1,4 +1,5 @@ import { Body, Controller, Get, Param, Post, UseFilters } from "@nestjs/common"; + import { AgentService } from "../askar/agent.service"; import { CreateCredentialDefinitionRequsetDto, @@ -87,7 +88,7 @@ export class RestController { } @Post("/messages") - sendMeesage(@Body() message: MakeBasicMessageRequestDto) { + async sendMeesage(@Body() message: MakeBasicMessageRequestDto) { return this.agentService.sendMessage(message); } } diff --git a/libs/askar/src/askar/agent.event.listener.servce.ts b/libs/askar/src/askar/agent.event.listener.servce.ts index 03eaf71d0507327cd89e83b680ae4cdfbcf21cf5..08c4fec6be11ee782da60f2ba85f6e9dea9a0666 100644 --- a/libs/askar/src/askar/agent.event.listener.servce.ts +++ b/libs/askar/src/askar/agent.event.listener.servce.ts @@ -5,6 +5,10 @@ import { BasicMessageEventTypes, BasicMessageRole, BasicMessageStateChangedEvent, + ConnectionEventTypes, + ConnectionStateChangedEvent, + ProofEventTypes, + ProofStateChangedEvent, } from "@aries-framework/core"; import { MakeBasicMessageResponseDto, @@ -13,10 +17,14 @@ import { } from "@ocm-engine/dtos"; import { IConfAgent } from "@ocm-engine/config"; import { ConfigService } from "@nestjs/config"; +import { + svdxConnectionStateChangeHandler, + svdxProofStateChangeHandler, +} from "../agent.utils"; @Injectable() export class AgentEventListenerServce implements OnModuleInit { - private agentConfig: IConfAgent; + private agentConfig: IConfAgent | undefined; private readonly logger: Logger = new Logger(AgentEventListenerServce.name); constructor( @@ -27,8 +35,36 @@ export class AgentEventListenerServce implements OnModuleInit { onModuleInit(): void { this.logger.debug("Agent is listening for AFJ events"); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this.agentConfig = this.configService.get<IConfAgent>("agent")!; + this.agentConfig = this.configService.get<IConfAgent>("agent"); + + if (this.agentConfig?.agentIsSVDX && this.agentConfig?.agentIsRest) { + this.askar.agent.events.on( + ConnectionEventTypes.ConnectionStateChanged, + async (ev: ConnectionStateChangedEvent) => { + this.logger.log("connection state event received"); + this.logger.debug(JSON.stringify(ev, null, 2)); + return svdxConnectionStateChangeHandler( + ev, + this.askar.agent, + this.agentConfig, + ); + }, + ); + + this.askar.agent.events.on( + ProofEventTypes.ProofStateChanged, + async (ev: ProofStateChangedEvent) => { + this.logger.log("proof state event received"); + this.logger.debug(JSON.stringify(ev, null, 2)); + + return svdxProofStateChangeHandler( + ev, + this.askar.agent, + this.agentConfig, + ); + }, + ); + } this.askar.agent.events.on( BasicMessageEventTypes.BasicMessageStateChanged, @@ -46,7 +82,7 @@ export class AgentEventListenerServce implements OnModuleInit { dto.connectionId = ev.payload.basicMessageRecord.connectionId; dto.from = connectionInfo?.theirLabel; - if (this.agentConfig.agentIsRest) { + if (this.agentConfig?.agentIsRest) { this.logger.debug( "agent is configured as rest, webhook still not implemented", ); diff --git a/libs/config/src/config/agent.config.ts b/libs/config/src/config/agent.config.ts index 98e02af930dcaa8bec69d5b7c4b2b14486ca9094..c7fced916bc3e844873b808c453f09678b64f5ef 100644 --- a/libs/config/src/config/agent.config.ts +++ b/libs/config/src/config/agent.config.ts @@ -18,5 +18,11 @@ export const agentConfig = registerAs( agentConsumerMaxMessagess: parseInt(process.env["AGENT_MAX_MESSAGES"]!), agentConsumerRateLimit: parseInt(process.env["AGENT_RETE_LIMIT"]!), agentPort: parseInt(process.env["AGENT_PORT"]!), + agentIsSVDX: process.env["AGENT_IS_SVDX"] === "true", + agentSVDXSchemaId: process.env["AGENT_SVDX_SCHEMA_ID"]!, + agentSVDXCredDefId: process.env["AGENT_SVDX_CRED_DEF_ID"]!, + agentSVDXWebHook: process.env["AGENT_SVDX_WEBHOOK_URL"]!, + agentSVDXBasicUser: process.env["AGENT_SVDX_BASIC_USER"]!, + agentSVDXBasicPass: process.env["AGENT_SVDX_BASIC_PASS"]!, }), ); diff --git a/libs/config/src/interfaces/agent.config.interface.ts b/libs/config/src/interfaces/agent.config.interface.ts index 1f0e7a85caa94710dd23ede1d6ff0d5042870a86..317b645a88d15a6b1eac322618bb706fabc12565 100644 --- a/libs/config/src/interfaces/agent.config.interface.ts +++ b/libs/config/src/interfaces/agent.config.interface.ts @@ -12,4 +12,11 @@ export interface IConfAgent { agentConsumerMaxMessagess: number; agentConsumerRateLimit: number; agentPort: number; + + agentIsSVDX: boolean; + agentSVDXSchemaId: string; + agentSVDXCredDefId: string; + agentSVDXWebHook: string; + agentSVDXBasicUser: string; + agentSVDXBasicPass: string; } diff --git a/libs/config/src/schemas/agent.schema.ts b/libs/config/src/schemas/agent.schema.ts index 9cf569159b843b261c55387a444a11a52c39d2e6..46b36990cd6060f206dfcba92df03df3b4e6c8df 100644 --- a/libs/config/src/schemas/agent.schema.ts +++ b/libs/config/src/schemas/agent.schema.ts @@ -9,8 +9,12 @@ export const agentSchema = Joi.object({ AGENT_DB_USER: Joi.string().required(), AGENT_DB_PASS: Joi.string().required(), AGENT_CONSUMER_NAME: Joi.string(), - AGENT_IS_REST: Joi.string().required(), + AGENT_IS_REST: Joi.string().optional(), AGENT_MAX_MESSAGES: Joi.string().required(), AGENT_RETE_LIMIT: Joi.string().required(), AGENT_PORT: Joi.string().required(), + AGENT_IS_SVDX: Joi.string().optional(), + AGENT_SVDX_SCHEMA_ID: Joi.string().optional(), + AGENT_SVDX_CRED_DEF_ID: Joi.string().optional(), + AGENT_SVDX_WEBHOOK_URL: Joi.string().optional(), }); diff --git a/package.json b/package.json index 3443e6970e52e3487e33e157972825a37f297ccb..1e94baaca7f1934074d4d47753c7ec0922c192b2 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "@nestjs/config": "^2.3.1", "@nestjs/core": "^9.0.0", "@nestjs/microservices": "^9.4.2", + "@nestjs/passport": "^10.0.1", "@nestjs/platform-express": "^9.0.0", "@nestjs/platform-ws": "^10.1.3", "@nestjs/websockets": "^9.4.2", @@ -51,6 +52,9 @@ "cloudevents": "^7.0.0", "joi": "^17.9.2", "nats": "^2.14.0", + "passport": "^0.6.0", + "passport-http": "^0.3.0", + "passport-local": "^1.0.0", "reflect-metadata": "^0.1.13", "rxjs": "^7.0.0", "tslib": "^2.3.0", @@ -83,6 +87,8 @@ "@types/async-retry": "^1.4.5", "@types/jest": "^29.4.0", "@types/node": "~18.7.1", + "@types/passport-http": "^0.3.9", + "@types/passport-local": "^1.0.35", "@typescript-eslint/eslint-plugin": "^5.58.0", "@typescript-eslint/parser": "^5.58.0", "concurrently": "^8.2.0", diff --git a/yarn.lock b/yarn.lock index 9b857ac58a18edcb876f55ba20d6a865edc57975..2766f1095dc46380e23bf57b0170333df647dd1f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1676,6 +1676,11 @@ iterare "1.2.1" tslib "2.5.3" +"@nestjs/passport@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@nestjs/passport/-/passport-10.0.1.tgz#4a745cb4acf01ef8fd56b9ec1349ac74165b098f" + integrity sha512-hS22LeNj0LByS9toBPkpKyZhyKAXoHACLS1EQrjbAJJEQjhocOskVGwcMwvMlz+ohN+VU804/nMF1Zlya4+TiQ== + "@nestjs/platform-express@^9.0.0": version "9.4.3" resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-9.4.3.tgz#f61b75686bdfce566be3b54fa7bb20a4d87ed619" @@ -2899,6 +2904,38 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/passport-http@^0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@types/passport-http/-/passport-http-0.3.9.tgz#268e483ade820d4f0edb3d35cec090d1990cc081" + integrity sha512-uQ4vyRdvM0jdWuKpLmi6Q6ri9Nwt8YnHmF7kE6snbthxPrsMWcjRCVc5WcPaQ356ODSZTDgiRYURMPIspCkn3Q== + dependencies: + "@types/express" "*" + "@types/passport" "*" + +"@types/passport-local@^1.0.35": + version "1.0.35" + resolved "https://registry.yarnpkg.com/@types/passport-local/-/passport-local-1.0.35.tgz#233d370431b3f93bb43cf59154fb7519314156d9" + integrity sha512-K4eLTJ8R0yYW8TvCqkjB0pTKoqfUSdl5PfZdidTjV2ETV3604fQxtY6BHKjQWAx50WUS0lqzBvKv3LoI1ZBPeA== + dependencies: + "@types/express" "*" + "@types/passport" "*" + "@types/passport-strategy" "*" + +"@types/passport-strategy@*": + version "0.2.35" + resolved "https://registry.yarnpkg.com/@types/passport-strategy/-/passport-strategy-0.2.35.tgz#e52f5212279ea73f02d9b06af67efe9cefce2d0c" + integrity sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g== + dependencies: + "@types/express" "*" + "@types/passport" "*" + +"@types/passport@*": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.12.tgz#7dc8ab96a5e895ec13688d9e3a96920a7f42e73e" + integrity sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw== + dependencies: + "@types/express" "*" + "@types/qs@*": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" @@ -8901,6 +8938,34 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +passport-http@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/passport-http/-/passport-http-0.3.0.tgz#8ee53d4380be9c60df2151925029826f77115603" + integrity sha512-OwK9DkqGVlJfO8oD0Bz1VDIo+ijD3c1ZbGGozIZw+joIP0U60pXY7goB+8wiDWtNqHpkTaQiJ9Ux1jE3Ykmpuw== + dependencies: + passport-strategy "1.x.x" + +passport-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee" + integrity sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow== + dependencies: + passport-strategy "1.x.x" + +passport-strategy@1.x.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" + integrity sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA== + +passport@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/passport/-/passport-0.6.0.tgz#e869579fab465b5c0b291e841e6cc95c005fac9d" + integrity sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug== + dependencies: + passport-strategy "1.x.x" + pause "0.0.1" + utils-merge "^1.0.1" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -8966,6 +9031,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pause@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" + integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -11063,7 +11133,7 @@ util@^0.12.4: is-typed-array "^1.1.3" which-typed-array "^1.1.2" -utils-merge@1.0.1: +utils-merge@1.0.1, utils-merge@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==