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,1159 @@
|
|
|
1
|
+
import hash from 'object-hash';
|
|
2
|
+
import moment from 'moment-timezone';
|
|
3
|
+
import _ from 'lodash';
|
|
4
|
+
import clone from 'clone';
|
|
5
|
+
import defaultCrypto from '../../../crypto/default.mjs';
|
|
6
|
+
import objType from '../../../get/objType.mjs';
|
|
7
|
+
import config from '../config.mjs';
|
|
8
|
+
import fbLogger from '../../logger.mjs';
|
|
9
|
+
import getUser from '../api/getUser.mjs';
|
|
10
|
+
import userIp from '../../../http/userIP.mjs';
|
|
11
|
+
import getDomainURL from '../../../http/getDomainURL.mjs';
|
|
12
|
+
import login from '../firebase_redirect/login.mjs';
|
|
13
|
+
import logout from '../firebase_redirect/logout.mjs';
|
|
14
|
+
import addGuildMember from '../api/addGuildMember.mjs';
|
|
15
|
+
import getGuildWidget from '../api/getGuildWidget.mjs';
|
|
16
|
+
import getUserConnections from '../api/getUserConnections.mjs';
|
|
17
|
+
import discordAuth from '../index.mjs';
|
|
18
|
+
import getUserGuilds from '../api/getUserGuilds.mjs';
|
|
19
|
+
import getCookieSession from '../get/cookie-session.mjs';
|
|
20
|
+
import getFirebaseCookieSession from '../../../socket.io/cookie-session.mjs';
|
|
21
|
+
import AuthSystem from '../../cookieSession.mjs';
|
|
22
|
+
import revokeToken from '../api/revokeToken.mjs';
|
|
23
|
+
/**
|
|
24
|
+
* Middleware function to handle Discord and Firebase sessions, including login, logout,
|
|
25
|
+
* and redirection functionalities.
|
|
26
|
+
*
|
|
27
|
+
* @param {Object} app - The Express.js app object.
|
|
28
|
+
* @param {Object} cfg - The configuration object for the middleware, including Firebase settings.
|
|
29
|
+
* @throws {Error} Throws an error if the configuration object is invalid.
|
|
30
|
+
*/
|
|
31
|
+
export default function cookieSession(app, cfg) {
|
|
32
|
+
// Config
|
|
33
|
+
if (objType(cfg, 'object')) {
|
|
34
|
+
// Validator Session Discord and Firebase
|
|
35
|
+
const sessionFirebaseDiscordValidator = function (req) {
|
|
36
|
+
return (req.firebase_session.uid ===
|
|
37
|
+
`${discordSession.varsTemplate.uid}${tinyAuth.client_id}_${req.discord_session.user.id}`);
|
|
38
|
+
};
|
|
39
|
+
// Prepare Base
|
|
40
|
+
app.use((req, res, next) => {
|
|
41
|
+
// Add Discord Session
|
|
42
|
+
if (!req.discord_session)
|
|
43
|
+
req.discord_session = {};
|
|
44
|
+
// Complete
|
|
45
|
+
next();
|
|
46
|
+
});
|
|
47
|
+
// Logger
|
|
48
|
+
const logger = fbLogger;
|
|
49
|
+
// Get Discord User
|
|
50
|
+
const getDiscordUser = getUser;
|
|
51
|
+
// Get User IP
|
|
52
|
+
const getUserIP = userIp;
|
|
53
|
+
// Discord session
|
|
54
|
+
const discordSession = {};
|
|
55
|
+
// Firebase Auth
|
|
56
|
+
discordSession.firebaseAuth = {};
|
|
57
|
+
// Redirect
|
|
58
|
+
discordSession.firebaseAuth.redirect = {
|
|
59
|
+
template: function (type, req, res, redirect_url, csrfToken, firebase_auth) {
|
|
60
|
+
// Get Domain
|
|
61
|
+
const tinyDomain = getDomainURL(req, cfg.port);
|
|
62
|
+
// Fix URL
|
|
63
|
+
if (typeof redirect_url !== 'string')
|
|
64
|
+
redirect_url = '';
|
|
65
|
+
else if (redirect_url.startsWith('/'))
|
|
66
|
+
redirect_url = redirect_url.substring(1);
|
|
67
|
+
// New URL
|
|
68
|
+
redirect_url = `${tinyURLPath[type]}?redirect=${encodeURIComponent(redirect_url)}`;
|
|
69
|
+
if (typeof csrfToken === 'string')
|
|
70
|
+
redirect_url += `&key=${csrfToken}`;
|
|
71
|
+
if (typeof firebase_auth === 'string')
|
|
72
|
+
redirect_url += `&token=${firebase_auth}`;
|
|
73
|
+
// Complete
|
|
74
|
+
res.redirect(tinyDomain + redirect_url);
|
|
75
|
+
},
|
|
76
|
+
// Login
|
|
77
|
+
login: function (req, res, redirect_url, csrfToken) {
|
|
78
|
+
return discordSession.firebaseAuth.redirect.template('firebaseLogin', req, res, redirect_url, csrfToken);
|
|
79
|
+
},
|
|
80
|
+
// Logout
|
|
81
|
+
logout: function (req, res, redirect_url, csrfToken, firebase_auth) {
|
|
82
|
+
return discordSession.firebaseAuth.redirect.template('firebaseLogout', req, res, redirect_url, csrfToken, firebase_auth);
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
// Variables
|
|
86
|
+
discordSession.varsTemplate = {
|
|
87
|
+
uid: 'discord_user_id_',
|
|
88
|
+
avatarURL: 'https://cdn.discordapp.com/avatars/',
|
|
89
|
+
};
|
|
90
|
+
// Get Firebase UID
|
|
91
|
+
discordSession.uidGenerator = function (userID) {
|
|
92
|
+
return `${discordSession.varsTemplate.uid}${tinyAuth.client_id}_${encodeURIComponent(userID)}`;
|
|
93
|
+
};
|
|
94
|
+
// Session Set
|
|
95
|
+
discordSession.set = function (req, tokenRequest, extra_text = '') {
|
|
96
|
+
// Session Items
|
|
97
|
+
req.session[sessionVars.access_token + extra_text] = tokenRequest.access_token;
|
|
98
|
+
req.session[sessionVars.refresh_token + extra_text] = tokenRequest.refresh_token;
|
|
99
|
+
req.session[sessionVars.token_type + extra_text] = tokenRequest.token_type;
|
|
100
|
+
req.session[sessionVars.scope + extra_text] = tokenRequest.scope;
|
|
101
|
+
// Expire In
|
|
102
|
+
req.session[sessionVars.token_expires_in + extra_text] = moment
|
|
103
|
+
.tz('Universal')
|
|
104
|
+
.add(tokenRequest.expires_in, 'second')
|
|
105
|
+
.format();
|
|
106
|
+
};
|
|
107
|
+
discordSession.get = function (req) {
|
|
108
|
+
return {
|
|
109
|
+
access_token: req.session[sessionVars.access_token],
|
|
110
|
+
refresh_token: req.session[sessionVars.refresh_token],
|
|
111
|
+
token_type: req.session[sessionVars.token_type],
|
|
112
|
+
scope: req.session[sessionVars.scope],
|
|
113
|
+
token_expires_in: req.session[sessionVars.token_expires_in],
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
// Prepare Firebase Items
|
|
117
|
+
const prepare_fire_auth_discord = function (req, user) {
|
|
118
|
+
// Discord Session
|
|
119
|
+
const dsSession = discordSession.get(req);
|
|
120
|
+
const preparedsSession = {};
|
|
121
|
+
// Scope
|
|
122
|
+
if (typeof dsSession.scope === 'string')
|
|
123
|
+
preparedsSession.scope = dsSession.scope.split(' ');
|
|
124
|
+
else
|
|
125
|
+
preparedsSession.scope = dsSession.scope;
|
|
126
|
+
// User IP
|
|
127
|
+
if (tinyCfg.ipVerification) {
|
|
128
|
+
const requestIpAddress = getUserIP(req, { isFirebase: true });
|
|
129
|
+
preparedsSession.user_ip = requestIpAddress.value;
|
|
130
|
+
preparedsSession.user_ip_type = requestIpAddress.type;
|
|
131
|
+
}
|
|
132
|
+
// Discord
|
|
133
|
+
preparedsSession.discord = user;
|
|
134
|
+
// Complete
|
|
135
|
+
return preparedsSession;
|
|
136
|
+
};
|
|
137
|
+
// Firebase Discord Auth
|
|
138
|
+
discordSession.firebase = {};
|
|
139
|
+
discordSession.firebase.createAccountData = function (access_token, userData, oldData) {
|
|
140
|
+
// Prepare New User Data
|
|
141
|
+
const newUserData = {};
|
|
142
|
+
const existOLD = objType(oldData, 'object');
|
|
143
|
+
// Password
|
|
144
|
+
if (typeof access_token === 'string' && access_token.length > 0)
|
|
145
|
+
newUserData.password = access_token;
|
|
146
|
+
// Main Data
|
|
147
|
+
const newUsername = userData.username + '#' + userData.discriminator;
|
|
148
|
+
const newAvatar = `${discordSession.varsTemplate.avatarURL}${userData.id}/${userData.avatar}`;
|
|
149
|
+
// Basic Profile
|
|
150
|
+
if (!existOLD || newUsername !== oldData.displayNama)
|
|
151
|
+
newUserData.displayName = newUsername;
|
|
152
|
+
if (!existOLD || newAvatar !== oldData.photoURL)
|
|
153
|
+
newUserData.photoURL = newAvatar;
|
|
154
|
+
// Insert User Email
|
|
155
|
+
if (typeof userData.email === 'string') {
|
|
156
|
+
if (!existOLD || userData.email !== oldData.email) {
|
|
157
|
+
newUserData.email = userData.email;
|
|
158
|
+
newUserData.emailVerified = userData.verified;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Complete
|
|
162
|
+
return newUserData;
|
|
163
|
+
};
|
|
164
|
+
discordSession.firebase.updateUser = function (access_token, user, oldUser) {
|
|
165
|
+
return new Promise(function (resolve, reject) {
|
|
166
|
+
// Prepare MD5
|
|
167
|
+
const validator = {};
|
|
168
|
+
validator.user = hash(user);
|
|
169
|
+
if (objType(oldUser, 'object'))
|
|
170
|
+
validator.oldUser = hash(oldUser);
|
|
171
|
+
else
|
|
172
|
+
validator.oldUser = '';
|
|
173
|
+
// Validate
|
|
174
|
+
if (validator.user !== validator.oldUser) {
|
|
175
|
+
// Get UID
|
|
176
|
+
const uid = discordSession.uidGenerator(user.id);
|
|
177
|
+
const firebaseAccount = discordSession.firebase.createAccountData(access_token, user, oldUser);
|
|
178
|
+
// Update User
|
|
179
|
+
cfg.firebase.auth
|
|
180
|
+
.updateUser(uid, firebaseAccount)
|
|
181
|
+
.then((userRecord) => resolve({
|
|
182
|
+
updated: true,
|
|
183
|
+
uid: uid,
|
|
184
|
+
newData: firebaseAccount,
|
|
185
|
+
userRecord: userRecord,
|
|
186
|
+
}))
|
|
187
|
+
.catch(reject);
|
|
188
|
+
}
|
|
189
|
+
// Nope
|
|
190
|
+
else
|
|
191
|
+
resolve({ updated: false });
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
// Set User
|
|
195
|
+
discordSession.firebase.set = function (req, user) {
|
|
196
|
+
return new Promise(function (resolve, reject) {
|
|
197
|
+
// UID
|
|
198
|
+
const uid = discordSession.uidGenerator(user.id);
|
|
199
|
+
const claims = prepare_fire_auth_discord(req, user);
|
|
200
|
+
// Prepare Auth
|
|
201
|
+
cfg.firebase.auth
|
|
202
|
+
.createCustomToken(uid, claims)
|
|
203
|
+
// Complete
|
|
204
|
+
.then((customToken) => {
|
|
205
|
+
req.session[sessionVars.firebase_auth_token] = customToken;
|
|
206
|
+
resolve(customToken);
|
|
207
|
+
})
|
|
208
|
+
// Error
|
|
209
|
+
.catch((err) => {
|
|
210
|
+
reject({ code: 500, message: err.message });
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
};
|
|
214
|
+
// Get User
|
|
215
|
+
discordSession.firebase.get = function (req, res) {
|
|
216
|
+
return new Promise(function (resolve, reject) {
|
|
217
|
+
// Prepare Auth
|
|
218
|
+
cfg.firebase.auth
|
|
219
|
+
.verifySessionCookie(req.session[sessionVars.firebase_token])
|
|
220
|
+
// Complete
|
|
221
|
+
.then((decodedToken) => {
|
|
222
|
+
// Validator
|
|
223
|
+
if (tinyCfg.ipVerification) {
|
|
224
|
+
// Get Request IP
|
|
225
|
+
const requestIpAddress = getUserIP(req, { isFirebase: true });
|
|
226
|
+
// Convert
|
|
227
|
+
if (typeof decodedToken.user_ip === 'string')
|
|
228
|
+
decodedToken.user_ip = [decodedToken.user_ip];
|
|
229
|
+
if (typeof requestIpAddress.value === 'string')
|
|
230
|
+
requestIpAddress.value = [requestIpAddress.value];
|
|
231
|
+
// Verification
|
|
232
|
+
if (hash(decodedToken.user_ip) === hash(requestIpAddress.value) &&
|
|
233
|
+
decodedToken.user_ip_type === requestIpAddress.type) {
|
|
234
|
+
req.firebase_session = decodedToken;
|
|
235
|
+
resolve();
|
|
236
|
+
}
|
|
237
|
+
// Nope
|
|
238
|
+
else
|
|
239
|
+
reject({ code: 406, message: 'Invalid User IP Session!' });
|
|
240
|
+
}
|
|
241
|
+
// Nope
|
|
242
|
+
else {
|
|
243
|
+
req.firebase_session = decodedToken;
|
|
244
|
+
resolve();
|
|
245
|
+
}
|
|
246
|
+
})
|
|
247
|
+
// Error
|
|
248
|
+
.catch((err) => {
|
|
249
|
+
reject({ code: 500, message: err.message });
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
};
|
|
253
|
+
// Firebase Redirect
|
|
254
|
+
const firebase_redirect = { login, logout };
|
|
255
|
+
for (const page in firebase_redirect)
|
|
256
|
+
for (const item in firebase_redirect[page])
|
|
257
|
+
firebase_redirect[page][item] = firebase_redirect[page][item].toString();
|
|
258
|
+
// Create Settings
|
|
259
|
+
const tinyCfg = _.defaultsDeep({}, cfg.cfg, {
|
|
260
|
+
// IP Verification
|
|
261
|
+
ipVerification: false,
|
|
262
|
+
// Need Verification
|
|
263
|
+
needEmailVerified: true,
|
|
264
|
+
// Error Callback
|
|
265
|
+
errorCallback: function (err, req, res) {
|
|
266
|
+
if (res) {
|
|
267
|
+
return res.json(err);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
logger.error(err);
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
// Redirect
|
|
274
|
+
redirect: {
|
|
275
|
+
/* Login */
|
|
276
|
+
login: function (data, req, res) {
|
|
277
|
+
return res.json(data);
|
|
278
|
+
},
|
|
279
|
+
/* Logout */
|
|
280
|
+
logout: function (data, req, res) {
|
|
281
|
+
return res.json(data);
|
|
282
|
+
},
|
|
283
|
+
webhook: function (data, req, res) {
|
|
284
|
+
return res.json(data);
|
|
285
|
+
},
|
|
286
|
+
},
|
|
287
|
+
});
|
|
288
|
+
// Auth Config
|
|
289
|
+
const tinyAuth = _.defaultsDeep({}, cfg.auth, {
|
|
290
|
+
redirect: '',
|
|
291
|
+
client_id: '',
|
|
292
|
+
client_secret: '',
|
|
293
|
+
bot_token: '',
|
|
294
|
+
first_get_user: true,
|
|
295
|
+
discordScope: ['identify', 'email'],
|
|
296
|
+
});
|
|
297
|
+
// Auth Commands Config
|
|
298
|
+
const tinyCommandAuth = _.defaultsDeep({}, cfg.comamndAuth, {
|
|
299
|
+
redirect: tinyAuth.redirect,
|
|
300
|
+
client_id: tinyAuth.client_id,
|
|
301
|
+
client_secret: tinyAuth.client_secret,
|
|
302
|
+
bot_token: tinyAuth.bot_token,
|
|
303
|
+
first_get_user: tinyAuth.first_get_user,
|
|
304
|
+
discordScope: ['applications.commands'],
|
|
305
|
+
});
|
|
306
|
+
// Bot Auth
|
|
307
|
+
const botAuth = _.defaultsDeep({}, cfg.bot, {
|
|
308
|
+
discordScope: ['bot', 'applications.commands'],
|
|
309
|
+
permissions: 0,
|
|
310
|
+
});
|
|
311
|
+
// Final Result
|
|
312
|
+
const final_functions = {
|
|
313
|
+
// Auth
|
|
314
|
+
auth: tinyAuth,
|
|
315
|
+
commandAuth: tinyCommandAuth,
|
|
316
|
+
// API
|
|
317
|
+
addGuildMember: function (data) {
|
|
318
|
+
return addGuildMember(tinyAuth.bot_token, data);
|
|
319
|
+
},
|
|
320
|
+
getGuildWidget: function (guildID) {
|
|
321
|
+
return getGuildWidget(guildID);
|
|
322
|
+
},
|
|
323
|
+
// UID Generator
|
|
324
|
+
uidGenerator: function (userID) {
|
|
325
|
+
return discordSession.uidGenerator(userID);
|
|
326
|
+
},
|
|
327
|
+
// Session Validator
|
|
328
|
+
sessionValidator: function (data = {}) {
|
|
329
|
+
return (req, res, next) => {
|
|
330
|
+
// Validator Progress
|
|
331
|
+
const validatorItems = {
|
|
332
|
+
values: ['getUserConnections', 'getUser', 'getUserGuilds'],
|
|
333
|
+
count: 0,
|
|
334
|
+
callback: function () {
|
|
335
|
+
// The Item
|
|
336
|
+
const item = validatorItems.values[validatorItems.count];
|
|
337
|
+
if (typeof item === 'string') {
|
|
338
|
+
// Read Item
|
|
339
|
+
if (data[item]) {
|
|
340
|
+
final_functions.sessionPlugins[item](req, res, () => {
|
|
341
|
+
validatorItems.count++;
|
|
342
|
+
return validatorItems.callback();
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
else {
|
|
346
|
+
validatorItems.count++;
|
|
347
|
+
validatorItems.callback();
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
// Next
|
|
351
|
+
else
|
|
352
|
+
final_functions.sessionPlugins.validator(req, res, () => {
|
|
353
|
+
next();
|
|
354
|
+
});
|
|
355
|
+
},
|
|
356
|
+
};
|
|
357
|
+
// Complete
|
|
358
|
+
return validatorItems.callback();
|
|
359
|
+
};
|
|
360
|
+
},
|
|
361
|
+
// Session Plugins
|
|
362
|
+
sessionPlugins: {
|
|
363
|
+
// Session Validator
|
|
364
|
+
validator: function (req, res, next) {
|
|
365
|
+
// Empty CSRF Token
|
|
366
|
+
if (!req.csrfToken)
|
|
367
|
+
req.csrfToken = { new: {}, now: {} };
|
|
368
|
+
// Preparing Clocks
|
|
369
|
+
if (!req.utc_clock)
|
|
370
|
+
req.utc_clock = { now: moment.tz('Universal') };
|
|
371
|
+
// Add Auth
|
|
372
|
+
req.discord_session.auth = {
|
|
373
|
+
app: tinyAuth,
|
|
374
|
+
command: tinyCommandAuth,
|
|
375
|
+
bot: botAuth,
|
|
376
|
+
};
|
|
377
|
+
// Exist Discord Session
|
|
378
|
+
const existDiscordSession = typeof req.session[sessionVars.token_expires_in] === 'string' &&
|
|
379
|
+
typeof req.session[sessionVars.access_token] === 'string' &&
|
|
380
|
+
typeof req.session[sessionVars.refresh_token] === 'string';
|
|
381
|
+
// Exist Session
|
|
382
|
+
if (existDiscordSession &&
|
|
383
|
+
!req.url.startsWith(tinyURLPath.firebaseLogin + '?') &&
|
|
384
|
+
req.url !== tinyURLPath.firebaseLogin &&
|
|
385
|
+
!req.url.startsWith(tinyURLPath.firebaseLogout + '?') &&
|
|
386
|
+
req.url !== tinyURLPath.firebaseLogout) {
|
|
387
|
+
// Exist Firebase
|
|
388
|
+
if (cfg.firebase) {
|
|
389
|
+
// Finish the Session
|
|
390
|
+
const finishTinySession = function (err) {
|
|
391
|
+
// Firebase Auth
|
|
392
|
+
const firebase_auth = req.session[sessionVars.firebase_token];
|
|
393
|
+
// Logout
|
|
394
|
+
auto_logout(req, err)
|
|
395
|
+
.then((result) => {
|
|
396
|
+
logout_firebase(res, req, result.redirect, firebase_auth);
|
|
397
|
+
})
|
|
398
|
+
.catch((err) => {
|
|
399
|
+
tinyCfg.errorCallback(err, req, res);
|
|
400
|
+
});
|
|
401
|
+
};
|
|
402
|
+
discordSession.firebase
|
|
403
|
+
.get(req, res)
|
|
404
|
+
.then(() => {
|
|
405
|
+
// Discord and Firebase same session
|
|
406
|
+
if (!req.discord_session.user || sessionFirebaseDiscordValidator(req))
|
|
407
|
+
checkDiscordSession(req, res, next);
|
|
408
|
+
// Nope
|
|
409
|
+
else
|
|
410
|
+
finishTinySession();
|
|
411
|
+
})
|
|
412
|
+
.catch(finishTinySession);
|
|
413
|
+
}
|
|
414
|
+
// Nope
|
|
415
|
+
else
|
|
416
|
+
checkDiscordSession(req, res, next);
|
|
417
|
+
}
|
|
418
|
+
else
|
|
419
|
+
next();
|
|
420
|
+
},
|
|
421
|
+
// Get User Module
|
|
422
|
+
getUser: function (req, res, next) {
|
|
423
|
+
// Get User Discord Data
|
|
424
|
+
const access_token = req.session[sessionVars.access_token];
|
|
425
|
+
if (typeof access_token === 'string') {
|
|
426
|
+
getDiscordUser(access_token)
|
|
427
|
+
.then((user) => {
|
|
428
|
+
// Set Discord Data
|
|
429
|
+
req.discord_session.user = user;
|
|
430
|
+
// Complete
|
|
431
|
+
next();
|
|
432
|
+
})
|
|
433
|
+
.catch((err) => {
|
|
434
|
+
if (!req.discord_session.errors) {
|
|
435
|
+
req.discord_session.errors = {};
|
|
436
|
+
}
|
|
437
|
+
req.discord_session.errors.user = err;
|
|
438
|
+
delete req.discord_session.user;
|
|
439
|
+
prepare_final_session(req, res, err);
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
else
|
|
443
|
+
next();
|
|
444
|
+
},
|
|
445
|
+
// Get User Module
|
|
446
|
+
getUserConnections: function (req, res, next) {
|
|
447
|
+
// Get User Discord Data
|
|
448
|
+
if (typeof req.session[sessionVars.access_token] === 'string') {
|
|
449
|
+
getUserConnections(req.session[sessionVars.access_token])
|
|
450
|
+
.then((connections) => {
|
|
451
|
+
// Set Discord Data
|
|
452
|
+
req.discord_session.connections = connections;
|
|
453
|
+
// Complete
|
|
454
|
+
next();
|
|
455
|
+
})
|
|
456
|
+
.catch((err) => {
|
|
457
|
+
if (!req.discord_session.errors) {
|
|
458
|
+
req.discord_session.errors = {};
|
|
459
|
+
}
|
|
460
|
+
req.discord_session.errors.connections = err;
|
|
461
|
+
delete req.discord_session.connections;
|
|
462
|
+
prepare_final_session(req, res, err);
|
|
463
|
+
});
|
|
464
|
+
}
|
|
465
|
+
else
|
|
466
|
+
next();
|
|
467
|
+
},
|
|
468
|
+
// Get User Module
|
|
469
|
+
getUserGuilds: function (req, res, next) {
|
|
470
|
+
// Get User Discord Data
|
|
471
|
+
if (typeof req.session[sessionVars.access_token] === 'string') {
|
|
472
|
+
getUserGuilds(req.session[sessionVars.access_token])
|
|
473
|
+
.then((guilds) => {
|
|
474
|
+
// Set Discord Data
|
|
475
|
+
req.discord_session.guilds = guilds;
|
|
476
|
+
// Complete
|
|
477
|
+
next();
|
|
478
|
+
})
|
|
479
|
+
.catch((err) => {
|
|
480
|
+
if (!req.discord_session.errors) {
|
|
481
|
+
req.discord_session.errors = {};
|
|
482
|
+
}
|
|
483
|
+
req.discord_session.errors.guilds = err;
|
|
484
|
+
delete req.discord_session.guilds;
|
|
485
|
+
prepare_final_session(req, res, err);
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
else
|
|
489
|
+
next();
|
|
490
|
+
},
|
|
491
|
+
},
|
|
492
|
+
};
|
|
493
|
+
// Test Modules Prepare
|
|
494
|
+
const getSessionFromCookie = getCookieSession;
|
|
495
|
+
// Need Identify
|
|
496
|
+
if (tinyAuth.discordScope.indexOf('identify') < 0)
|
|
497
|
+
tinyAuth.discordScope.push('identify');
|
|
498
|
+
if (tinyAuth.discordScope.indexOf('email') < 0)
|
|
499
|
+
tinyAuth.discordScope.push('email');
|
|
500
|
+
// Firebase Mode
|
|
501
|
+
if (objType(cfg.firebase, 'object')) {
|
|
502
|
+
// Fix First Get User Value
|
|
503
|
+
tinyAuth.first_get_user = true;
|
|
504
|
+
// Fix Auth Value
|
|
505
|
+
if (!cfg.firebase.auth)
|
|
506
|
+
cfg.firebase.auth = cfg.firebase.root.auth();
|
|
507
|
+
}
|
|
508
|
+
// Session Vars
|
|
509
|
+
const sessionVars = _.defaultsDeep({}, cfg.vars, {
|
|
510
|
+
access_token: 'access_token',
|
|
511
|
+
refresh_token: 'refresh_token',
|
|
512
|
+
token_type: 'token_type',
|
|
513
|
+
csrfToken: 'csrfToken',
|
|
514
|
+
scope: 'scope',
|
|
515
|
+
token_expires_in: 'token_expires_in',
|
|
516
|
+
firebase_token: 'firebase_token',
|
|
517
|
+
firebase_auth_token: 'firebase_auth_token',
|
|
518
|
+
});
|
|
519
|
+
// Crypto Values
|
|
520
|
+
const tinyCrypto = _.defaultsDeep({}, cfg.crypto, defaultCrypto);
|
|
521
|
+
// Crypto Values
|
|
522
|
+
const tinyURLPath = _.defaultsDeep({}, cfg.url, {
|
|
523
|
+
commandLogin: '/commandLogin',
|
|
524
|
+
botLogin: '/botLogin',
|
|
525
|
+
login: '/login',
|
|
526
|
+
logout: '/logout',
|
|
527
|
+
redirect: '/redirect',
|
|
528
|
+
firebaseLogin: '/firebase/login',
|
|
529
|
+
firebaseLogout: '/firebase/logout',
|
|
530
|
+
});
|
|
531
|
+
// Logout Firebase
|
|
532
|
+
const logout_firebase = (res, req, redirect, firebase_auth) => {
|
|
533
|
+
// Firebase Logout
|
|
534
|
+
if (cfg.firebase)
|
|
535
|
+
return discordSession.firebaseAuth.redirect.logout(req, res, redirect, req.csrfToken.now.value, firebase_auth);
|
|
536
|
+
// Normal
|
|
537
|
+
else {
|
|
538
|
+
// Get Domain
|
|
539
|
+
const tinyDomain = getDomainURL(req, cfg.port);
|
|
540
|
+
return res.redirect(tinyDomain + redirect);
|
|
541
|
+
}
|
|
542
|
+
};
|
|
543
|
+
// Logout Result
|
|
544
|
+
const logout_result = (req, user) => {
|
|
545
|
+
return new Promise(function (resolve) {
|
|
546
|
+
// Firebase Logout
|
|
547
|
+
if (cfg.firebase) {
|
|
548
|
+
// Exist User
|
|
549
|
+
if (user) {
|
|
550
|
+
// Revoke Refresh
|
|
551
|
+
cfg.firebase.auth
|
|
552
|
+
.revokeRefreshTokens(discordSession.uidGenerator(user.id))
|
|
553
|
+
.then(() => {
|
|
554
|
+
req.session = null;
|
|
555
|
+
resolve(user);
|
|
556
|
+
})
|
|
557
|
+
.catch((err) => {
|
|
558
|
+
req.session = null;
|
|
559
|
+
resolve(user);
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
// Nope
|
|
563
|
+
else {
|
|
564
|
+
req.session = null;
|
|
565
|
+
resolve();
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
// Nope
|
|
569
|
+
else {
|
|
570
|
+
req.session = null;
|
|
571
|
+
resolve(user);
|
|
572
|
+
}
|
|
573
|
+
});
|
|
574
|
+
};
|
|
575
|
+
// Remove Values
|
|
576
|
+
const removeCommandSession = function (req, callback) {
|
|
577
|
+
// Session Items
|
|
578
|
+
delete req.session[sessionVars.access_token + '_command'];
|
|
579
|
+
delete req.session[sessionVars.refresh_token + '_command'];
|
|
580
|
+
delete req.session[sessionVars.token_type + '_command'];
|
|
581
|
+
delete req.session[sessionVars.scope + '_command'];
|
|
582
|
+
// Expire In
|
|
583
|
+
delete req.session[sessionVars.token_expires_in + '_command'];
|
|
584
|
+
// Complete
|
|
585
|
+
return callback();
|
|
586
|
+
};
|
|
587
|
+
// Logout Action
|
|
588
|
+
const logout_action = function (req, csrfToken, redirect) {
|
|
589
|
+
return new Promise(function (resolve) {
|
|
590
|
+
// State
|
|
591
|
+
const state = { csrfToken: req.csrfToken.now.value };
|
|
592
|
+
// Redirect
|
|
593
|
+
if (redirect)
|
|
594
|
+
state.redirect = redirect;
|
|
595
|
+
// Result
|
|
596
|
+
const finalResult = function () {
|
|
597
|
+
discordAuth
|
|
598
|
+
.logout(req, req.session[sessionVars.access_token], {
|
|
599
|
+
// CSRF Token
|
|
600
|
+
csrfToken: csrfToken,
|
|
601
|
+
// Query
|
|
602
|
+
query: {
|
|
603
|
+
csrfToken: 'csrfToken',
|
|
604
|
+
redirect: 'redirect',
|
|
605
|
+
},
|
|
606
|
+
// State
|
|
607
|
+
state: state,
|
|
608
|
+
// Auth
|
|
609
|
+
auth: tinyAuth,
|
|
610
|
+
}, (getSessionFromCookie(req, sessionVars.access_token),
|
|
611
|
+
req.session[sessionVars.access_token]))
|
|
612
|
+
.then(resolve)
|
|
613
|
+
.catch(resolve);
|
|
614
|
+
};
|
|
615
|
+
// Normal
|
|
616
|
+
if (typeof req.session[sessionVars.access_token + '_command'] !== 'string')
|
|
617
|
+
finalResult();
|
|
618
|
+
// Remove Command Token
|
|
619
|
+
else {
|
|
620
|
+
// Prepare Auth
|
|
621
|
+
const commandAuth = clone(tinyAuth);
|
|
622
|
+
commandAuth.discordScope = ['applications.commands', 'applications.commands.update'];
|
|
623
|
+
discordAuth
|
|
624
|
+
.logout(req, req.session[sessionVars.access_token], {
|
|
625
|
+
// CSRF Token
|
|
626
|
+
csrfToken: csrfToken,
|
|
627
|
+
// Query
|
|
628
|
+
query: {
|
|
629
|
+
csrfToken: 'csrfToken',
|
|
630
|
+
redirect: 'redirect',
|
|
631
|
+
},
|
|
632
|
+
// State
|
|
633
|
+
state: state,
|
|
634
|
+
// Auth
|
|
635
|
+
auth: commandAuth,
|
|
636
|
+
}, (getSessionFromCookie(req, sessionVars.access_token),
|
|
637
|
+
req.session[sessionVars.access_token]))
|
|
638
|
+
.then((result) => {
|
|
639
|
+
removeCommandSession(req, finalResult);
|
|
640
|
+
})
|
|
641
|
+
.catch((err) => {
|
|
642
|
+
removeCommandSession(req, finalResult);
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
});
|
|
646
|
+
};
|
|
647
|
+
// Auto Logout
|
|
648
|
+
const auto_logout = function (req, err) {
|
|
649
|
+
return new Promise(function (resolve, reject) {
|
|
650
|
+
// Print Error
|
|
651
|
+
if (err)
|
|
652
|
+
tinyCfg.errorCallback(err);
|
|
653
|
+
// Result
|
|
654
|
+
logout_action(req, req.csrfToken.now.value, req.url).then((result) => {
|
|
655
|
+
// Discord Logout Complete
|
|
656
|
+
logout_result(req, result.user).then(resolve);
|
|
657
|
+
});
|
|
658
|
+
});
|
|
659
|
+
};
|
|
660
|
+
// Prepare Final Session
|
|
661
|
+
const prepare_final_session = function (req, res, err) {
|
|
662
|
+
// Firebase Auth
|
|
663
|
+
const firebase_auth = req.session[sessionVars.firebase_token];
|
|
664
|
+
if (err)
|
|
665
|
+
tinyCfg.errorCallback(err);
|
|
666
|
+
// Logout
|
|
667
|
+
auto_logout(req)
|
|
668
|
+
.then((result) => {
|
|
669
|
+
logout_firebase(res, req, result.redirect, firebase_auth);
|
|
670
|
+
})
|
|
671
|
+
.catch((err) => {
|
|
672
|
+
tinyCfg.errorCallback(err, req, res);
|
|
673
|
+
});
|
|
674
|
+
};
|
|
675
|
+
// Check Discord Session
|
|
676
|
+
const checkDiscordSession = function (req, res, next) {
|
|
677
|
+
// Rest Checker
|
|
678
|
+
const restChecker = function () {
|
|
679
|
+
// Add to Req
|
|
680
|
+
if (typeof req.session[sessionVars.access_token + '_command'] === 'string' ||
|
|
681
|
+
typeof req.session[sessionVars.access_token + '_command'] === 'number') {
|
|
682
|
+
// Add Access Command
|
|
683
|
+
req.discord_session.commands = {};
|
|
684
|
+
req.discord_session.commands.access_token =
|
|
685
|
+
req.session[sessionVars.access_token + '_command'];
|
|
686
|
+
// Other Values
|
|
687
|
+
if (typeof req.session[sessionVars.token_type + '_command'] === 'string' ||
|
|
688
|
+
typeof req.session[sessionVars.token_type + '_command'] === 'number') {
|
|
689
|
+
req.discord_session.commands.token_type =
|
|
690
|
+
req.session[sessionVars.token_type + '_command'];
|
|
691
|
+
}
|
|
692
|
+
if (typeof req.session[sessionVars.scope + '_command'] === 'string' ||
|
|
693
|
+
typeof req.session[sessionVars.scope + '_command'] === 'number')
|
|
694
|
+
req.discord_session.commands.scope = req.session[sessionVars.scope + '_command'];
|
|
695
|
+
}
|
|
696
|
+
// Need Refresh
|
|
697
|
+
if (req.utc_clock.ds_token_time_left < 1440) {
|
|
698
|
+
// Not Expired
|
|
699
|
+
if (req.utc_clock.ds_token_time_left > 0) {
|
|
700
|
+
discordAuth
|
|
701
|
+
.refreshToken(req, {
|
|
702
|
+
// Auth
|
|
703
|
+
auth: tinyAuth,
|
|
704
|
+
// Refresh Token
|
|
705
|
+
refresh_token: req.session[sessionVars.refresh_token],
|
|
706
|
+
}, getSessionFromCookie(req, sessionVars.access_token))
|
|
707
|
+
.then((result) => {
|
|
708
|
+
// Complete
|
|
709
|
+
if (result.refreshed) {
|
|
710
|
+
// Set Cookie Session
|
|
711
|
+
discordSession.set(req, result.tokenRequest);
|
|
712
|
+
// Exist Firebase
|
|
713
|
+
if (cfg.firebase) {
|
|
714
|
+
// Set New Firebase Session Data
|
|
715
|
+
const access_token = req.session[sessionVars.access_token];
|
|
716
|
+
getDiscordUser(access_token)
|
|
717
|
+
.then((user) => {
|
|
718
|
+
// Set Custom Usre Claims
|
|
719
|
+
cfg.firebase.auth
|
|
720
|
+
.setCustomUserClaims(discordSession.uidGenerator(user.id), prepare_fire_auth_discord(req, user))
|
|
721
|
+
.then(() => {
|
|
722
|
+
// Update User Data
|
|
723
|
+
/* discordSession.firebase.updateUser(access_token, user).then(function () {
|
|
724
|
+
next();
|
|
725
|
+
}).catch(error => {
|
|
726
|
+
logger.error(error);
|
|
727
|
+
prepare_final_session(req, res, error);
|
|
728
|
+
}); */
|
|
729
|
+
next();
|
|
730
|
+
})
|
|
731
|
+
.catch((err) => {
|
|
732
|
+
prepare_final_session(req, res, err);
|
|
733
|
+
});
|
|
734
|
+
})
|
|
735
|
+
.catch((err) => {
|
|
736
|
+
prepare_final_session(req, res, err);
|
|
737
|
+
});
|
|
738
|
+
}
|
|
739
|
+
// Nope
|
|
740
|
+
else
|
|
741
|
+
next();
|
|
742
|
+
}
|
|
743
|
+
// Nope
|
|
744
|
+
else
|
|
745
|
+
next();
|
|
746
|
+
})
|
|
747
|
+
.catch((err) => {
|
|
748
|
+
prepare_final_session(req, res, err);
|
|
749
|
+
});
|
|
750
|
+
}
|
|
751
|
+
// Finish the Session
|
|
752
|
+
else
|
|
753
|
+
prepare_final_session(req, res);
|
|
754
|
+
}
|
|
755
|
+
else {
|
|
756
|
+
// Exist Discord Session Data and Firebase
|
|
757
|
+
if (cfg.firebase && req.discord_session.user && objType(req.firebase_session, 'object')) {
|
|
758
|
+
// Set New Firebase Session Data
|
|
759
|
+
const access_token = req.session[sessionVars.access_token];
|
|
760
|
+
// Prepare OLD User
|
|
761
|
+
/* const oldUser = {};
|
|
762
|
+
|
|
763
|
+
// Get ID
|
|
764
|
+
oldUser.id = req.firebase_session.uid.substring(discordSession.varsTemplate.uid.length + tinyAuth.client_id.length + 1);
|
|
765
|
+
|
|
766
|
+
// Convert Username
|
|
767
|
+
oldUser.username = req.firebase_session.name.split('#');
|
|
768
|
+
|
|
769
|
+
// Get Discriminator
|
|
770
|
+
oldUser.discriminator = oldUser.username[oldUser.username.length - 1];
|
|
771
|
+
|
|
772
|
+
// Remove Discriminator
|
|
773
|
+
oldUser.username.pop();
|
|
774
|
+
|
|
775
|
+
// Insert Username
|
|
776
|
+
oldUser.username = oldUser.username.join('#');
|
|
777
|
+
|
|
778
|
+
// Get Avatar
|
|
779
|
+
oldUser.avatar = req.firebase_session.picture.substring(discordSession.varsTemplate.avatarURL.length + oldUser.id.length + 1);
|
|
780
|
+
|
|
781
|
+
// Get Email
|
|
782
|
+
oldUser.email = req.firebase_session.email;
|
|
783
|
+
oldUser.verified = req.firebase_session.email_verified; */
|
|
784
|
+
// Prepare New User
|
|
785
|
+
const user = {
|
|
786
|
+
id: req.discord_session.user.id,
|
|
787
|
+
username: req.discord_session.user.username,
|
|
788
|
+
avatar: req.discord_session.user.avatar,
|
|
789
|
+
discriminator: req.discord_session.user.discriminator,
|
|
790
|
+
email: req.discord_session.user.email,
|
|
791
|
+
verified: req.discord_session.user.verified,
|
|
792
|
+
};
|
|
793
|
+
// Update User Data
|
|
794
|
+
const make_the_update = function () {
|
|
795
|
+
/*
|
|
796
|
+
discordSession.firebase.updateUser(access_token, user, oldUser).then(function () {
|
|
797
|
+
next();
|
|
798
|
+
}).catch(error => {
|
|
799
|
+
logger.error(error);
|
|
800
|
+
prepare_final_session(req, res, error);
|
|
801
|
+
});
|
|
802
|
+
*/
|
|
803
|
+
next();
|
|
804
|
+
};
|
|
805
|
+
// Check Need Update
|
|
806
|
+
let needUpdate = false;
|
|
807
|
+
if (!objType(req.firebase_session.discord, 'object') ||
|
|
808
|
+
hash(req.firebase_session.discord) !== hash(req.discord_session.user))
|
|
809
|
+
needUpdate = true;
|
|
810
|
+
// User Verified
|
|
811
|
+
if (!needUpdate)
|
|
812
|
+
make_the_update();
|
|
813
|
+
// Nope
|
|
814
|
+
else
|
|
815
|
+
cfg.firebase.auth
|
|
816
|
+
.setCustomUserClaims(discordSession.uidGenerator(req.discord_session.user.id), prepare_fire_auth_discord(req, req.discord_session.user))
|
|
817
|
+
.then(() => make_the_update())
|
|
818
|
+
.catch((err) => prepare_final_session(req, res, err));
|
|
819
|
+
}
|
|
820
|
+
// Nope
|
|
821
|
+
else
|
|
822
|
+
next();
|
|
823
|
+
}
|
|
824
|
+
};
|
|
825
|
+
// Get Token Expiration
|
|
826
|
+
req.utc_clock.ds_token_expires_in = moment.tz(req.session[sessionVars.token_expires_in], 'Universal');
|
|
827
|
+
// Time Left
|
|
828
|
+
req.utc_clock.ds_token_time_left = req.utc_clock.ds_token_expires_in.diff(req.utc_clock.now, 'minutes');
|
|
829
|
+
// Command Time Left
|
|
830
|
+
if (!req.session[sessionVars.token_expires_in + '_command'])
|
|
831
|
+
return restChecker();
|
|
832
|
+
// Nope
|
|
833
|
+
else {
|
|
834
|
+
// Get Token Expiration
|
|
835
|
+
req.utc_clock.ds_token_expires_in_command = moment.tz(req.session[sessionVars.token_expires_in + '_command'], 'Universal');
|
|
836
|
+
// Time Left
|
|
837
|
+
req.utc_clock.ds_token_time_left_command = req.utc_clock.ds_token_expires_in.diff(req.utc_clock.now, 'minutes');
|
|
838
|
+
// Need Refresh
|
|
839
|
+
if (req.utc_clock.ds_token_time_left_command < 1440) {
|
|
840
|
+
// Prepare Auth
|
|
841
|
+
const commandAuth = clone(tinyAuth);
|
|
842
|
+
commandAuth.discordScope = ['applications.commands', 'applications.commands.update'];
|
|
843
|
+
// Logout
|
|
844
|
+
const logoutCommand = function () {
|
|
845
|
+
// Revoke Token
|
|
846
|
+
revokeToken(req.session[sessionVars.access_token + '_command'], commandAuth)
|
|
847
|
+
.then((data) => {
|
|
848
|
+
removeCommandSession(req, restChecker);
|
|
849
|
+
})
|
|
850
|
+
.catch((err) => {
|
|
851
|
+
removeCommandSession(req, restChecker);
|
|
852
|
+
});
|
|
853
|
+
};
|
|
854
|
+
// Not Expired
|
|
855
|
+
if (req.utc_clock.ds_token_time_left_command > 0) {
|
|
856
|
+
discordAuth
|
|
857
|
+
.refreshToken(req, {
|
|
858
|
+
// Auth
|
|
859
|
+
auth: commandAuth,
|
|
860
|
+
// Refresh Token
|
|
861
|
+
refresh_token: req.session[sessionVars.refresh_token + '_command'],
|
|
862
|
+
}, getSessionFromCookie(req, sessionVars.access_token))
|
|
863
|
+
.then((result) => {
|
|
864
|
+
// Complete
|
|
865
|
+
if (result.refreshed)
|
|
866
|
+
discordSession.set(req, result.tokenRequest, '_command');
|
|
867
|
+
// Rest
|
|
868
|
+
restChecker();
|
|
869
|
+
})
|
|
870
|
+
.catch(async (err) => {
|
|
871
|
+
logoutCommand();
|
|
872
|
+
});
|
|
873
|
+
}
|
|
874
|
+
// Finish the Session
|
|
875
|
+
else
|
|
876
|
+
logoutCommand();
|
|
877
|
+
}
|
|
878
|
+
else
|
|
879
|
+
restChecker();
|
|
880
|
+
}
|
|
881
|
+
};
|
|
882
|
+
// Prepare Body Parser
|
|
883
|
+
let bodyParser = {};
|
|
884
|
+
if (cfg.bodyParser) {
|
|
885
|
+
bodyParser.json = cfg.bodyParser.json();
|
|
886
|
+
bodyParser.urlencoded = cfg.bodyParser.urlencoded({ extended: true });
|
|
887
|
+
}
|
|
888
|
+
// Login Firebase
|
|
889
|
+
const firebaseLoginCallback = (req, res) => {
|
|
890
|
+
// Remove OLD Auth Token
|
|
891
|
+
req.session[sessionVars.firebase_auth_token] = null;
|
|
892
|
+
// Exist Discord
|
|
893
|
+
if (req.discord_session.user) {
|
|
894
|
+
// Exist Body
|
|
895
|
+
if (objType(req.body, 'object') && typeof req.body.token === 'string') {
|
|
896
|
+
// Exist Query
|
|
897
|
+
if (typeof req.csrfToken.now.value !== 'string' ||
|
|
898
|
+
req.csrfToken.now.value.length < 1 ||
|
|
899
|
+
(typeof req.body.csrfToken === 'string' &&
|
|
900
|
+
req.csrfToken.now.value === req.body.csrfToken)) {
|
|
901
|
+
// Prepare Module
|
|
902
|
+
const newCookie = new AuthSystem();
|
|
903
|
+
// Set Settings
|
|
904
|
+
newCookie.setCookieTimeGenerator(cfg.cookieTimeGenerator);
|
|
905
|
+
newCookie.setCheckAuthTime(cfg.checkAuthTime);
|
|
906
|
+
// Action
|
|
907
|
+
newCookie
|
|
908
|
+
.genCookieSession(cfg.firebase.auth, req.body.token)
|
|
909
|
+
.then((sessionCookie) => {
|
|
910
|
+
req.session[sessionVars.firebase_token] = sessionCookie;
|
|
911
|
+
res.json({ success: true });
|
|
912
|
+
})
|
|
913
|
+
.catch((err) => {
|
|
914
|
+
res.json({ success: false, error: err.message });
|
|
915
|
+
});
|
|
916
|
+
/* discordSession.firebase.updateUser(req.session[sessionVars.access_token], req.discord_session.user).then(function () {
|
|
917
|
+
res.json({ success: true });
|
|
918
|
+
}).catch(error => {
|
|
919
|
+
logger.error(error);
|
|
920
|
+
res.json({ success: false, error: 'Error updating user' });
|
|
921
|
+
}); */
|
|
922
|
+
}
|
|
923
|
+
// Nope
|
|
924
|
+
else
|
|
925
|
+
return res.json({ success: false, error: 'Invalid csrfToken!' });
|
|
926
|
+
}
|
|
927
|
+
// Nope
|
|
928
|
+
else
|
|
929
|
+
return res.json({ success: false, error: 'Invalid Data!' });
|
|
930
|
+
}
|
|
931
|
+
// Nope
|
|
932
|
+
else
|
|
933
|
+
return res.json({ success: false, error: 'Invalid Discord User!' });
|
|
934
|
+
};
|
|
935
|
+
if (cfg.bodyParser)
|
|
936
|
+
app.post(tinyURLPath.firebaseLogin, bodyParser.json, bodyParser.urlencoded, final_functions.sessionPlugins.getUser, final_functions.sessionPlugins.validator, firebaseLoginCallback);
|
|
937
|
+
else
|
|
938
|
+
app.post(tinyURLPath.firebaseLogin, final_functions.sessionPlugins.getUser, final_functions.sessionPlugins.validator, firebaseLoginCallback);
|
|
939
|
+
app.get(tinyURLPath.firebaseLogin, final_functions.sessionPlugins.validator, (req, res) => {
|
|
940
|
+
// Final Data
|
|
941
|
+
const final_data = {};
|
|
942
|
+
// Exist Redirect
|
|
943
|
+
if (typeof req.query.redirect === 'string')
|
|
944
|
+
final_data.redirect = '/' + req.query.redirect;
|
|
945
|
+
else
|
|
946
|
+
final_data.redirect = '/';
|
|
947
|
+
// Auth Token
|
|
948
|
+
if (typeof req.session[sessionVars.firebase_auth_token] === 'string') {
|
|
949
|
+
// Insert Data
|
|
950
|
+
if (typeof req.query.key === 'string' && req.query.key.length > 0) {
|
|
951
|
+
final_data.key = req.query.key;
|
|
952
|
+
}
|
|
953
|
+
final_data.functions = firebase_redirect.login;
|
|
954
|
+
final_data.token = req.session[sessionVars.firebase_auth_token];
|
|
955
|
+
// Complete
|
|
956
|
+
return tinyCfg.redirect.login(final_data, req, res);
|
|
957
|
+
}
|
|
958
|
+
// Nope
|
|
959
|
+
else {
|
|
960
|
+
// Get Domain
|
|
961
|
+
const tinyDomain = getDomainURL(req, cfg.port);
|
|
962
|
+
return res.redirect(tinyDomain + final_data.redirect);
|
|
963
|
+
}
|
|
964
|
+
});
|
|
965
|
+
// Logout Firebase
|
|
966
|
+
const firebaseLogoutCallback = (req, res) => {
|
|
967
|
+
req.session[sessionVars.firebase_token] = null;
|
|
968
|
+
return res.json({ success: true });
|
|
969
|
+
};
|
|
970
|
+
if (cfg.bodyParser)
|
|
971
|
+
app.post(tinyURLPath.firebaseLogout, bodyParser.json, bodyParser.urlencoded, final_functions.sessionPlugins.validator, firebaseLogoutCallback);
|
|
972
|
+
else
|
|
973
|
+
app.post(tinyURLPath.firebaseLogout, final_functions.sessionPlugins.validator, firebaseLogoutCallback);
|
|
974
|
+
app.get(tinyURLPath.firebaseLogout, final_functions.sessionPlugins.validator, (req, res) => {
|
|
975
|
+
// Final Data
|
|
976
|
+
const final_data = {};
|
|
977
|
+
// Exist Redirect
|
|
978
|
+
if (typeof req.query.redirect === 'string')
|
|
979
|
+
final_data.redirect = '/' + req.query.redirect;
|
|
980
|
+
else
|
|
981
|
+
final_data.redirect = '/';
|
|
982
|
+
// Exist Token
|
|
983
|
+
if (typeof req.query.firebase_auth === 'string') {
|
|
984
|
+
// Insert Data
|
|
985
|
+
if (typeof req.query.key === 'string' && req.query.key.length > 0) {
|
|
986
|
+
final_data.key = req.query.key;
|
|
987
|
+
}
|
|
988
|
+
final_data.originalKey = req.csrfToken.now.value;
|
|
989
|
+
final_data.functions = firebase_redirect.logout;
|
|
990
|
+
final_data.token = req.query.firebase_auth;
|
|
991
|
+
// Complete
|
|
992
|
+
return tinyCfg.redirect.logout(final_data, req, res);
|
|
993
|
+
}
|
|
994
|
+
// Nope
|
|
995
|
+
else {
|
|
996
|
+
// Get Domain
|
|
997
|
+
const tinyDomain = getDomainURL(req, cfg.port);
|
|
998
|
+
return res.redirect(tinyDomain + final_data.redirect);
|
|
999
|
+
}
|
|
1000
|
+
});
|
|
1001
|
+
// Login
|
|
1002
|
+
if (typeof tinyURLPath.login === 'string') {
|
|
1003
|
+
app.get(tinyURLPath.login, final_functions.sessionPlugins.validator, (req, res) => {
|
|
1004
|
+
// Result
|
|
1005
|
+
discordAuth.login(req, res, {
|
|
1006
|
+
// Error
|
|
1007
|
+
errorCallback: tinyCfg.errorCallback,
|
|
1008
|
+
// Crypto
|
|
1009
|
+
crypto: tinyCrypto,
|
|
1010
|
+
// Auth
|
|
1011
|
+
auth: tinyAuth,
|
|
1012
|
+
// Type
|
|
1013
|
+
type: 'login',
|
|
1014
|
+
// Query
|
|
1015
|
+
query: { redirect: 'redirect' },
|
|
1016
|
+
// State
|
|
1017
|
+
state: {
|
|
1018
|
+
csrfToken: req.csrfToken.now.value,
|
|
1019
|
+
},
|
|
1020
|
+
// Port
|
|
1021
|
+
port: cfg.port,
|
|
1022
|
+
}, getSessionFromCookie(req, sessionVars.access_token));
|
|
1023
|
+
});
|
|
1024
|
+
}
|
|
1025
|
+
// Command Login
|
|
1026
|
+
if (typeof tinyURLPath.commandLogin === 'string') {
|
|
1027
|
+
app.get(tinyURLPath.commandLogin, final_functions.sessionPlugins.validator, (req, res) => {
|
|
1028
|
+
// Prepare Auth
|
|
1029
|
+
const commandAuth = clone(tinyCommandAuth);
|
|
1030
|
+
// Result
|
|
1031
|
+
discordAuth.login(req, res, {
|
|
1032
|
+
// Error
|
|
1033
|
+
errorCallback: tinyCfg.errorCallback,
|
|
1034
|
+
// Crypto
|
|
1035
|
+
crypto: tinyCrypto,
|
|
1036
|
+
// Auth
|
|
1037
|
+
auth: commandAuth,
|
|
1038
|
+
// Type
|
|
1039
|
+
type: 'login_command',
|
|
1040
|
+
// Query
|
|
1041
|
+
query: { redirect: 'redirect' },
|
|
1042
|
+
// State
|
|
1043
|
+
state: {
|
|
1044
|
+
csrfToken: req.csrfToken.now.value,
|
|
1045
|
+
},
|
|
1046
|
+
// Port
|
|
1047
|
+
port: cfg.port,
|
|
1048
|
+
}, getSessionFromCookie(req, sessionVars.access_token));
|
|
1049
|
+
});
|
|
1050
|
+
}
|
|
1051
|
+
// Add Commands
|
|
1052
|
+
if (typeof tinyURLPath.botLogin === 'string') {
|
|
1053
|
+
app.get(tinyURLPath.botLogin, (req, res) => {
|
|
1054
|
+
return res.redirect(`${config.oauth2}?client_id=${encodeURIComponent(tinyAuth.client_id)}&scope=${encodeURIComponent(botAuth.discordScope.join(' '))}&permissions=${botAuth.permissions}`);
|
|
1055
|
+
});
|
|
1056
|
+
}
|
|
1057
|
+
// Logout
|
|
1058
|
+
app.get(tinyURLPath.logout, final_functions.sessionPlugins.validator, (req, res) => {
|
|
1059
|
+
// Firebase Auth
|
|
1060
|
+
const firebase_auth = req.session[sessionVars.firebase_token];
|
|
1061
|
+
// Result
|
|
1062
|
+
logout_action(req, req.query[sessionVars.csrfToken]).then((result) => {
|
|
1063
|
+
// Discord Logout Complete
|
|
1064
|
+
logout_result(req, result.user).then(() => {
|
|
1065
|
+
logout_firebase(res, req, result.redirect, firebase_auth);
|
|
1066
|
+
});
|
|
1067
|
+
});
|
|
1068
|
+
});
|
|
1069
|
+
// Redirect
|
|
1070
|
+
app.get(tinyURLPath.redirect, final_functions.sessionPlugins.validator, (req, res) => {
|
|
1071
|
+
// Result
|
|
1072
|
+
discordAuth
|
|
1073
|
+
.redirect(req, {
|
|
1074
|
+
// Auth
|
|
1075
|
+
auth: tinyAuth,
|
|
1076
|
+
// Crypto
|
|
1077
|
+
crypto: tinyCrypto,
|
|
1078
|
+
// Query
|
|
1079
|
+
query: { redirect: 'redirect' },
|
|
1080
|
+
// State
|
|
1081
|
+
state: {
|
|
1082
|
+
csrfToken: req.csrfToken.now.value,
|
|
1083
|
+
},
|
|
1084
|
+
}, getSessionFromCookie(req, sessionVars.access_token))
|
|
1085
|
+
.then((result) => {
|
|
1086
|
+
// New Session Result
|
|
1087
|
+
if (result.state.type === 'login' && result.newSession) {
|
|
1088
|
+
// Verified
|
|
1089
|
+
if (!tinyCfg.needEmailVerified || result.user.verified) {
|
|
1090
|
+
// Set Cookie Session
|
|
1091
|
+
discordSession.set(req, result.tokenRequest);
|
|
1092
|
+
// Set Firebase Session
|
|
1093
|
+
if (cfg.firebase) {
|
|
1094
|
+
discordSession.firebase
|
|
1095
|
+
.set(req, result.user)
|
|
1096
|
+
.then(() => {
|
|
1097
|
+
discordSession.firebaseAuth.redirect.login(req, res, result.redirect, result.state.csrfToken);
|
|
1098
|
+
})
|
|
1099
|
+
.catch((err) => {
|
|
1100
|
+
// Firebase Auth
|
|
1101
|
+
const firebase_auth = req.session[sessionVars.firebase_token];
|
|
1102
|
+
// Logout
|
|
1103
|
+
auto_logout(req, { code: 500, message: err.message })
|
|
1104
|
+
.then((result) => {
|
|
1105
|
+
logout_firebase(res, req, result.redirect, firebase_auth);
|
|
1106
|
+
})
|
|
1107
|
+
.catch((err) => {
|
|
1108
|
+
tinyCfg.errorCallback(err, req, res);
|
|
1109
|
+
});
|
|
1110
|
+
});
|
|
1111
|
+
}
|
|
1112
|
+
// Normal
|
|
1113
|
+
else {
|
|
1114
|
+
// Get Domain
|
|
1115
|
+
const tinyDomain = getDomainURL(req, cfg.port);
|
|
1116
|
+
res.redirect(tinyDomain + result.redirect);
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
// Nope
|
|
1120
|
+
else
|
|
1121
|
+
tinyCfg.errorCallback({ code: 401, message: 'This email is not a verified email!' }, req, res);
|
|
1122
|
+
}
|
|
1123
|
+
// Command
|
|
1124
|
+
else if (result.state.type === 'login_command') {
|
|
1125
|
+
// Verified
|
|
1126
|
+
if (!tinyCfg.needEmailVerified || result.user.verified) {
|
|
1127
|
+
// Set Cookie Session
|
|
1128
|
+
discordSession.set(req, result.tokenRequest, '_command');
|
|
1129
|
+
// Get Domain
|
|
1130
|
+
const tinyDomain = getDomainURL(req, cfg.port);
|
|
1131
|
+
res.redirect(tinyDomain + result.redirect);
|
|
1132
|
+
}
|
|
1133
|
+
// Nope
|
|
1134
|
+
else
|
|
1135
|
+
tinyCfg.errorCallback({ code: 401, message: 'This email is not a verified email!' }, req, res);
|
|
1136
|
+
}
|
|
1137
|
+
// Normal Redirect
|
|
1138
|
+
else {
|
|
1139
|
+
if (typeof tinyCfg.redirect[result.state.type] === 'function')
|
|
1140
|
+
tinyCfg.redirect[result.state.type](result, req, res);
|
|
1141
|
+
// Nope
|
|
1142
|
+
else {
|
|
1143
|
+
// Get Domain
|
|
1144
|
+
const tinyDomain = getDomainURL(req, cfg.port);
|
|
1145
|
+
res.redirect(tinyDomain + result.redirect);
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
})
|
|
1149
|
+
.catch((err) => {
|
|
1150
|
+
tinyCfg.errorCallback(err, req, res);
|
|
1151
|
+
});
|
|
1152
|
+
});
|
|
1153
|
+
// Complete
|
|
1154
|
+
return final_functions;
|
|
1155
|
+
}
|
|
1156
|
+
// Nope
|
|
1157
|
+
else
|
|
1158
|
+
throw new Error('Invalid Config Value!');
|
|
1159
|
+
}
|