UNPKG

@rnaga/wp-node

Version:

👉 **[View Full Documentation at rnaga.github.io/wp-node →](https://rnaga.github.io/wp-node/)**

306 lines (305 loc) • 11.8 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SignupTrx = void 0; const crypto = __importStar(require("crypto")); const common_1 = require("../common"); const components_1 = require("../core/components"); const current_1 = require("../core/current"); const logger_1 = require("../core/logger"); const query_util_1 = require("../core/utils/query.util"); const validator_1 = require("../core/validator"); const database_1 = __importDefault(require("../database")); const component_1 = require("../decorators/component"); const val = __importStar(require("../validators")); const blog_trx_1 = require("./blog.trx"); const meta_trx_1 = require("./meta.trx"); const trx_1 = require("./trx"); const user_trx_1 = require("./user.trx"); let SignupTrx = class SignupTrx extends trx_1.Trx { database; logger; components; blogTrx; userTrx; validator; constructor(database, logger, components, blogTrx, userTrx, validator) { super(components); this.database = database; this.logger = logger; this.components = components; this.blogTrx = blogTrx; this.userTrx = userTrx; this.validator = validator; } generateKey(value) { const currentTime = Math.floor(Date.now() / 1000); // Get current time in seconds const randomValue = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); // Generate a random number const inputString = currentTime.toString() + randomValue.toString() + value; // Calculate the MD5 hash const md5Hash = crypto .createHash("md5") .update(inputString) .digest("hex"); // Take the first 16 characters of the MD5 hash as the key const key = md5Hash.substring(0, 16); return key; } async changeUserSignupEligibility(enable) { const metaTrx = this.components.get(meta_trx_1.MetaTrx); const current = this.components.get(current_1.Current); return await metaTrx.upsert("site", current.siteId, "registration", enable ? "user" : "none"); } // wpmu_signup_blog // wpmu_signup_user async insert(input) { let data; if (input.type == "user") { data = { domain: "", path: "", title: "", user_login: common_1.formatting.username(input.user), user_email: input.user_email, registered: common_1.formatting.dateMySQL(), activation_key: this.generateKey(input.user_email), meta: input.meta ? (0, common_1.phpSerialize)(input.meta) : "", }; } else { data = { domain: input.domain, path: input.path, title: input.title, user_login: common_1.formatting.username(input.user), user_email: input.user_email, registered: common_1.formatting.dateMySQL(), activation_key: this.generateKey(input.domain), meta: input.meta ? (0, common_1.phpSerialize)(input.meta) : "", }; } let dataInsert = {}; try { dataInsert = this.validator.execAny(val.trx.signupInsert, data); } catch (e) { this.logger.warn(`parse error: ${e}`, { data }); throw e; } if (!dataInsert) { throw new Error(`Invalid signup data - ${JSON.stringify(data)}`); } const trx = await this.database.transaction; let signupId = 0; try { await trx .insert(dataInsert) .into(this.tables.get("signups")) .then((v) => { signupId = v[0]; }); } catch (e) { await trx.rollback(); throw new Error(`Failed to insert signup - ${e}`); } await trx.commit(); return signupId; } // wpmu_activate_signup async activate(activationKey, options) { const queryUtil = this.components.get(query_util_1.QueryUtil); const current = this.components.get(current_1.Current); const { userRef } = options ?? {}; if (!current.site?.props.site.id) { throw new Error(`Current site not found`); } const siteId = current.site.props.site.id; const signups = await queryUtil.common("signups", (query) => { const { column } = query.alias; query.where("activation_key", activationKey); if (userRef) { query.andWhere((query) => { query.builder.where(column("signups", "user_login"), userRef); query.or.builder.where(column("signups", "user_email"), userRef); }); } }); if (!signups) { throw new Error("Invalid activation key."); } const signup = signups[0]; if (1 == signup.active) { throw new Error(signup.domain.length > 0 ? "The site is already active." : "The user is already active."); } const meta = signup.meta; const password = (0, common_1.generatePassword)(12, false); const existingUsers = await queryUtil.users((query) => { query.where("user_login", signup.user_login); }); let userId = 0; if (!existingUsers) { this.logger.info(`userLogin: ${signup.user_login}, ${common_1.formatting.username(signup.user_login)} `); userId = await this.userTrx.upsert({ user_login: common_1.formatting.username(signup.user_login), user_email: signup.user_email, user_pass: password, }, { attachRole: false, }); } else { userId = existingUsers[0].ID; } if (0 == userId) { throw new Error("Could not create user"); } const updateDatabase = async () => { const trx = await this.database.transaction; try { await trx .table(this.tables.get("signups")) .where("activation_key", activationKey) .update({ active: 1, activated: common_1.formatting.dateMySQL(), }); } catch (e) { await trx.rollback(); throw new Error(`Failed to activate - ${e}`); } await trx.commit(); }; if (0 >= signup.domain.length) { await updateDatabase(); if (existingUsers) { throw new Error("'That username is already activated.' "); } return { user_id: userId, password, meta, }; } const blogs = await queryUtil.blogs((query) => { query .where("domain", signup.domain) .where("path", signup.path) .where("site_id", siteId); }); let blogId = 0; if (!blogs) { blogId = await this.blogTrx.upsert({ user_id: userId, title: signup.title, domain: signup.domain, path: signup.path, site_id: siteId, blog_meta: signup.meta, }); } else { blogId = blogs[0].blog_id; } await updateDatabase(); return { blog_id: blogId, user_id: userId, password, title: signup.title, meta, }; } // Remove the old record // Part of wpmu_validate_user_signup async remove(userLoginOrEmail, options) { const { days = 0 } = options ?? {}; const queryUtil = this.components.get(query_util_1.QueryUtil); const signup = await queryUtil.common("signups", (query) => { query .where("user_email", userLoginOrEmail) .or.where("user_login", userLoginOrEmail) .builder.first(); }, val.database.wpSignups); if (!signup || !signup.registered) { return; } const registered = (typeof signup.registered == "string" ? new Date(signup.registered) : signup.registered)?.getTime(); // Throw error if email was recently registered if (new Date().getTime() - registered <= days * 24 * 60 * 60 * 1000) { throw new Error(`That email address has already been used.`); } const trx = await this.database.transaction; try { await trx .table(this.tables.get("signups")) .where("user_login", userLoginOrEmail) .orWhere("user_email", userLoginOrEmail) .del(); } catch (e) { await trx.rollback(); throw new Error(`Failed to activate - ${e}`); } await trx.commit(); } }; exports.SignupTrx = SignupTrx; exports.SignupTrx = SignupTrx = __decorate([ (0, component_1.transactions)(), __metadata("design:paramtypes", [database_1.default, logger_1.Logger, components_1.Components, blog_trx_1.BlogTrx, user_trx_1.UserTrx, validator_1.Validator]) ], SignupTrx);