{"version":3,"file":"index-node.mjs","sources":["../src/createAuthController.ts","../src/createRoutes.ts","../src/utils/generators.ts","../src/services/authentification/AuthenticationService.ts","../src/services/user/UserAccountsService.ts","../src/utils/cookies.ts","../src/utils/createFindLoggedInUser.ts","../src/MongoUsersManager.ts","../src/services/user/UserAccountGoogleService.ts","../src/services/user/UserAccountSlackService.ts","../src/authSocketIO.ts","../src/authApolloContext.ts","../src/index.ts"],"sourcesContent":["import type { AlpRouteRef, Context } from \"alp-node\";\nimport type MongoUsersManager from \"./MongoUsersManager\";\nimport type {\n  AccessResponseHooks,\n  AuthenticationService,\n} from \"./services/authentification/AuthenticationService\";\nimport type {\n  AllowedMapParamsStrategy,\n  AllowedStrategyKeys,\n} from \"./services/authentification/types\";\nimport type { User, UserSanitized } from \"./types\";\n\nexport interface CreateAuthControllerParams<\n  StrategyKeys extends AllowedStrategyKeys,\n  U extends User = User,\n  USanitized extends UserSanitized = UserSanitized,\n> {\n  authenticationService: AuthenticationService<StrategyKeys, U, UserSanitized>;\n  homeRouterKey?: string;\n  usersManager: MongoUsersManager<U, USanitized>;\n  defaultStrategy?: StrategyKeys;\n  authHooks?: AuthHooks<StrategyKeys>;\n}\n\nexport interface AuthController {\n  login: AlpRouteRef;\n  addScope: AlpRouteRef;\n  response: AlpRouteRef;\n  logout: AlpRouteRef;\n}\n\ntype OptionalRecord<K extends keyof any, T> = Partial<Record<K, T>>;\n\nexport interface AuthHooks<StrategyKeys extends AllowedStrategyKeys>\n  extends AccessResponseHooks<StrategyKeys> {\n  paramsForLogin?: <StrategyKey extends StrategyKeys>(\n    strategy: StrategyKey,\n    ctx: Context,\n  ) =>\n    | OptionalRecord<AllowedMapParamsStrategy[StrategyKey], any>\n    | Promise<OptionalRecord<AllowedMapParamsStrategy[StrategyKey], any>>\n    | Promise<void>\n    // eslint-disable-next-line @typescript-eslint/no-invalid-void-type\n    | void;\n}\n\nexport function createAuthController<\n  StrategyKeys extends AllowedStrategyKeys,\n  U extends User = User,\n  USanitized extends UserSanitized = UserSanitized,\n>({\n  usersManager,\n  authenticationService,\n  homeRouterKey = \"/\",\n  defaultStrategy,\n  authHooks = {},\n}: CreateAuthControllerParams<StrategyKeys, U, USanitized>): AuthController {\n  return {\n    async login(ctx: Context): Promise<void> {\n      const strategy: StrategyKeys = (ctx.namedRouteParam(\"strategy\") ||\n        defaultStrategy) as StrategyKeys;\n      if (!strategy) throw new Error(\"Strategy missing\");\n      const params =\n        (authHooks.paramsForLogin &&\n          (await authHooks.paramsForLogin(strategy, ctx))) ||\n        {};\n      await authenticationService.redirectAuthUrl(ctx, strategy, {}, params);\n    },\n\n    /**\n     * Add scope in existing\n     * The user must already be connected\n     */\n    async addScope(ctx: Context): Promise<void> {\n      if (!ctx.state.loggedInUser) {\n        ctx.redirectTo(homeRouterKey);\n        return;\n      }\n\n      const strategy: StrategyKeys = (ctx.namedRouteParam(\"strategy\") ||\n        defaultStrategy) as StrategyKeys;\n      if (!strategy) throw new Error(\"Strategy missing\");\n      const scopeKey = ctx.namedRouteParam(\"scopeKey\");\n      if (!scopeKey) throw new Error(\"Scope missing\");\n      await authenticationService.redirectAuthUrl(ctx, strategy, { scopeKey });\n    },\n\n    async response(ctx: Context): Promise<void> {\n      const strategy: StrategyKeys = ctx.namedRouteParam(\n        \"strategy\",\n      ) as StrategyKeys;\n      ctx.assert(strategy);\n\n      const loggedInUser = await authenticationService.accessResponse(\n        ctx,\n        strategy,\n        !!ctx.state.loggedInUser,\n        {\n          afterLoginSuccess: authHooks.afterLoginSuccess,\n          afterScopeUpdate: authHooks.afterScopeUpdate,\n        },\n      );\n      const keyPath = usersManager.store.keyPath;\n      await ctx.setLoggedIn(loggedInUser[keyPath], loggedInUser);\n      ctx.redirectTo(homeRouterKey);\n    },\n\n    // eslint-disable-next-line @typescript-eslint/require-await -- keep async in case i later need await in this method\n    async logout(ctx: Context): Promise<void> {\n      ctx.logout();\n      ctx.redirectTo(homeRouterKey);\n    },\n  };\n}\n","import type { AuthController } from \"./createAuthController\";\n\nexport interface AuthRoutes {\n  login: [string, (segment: any) => void];\n  addScope: [string, AuthController[\"addScope\"]];\n  logout: [string, AuthController[\"logout\"]];\n}\n\nexport const createRoutes = (controller: AuthController): AuthRoutes => ({\n  login: [\n    \"/login/:strategy?\",\n    (segment: any) => {\n      segment.add(\"/response\", controller.response, \"authResponse\");\n      segment.defaultRoute(controller.login, \"login\");\n    },\n  ],\n  addScope: [\"/add-scope/:strategy/:scopeKey\", controller.addScope],\n  logout: [\"/logout\", controller.logout],\n});\n","import { randomBytes } from \"node:crypto\";\nimport { promisify } from \"node:util\";\n\nconst randomBytesPromisified = promisify(randomBytes);\n\nexport async function randomBase64(size: number): Promise<string> {\n  const buffer = await randomBytesPromisified(size);\n  return buffer.toString(\"base64\");\n}\n\nexport async function randomHex(size: number): Promise<string> {\n  const buffer = await randomBytesPromisified(size);\n  return buffer.toString(\"hex\");\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable camelcase */\nimport { EventEmitter } from \"node:events\";\nimport type { Context, NodeConfig } from \"alp-node\";\nimport { Logger } from \"nightingale-logger\";\nimport type { Strategy as Oauth2Strategy } from \"../../../strategies/strategies.d\";\nimport type { Account, AccountId, User, UserSanitized } from \"../../types\";\nimport { randomHex } from \"../../utils/generators\";\nimport type UserAccountsService from \"../user/UserAccountsService\";\nimport type { AllowedStrategyKeys, Tokens } from \"./types\";\n\nconst logger = new Logger(\"alp:auth:authentication\");\n\nexport interface GenerateAuthUrlOptions {\n  accessType?: string;\n  grantType?: string;\n  includeGrantedScopes?: boolean;\n  loginHint?: string;\n  prompt?: string;\n  redirectUri?: string;\n  scope?: string;\n  state?: string;\n}\n\nexport interface GetTokensOptions {\n  code: string;\n  redirectUri: string;\n}\n\nexport type Strategies<StrategyKeys extends AllowedStrategyKeys> = Record<\n  StrategyKeys,\n  Oauth2Strategy<any>\n>;\n\nexport interface AccessResponseHooks<StrategyKeys, U extends User = User> {\n  afterLoginSuccess?: <StrategyKey extends StrategyKeys>(\n    strategy: StrategyKey,\n    loggedInUser: U,\n  ) => Promise<void> | void;\n\n  afterScopeUpdate?: <StrategyKey extends StrategyKeys>(\n    strategy: StrategyKey,\n    scopeKey: string,\n    account: Account,\n    user: U,\n  ) => Promise<void> | void;\n}\n\nexport class AuthenticationService<\n  StrategyKeys extends AllowedStrategyKeys,\n  U extends User = User,\n  USanitized extends UserSanitized = UserSanitized,\n  // eslint-disable-next-line unicorn/prefer-event-target\n> extends EventEmitter {\n  config: NodeConfig;\n\n  strategies: Strategies<StrategyKeys>;\n\n  userAccountsService: UserAccountsService<StrategyKeys, U, USanitized>;\n\n  constructor(\n    config: NodeConfig,\n    strategies: Strategies<StrategyKeys>,\n    userAccountsService: UserAccountsService<StrategyKeys, U, USanitized>,\n  ) {\n    super();\n    this.config = config;\n    this.strategies = strategies;\n    this.userAccountsService = userAccountsService;\n  }\n\n  generateAuthUrl<T extends StrategyKeys>(strategy: T, params: any): string {\n    logger.debug(\"generateAuthUrl\", { strategy, params });\n    const strategyInstance = this.strategies[strategy];\n    switch (strategyInstance.type) {\n      case \"oauth2\":\n        return strategyInstance.oauth2.authorizationCode.authorizeURL(params);\n      default:\n        throw new Error(\"Invalid strategy\");\n    }\n  }\n\n  async getTokens(\n    strategy: StrategyKeys,\n    options: GetTokensOptions,\n  ): Promise<Tokens> {\n    logger.debug(\"getTokens\", { strategy, options });\n    const strategyInstance = this.strategies[strategy];\n    switch (strategyInstance.type) {\n      case \"oauth2\": {\n        const result = await strategyInstance.oauth2.authorizationCode.getToken(\n          {\n            code: options.code,\n            redirect_uri: options.redirectUri,\n          },\n        );\n        if (!result) return result;\n        const tokens = result.token;\n\n        return {\n          accessToken: tokens.access_token as string,\n          refreshToken: tokens.refresh_token as string,\n          tokenType: tokens.token_type as string,\n          expiresIn: tokens.expires_in as number,\n          expireDate: (() => {\n            if (tokens.expires_in == null) return null;\n            const d = new Date();\n            d.setTime(d.getTime() + (tokens.expires_in as number) * 1000);\n            return d;\n          })(),\n          idToken: tokens.id_token as string,\n        };\n        // return strategyInstance.accessToken.create(result);\n      }\n\n      default:\n        throw new Error(\"Invalid stategy\");\n    }\n  }\n\n  async refreshToken(\n    strategy: StrategyKeys,\n    tokensParam: { refreshToken: string },\n  ): Promise<Tokens> {\n    logger.debug(\"refreshToken\", { strategy });\n    if (!tokensParam.refreshToken) {\n      throw new Error(\"Missing refresh token\");\n    }\n    const strategyInstance = this.strategies[strategy];\n    switch (strategyInstance.type) {\n      case \"oauth2\": {\n        const token = strategyInstance.oauth2.clientCredentials.createToken({\n          refresh_token: tokensParam.refreshToken,\n        });\n        const result = await token.refresh();\n        const tokens = result.token;\n        return {\n          accessToken: tokens.access_token as string,\n          tokenType: tokens.token_type as string,\n          expiresIn: tokens.expires_in as number,\n          expireDate: (() => {\n            if (tokens.expires_in == null) return null;\n            const d = new Date();\n            d.setTime(d.getTime() + (tokens.expires_in as number) * 1000);\n            return d;\n          })(),\n          idToken: tokens.id_token as string,\n        };\n      }\n\n      default:\n        throw new Error(\"Invalid stategy\");\n    }\n  }\n\n  redirectUri(ctx: Context, strategy: string): string {\n    const host = `http${this.config.get(\"allowHttps\") ? \"s\" : \"\"}://${\n      ctx.request.host\n    }`;\n    return `${host}${ctx.urlGenerator(\"authResponse\", {\n      strategy,\n    })}`;\n  }\n\n  async redirectAuthUrl(\n    ctx: Context,\n    strategy: StrategyKeys,\n    {\n      refreshToken,\n      scopeKey,\n      user,\n      accountId,\n    }: {\n      refreshToken?: string | undefined;\n      scopeKey?: string | undefined;\n      user?: U;\n      accountId?: AccountId;\n    },\n    params?: any,\n  ): Promise<void> {\n    logger.debug(\"redirectAuthUrl\", { strategy, scopeKey, refreshToken });\n    const state = await randomHex(8);\n    const isLoginAccess = !scopeKey || scopeKey === \"login\";\n    const scope = this.userAccountsService.getScope(\n      strategy,\n      scopeKey || \"login\",\n      user,\n      accountId,\n    );\n\n    if (!scope) {\n      throw new Error(\"Invalid empty scope\");\n    }\n\n    ctx.cookies.set(\n      `auth_${strategy}_${state}`,\n      JSON.stringify({\n        scopeKey,\n        scope,\n        isLoginAccess,\n      }),\n      {\n        maxAge: 10 * 60 * 1000,\n        httpOnly: true,\n        secure: this.config.get(\"allowHttps\"),\n      },\n    );\n    const redirectUri = this.generateAuthUrl(strategy, {\n      redirect_uri: this.redirectUri(ctx, strategy),\n      scope,\n      state,\n      access_type: refreshToken ? \"offline\" : \"online\",\n      ...params,\n    });\n\n    ctx.redirect(redirectUri);\n  }\n\n  async accessResponse<StrategyKey extends StrategyKeys>(\n    ctx: Context,\n    strategy: StrategyKey,\n    isLoggedIn: boolean,\n    hooks: AccessResponseHooks<StrategyKeys, U>,\n  ): Promise<U> {\n    const errorParam = ctx.params.queryParam(\"error\").notEmpty();\n    if (errorParam.isValid()) {\n      ctx.throw(403, errorParam.value);\n    }\n\n    const code = ctx.validParams.queryParam(\"code\").notEmpty().value;\n    const state = ctx.validParams.queryParam(\"state\").notEmpty().value;\n\n    const cookieName = `auth_${strategy}_${state}`;\n    const cookie = ctx.cookies.get(cookieName);\n    ctx.cookies.set(cookieName, \"\", { expires: new Date(1) });\n    if (!cookie) {\n      throw new Error(\"No cookie for this state\");\n    }\n\n    const parsedCookie = JSON.parse(cookie);\n    if (!parsedCookie?.scope) {\n      throw new Error(\"Unexpected cookie value\");\n    }\n\n    if (!parsedCookie.isLoginAccess) {\n      if (!isLoggedIn) {\n        throw new Error(\"You are not connected\");\n      }\n    }\n\n    const tokens: Tokens = await this.getTokens(strategy, {\n      code,\n      redirectUri: this.redirectUri(ctx, strategy),\n    });\n\n    if (parsedCookie.isLoginAccess) {\n      const user = await this.userAccountsService.findOrCreateFromStrategy(\n        strategy,\n        tokens,\n        parsedCookie.scope,\n        parsedCookie.scopeKey,\n      );\n\n      if (hooks.afterLoginSuccess) {\n        await hooks.afterLoginSuccess(strategy, user);\n      }\n\n      return user;\n    }\n\n    const loggedInUser = ctx.state.loggedInUser as U;\n    const { account, user } = await this.userAccountsService.update(\n      loggedInUser,\n      strategy,\n      tokens,\n      parsedCookie.scope,\n      parsedCookie.scopeKey,\n    );\n\n    if (hooks.afterScopeUpdate) {\n      await hooks.afterScopeUpdate(\n        strategy,\n        parsedCookie.scopeKey,\n        account,\n        user,\n      );\n    }\n\n    return loggedInUser;\n  }\n\n  refreshAccountTokens(user: U, account: Account): Promise<boolean> {\n    if (\n      account.tokenExpireDate &&\n      account.tokenExpireDate.getTime() > Date.now()\n    ) {\n      return Promise.resolve(false);\n    }\n    return this.refreshToken(account.provider as StrategyKeys, {\n      // accessToken: account.accessToken,\n      refreshToken: account.refreshToken!,\n    }).then((tokens: Tokens) => {\n      if (!tokens) {\n        // serviceGoogle.updateFields({ accessToken:null, refreshToken:null, status: .OUTDATED });\n        return false;\n      }\n      account.accessToken = tokens.accessToken;\n      account.tokenExpireDate = tokens.expireDate;\n      return this.userAccountsService\n        .updateAccount(user, account)\n        .then(() => true);\n    });\n  }\n}\n","import { EventEmitter } from \"node:events\";\nimport { Logger } from \"nightingale-logger\";\nimport type MongoUsersManager from \"../../MongoUsersManager\";\nimport type { Account, AccountId, User, UserSanitized } from \"../../types\";\nimport type { AllowedStrategyKeys } from \"../authentification/types\";\nimport type { AccountService, TokensObject } from \"./types\";\n\nconst logger = new Logger(\"alp:auth:userAccounts\");\n\nexport const STATUSES = {\n  VALIDATED: \"validated\",\n  DELETED: \"deleted\",\n};\n\nexport default class UserAccountsService<\n  StrategyKeys extends AllowedStrategyKeys,\n  U extends User = User,\n  USanitized extends UserSanitized = UserSanitized,\n  // eslint-disable-next-line unicorn/prefer-event-target\n> extends EventEmitter {\n  private readonly strategyToService: Record<StrategyKeys, AccountService<any>>;\n\n  usersManager: MongoUsersManager<U, USanitized>;\n\n  constructor(\n    usersManager: MongoUsersManager<U, USanitized>,\n    strategyToService: Record<StrategyKeys, AccountService<any>>,\n  ) {\n    super();\n    this.usersManager = usersManager;\n    this.strategyToService = strategyToService;\n  }\n\n  getScope(\n    strategy: StrategyKeys,\n    scopeKey: string,\n    user?: U,\n    accountId?: AccountId,\n  ): string {\n    logger.debug(\"getScope\", { strategy, userId: user?._id });\n    const service = this.strategyToService[strategy];\n    if (!service) {\n      throw new Error(\"Strategy not supported\");\n    }\n\n    const newScope = service.scopeKeyToScope[scopeKey]!;\n    if (!user || !accountId) {\n      return newScope;\n    }\n    const account = user.accounts.find(\n      (account) =>\n        account.provider === strategy && account.accountId === accountId,\n    );\n\n    if (!account) {\n      throw new Error(\"Could not found associated account\");\n    }\n    return service.getScope(account.scope, newScope).join(\" \");\n  }\n\n  async update(\n    user: U,\n    strategy: StrategyKeys,\n    tokens: TokensObject,\n    scope: string,\n    subservice: string,\n  ): Promise<{ user: U; account: U[\"accounts\"][number] }> {\n    const service = this.strategyToService[strategy];\n    const profile = await service.getProfile(tokens);\n    const accountId = service.getId(profile);\n    const account = user.accounts.find(\n      (account) =>\n        account.provider === strategy && account.accountId === accountId,\n    );\n    if (!account) {\n      // TODO check if already exists in other user => merge\n      // TODO else add a new account in this user\n      throw new Error(\"Could not found associated account\");\n    }\n    account.status = \"valid\";\n    account.accessToken = tokens.accessToken;\n    if (tokens.refreshToken) {\n      account.refreshToken = tokens.refreshToken;\n    }\n    if (tokens.expireDate !== undefined) {\n      account.tokenExpireDate = tokens.expireDate;\n    }\n    account.scope = service.getScope(account.scope, scope);\n    account.subservices = account.subservices || [];\n    if (subservice && !account.subservices.includes(subservice)) {\n      account.subservices.push(subservice);\n    }\n\n    await this.usersManager.replaceOne(user);\n    return { user, account };\n  }\n\n  async findOrCreateFromStrategy(\n    strategy: StrategyKeys,\n    tokens: TokensObject,\n    scope: string,\n    subservice: string,\n  ): Promise<U> {\n    const service = this.strategyToService[strategy];\n    if (!service) throw new Error(\"Strategy not supported\");\n\n    const profile = await service.getProfile(tokens);\n    const accountId = service.getId(profile);\n    if (!accountId) throw new Error(\"Invalid profile: no id found\");\n\n    const emails = service.getEmails(profile);\n\n    let user: Partial<U> | undefined =\n      await this.usersManager.findOneByAccountOrEmails({\n        provider: service.providerKey,\n        accountId,\n        emails,\n      });\n\n    logger.info(!user ? \"create user\" : \"existing user\", {\n      userId: user?._id,\n      accountId,\n      /*emails , user*/\n    });\n\n    if (!user) {\n      user = {};\n    }\n\n    Object.assign(user, {\n      displayName: service.getDisplayName(profile),\n      fullName: service.getFullName(profile),\n      status: STATUSES.VALIDATED,\n    });\n\n    if (!user.accounts) user.accounts = [];\n\n    let account: Partial<Account> | undefined = user.accounts.find(\n      (account: Account) =>\n        account.provider === strategy && account.accountId === accountId,\n    );\n\n    if (!account) {\n      account = { provider: strategy, accountId };\n      user.accounts.push(account as Account);\n    }\n\n    account.name = service.getAccountName(profile);\n    account.status = \"valid\";\n    account.profile = profile;\n    account.accessToken = tokens.accessToken;\n    if (tokens.refreshToken) {\n      account.refreshToken = tokens.refreshToken;\n    }\n    if (tokens.expireDate !== undefined) {\n      account.tokenExpireDate = tokens.expireDate;\n    }\n    account.scope = service.getScope(account.scope, scope);\n\n    if (!account.subservices) account.subservices = [];\n    if (subservice && !account.subservices.includes(subservice)) {\n      account.subservices.push(subservice);\n    }\n\n    if (!user.emails) user.emails = [];\n    const userEmails = user.emails;\n    emails.forEach((email: string) => {\n      if (!userEmails.includes(email)) {\n        userEmails.push(email);\n      }\n    });\n\n    user.emailDomains = [\n      // eslint-disable-next-line unicorn/no-array-reduce\n      ...user.emails.reduce(\n        (domains: Set<string>, email: string) =>\n          domains.add(email.split(\"@\", 2)[1]!),\n        new Set<string>(),\n      ),\n    ];\n\n    const keyPath = this.usersManager.store.keyPath;\n\n    if (user[keyPath]) {\n      await this.usersManager.replaceOne(user as U);\n    } else {\n      await this.usersManager.insertOne(user as U);\n    }\n\n    return user as U;\n  }\n\n  async updateAccount(user: U, account: Account): Promise<U> {\n    await this.usersManager.updateAccount(user, account);\n    return user;\n  }\n}\n","import type { IncomingMessage } from \"node:http\";\nimport type { Option } from \"cookies\";\nimport Cookies from \"cookies\";\n\nexport const COOKIE_NAME_TOKEN = \"loggedInUserToken\";\nexport const COOKIE_NAME_STATE = \"loggedInUserState\";\n\nexport const getTokenFromRequest = (\n  req: IncomingMessage,\n  options?: Pick<Option, Exclude<keyof Option, \"secure\">>,\n): string | undefined => {\n  if (req.headers.authorization?.startsWith(\"Bearer \")) {\n    return req.headers.authorization.slice(\"Bearer \".length);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n  const cookies = new Cookies(req, null as unknown as any, {\n    ...options,\n    secure: true,\n  });\n\n  return cookies.get(COOKIE_NAME_TOKEN);\n};\n","import { promisify } from \"node:util\";\nimport type {\n  GetPublicKeyOrSecret,\n  Secret,\n  VerifyCallback,\n  VerifyOptions,\n} from \"jsonwebtoken\";\nimport jsonwebtoken from \"jsonwebtoken\";\nimport type { Logger } from \"nightingale-logger\";\nimport type MongoUsersManager from \"../MongoUsersManager\";\nimport type { User, UserSanitized } from \"../types\";\n\ntype Verify = (\n  token: string,\n  secretOrPublicKey: GetPublicKeyOrSecret | Secret,\n  options?: VerifyOptions,\n  callback?: VerifyCallback,\n) => void;\n\nconst verifyPromisified = promisify<\n  Parameters<Verify>[0],\n  Parameters<Verify>[1],\n  Parameters<Verify>[2],\n  Parameters<VerifyCallback>[1]\n>(jsonwebtoken.verify as Verify);\n\nconst createDecodeJWT =\n  (secretKey: string) =>\n  async (token: string, jwtAudience: string): Promise<string | undefined> => {\n    const result = await verifyPromisified(token, secretKey, {\n      algorithms: [\"HS512\"],\n      audience: jwtAudience,\n    });\n    return (result as any)?.loggedInUserId as string | undefined;\n  };\n\nexport type FindLoggedInUser<U extends User> = (\n  jwtAudience?: string,\n  token?: string,\n) => Promise<[U[\"_id\"] | null | undefined, U | null | undefined]>;\n\nexport const createFindLoggedInUser = <\n  U extends User,\n  USanitized extends UserSanitized,\n>(\n  secretKey: string,\n  usersManager: MongoUsersManager<U, USanitized>,\n  logger: Logger,\n): FindLoggedInUser<U> => {\n  const decodeJwt = createDecodeJWT(secretKey);\n\n  const findLoggedInUser: FindLoggedInUser<U> = async (jwtAudience, token) => {\n    if (!token || !jwtAudience) return [null, null];\n\n    let loggedInUserId;\n    try {\n      loggedInUserId = await decodeJwt(token, jwtAudience);\n    } catch (error: unknown) {\n      logger.debug(\"failed to verify authentification\", { err: error });\n    }\n\n    if (loggedInUserId == null) return [null, null];\n\n    const loggedInUser = await usersManager.findById(loggedInUserId);\n\n    if (!loggedInUser) return [null, null];\n\n    return [loggedInUserId, loggedInUser];\n  };\n\n  return findLoggedInUser;\n};\n","import type { MongoInsertType, MongoStore, Update } from \"liwi-mongo\";\nimport type { Account, User, UserSanitized } from \"./types\";\n\nexport default class MongoUsersManager<\n  U extends User = User,\n  USanitized extends UserSanitized = UserSanitized,\n> {\n  store: MongoStore<U>;\n\n  constructor(store: MongoStore<U>) {\n    this.store = store;\n  }\n\n  /** @deprecated use findById instead */\n  findConnected(connected: string): Promise<U | undefined> {\n    return this.store.findByKey(connected);\n  }\n\n  findById(userId: string): Promise<U | undefined> {\n    return this.store.findByKey(userId);\n  }\n\n  insertOne(user: MongoInsertType<U>): Promise<any> {\n    return this.store.insertOne(user);\n  }\n\n  replaceOne(user: U): Promise<any> {\n    return this.store.replaceOne(user);\n  }\n\n  sanitize(user: U): USanitized {\n    return this.sanitizeBaseUser(user) as USanitized;\n  }\n\n  findOneByAccountOrEmails({\n    accountId,\n    emails,\n    provider,\n  }: {\n    accountId: number | string;\n    emails?: string[];\n    provider: string;\n  }): Promise<U | undefined> {\n    let query: any = {\n      \"accounts.provider\": provider,\n      \"accounts.accountId\": accountId,\n    };\n\n    if (emails && emails.length > 0) {\n      query = {\n        $or: [\n          query,\n          {\n            emails: { $in: emails },\n          },\n        ],\n      };\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n    return this.store.findOne(query);\n  }\n\n  updateAccount(user: U, account: Account): Promise<U> {\n    const accountIndex = user.accounts.indexOf(account);\n    if (accountIndex === -1) {\n      throw new Error(\"Invalid account\");\n    }\n\n    return this.store.partialUpdateOne(user, {\n      $set: {\n        [`accounts.${accountIndex}`]: account,\n      },\n    } as Update<U>);\n  }\n\n  sanitizeBaseUser(user: U): UserSanitized {\n    return {\n      _id: user._id,\n      created: user.created,\n      updated: user.updated,\n      displayName: user.displayName,\n      fullName: user.fullName,\n      status: user.status,\n      emails: user.emails,\n      emailDomains: user.emailDomains,\n      accounts: user.accounts.map((account: Account) => ({\n        provider: account.provider,\n        accountId: account.accountId,\n        name: account.name,\n        status: account.status,\n        profile: account.profile,\n      })),\n    };\n  }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nimport type { Tokens } from \"../authentification/types\";\nimport type { AccountService, FullName } from \"./types\";\n\nexport default class UserAccountGoogleService<ScopeKeys extends \"login\">\n  implements AccountService<ScopeKeys>\n{\n  scopeKeyToScope: Record<ScopeKeys, string>;\n\n  constructor(scopeKeyToScope: Record<Exclude<\"login\", ScopeKeys>, string>) {\n    this.scopeKeyToScope = {\n      ...scopeKeyToScope,\n      login: \"openid profile email\",\n    };\n  }\n\n  providerKey = \"google\";\n\n  getProfile(tokens: Tokens): Promise<any> {\n    return fetch(\n      `https://www.googleapis.com/oauth2/v1/userinfo?access_token=${tokens.accessToken}`,\n    ).then((response) => response.json());\n  }\n\n  getId(profile: any): any {\n    return profile.id;\n  }\n\n  getAccountName(profile: any): string | null | undefined {\n    return profile.email;\n  }\n\n  getEmails(profile: any): string[] {\n    const emails: string[] = [];\n\n    if (profile.email) {\n      emails.push(profile.email);\n    }\n\n    return emails;\n  }\n\n  getDisplayName(profile: any): string | null | undefined {\n    return profile.name;\n  }\n\n  getFullName(profile: any): FullName {\n    return {\n      givenName: profile.given_name,\n      familyName: profile.family_name,\n    };\n  }\n\n  getDefaultScope(newScope: string): string[] {\n    return this.getScope(undefined, newScope);\n  }\n\n  getScope(oldScope: string[] | undefined, newScope: string): string[] {\n    return !oldScope\n      ? newScope.split(\" \")\n      : [...oldScope, ...newScope.split(\" \")].filter(\n          (item, i, ar) => ar.indexOf(item) === i,\n        );\n  }\n}\n","/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\nimport type { Tokens } from \"../authentification/types\";\nimport type { AccountService, FullName } from \"./types\";\n\n// https://api.slack.com/methods/users.identity\n\nexport default class UserAccountSlackService<ScopeKeys extends \"login\">\n  implements AccountService<ScopeKeys>\n{\n  scopeKeyToScope: Record<ScopeKeys, string>;\n\n  constructor(scopeKeyToScope: Record<Exclude<\"login\", ScopeKeys>, string>) {\n    this.scopeKeyToScope = {\n      ...scopeKeyToScope,\n      login: \"identity.basic identity.email identity.avatar\",\n    };\n  }\n\n  providerKey = \"google\";\n\n  getProfile(tokens: Tokens): Promise<any> {\n    return fetch(\n      `https://slack.com/api/users.identity?token=${tokens.accessToken}`,\n    ).then((response) => response.json());\n  }\n\n  getId(profile: any): string | null {\n    if (!profile?.team?.id || !profile.user?.id) {\n      return null;\n    }\n    return `team:${profile.team.id as string};user:${\n      profile.user.id as string\n    }`;\n  }\n\n  getAccountName(profile: any): string | null | undefined {\n    return profile.user.email;\n  }\n\n  getEmails(profile: any): string[] {\n    return profile.user.email ? [profile.user.email] : [];\n  }\n\n  getDisplayName(profile: any): string | null | undefined {\n    return profile.user.name;\n  }\n\n  getFullName(profile: any): FullName | null {\n    return null;\n  }\n\n  getDefaultScope(newScope: string): string[] {\n    return this.getScope(undefined, newScope);\n  }\n\n  getScope(oldScope: string[] | undefined, newScope: string): string[] {\n    return !oldScope\n      ? newScope.split(\" \")\n      : [...oldScope, ...newScope.split(\" \")].filter(\n          (item, i, ar) => ar.indexOf(item) === i,\n        );\n  }\n}\n","import type { NodeApplication } from \"alp-node\";\nimport { Logger } from \"nightingale-logger\";\nimport type MongoUsersManager from \"./MongoUsersManager\";\nimport type { User } from \"./types\";\nimport { getTokenFromRequest } from \"./utils/cookies\";\nimport { createFindLoggedInUser } from \"./utils/createFindLoggedInUser\";\n\nconst logger = new Logger(\"alp:auth\");\n\nexport const authSocketIO = <U extends User = User>(\n  app: NodeApplication,\n  usersManager: MongoUsersManager<U>,\n  // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n  io: any,\n  jwtAudience?: string,\n): void => {\n  const findLoggedInUser = createFindLoggedInUser(\n    app.config.get<{ secretKey: string }>(\"authentication\").secretKey,\n    usersManager,\n    logger,\n  );\n\n  const users = new Map();\n  io.users = users;\n\n  io.use(async (socket: any, next: any) => {\n    const handshakeData = socket.request;\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n    const token = getTokenFromRequest(handshakeData);\n\n    if (!token) return next();\n\n    const [loggedInUserId, loggedInUser] = await findLoggedInUser(\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n      jwtAudience || handshakeData.headers[\"user-agent\"],\n      token,\n    );\n\n    if (!loggedInUserId || !loggedInUser) return next();\n\n    socket.user = loggedInUser;\n    users.set(socket.client.id, loggedInUser);\n\n    socket.on(\"disconnected\", () => users.delete(socket.client.id));\n\n    await next();\n  });\n};\n","import type { IncomingMessage } from \"node:http\";\nimport type { NodeConfig } from \"alp-node\";\nimport { Logger } from \"nightingale-logger\";\nimport type MongoUsersManager from \"./MongoUsersManager\";\nimport type { User } from \"./types\";\nimport { COOKIE_NAME_TOKEN, getTokenFromRequest } from \"./utils/cookies\";\nimport { createFindLoggedInUser } from \"./utils/createFindLoggedInUser\";\n\nconst logger = new Logger(\"alp:auth\");\n\nconst getTokenFromReq = (\n  req: IncomingMessage & { cookies?: Record<string, string> },\n): string | undefined => {\n  if (req.cookies) return req.cookies[COOKIE_NAME_TOKEN];\n  return getTokenFromRequest(req);\n};\n\n/*\n * Not tested yet.\n * @internal\n */\nexport const createAuthApolloContext = <U extends User = User>(\n  config: NodeConfig,\n  usersManager: MongoUsersManager<U>,\n): any => {\n  const findLoggedInUser = createFindLoggedInUser(\n    config.get<{ secretKey: string }>(\"authentication\").secretKey,\n    usersManager,\n    logger,\n  );\n\n  return async ({ req, connection }: { req: any; connection: any }) => {\n    if (connection?.loggedInUser) {\n      return { user: connection.loggedInUser };\n    }\n\n    if (!req) return null;\n\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n    const token = getTokenFromReq(req);\n\n    if (!token) return { user: undefined };\n\n    const [, loggedInUser] = await findLoggedInUser(\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n      req.headers[\"user-agent\"],\n      token,\n    );\n\n    return { user: loggedInUser };\n  };\n};\n","import type { IncomingMessage } from \"node:http\";\nimport { promisify } from \"node:util\";\nimport type { Context, ContextState, NodeApplication } from \"alp-node\";\nimport jsonwebtoken from \"jsonwebtoken\";\nimport { Logger } from \"nightingale-logger\";\nimport type MongoUsersManager from \"./MongoUsersManager\";\nimport type {\n  AuthController as AuthControllerType,\n  AuthHooks,\n} from \"./createAuthController\";\nimport { createAuthController } from \"./createAuthController\";\nimport type { AuthRoutes as AuthRoutesType } from \"./createRoutes\";\nimport { createRoutes } from \"./createRoutes\";\nimport type { Strategies } from \"./services/authentification/AuthenticationService\";\nimport { AuthenticationService } from \"./services/authentification/AuthenticationService\";\nimport type { AllowedStrategyKeys } from \"./services/authentification/types\";\nimport UserAccountsService from \"./services/user/UserAccountsService\";\nimport type { AccountService } from \"./services/user/types\";\nimport type { User, UserSanitized } from \"./types\";\nimport {\n  COOKIE_NAME_STATE,\n  COOKIE_NAME_TOKEN,\n  getTokenFromRequest,\n} from \"./utils/cookies\";\nimport { createFindLoggedInUser } from \"./utils/createFindLoggedInUser\";\n\nexport { default as MongoUsersManager } from \"./MongoUsersManager\";\nexport { default as UserAccountGoogleService } from \"./services/user/UserAccountGoogleService\";\nexport { default as UserAccountSlackService } from \"./services/user/UserAccountSlackService\";\nexport { authSocketIO } from \"./authSocketIO\";\nexport { createAuthApolloContext } from \"./authApolloContext\";\nexport { STATUSES } from \"./services/user/UserAccountsService\";\n\nexport type * from \"./types\";\n\ndeclare module \"alp-node\" {\n  interface ContextState {\n    loggedInUserId:\n      | NonNullable<ContextState[\"loggedInUser\"]>[\"_id\"]\n      | null\n      | undefined;\n    loggedInUser: User | null | undefined;\n  }\n\n  interface ContextSanitizedState {\n    loggedInUserId:\n      | NonNullable<ContextSanitizedState[\"loggedInUser\"]>[\"_id\"]\n      | null\n      | undefined;\n    loggedInUser: UserSanitized | null | undefined;\n  }\n\n  interface BaseContext {\n    setLoggedIn: (\n      loggedInUserId: NonNullable<ContextState[\"loggedInUserId\"]>,\n      loggedInUser: NonNullable<ContextState[\"loggedInUser\"]>,\n    ) => Promise<void>;\n    logout: () => void;\n  }\n}\n\nconst logger = new Logger(\"alp:auth\");\n\nconst signPromisified: any = promisify(jsonwebtoken.sign);\n\nexport type AuthController = AuthControllerType;\nexport type AuthRoutes = AuthRoutesType;\nexport { AuthenticationService } from \"./services/authentification/AuthenticationService\";\n\nexport default function init<\n  StrategyKeys extends AllowedStrategyKeys = \"google\",\n  U extends User = User,\n  USanitized extends UserSanitized = UserSanitized,\n>({\n  homeRouterKey,\n  usersManager,\n  strategies,\n  defaultStrategy,\n  strategyToService,\n  authHooks,\n  jwtAudience,\n}: {\n  homeRouterKey?: string;\n  usersManager: MongoUsersManager<U, USanitized>;\n  strategies: Strategies<StrategyKeys>;\n  defaultStrategy?: StrategyKeys;\n  strategyToService: Record<StrategyKeys, AccountService<any>>;\n  authHooks?: AuthHooks<StrategyKeys>;\n  jwtAudience?: string;\n}) {\n  // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n  return (app: NodeApplication) => {\n    const userAccountsService = new UserAccountsService(\n      usersManager,\n      strategyToService,\n    );\n\n    const authenticationService = new AuthenticationService(\n      app.config,\n      strategies,\n      userAccountsService,\n    );\n\n    const controller = createAuthController({\n      usersManager,\n      authenticationService,\n      homeRouterKey,\n      defaultStrategy,\n      authHooks,\n    });\n\n    app.context.setLoggedIn = async function setLoggedIn(\n      this: Context,\n      loggedInUserId: NonNullable<ContextState[\"loggedInUser\"]>[\"_id\"],\n      loggedInUser: NonNullable<ContextState[\"loggedInUser\"]>,\n    ): Promise<void> {\n      logger.debug(\"setLoggedIn\", { loggedInUser });\n      if (!loggedInUserId) {\n        throw new Error(\"Illegal value for setLoggedIn\");\n      }\n\n      this.state.loggedInUserId = loggedInUserId;\n      this.state.loggedInUser = loggedInUser;\n\n      const token = await signPromisified(\n        { loggedInUserId, time: Date.now() },\n        this.config\n          .get<Map<string, unknown>>(\"authentication\")\n          .get(\"secretKey\"),\n        {\n          algorithm: \"HS512\",\n          audience: jwtAudience || this.request.headers[\"user-agent\"],\n          expiresIn: \"30 days\",\n        },\n      );\n\n      const calcExpiresTime = (): number => {\n        const date = new Date();\n        date.setDate(date.getDate() + 30);\n        return date.getTime();\n      };\n\n      this.cookies.set(COOKIE_NAME_TOKEN, token, {\n        httpOnly: true,\n        secure: this.config.get(\"allowHttps\"),\n      });\n\n      this.cookies.set(\n        COOKIE_NAME_STATE,\n        JSON.stringify({ loggedInUserId, expiresIn: calcExpiresTime() }),\n        {\n          httpOnly: false,\n          secure: this.config.get(\"allowHttps\"),\n        },\n      );\n    };\n\n    app.context.logout = function logout(this: Context): void {\n      delete this.state.loggedInUserId;\n      delete this.state.loggedInUser;\n      this.cookies.set(COOKIE_NAME_TOKEN, \"\", { expires: new Date(1) });\n      this.cookies.set(COOKIE_NAME_STATE, \"\", { expires: new Date(1) });\n    };\n\n    const findLoggedInUser = createFindLoggedInUser(\n      app.config.get<{ secretKey: string }>(\"authentication\").secretKey,\n      usersManager,\n      logger,\n    );\n\n    return {\n      routes: createRoutes(controller),\n      findLoggedInUserFromRequest: (\n        req: IncomingMessage,\n      ): ReturnType<typeof findLoggedInUser> => {\n        const token = getTokenFromRequest(req);\n        return findLoggedInUser(\n          jwtAudience || req.headers[\"user-agent\"],\n          token,\n        );\n      },\n      findLoggedInUser,\n      middleware: async <T>(\n        ctx: Context,\n        next: () => Promise<T> | T,\n      ): Promise<T> => {\n        const token = ctx.cookies.get(COOKIE_NAME_TOKEN);\n        const userAgent = ctx.request.headers[\"user-agent\"];\n        logger.debug(\"middleware\", { token });\n\n        const setState = (\n          loggedInUserId: U[\"_id\"] | null | undefined,\n          loggedInUser: U | null | undefined,\n        ): void => {\n          ctx.state.loggedInUserId = loggedInUserId;\n          ctx.state.user = loggedInUser;\n          ctx.sanitizedState.loggedInUserId = loggedInUserId;\n          ctx.sanitizedState.loggedInUser =\n            loggedInUser && usersManager.sanitize(loggedInUser);\n        };\n\n        const [loggedInUserId, loggedInUser] = await findLoggedInUser(\n          jwtAudience || userAgent,\n          token,\n        );\n        logger.debug(\"middleware\", { loggedInUserId });\n\n        if (loggedInUserId == null || loggedInUser == null) {\n          if (token) {\n            ctx.cookies.set(COOKIE_NAME_TOKEN, \"\", { expires: new Date(1) });\n            ctx.cookies.set(COOKIE_NAME_STATE, \"\", { expires: new Date(1) });\n          }\n          setState(null, null);\n          return next();\n        }\n\n        setState(loggedInUserId, loggedInUser);\n        return next();\n      },\n    };\n  };\n}\n"],"names":["logger","user","account","loggedInUserId","loggedInUser"],"mappings":"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"}