UNPKG

@nocobase/plugin-verification

Version:

User identity verification management, including SMS, TOTP authenticator, with extensibility.

177 lines (175 loc) 7.07 kB
/** * This file is part of the NocoBase (R) project. * Copyright (c) 2020-2024 NocoBase Co., Ltd. * Authors: NocoBase Team. * * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. * For more information, please refer to: https://www.nocobase.com/agreement. */ var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var verifiers_exports = {}; __export(verifiers_exports, { default: () => verifiers_default }); module.exports = __toCommonJS(verifiers_exports); var import_package = __toESM(require("../../../package.json")); var import_lodash = __toESM(require("lodash")); var verifiers_default = { listTypes: async (ctx, next) => { const plugin = ctx.app.pm.get("verification"); ctx.body = plugin.verificationManager.listTypes(); await next(); }, listByScene: async (ctx, next) => { const { scene } = ctx.action.params || {}; const plugin = ctx.app.pm.get("verification"); const verificationTypes = plugin.verificationManager.getVerificationTypesByScene(scene); if (!verificationTypes.length) { ctx.body = { verifiers: [], availableTypes: [] }; return next(); } const verifiers = await ctx.db.getRepository("verifiers").find({ filter: { verificationType: verificationTypes.map((item) => item.type) } }); ctx.body = { verifiers: (verifiers || []).map((item) => ({ name: item.name, title: item.title })), availableTypes: verificationTypes.map((item) => ({ name: item.type, title: item.title })) }; await next(); }, listByUser: async (ctx, next) => { const plugin = ctx.app.pm.get("verification"); const verificationTypes = plugin.verificationManager.verificationTypes; const bindingRequiredTypes = Array.from(verificationTypes.getEntities()).filter(([, options]) => options.bindingRequired).map(([type]) => type); const verifiers = await ctx.db.getRepository("verifiers").find({ filter: { verificationType: bindingRequiredTypes } }); const result = []; for (const verifier of verifiers) { try { const verificationType = plugin.verificationManager.verificationTypes.get(verifier.verificationType); const Verification = plugin.verificationManager.getVerification(verifier.verificationType); const verification = new Verification({ ctx, verifier, options: verifier.options }); const boundInfo = await verification.getPublicBoundInfo(ctx.auth.user.id); result.push({ ...import_lodash.default.omit(verifier.dataValues, "options"), title: verifier.title || verificationType.title, description: verifier.description || verificationType.description, boundInfo }); } catch (error) { ctx.log.error(error); } } ctx.body = result; await next(); }, listForVerify: async (ctx, next) => { const { scene } = ctx.action.params || {}; const plugin = ctx.app.pm.get("verification"); const verificationTypes = plugin.verificationManager.getVerificationTypesByScene(scene); if (!verificationTypes.length) { ctx.body = []; return next(); } const verifiers = await ctx.db.getRepository("verifiers").find({ filter: { verificationType: verificationTypes.map((item) => item.type) } }); if (!verifiers.length) { ctx.body = []; return next(); } const result = []; for (const verifier of verifiers) { const verificationType = plugin.verificationManager.verificationTypes.get(verifier.verificationType); const Verification = plugin.verificationManager.getVerification(verifier.verificationType); const verification = new Verification({ ctx, verifier, options: verifier.options }); const publicBoundInfo = await verification.getPublicBoundInfo(ctx.auth.user.id); if (!(publicBoundInfo == null ? void 0 : publicBoundInfo.bound)) { continue; } result.push({ name: verifier.name, title: verifier.title, verificationType: verifier.verificationType, verificationTypeTitle: verificationType == null ? void 0 : verificationType.title, boundInfo: publicBoundInfo }); } ctx.body = result; await next(); }, bind: async (ctx, next) => { const { verifier: name } = ctx.action.params.values || {}; const user = ctx.auth.user; const verificationPlugin = ctx.app.pm.get("verification"); const record = await verificationPlugin.verificationManager.getBoundRecord(user.id, name); if (record) { return ctx.throw(400, ctx.t("You have already bound this verifier", { ns: import_package.default.name })); } const verifier = await verificationPlugin.verificationManager.getVerifier(name); if (!verifier) { return ctx.throw(400, ctx.t("Invalid verifier")); } const Verification = verificationPlugin.verificationManager.getVerification(verifier.verificationType); const verification = new Verification({ ctx, verifier, options: verifier.options }); const { uuid, meta } = await verification.bind(user.id); await verifier.addUser(user.id, { through: { uuid, meta } }); ctx.body = {}; await next(); }, unbind: async (ctx, next) => { const { unbindVerifier: name } = ctx.action.params.values || {}; const user = ctx.auth.user; const verificationPlugin = ctx.app.pm.get("verification"); const verifier = await verificationPlugin.verificationManager.getVerifier(name); if (!verifier) { return ctx.throw(400, ctx.t("Invalid verifier")); } await verifier.removeUser(user.id); await next(); } };