tiny-essentials 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/FUNDING.yml +4 -0
- package/.github/workflows/node.js.yml +31 -0
- package/LICENSE +674 -0
- package/README.md +67 -0
- package/dist/TinyEssentials.min.js +1 -0
- package/dist/_virtual/_commonjsHelpers.cjs +7 -0
- package/dist/_virtual/common.cjs +5 -0
- package/dist/_virtual/index.cjs +9 -0
- package/dist/_virtual/index2.cjs +5 -0
- package/dist/_virtual/trace.cjs +5 -0
- package/dist/legacy/crypto/decrypt.cjs +57 -0
- package/dist/legacy/crypto/decrypt.d.mts +18 -0
- package/dist/legacy/crypto/decrypt.mjs +47 -0
- package/dist/legacy/crypto/default.cjs +23 -0
- package/dist/legacy/crypto/default.d.mts +35 -0
- package/dist/legacy/crypto/default.mjs +19 -0
- package/dist/legacy/crypto/encrypt.cjs +54 -0
- package/dist/legacy/crypto/encrypt.d.mts +19 -0
- package/dist/legacy/crypto/encrypt.mjs +46 -0
- package/dist/legacy/crypto/index.cjs +11 -0
- package/dist/legacy/crypto/index.d.mts +4 -0
- package/dist/legacy/crypto/index.mjs +6 -0
- package/dist/legacy/firebase/cookieSession.cjs +121 -0
- package/dist/legacy/firebase/cookieSession.d.mts +56 -0
- package/dist/legacy/firebase/cookieSession.mjs +114 -0
- package/dist/legacy/firebase/database/index.cjs +11 -0
- package/dist/legacy/firebase/database/index.d.mts +7 -0
- package/dist/legacy/firebase/database/index.mjs +7 -0
- package/dist/legacy/firebase/database/presence.cjs +131 -0
- package/dist/legacy/firebase/database/presence.d.mts +9 -0
- package/dist/legacy/firebase/database/presence.mjs +111 -0
- package/dist/legacy/firebase/database/saveAsync.cjs +147 -0
- package/dist/legacy/firebase/database/saveAsync.d.mts +54 -0
- package/dist/legacy/firebase/database/saveAsync.mjs +147 -0
- package/dist/legacy/firebase/databaseEscape.cjs +42 -0
- package/dist/legacy/firebase/databaseEscape.d.mts +11 -0
- package/dist/legacy/firebase/databaseEscape.mjs +37 -0
- package/dist/legacy/firebase/databaseLogger.cjs +258 -0
- package/dist/legacy/firebase/databaseLogger.d.mts +7 -0
- package/dist/legacy/firebase/databaseLogger.mjs +234 -0
- package/dist/legacy/firebase/discord/api/addGuildMember.cjs +71 -0
- package/dist/legacy/firebase/discord/api/addGuildMember.d.mts +38 -0
- package/dist/legacy/firebase/discord/api/addGuildMember.mjs +64 -0
- package/dist/legacy/firebase/discord/api/getGuildWidget.cjs +47 -0
- package/dist/legacy/firebase/discord/api/getGuildWidget.d.mts +17 -0
- package/dist/legacy/firebase/discord/api/getGuildWidget.mjs +43 -0
- package/dist/legacy/firebase/discord/api/getToken.cjs +67 -0
- package/dist/legacy/firebase/discord/api/getToken.d.mts +35 -0
- package/dist/legacy/firebase/discord/api/getToken.mjs +63 -0
- package/dist/legacy/firebase/discord/api/getUser.cjs +58 -0
- package/dist/legacy/firebase/discord/api/getUser.d.mts +27 -0
- package/dist/legacy/firebase/discord/api/getUser.mjs +54 -0
- package/dist/legacy/firebase/discord/api/getUserConnections.cjs +57 -0
- package/dist/legacy/firebase/discord/api/getUserConnections.d.mts +26 -0
- package/dist/legacy/firebase/discord/api/getUserConnections.mjs +53 -0
- package/dist/legacy/firebase/discord/api/getUserGuilds.cjs +56 -0
- package/dist/legacy/firebase/discord/api/getUserGuilds.d.mts +25 -0
- package/dist/legacy/firebase/discord/api/getUserGuilds.mjs +52 -0
- package/dist/legacy/firebase/discord/api/index.cjs +24 -0
- package/dist/legacy/firebase/discord/api/index.d.mts +19 -0
- package/dist/legacy/firebase/discord/api/index.mjs +20 -0
- package/dist/legacy/firebase/discord/api/refreshToken.cjs +77 -0
- package/dist/legacy/firebase/discord/api/refreshToken.d.mts +45 -0
- package/dist/legacy/firebase/discord/api/refreshToken.mjs +73 -0
- package/dist/legacy/firebase/discord/api/revokeToken.cjs +61 -0
- package/dist/legacy/firebase/discord/api/revokeToken.d.mts +29 -0
- package/dist/legacy/firebase/discord/api/revokeToken.mjs +58 -0
- package/dist/legacy/firebase/discord/config.cjs +21 -0
- package/dist/legacy/firebase/discord/config.d.mts +27 -0
- package/dist/legacy/firebase/discord/config.mjs +17 -0
- package/dist/legacy/firebase/discord/firebase_redirect/index.cjs +11 -0
- package/dist/legacy/firebase/discord/firebase_redirect/index.d.mts +7 -0
- package/dist/legacy/firebase/discord/firebase_redirect/index.mjs +7 -0
- package/dist/legacy/firebase/discord/firebase_redirect/login.cjs +110 -0
- package/dist/legacy/firebase/discord/firebase_redirect/login.d.mts +4 -0
- package/dist/legacy/firebase/discord/firebase_redirect/login.mjs +107 -0
- package/dist/legacy/firebase/discord/firebase_redirect/logout.cjs +100 -0
- package/dist/legacy/firebase/discord/firebase_redirect/logout.d.mts +4 -0
- package/dist/legacy/firebase/discord/firebase_redirect/logout.mjs +97 -0
- package/dist/legacy/firebase/discord/get/authURLGenerator.cjs +76 -0
- package/dist/legacy/firebase/discord/get/authURLGenerator.d.mts +23 -0
- package/dist/legacy/firebase/discord/get/authURLGenerator.mjs +67 -0
- package/dist/legacy/firebase/discord/get/cookie-session.cjs +32 -0
- package/dist/legacy/firebase/discord/get/cookie-session.d.mts +20 -0
- package/dist/legacy/firebase/discord/get/cookie-session.mjs +28 -0
- package/dist/legacy/firebase/discord/get/credentials.cjs +24 -0
- package/dist/legacy/firebase/discord/get/credentials.d.mts +19 -0
- package/dist/legacy/firebase/discord/get/credentials.mjs +20 -0
- package/dist/legacy/firebase/discord/get/errorValidator.cjs +60 -0
- package/dist/legacy/firebase/discord/get/errorValidator.d.mts +28 -0
- package/dist/legacy/firebase/discord/get/errorValidator.mjs +55 -0
- package/dist/legacy/firebase/discord/get/index.cjs +17 -0
- package/dist/legacy/firebase/discord/get/index.d.mts +13 -0
- package/dist/legacy/firebase/discord/get/index.mjs +13 -0
- package/dist/legacy/firebase/discord/get/randomAvatar.cjs +37 -0
- package/dist/legacy/firebase/discord/get/randomAvatar.d.mts +22 -0
- package/dist/legacy/firebase/discord/get/randomAvatar.mjs +30 -0
- package/dist/legacy/firebase/discord/http/index.cjs +15 -0
- package/dist/legacy/firebase/discord/http/index.d.mts +11 -0
- package/dist/legacy/firebase/discord/http/index.mjs +11 -0
- package/dist/legacy/firebase/discord/http/login.cjs +127 -0
- package/dist/legacy/firebase/discord/http/login.d.mts +21 -0
- package/dist/legacy/firebase/discord/http/login.mjs +123 -0
- package/dist/legacy/firebase/discord/http/logout.cjs +155 -0
- package/dist/legacy/firebase/discord/http/logout.d.mts +22 -0
- package/dist/legacy/firebase/discord/http/logout.mjs +143 -0
- package/dist/legacy/firebase/discord/http/redirect.cjs +188 -0
- package/dist/legacy/firebase/discord/http/redirect.d.mts +24 -0
- package/dist/legacy/firebase/discord/http/redirect.mjs +178 -0
- package/dist/legacy/firebase/discord/http/refreshToken.cjs +133 -0
- package/dist/legacy/firebase/discord/http/refreshToken.d.mts +24 -0
- package/dist/legacy/firebase/discord/http/refreshToken.mjs +121 -0
- package/dist/legacy/firebase/discord/index.cjs +19 -0
- package/dist/legacy/firebase/discord/index.d.mts +15 -0
- package/dist/legacy/firebase/discord/index.mjs +15 -0
- package/dist/legacy/firebase/discord/template/cookie-session.cjs +1430 -0
- package/dist/legacy/firebase/discord/template/cookie-session.d.mts +22 -0
- package/dist/legacy/firebase/discord/template/cookie-session.mjs +1159 -0
- package/dist/legacy/firebase/domainRedirect.cjs +35 -0
- package/dist/legacy/firebase/domainRedirect.d.mts +12 -0
- package/dist/legacy/firebase/domainRedirect.mjs +27 -0
- package/dist/legacy/firebase/escape.cjs +75 -0
- package/dist/legacy/firebase/escape.d.mts +17 -0
- package/dist/legacy/firebase/escape.mjs +58 -0
- package/dist/legacy/firebase/getDBAsync.cjs +33 -0
- package/dist/legacy/firebase/getDBAsync.d.mts +10 -0
- package/dist/legacy/firebase/getDBAsync.mjs +26 -0
- package/dist/legacy/firebase/getDBData.cjs +21 -0
- package/dist/legacy/firebase/getDBData.d.mts +1 -0
- package/dist/legacy/firebase/getDBData.mjs +17 -0
- package/dist/legacy/firebase/getDBValue.cjs +17 -0
- package/dist/legacy/firebase/getDBValue.d.mts +9 -0
- package/dist/legacy/firebase/getDBValue.mjs +14 -0
- package/dist/legacy/firebase/index.cjs +261 -0
- package/dist/legacy/firebase/index.d.mts +51 -0
- package/dist/legacy/firebase/index.mjs +234 -0
- package/dist/legacy/firebase/isEmulator.cjs +14 -0
- package/dist/legacy/firebase/isEmulator.d.mts +8 -0
- package/dist/legacy/firebase/isEmulator.mjs +10 -0
- package/dist/legacy/firebase/logger.cjs +137 -0
- package/dist/legacy/firebase/logger.d.mts +7 -0
- package/dist/legacy/firebase/logger.mjs +125 -0
- package/dist/legacy/firebase/mySQL.cjs +26 -0
- package/dist/legacy/firebase/mySQL.d.mts +10 -0
- package/dist/legacy/firebase/mySQL.mjs +22 -0
- package/dist/legacy/firebase/mysqlConnector/create.cjs +119 -0
- package/dist/legacy/firebase/mysqlConnector/create.d.mts +36 -0
- package/dist/legacy/firebase/mysqlConnector/create.mjs +109 -0
- package/dist/legacy/firebase/mysqlConnector/index.cjs +23 -0
- package/dist/legacy/firebase/mysqlConnector/index.d.mts +11 -0
- package/dist/legacy/firebase/mysqlConnector/index.mjs +16 -0
- package/dist/legacy/firebase/mysqlConnector/nextPrev.cjs +75 -0
- package/dist/legacy/firebase/mysqlConnector/nextPrev.d.mts +31 -0
- package/dist/legacy/firebase/mysqlConnector/nextPrev.mjs +63 -0
- package/dist/legacy/firebase/mysqlConnector/pagination.cjs +91 -0
- package/dist/legacy/firebase/mysqlConnector/pagination.d.mts +33 -0
- package/dist/legacy/firebase/mysqlConnector/pagination.mjs +87 -0
- package/dist/legacy/firebase/mysqlConnector/sameUser.cjs +28 -0
- package/dist/legacy/firebase/mysqlConnector/sameUser.d.mts +12 -0
- package/dist/legacy/firebase/mysqlConnector/sameUser.mjs +23 -0
- package/dist/legacy/firebase/transactionDBAsync.cjs +33 -0
- package/dist/legacy/firebase/transactionDBAsync.d.mts +11 -0
- package/dist/legacy/firebase/transactionDBAsync.mjs +27 -0
- package/dist/legacy/get/countObj.cjs +24 -0
- package/dist/legacy/get/countObj.d.mts +11 -0
- package/dist/legacy/get/countObj.mjs +21 -0
- package/dist/legacy/get/decimalColor.cjs +60 -0
- package/dist/legacy/get/decimalColor.d.mts +12 -0
- package/dist/legacy/get/decimalColor.mjs +54 -0
- package/dist/legacy/get/objType.cjs +43 -0
- package/dist/legacy/get/objType.d.mts +19 -0
- package/dist/legacy/get/objType.mjs +40 -0
- package/dist/legacy/get/pagination.cjs +100 -0
- package/dist/legacy/get/pagination.d.mts +25 -0
- package/dist/legacy/get/pagination.mjs +91 -0
- package/dist/legacy/get/queryUrlByName.cjs +31 -0
- package/dist/legacy/get/queryUrlByName.d.mts +20 -0
- package/dist/legacy/get/queryUrlByName.mjs +28 -0
- package/dist/legacy/get/queryUrlJSON.cjs +54 -0
- package/dist/legacy/get/queryUrlJSON.d.mts +23 -0
- package/dist/legacy/get/queryUrlJSON.mjs +57 -0
- package/dist/legacy/get/super_string_filter.cjs +97 -0
- package/dist/legacy/get/super_string_filter.d.mts +25 -0
- package/dist/legacy/get/super_string_filter.mjs +83 -0
- package/dist/legacy/get/versionCheck.cjs +49 -0
- package/dist/legacy/get/versionCheck.d.mts +17 -0
- package/dist/legacy/get/versionCheck.mjs +38 -0
- package/dist/legacy/http/HTTP-1.0.cjs +151 -0
- package/dist/legacy/http/HTTP-1.0.d.mts +8 -0
- package/dist/legacy/http/HTTP-1.0.mjs +136 -0
- package/dist/legacy/http/auth.cjs +70 -0
- package/dist/legacy/http/auth.d.mts +41 -0
- package/dist/legacy/http/auth.mjs +63 -0
- package/dist/legacy/http/check_domain.cjs +84 -0
- package/dist/legacy/http/check_domain.d.mts +10 -0
- package/dist/legacy/http/check_domain.mjs +82 -0
- package/dist/legacy/http/csrfTokenAnalyze.cjs +46 -0
- package/dist/legacy/http/csrfTokenAnalyze.d.mts +21 -0
- package/dist/legacy/http/csrfTokenAnalyze.mjs +40 -0
- package/dist/legacy/http/domainValidator.cjs +98 -0
- package/dist/legacy/http/domainValidator.d.mts +30 -0
- package/dist/legacy/http/domainValidator.mjs +82 -0
- package/dist/legacy/http/errorsCallback.cjs +55 -0
- package/dist/legacy/http/errorsCallback.d.mts +29 -0
- package/dist/legacy/http/errorsCallback.mjs +48 -0
- package/dist/legacy/http/fetch/json.cjs +48 -0
- package/dist/legacy/http/fetch/json.d.mts +22 -0
- package/dist/legacy/http/fetch/json.mjs +41 -0
- package/dist/legacy/http/fetch/text.cjs +47 -0
- package/dist/legacy/http/fetch/text.d.mts +21 -0
- package/dist/legacy/http/fetch/text.mjs +40 -0
- package/dist/legacy/http/fileCache.cjs +79 -0
- package/dist/legacy/http/fileCache.d.mts +35 -0
- package/dist/legacy/http/fileCache.mjs +70 -0
- package/dist/legacy/http/getDomainURL.cjs +59 -0
- package/dist/legacy/http/getDomainURL.d.mts +18 -0
- package/dist/legacy/http/getDomainURL.mjs +54 -0
- package/dist/legacy/http/userIP.cjs +59 -0
- package/dist/legacy/http/userIP.d.mts +21 -0
- package/dist/legacy/http/userIP.mjs +48 -0
- package/dist/legacy/index.cjs +122 -0
- package/dist/legacy/index.d.mts +89 -0
- package/dist/legacy/index.mjs +92 -0
- package/dist/legacy/libs/arraySortPositions.cjs +30 -0
- package/dist/legacy/libs/arraySortPositions.d.mts +16 -0
- package/dist/legacy/libs/arraySortPositions.mjs +27 -0
- package/dist/legacy/libs/capitalize.cjs +21 -0
- package/dist/legacy/libs/capitalize.d.mts +13 -0
- package/dist/legacy/libs/capitalize.mjs +17 -0
- package/dist/legacy/libs/convertBytes.cjs +64 -0
- package/dist/legacy/libs/convertBytes.d.mts +17 -0
- package/dist/legacy/libs/convertBytes.mjs +55 -0
- package/dist/legacy/libs/custom_module_loader.cjs +82 -0
- package/dist/legacy/libs/custom_module_loader.d.mts +5 -0
- package/dist/legacy/libs/custom_module_loader.mjs +79 -0
- package/dist/legacy/libs/dice.cjs +35 -0
- package/dist/legacy/libs/dice.d.mts +5 -0
- package/dist/legacy/libs/dice.mjs +31 -0
- package/dist/legacy/libs/markdown.cjs +85 -0
- package/dist/legacy/libs/markdown.d.mts +75 -0
- package/dist/legacy/libs/markdown.mjs +78 -0
- package/dist/legacy/libs/percentage.cjs +22 -0
- package/dist/legacy/libs/percentage.d.mts +4 -0
- package/dist/legacy/libs/percentage.mjs +19 -0
- package/dist/legacy/libs/regex/getLetter.cjs +22 -0
- package/dist/legacy/libs/regex/getLetter.d.mts +12 -0
- package/dist/legacy/libs/regex/getLetter.mjs +19 -0
- package/dist/legacy/libs/replaceAsync.cjs +32 -0
- package/dist/legacy/libs/replaceAsync.d.mts +15 -0
- package/dist/legacy/libs/replaceAsync.mjs +25 -0
- package/dist/legacy/libs/rule3.cjs +58 -0
- package/dist/legacy/libs/rule3.d.mts +5 -0
- package/dist/legacy/libs/rule3.mjs +54 -0
- package/dist/legacy/libs/userLevel.cjs +134 -0
- package/dist/legacy/libs/userLevel.d.mts +69 -0
- package/dist/legacy/libs/userLevel.mjs +123 -0
- package/dist/legacy/momentjs/getAge.cjs +28 -0
- package/dist/legacy/momentjs/getAge.d.mts +8 -0
- package/dist/legacy/momentjs/getAge.mjs +22 -0
- package/dist/legacy/momentjs/index.cjs +9 -0
- package/dist/legacy/momentjs/index.d.mts +3 -0
- package/dist/legacy/momentjs/index.mjs +3 -0
- package/dist/legacy/momentjs/timeDuration.cjs +29 -0
- package/dist/legacy/momentjs/timeDuration.d.mts +9 -0
- package/dist/legacy/momentjs/timeDuration.mjs +23 -0
- package/dist/legacy/socket.io/antiFlood/index.cjs +9 -0
- package/dist/legacy/socket.io/antiFlood/index.d.mts +3 -0
- package/dist/legacy/socket.io/antiFlood/index.mjs +3 -0
- package/dist/legacy/socket.io/antiFlood/install.cjs +32 -0
- package/dist/legacy/socket.io/antiFlood/install.d.mts +14 -0
- package/dist/legacy/socket.io/antiFlood/install.mjs +27 -0
- package/dist/legacy/socket.io/antiFlood/verify.cjs +87 -0
- package/dist/legacy/socket.io/antiFlood/verify.d.mts +15 -0
- package/dist/legacy/socket.io/antiFlood/verify.mjs +73 -0
- package/dist/legacy/socket.io/cookie-session.cjs +25 -0
- package/dist/legacy/socket.io/cookie-session.d.mts +9 -0
- package/dist/legacy/socket.io/cookie-session.mjs +20 -0
- package/dist/legacy/socket.io/discord.cjs +61 -0
- package/dist/legacy/socket.io/discord.d.mts +10 -0
- package/dist/legacy/socket.io/discord.mjs +52 -0
- package/dist/legacy/socket.io/index.cjs +13 -0
- package/dist/legacy/socket.io/index.d.mts +9 -0
- package/dist/legacy/socket.io/index.mjs +9 -0
- package/dist/v1/basics/array.cjs +31 -0
- package/dist/v1/basics/array.d.mts +10 -0
- package/dist/v1/basics/array.mjs +22 -0
- package/dist/v1/basics/clock.cjs +187 -0
- package/dist/v1/basics/clock.d.mts +37 -0
- package/dist/v1/basics/clock.mjs +152 -0
- package/dist/v1/basics/objFilter.cjs +55 -0
- package/dist/v1/basics/objFilter.d.mts +27 -0
- package/dist/v1/basics/objFilter.mjs +52 -0
- package/dist/v1/basics/simpleMath.cjs +88 -0
- package/dist/v1/basics/simpleMath.d.mts +54 -0
- package/dist/v1/basics/simpleMath.mjs +75 -0
- package/dist/v1/basics/text.cjs +34 -0
- package/dist/v1/basics/text.d.mts +20 -0
- package/dist/v1/basics/text.mjs +25 -0
- package/dist/v1/index.cjs +26 -0
- package/dist/v1/index.d.mts +15 -0
- package/dist/v1/index.mjs +8 -0
- package/package.json +72 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _ = require('lodash');
|
|
4
|
+
var _default = require('../../../crypto/default.cjs');
|
|
5
|
+
var objType = require('../../../get/objType.cjs');
|
|
6
|
+
var decrypt = require('../../../crypto/decrypt.cjs');
|
|
7
|
+
var getToken = require('../api/getToken.cjs');
|
|
8
|
+
var getUser = require('../api/getUser.cjs');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Handles the redirection logic for the OAuth flow, including state validation, token retrieval, and user session management.
|
|
12
|
+
* This function is used for handling Discord OAuth redirects and session creation or restoration.
|
|
13
|
+
*
|
|
14
|
+
* @param {Object} req - The request object from the client, which contains query parameters such as `state`, `code`, and `csrfToken`.
|
|
15
|
+
* @param {Object} cfg - The configuration object containing settings like `crypto`, `auth`, and `discordScope`.
|
|
16
|
+
* @param {boolean} existSession - Indicates if the user already has an active session.
|
|
17
|
+
*
|
|
18
|
+
* @returns {Promise<Object>} - A promise that resolves with an object containing the redirection URL and session information.
|
|
19
|
+
* If a new session is created, it also includes user data and the token request.
|
|
20
|
+
*
|
|
21
|
+
* @throws {Object} - Throws an error with a `code` and `message` if any validation fails (e.g., missing token, invalid state).
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* // Example usage of redirect function
|
|
25
|
+
* redirect(req, cfg, true)
|
|
26
|
+
* .then((result) => {
|
|
27
|
+
* console.log('Redirection successful', result);
|
|
28
|
+
* })
|
|
29
|
+
* .catch((err) => {
|
|
30
|
+
* console.error('Error during redirect', err);
|
|
31
|
+
* });
|
|
32
|
+
*/
|
|
33
|
+
async function redirect(req, cfg, existSession) {
|
|
34
|
+
return new Promise(function (resolve, reject) {
|
|
35
|
+
// Detect Config
|
|
36
|
+
if (objType(cfg, 'object')) {
|
|
37
|
+
// Create Settings
|
|
38
|
+
const tinyCrypto = _.defaultsDeep({}, cfg.crypto, _default);
|
|
39
|
+
|
|
40
|
+
// Detect Config
|
|
41
|
+
if (objType(tinyCrypto, 'object')) {
|
|
42
|
+
// Create Settings
|
|
43
|
+
const tinyCfg = _.defaultsDeep({}, cfg.auth, {
|
|
44
|
+
redirect: 'http://localhost/redirect',
|
|
45
|
+
discordScope: [],
|
|
46
|
+
client_id: '',
|
|
47
|
+
client_secret: '',
|
|
48
|
+
first_get_user: true,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
// Check Type
|
|
52
|
+
if (req.query.state.type === 'login_command') {
|
|
53
|
+
tinyCfg.discordScope = ['applications.commands', 'applications.commands.update'];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Detect Query
|
|
57
|
+
if (objType(req.query, 'object')) {
|
|
58
|
+
// Get State
|
|
59
|
+
if (typeof req.query.state === 'string') {
|
|
60
|
+
// Crypto
|
|
61
|
+
req.query.state = decrypt.decrypt(tinyCrypto, req.query.state);
|
|
62
|
+
|
|
63
|
+
// Convert
|
|
64
|
+
try {
|
|
65
|
+
req.query.state = JSON.parse(req.query.state);
|
|
66
|
+
} catch (err) {
|
|
67
|
+
req.query.state = {};
|
|
68
|
+
}
|
|
69
|
+
} else {
|
|
70
|
+
req.query.state = {};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Detect State
|
|
74
|
+
if (objType(req.query.state, 'object')) {
|
|
75
|
+
// Check Session
|
|
76
|
+
if (
|
|
77
|
+
typeof tinyCfg.csrfToken !== 'string' ||
|
|
78
|
+
tinyCfg.csrfToken.length < 1 ||
|
|
79
|
+
(typeof req.query.state.csrfToken === 'string' &&
|
|
80
|
+
req.query.state.csrfToken === tinyCfg.csrfToken)
|
|
81
|
+
) {
|
|
82
|
+
// Prepare Resolve Data
|
|
83
|
+
const resolveData = { newSession: false, state: req.query.state };
|
|
84
|
+
|
|
85
|
+
// Final Redirect
|
|
86
|
+
resolveData.redirect = '/';
|
|
87
|
+
if (typeof req.query.state.redirect === 'string') {
|
|
88
|
+
resolveData.redirect += req.query.state.redirect;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Exist Session
|
|
92
|
+
if (!existSession || req.query.state.type === 'webhook') {
|
|
93
|
+
if (
|
|
94
|
+
(typeof req.query.code === 'string' && req.query.code.length > 0) ||
|
|
95
|
+
(typeof req.query.code === 'number' && !isNaN(req.query.code))
|
|
96
|
+
) {
|
|
97
|
+
// Discord Token
|
|
98
|
+
getToken({
|
|
99
|
+
client_id: tinyCfg.client_id,
|
|
100
|
+
client_secret: tinyCfg.client_secret,
|
|
101
|
+
code: req.query.code,
|
|
102
|
+
redirect_uri: tinyCfg.redirect,
|
|
103
|
+
scope: tinyCfg.discordScope.join(' '),
|
|
104
|
+
})
|
|
105
|
+
// Success
|
|
106
|
+
.then((json) => {
|
|
107
|
+
// Valid Json Data
|
|
108
|
+
if (objType(json, 'object')) {
|
|
109
|
+
// Check Token
|
|
110
|
+
if (
|
|
111
|
+
typeof json.access_token === 'string' ||
|
|
112
|
+
typeof json.access_token === 'number'
|
|
113
|
+
) {
|
|
114
|
+
// Token
|
|
115
|
+
resolveData.tokenRequest = json;
|
|
116
|
+
|
|
117
|
+
// Login Type
|
|
118
|
+
if (req.query.state.type === 'login') {
|
|
119
|
+
// Check New Session
|
|
120
|
+
resolveData.newSession = true;
|
|
121
|
+
|
|
122
|
+
// Get User Data
|
|
123
|
+
if (tinyCfg.first_get_user) {
|
|
124
|
+
// Get User
|
|
125
|
+
getUser(json.access_token)
|
|
126
|
+
// Get User
|
|
127
|
+
.then((dsUser) => {
|
|
128
|
+
// Validate Data
|
|
129
|
+
if (objType(dsUser, 'object')) {
|
|
130
|
+
resolveData.user = dsUser;
|
|
131
|
+
resolve(resolveData);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Nope
|
|
135
|
+
else reject({ code: 500, message: 'Invalid JSON User Data!' });
|
|
136
|
+
})
|
|
137
|
+
// Fail
|
|
138
|
+
.catch(reject);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Nope
|
|
142
|
+
else {
|
|
143
|
+
// Return Result
|
|
144
|
+
resolve(resolveData);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Webhook Type
|
|
149
|
+
else if (req.query.state.type === 'webhook') {
|
|
150
|
+
// Guild ID
|
|
151
|
+
if (typeof req.query.guild_id === 'string')
|
|
152
|
+
resolveData.guild_id = req.query.guild_id;
|
|
153
|
+
|
|
154
|
+
// Return Result
|
|
155
|
+
resolve(resolveData);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Unknown
|
|
159
|
+
else reject({ code: 400, message: 'Invalid State Type!' });
|
|
160
|
+
}
|
|
161
|
+
// Nope
|
|
162
|
+
else reject({ code: 500, message: 'Invalid User Token Data!' });
|
|
163
|
+
}
|
|
164
|
+
// Nope
|
|
165
|
+
else reject({ code: 500, message: 'Invalid JSON Token Data!' });
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
// Fail
|
|
169
|
+
.catch(reject);
|
|
170
|
+
} else reject({ code: 401, message: 'Invalid Discord Code!' });
|
|
171
|
+
} else resolve({ newSession: false });
|
|
172
|
+
} else reject({ code: 401, message: 'Incorrect csrfToken!' });
|
|
173
|
+
}
|
|
174
|
+
// Nope
|
|
175
|
+
else reject({ code: 401, message: 'Invalid State Query!' });
|
|
176
|
+
}
|
|
177
|
+
// Nope
|
|
178
|
+
else reject({ code: 401, message: 'Invalid Query URL!' });
|
|
179
|
+
}
|
|
180
|
+
// Nope
|
|
181
|
+
else reject({ code: 500, message: 'Invalid Crypto Values!' });
|
|
182
|
+
}
|
|
183
|
+
// Nope
|
|
184
|
+
else reject({ code: 500, message: 'Invalid Config Values!' });
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
module.exports = redirect;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handles the redirection logic for the OAuth flow, including state validation, token retrieval, and user session management.
|
|
3
|
+
* This function is used for handling Discord OAuth redirects and session creation or restoration.
|
|
4
|
+
*
|
|
5
|
+
* @param {Object} req - The request object from the client, which contains query parameters such as `state`, `code`, and `csrfToken`.
|
|
6
|
+
* @param {Object} cfg - The configuration object containing settings like `crypto`, `auth`, and `discordScope`.
|
|
7
|
+
* @param {boolean} existSession - Indicates if the user already has an active session.
|
|
8
|
+
*
|
|
9
|
+
* @returns {Promise<Object>} - A promise that resolves with an object containing the redirection URL and session information.
|
|
10
|
+
* If a new session is created, it also includes user data and the token request.
|
|
11
|
+
*
|
|
12
|
+
* @throws {Object} - Throws an error with a `code` and `message` if any validation fails (e.g., missing token, invalid state).
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Example usage of redirect function
|
|
16
|
+
* redirect(req, cfg, true)
|
|
17
|
+
* .then((result) => {
|
|
18
|
+
* console.log('Redirection successful', result);
|
|
19
|
+
* })
|
|
20
|
+
* .catch((err) => {
|
|
21
|
+
* console.error('Error during redirect', err);
|
|
22
|
+
* });
|
|
23
|
+
*/
|
|
24
|
+
export default function redirect(req: Object, cfg: Object, existSession: boolean): Promise<Object>;
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import defaultCrypto from '../../../crypto/default.mjs';
|
|
3
|
+
import objType from '../../../get/objType.mjs';
|
|
4
|
+
import { decrypt } from '../../../crypto/decrypt.mjs';
|
|
5
|
+
import getToken from '../api/getToken.mjs';
|
|
6
|
+
import getUser from '../api/getUser.mjs';
|
|
7
|
+
/**
|
|
8
|
+
* Handles the redirection logic for the OAuth flow, including state validation, token retrieval, and user session management.
|
|
9
|
+
* This function is used for handling Discord OAuth redirects and session creation or restoration.
|
|
10
|
+
*
|
|
11
|
+
* @param {Object} req - The request object from the client, which contains query parameters such as `state`, `code`, and `csrfToken`.
|
|
12
|
+
* @param {Object} cfg - The configuration object containing settings like `crypto`, `auth`, and `discordScope`.
|
|
13
|
+
* @param {boolean} existSession - Indicates if the user already has an active session.
|
|
14
|
+
*
|
|
15
|
+
* @returns {Promise<Object>} - A promise that resolves with an object containing the redirection URL and session information.
|
|
16
|
+
* If a new session is created, it also includes user data and the token request.
|
|
17
|
+
*
|
|
18
|
+
* @throws {Object} - Throws an error with a `code` and `message` if any validation fails (e.g., missing token, invalid state).
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Example usage of redirect function
|
|
22
|
+
* redirect(req, cfg, true)
|
|
23
|
+
* .then((result) => {
|
|
24
|
+
* console.log('Redirection successful', result);
|
|
25
|
+
* })
|
|
26
|
+
* .catch((err) => {
|
|
27
|
+
* console.error('Error during redirect', err);
|
|
28
|
+
* });
|
|
29
|
+
*/
|
|
30
|
+
export default async function redirect(req, cfg, existSession) {
|
|
31
|
+
return new Promise(function (resolve, reject) {
|
|
32
|
+
// Detect Config
|
|
33
|
+
if (objType(cfg, 'object')) {
|
|
34
|
+
// Create Settings
|
|
35
|
+
const tinyCrypto = _.defaultsDeep({}, cfg.crypto, defaultCrypto);
|
|
36
|
+
// Detect Config
|
|
37
|
+
if (objType(tinyCrypto, 'object')) {
|
|
38
|
+
// Create Settings
|
|
39
|
+
const tinyCfg = _.defaultsDeep({}, cfg.auth, {
|
|
40
|
+
redirect: 'http://localhost/redirect',
|
|
41
|
+
discordScope: [],
|
|
42
|
+
client_id: '',
|
|
43
|
+
client_secret: '',
|
|
44
|
+
first_get_user: true,
|
|
45
|
+
});
|
|
46
|
+
// Check Type
|
|
47
|
+
if (req.query.state.type === 'login_command') {
|
|
48
|
+
tinyCfg.discordScope = ['applications.commands', 'applications.commands.update'];
|
|
49
|
+
}
|
|
50
|
+
// Detect Query
|
|
51
|
+
if (objType(req.query, 'object')) {
|
|
52
|
+
// Get State
|
|
53
|
+
if (typeof req.query.state === 'string') {
|
|
54
|
+
// Crypto
|
|
55
|
+
req.query.state = decrypt(tinyCrypto, req.query.state);
|
|
56
|
+
// Convert
|
|
57
|
+
try {
|
|
58
|
+
req.query.state = JSON.parse(req.query.state);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
req.query.state = {};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
req.query.state = {};
|
|
66
|
+
}
|
|
67
|
+
// Detect State
|
|
68
|
+
if (objType(req.query.state, 'object')) {
|
|
69
|
+
// Check Session
|
|
70
|
+
if (typeof tinyCfg.csrfToken !== 'string' ||
|
|
71
|
+
tinyCfg.csrfToken.length < 1 ||
|
|
72
|
+
(typeof req.query.state.csrfToken === 'string' &&
|
|
73
|
+
req.query.state.csrfToken === tinyCfg.csrfToken)) {
|
|
74
|
+
// Prepare Resolve Data
|
|
75
|
+
const resolveData = { newSession: false, state: req.query.state };
|
|
76
|
+
// Final Redirect
|
|
77
|
+
resolveData.redirect = '/';
|
|
78
|
+
if (typeof req.query.state.redirect === 'string') {
|
|
79
|
+
resolveData.redirect += req.query.state.redirect;
|
|
80
|
+
}
|
|
81
|
+
// Exist Session
|
|
82
|
+
if (!existSession || req.query.state.type === 'webhook') {
|
|
83
|
+
if ((typeof req.query.code === 'string' && req.query.code.length > 0) ||
|
|
84
|
+
(typeof req.query.code === 'number' && !isNaN(req.query.code))) {
|
|
85
|
+
// Discord Token
|
|
86
|
+
getToken({
|
|
87
|
+
client_id: tinyCfg.client_id,
|
|
88
|
+
client_secret: tinyCfg.client_secret,
|
|
89
|
+
code: req.query.code,
|
|
90
|
+
redirect_uri: tinyCfg.redirect,
|
|
91
|
+
scope: tinyCfg.discordScope.join(' '),
|
|
92
|
+
})
|
|
93
|
+
// Success
|
|
94
|
+
.then((json) => {
|
|
95
|
+
// Valid Json Data
|
|
96
|
+
if (objType(json, 'object')) {
|
|
97
|
+
// Check Token
|
|
98
|
+
if (typeof json.access_token === 'string' ||
|
|
99
|
+
typeof json.access_token === 'number') {
|
|
100
|
+
// Token
|
|
101
|
+
resolveData.tokenRequest = json;
|
|
102
|
+
// Login Type
|
|
103
|
+
if (req.query.state.type === 'login') {
|
|
104
|
+
// Check New Session
|
|
105
|
+
resolveData.newSession = true;
|
|
106
|
+
// Get User Data
|
|
107
|
+
if (tinyCfg.first_get_user) {
|
|
108
|
+
// Get User
|
|
109
|
+
getUser(json.access_token)
|
|
110
|
+
// Get User
|
|
111
|
+
.then((dsUser) => {
|
|
112
|
+
// Validate Data
|
|
113
|
+
if (objType(dsUser, 'object')) {
|
|
114
|
+
resolveData.user = dsUser;
|
|
115
|
+
resolve(resolveData);
|
|
116
|
+
}
|
|
117
|
+
// Nope
|
|
118
|
+
else
|
|
119
|
+
reject({ code: 500, message: 'Invalid JSON User Data!' });
|
|
120
|
+
})
|
|
121
|
+
// Fail
|
|
122
|
+
.catch(reject);
|
|
123
|
+
}
|
|
124
|
+
// Nope
|
|
125
|
+
else {
|
|
126
|
+
// Return Result
|
|
127
|
+
resolve(resolveData);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Webhook Type
|
|
131
|
+
else if (req.query.state.type === 'webhook') {
|
|
132
|
+
// Guild ID
|
|
133
|
+
if (typeof req.query.guild_id === 'string')
|
|
134
|
+
resolveData.guild_id = req.query.guild_id;
|
|
135
|
+
// Return Result
|
|
136
|
+
resolve(resolveData);
|
|
137
|
+
}
|
|
138
|
+
// Unknown
|
|
139
|
+
else
|
|
140
|
+
reject({ code: 400, message: 'Invalid State Type!' });
|
|
141
|
+
}
|
|
142
|
+
// Nope
|
|
143
|
+
else
|
|
144
|
+
reject({ code: 500, message: 'Invalid User Token Data!' });
|
|
145
|
+
}
|
|
146
|
+
// Nope
|
|
147
|
+
else
|
|
148
|
+
reject({ code: 500, message: 'Invalid JSON Token Data!' });
|
|
149
|
+
})
|
|
150
|
+
// Fail
|
|
151
|
+
.catch(reject);
|
|
152
|
+
}
|
|
153
|
+
else
|
|
154
|
+
reject({ code: 401, message: 'Invalid Discord Code!' });
|
|
155
|
+
}
|
|
156
|
+
else
|
|
157
|
+
resolve({ newSession: false });
|
|
158
|
+
}
|
|
159
|
+
else
|
|
160
|
+
reject({ code: 401, message: 'Incorrect csrfToken!' });
|
|
161
|
+
}
|
|
162
|
+
// Nope
|
|
163
|
+
else
|
|
164
|
+
reject({ code: 401, message: 'Invalid State Query!' });
|
|
165
|
+
}
|
|
166
|
+
// Nope
|
|
167
|
+
else
|
|
168
|
+
reject({ code: 401, message: 'Invalid Query URL!' });
|
|
169
|
+
}
|
|
170
|
+
// Nope
|
|
171
|
+
else
|
|
172
|
+
reject({ code: 500, message: 'Invalid Crypto Values!' });
|
|
173
|
+
}
|
|
174
|
+
// Nope
|
|
175
|
+
else
|
|
176
|
+
reject({ code: 500, message: 'Invalid Config Values!' });
|
|
177
|
+
});
|
|
178
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _ = require('lodash');
|
|
4
|
+
var objType = require('../../../get/objType.cjs');
|
|
5
|
+
var refreshToken$1 = require('../api/refreshToken.cjs');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Refreshes the Discord token using the provided refresh token.
|
|
9
|
+
*
|
|
10
|
+
* @async
|
|
11
|
+
* @function refreshToken
|
|
12
|
+
* @param {Object} req - The request object containing query parameters and csrfToken.
|
|
13
|
+
* @param {Object} cfg - The configuration object containing auth and state configurations.
|
|
14
|
+
* @param {boolean} existSession - A flag indicating if the user session exists.
|
|
15
|
+
*
|
|
16
|
+
* @returns {Promise<Object>} Resolves to an object containing the status of the refresh and the new token data, or rejects with an error object.
|
|
17
|
+
*
|
|
18
|
+
* @throws {Object} Rejects with an error object containing the following properties:
|
|
19
|
+
* - `code` {number} The error code (e.g., 401 for invalid CSRF token, 500 for server errors).
|
|
20
|
+
* - `message` {string} The error message describing the issue.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* const result = await refreshToken(req, cfg, existSession);
|
|
24
|
+
* if (result.refreshed) {
|
|
25
|
+
* console.log('Token refreshed:', result.tokenRequest);
|
|
26
|
+
* } else {
|
|
27
|
+
* console.log('Token refresh failed');
|
|
28
|
+
* }
|
|
29
|
+
*/
|
|
30
|
+
async function refreshToken(req, cfg, existSession) {
|
|
31
|
+
return new Promise(function (resolve, reject) {
|
|
32
|
+
// Detect Config
|
|
33
|
+
if (objType(cfg, 'object')) {
|
|
34
|
+
// Create Settings
|
|
35
|
+
const tinyCfg = _.defaultsDeep({}, cfg.auth, {
|
|
36
|
+
redirect: 'http://localhost/redirect',
|
|
37
|
+
discordScope: [],
|
|
38
|
+
client_id: '',
|
|
39
|
+
client_secret: '',
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Check Session
|
|
43
|
+
if (
|
|
44
|
+
typeof tinyCfg.csrfToken !== 'string' ||
|
|
45
|
+
tinyCfg.csrfToken.length < 1 ||
|
|
46
|
+
(typeof req.csrfToken.now.value === 'string' &&
|
|
47
|
+
req.csrfToken.now.value === tinyCfg.csrfToken)
|
|
48
|
+
) {
|
|
49
|
+
// Prepare more settings
|
|
50
|
+
const tinyQuery = _.defaultsDeep({}, cfg.auth, {
|
|
51
|
+
redirect: 'redirect',
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const tinyState = _.defaultsDeep({}, cfg.state, {
|
|
55
|
+
redirect: '',
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Result
|
|
59
|
+
const result = { refreshed: false };
|
|
60
|
+
|
|
61
|
+
// Prepare Final Redirect
|
|
62
|
+
result.redirect = '/';
|
|
63
|
+
|
|
64
|
+
// Redirect
|
|
65
|
+
if (typeof tinyState.redirect === 'string' && tinyState.redirect.length > 0) {
|
|
66
|
+
if (tinyState.redirect.startsWith('/')) result.redirect = tinyState.redirect.substring(1);
|
|
67
|
+
else result.redirect = tinyState.redirect;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Get Query
|
|
71
|
+
else if (
|
|
72
|
+
objType(tinyQuery, 'object') &&
|
|
73
|
+
objType(req.query, 'object') &&
|
|
74
|
+
typeof tinyQuery.redirect === 'string' &&
|
|
75
|
+
typeof req.query[tinyQuery.redirect] === 'string'
|
|
76
|
+
) {
|
|
77
|
+
if (req.query[tinyQuery.redirect].startsWith('/'))
|
|
78
|
+
result.redirect = req.query[tinyQuery.redirect].substring(1);
|
|
79
|
+
else result.redirect = req.query[tinyQuery.redirect];
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Exist Session
|
|
83
|
+
if (existSession) {
|
|
84
|
+
if (
|
|
85
|
+
(typeof cfg.refresh_token === 'string' && cfg.refresh_token.length > 0) ||
|
|
86
|
+
(typeof cfg.refresh_token === 'number' && !isNaN(cfg.refresh_token))
|
|
87
|
+
) {
|
|
88
|
+
// Discord Token
|
|
89
|
+
refreshToken$1({
|
|
90
|
+
client_id: tinyCfg.client_id,
|
|
91
|
+
client_secret: tinyCfg.client_secret,
|
|
92
|
+
refresh_token: cfg.refresh_token,
|
|
93
|
+
redirect_uri: tinyCfg.redirect,
|
|
94
|
+
scope: tinyCfg.discordScope.join(' '),
|
|
95
|
+
})
|
|
96
|
+
// Success
|
|
97
|
+
.then((json) => {
|
|
98
|
+
// Valid Json Data
|
|
99
|
+
if (objType(json, 'object')) {
|
|
100
|
+
// Check Token
|
|
101
|
+
if (
|
|
102
|
+
typeof json.access_token === 'string' ||
|
|
103
|
+
typeof json.access_token === 'number'
|
|
104
|
+
) {
|
|
105
|
+
// Token
|
|
106
|
+
result.refreshed = true;
|
|
107
|
+
result.tokenRequest = json;
|
|
108
|
+
|
|
109
|
+
// Return Result
|
|
110
|
+
resolve(result);
|
|
111
|
+
}
|
|
112
|
+
// Nope
|
|
113
|
+
else reject({ code: 500, message: 'Invalid User Token Data!' });
|
|
114
|
+
}
|
|
115
|
+
// Nope
|
|
116
|
+
else reject({ code: 500, message: 'Invalid JSON Token Data!' });
|
|
117
|
+
})
|
|
118
|
+
// Fail
|
|
119
|
+
.catch(reject);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Nope
|
|
123
|
+
else reject({ code: 401, message: 'Invalid Refresh Token Data!' });
|
|
124
|
+
} else resolve(result);
|
|
125
|
+
} else reject({ code: 401, message: 'Incorrect csrfToken!' });
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Nope
|
|
129
|
+
else reject({ code: 500, message: 'Invalid Config Values!' });
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
module.exports = refreshToken;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refreshes the Discord token using the provided refresh token.
|
|
3
|
+
*
|
|
4
|
+
* @async
|
|
5
|
+
* @function refreshToken
|
|
6
|
+
* @param {Object} req - The request object containing query parameters and csrfToken.
|
|
7
|
+
* @param {Object} cfg - The configuration object containing auth and state configurations.
|
|
8
|
+
* @param {boolean} existSession - A flag indicating if the user session exists.
|
|
9
|
+
*
|
|
10
|
+
* @returns {Promise<Object>} Resolves to an object containing the status of the refresh and the new token data, or rejects with an error object.
|
|
11
|
+
*
|
|
12
|
+
* @throws {Object} Rejects with an error object containing the following properties:
|
|
13
|
+
* - `code` {number} The error code (e.g., 401 for invalid CSRF token, 500 for server errors).
|
|
14
|
+
* - `message` {string} The error message describing the issue.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* const result = await refreshToken(req, cfg, existSession);
|
|
18
|
+
* if (result.refreshed) {
|
|
19
|
+
* console.log('Token refreshed:', result.tokenRequest);
|
|
20
|
+
* } else {
|
|
21
|
+
* console.log('Token refresh failed');
|
|
22
|
+
* }
|
|
23
|
+
*/
|
|
24
|
+
export default function refreshToken(req: Object, cfg: Object, existSession: boolean): Promise<Object>;
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import objType from '../../../get/objType.mjs';
|
|
3
|
+
import refreshTokenApi from '../api/refreshToken.mjs';
|
|
4
|
+
/**
|
|
5
|
+
* Refreshes the Discord token using the provided refresh token.
|
|
6
|
+
*
|
|
7
|
+
* @async
|
|
8
|
+
* @function refreshToken
|
|
9
|
+
* @param {Object} req - The request object containing query parameters and csrfToken.
|
|
10
|
+
* @param {Object} cfg - The configuration object containing auth and state configurations.
|
|
11
|
+
* @param {boolean} existSession - A flag indicating if the user session exists.
|
|
12
|
+
*
|
|
13
|
+
* @returns {Promise<Object>} Resolves to an object containing the status of the refresh and the new token data, or rejects with an error object.
|
|
14
|
+
*
|
|
15
|
+
* @throws {Object} Rejects with an error object containing the following properties:
|
|
16
|
+
* - `code` {number} The error code (e.g., 401 for invalid CSRF token, 500 for server errors).
|
|
17
|
+
* - `message` {string} The error message describing the issue.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* const result = await refreshToken(req, cfg, existSession);
|
|
21
|
+
* if (result.refreshed) {
|
|
22
|
+
* console.log('Token refreshed:', result.tokenRequest);
|
|
23
|
+
* } else {
|
|
24
|
+
* console.log('Token refresh failed');
|
|
25
|
+
* }
|
|
26
|
+
*/
|
|
27
|
+
export default async function refreshToken(req, cfg, existSession) {
|
|
28
|
+
return new Promise(function (resolve, reject) {
|
|
29
|
+
// Detect Config
|
|
30
|
+
if (objType(cfg, 'object')) {
|
|
31
|
+
// Create Settings
|
|
32
|
+
const tinyCfg = _.defaultsDeep({}, cfg.auth, {
|
|
33
|
+
redirect: 'http://localhost/redirect',
|
|
34
|
+
discordScope: [],
|
|
35
|
+
client_id: '',
|
|
36
|
+
client_secret: '',
|
|
37
|
+
});
|
|
38
|
+
// Check Session
|
|
39
|
+
if (typeof tinyCfg.csrfToken !== 'string' ||
|
|
40
|
+
tinyCfg.csrfToken.length < 1 ||
|
|
41
|
+
(typeof req.csrfToken.now.value === 'string' &&
|
|
42
|
+
req.csrfToken.now.value === tinyCfg.csrfToken)) {
|
|
43
|
+
// Prepare more settings
|
|
44
|
+
const tinyQuery = _.defaultsDeep({}, cfg.auth, {
|
|
45
|
+
redirect: 'redirect',
|
|
46
|
+
});
|
|
47
|
+
const tinyState = _.defaultsDeep({}, cfg.state, {
|
|
48
|
+
redirect: '',
|
|
49
|
+
});
|
|
50
|
+
// Result
|
|
51
|
+
const result = { refreshed: false };
|
|
52
|
+
// Prepare Final Redirect
|
|
53
|
+
result.redirect = '/';
|
|
54
|
+
// Redirect
|
|
55
|
+
if (typeof tinyState.redirect === 'string' && tinyState.redirect.length > 0) {
|
|
56
|
+
if (tinyState.redirect.startsWith('/'))
|
|
57
|
+
result.redirect = tinyState.redirect.substring(1);
|
|
58
|
+
else
|
|
59
|
+
result.redirect = tinyState.redirect;
|
|
60
|
+
}
|
|
61
|
+
// Get Query
|
|
62
|
+
else if (objType(tinyQuery, 'object') &&
|
|
63
|
+
objType(req.query, 'object') &&
|
|
64
|
+
typeof tinyQuery.redirect === 'string' &&
|
|
65
|
+
typeof req.query[tinyQuery.redirect] === 'string') {
|
|
66
|
+
if (req.query[tinyQuery.redirect].startsWith('/'))
|
|
67
|
+
result.redirect = req.query[tinyQuery.redirect].substring(1);
|
|
68
|
+
else
|
|
69
|
+
result.redirect = req.query[tinyQuery.redirect];
|
|
70
|
+
}
|
|
71
|
+
// Exist Session
|
|
72
|
+
if (existSession) {
|
|
73
|
+
if ((typeof cfg.refresh_token === 'string' && cfg.refresh_token.length > 0) ||
|
|
74
|
+
(typeof cfg.refresh_token === 'number' && !isNaN(cfg.refresh_token))) {
|
|
75
|
+
// Discord Token
|
|
76
|
+
refreshTokenApi({
|
|
77
|
+
client_id: tinyCfg.client_id,
|
|
78
|
+
client_secret: tinyCfg.client_secret,
|
|
79
|
+
refresh_token: cfg.refresh_token,
|
|
80
|
+
redirect_uri: tinyCfg.redirect,
|
|
81
|
+
scope: tinyCfg.discordScope.join(' '),
|
|
82
|
+
})
|
|
83
|
+
// Success
|
|
84
|
+
.then((json) => {
|
|
85
|
+
// Valid Json Data
|
|
86
|
+
if (objType(json, 'object')) {
|
|
87
|
+
// Check Token
|
|
88
|
+
if (typeof json.access_token === 'string' ||
|
|
89
|
+
typeof json.access_token === 'number') {
|
|
90
|
+
// Token
|
|
91
|
+
result.refreshed = true;
|
|
92
|
+
result.tokenRequest = json;
|
|
93
|
+
// Return Result
|
|
94
|
+
resolve(result);
|
|
95
|
+
}
|
|
96
|
+
// Nope
|
|
97
|
+
else
|
|
98
|
+
reject({ code: 500, message: 'Invalid User Token Data!' });
|
|
99
|
+
}
|
|
100
|
+
// Nope
|
|
101
|
+
else
|
|
102
|
+
reject({ code: 500, message: 'Invalid JSON Token Data!' });
|
|
103
|
+
})
|
|
104
|
+
// Fail
|
|
105
|
+
.catch(reject);
|
|
106
|
+
}
|
|
107
|
+
// Nope
|
|
108
|
+
else
|
|
109
|
+
reject({ code: 401, message: 'Invalid Refresh Token Data!' });
|
|
110
|
+
}
|
|
111
|
+
else
|
|
112
|
+
resolve(result);
|
|
113
|
+
}
|
|
114
|
+
else
|
|
115
|
+
reject({ code: 401, message: 'Incorrect csrfToken!' });
|
|
116
|
+
}
|
|
117
|
+
// Nope
|
|
118
|
+
else
|
|
119
|
+
reject({ code: 500, message: 'Invalid Config Values!' });
|
|
120
|
+
});
|
|
121
|
+
}
|