UNPKG

tiny-essentials

Version:

Collection of small, essential scripts designed to be used across various projects. These simple utilities are crafted for speed, ease of use, and versatility.

131 lines (114 loc) 4.94 kB
'use strict'; var _ = require('lodash'); var objFilter = require('../../../../v1/basics/objFilter.cjs'); var _default = require('../../../crypto/default.cjs'); var HTTP1_0 = require('../../../http/HTTP-1.0.cjs'); var getDomainURL = require('../../../http/getDomainURL.cjs'); var authURLGenerator = require('../get/authURLGenerator.cjs'); // @ts-nocheck /** * Handles the login process by checking the configuration, generating authentication URLs, and redirecting the user to the appropriate destination. * Depending on the configuration type, it handles various authentication methods like login, login_command, and webhook. * * @function * @param {Record<string, any>} req - The request object, typically provided by the web framework (e.g., Express). * @param {Record<string, any>} res - The response object, typically provided by the web framework (e.g., Express). * @param {Record<string, any>} cfg - The configuration object that includes various settings for the login process. * @param {boolean} existSession - A flag indicating whether the user already has an active session. * * @returns {void} This function does not return anything. It sends a redirect response to the user based on the configuration. * * @throws {Error} If any validation or configuration fails, an error response will be sent. * * @example * // Example usage with Express: * app.get('/login', (req, res) => { * login(req, res, config, sessionExists); * }); */ function login(req, res, cfg, existSession) { // Send Error const sendError = function (data) { if (typeof cfg.errorCallback !== 'function') return HTTP1_0.send(res, data.code); else return cfg.errorCallback(data, req, res); }; // Detect Config if ( objFilter.objType(cfg, 'object') && typeof cfg.type === 'string' && (cfg.type === 'login' || cfg.type === 'login_command' || cfg.type === 'webhook') ) { // Create Settings const tinyCrypto = _.defaultsDeep({}, cfg.crypto, _default); // Detect Config if (objFilter.objType(tinyCrypto, 'object')) { // Create Settings const tinyCfg = _.defaultsDeep({}, cfg.auth, { redirect: 'http://localhost/redirect', discordScope: [], client_id: '', }); // Validate Config if (objFilter.objType(tinyCfg, 'object')) { // Default Values State let tinyState = _.defaultsDeep({}, cfg.state, { csrfToken: '', redirect: '', type: cfg.type, }); // Validate if (typeof tinyState.type !== 'string') tinyState.type = cfg.type; // Validate State if (objFilter.objType(tinyState, 'object')) { // Create Settings const tinyQuery = _.defaultsDeep({}, cfg.query, { redirect: 'redirect', }); // Exist Cfg if (objFilter.objType(tinyQuery, 'object')) { // Get Domain const tinyDomain = getDomainURL(req, cfg.port); // Redirect let returnRedirect = tinyDomain + '/'; if (objFilter.objType(req.query, 'object')) { if (typeof req.query[tinyQuery.redirect] === 'string') { req.query[tinyQuery.redirect] = req.query[tinyQuery.redirect].trim(); if (!req.query[tinyQuery.redirect].startsWith('http')) { if (req.query[tinyQuery.redirect].startsWith('/')) req.query[tinyQuery.redirect] = req.query[tinyQuery.redirect].substring(1); // Return Redirect tinyState.redirect = req.query[tinyQuery.redirect]; returnRedirect = req.query[tinyQuery.redirect]; // Fix Redirect returnRedirect = tinyDomain + '/' + returnRedirect; } else tinyState.redirect = ''; } else { tinyState.redirect = ''; delete req.query[tinyQuery.redirect]; } } else tinyState.redirect = ''; // Don't exist session if (!existSession || cfg.type === 'login_command' || cfg.type === 'webhook') { // Redirect Result const redirect_discord = authURLGenerator(tinyCfg, tinyState, tinyCrypto, cfg.type); return res.redirect(redirect_discord); } // Yes else return res.redirect(returnRedirect); } // Nope else return sendError({ code: 400, message: 'Invalide Request!' }); } // Error else return sendError({ code: 400, message: 'Invalide State Config!' }); } // Error else return sendError({ code: 500, message: 'Invalide System Config!' }); } // Nope else return sendError({ code: 500, message: 'Invalid Crypto Values!' }); } // Nope else return sendError({ code: 500, message: 'Invalid Config Values!' }); } module.exports = login;