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.
Files changed (302) hide show
  1. package/.github/FUNDING.yml +4 -0
  2. package/.github/workflows/node.js.yml +31 -0
  3. package/LICENSE +674 -0
  4. package/README.md +67 -0
  5. package/dist/TinyEssentials.min.js +1 -0
  6. package/dist/_virtual/_commonjsHelpers.cjs +7 -0
  7. package/dist/_virtual/common.cjs +5 -0
  8. package/dist/_virtual/index.cjs +9 -0
  9. package/dist/_virtual/index2.cjs +5 -0
  10. package/dist/_virtual/trace.cjs +5 -0
  11. package/dist/legacy/crypto/decrypt.cjs +57 -0
  12. package/dist/legacy/crypto/decrypt.d.mts +18 -0
  13. package/dist/legacy/crypto/decrypt.mjs +47 -0
  14. package/dist/legacy/crypto/default.cjs +23 -0
  15. package/dist/legacy/crypto/default.d.mts +35 -0
  16. package/dist/legacy/crypto/default.mjs +19 -0
  17. package/dist/legacy/crypto/encrypt.cjs +54 -0
  18. package/dist/legacy/crypto/encrypt.d.mts +19 -0
  19. package/dist/legacy/crypto/encrypt.mjs +46 -0
  20. package/dist/legacy/crypto/index.cjs +11 -0
  21. package/dist/legacy/crypto/index.d.mts +4 -0
  22. package/dist/legacy/crypto/index.mjs +6 -0
  23. package/dist/legacy/firebase/cookieSession.cjs +121 -0
  24. package/dist/legacy/firebase/cookieSession.d.mts +56 -0
  25. package/dist/legacy/firebase/cookieSession.mjs +114 -0
  26. package/dist/legacy/firebase/database/index.cjs +11 -0
  27. package/dist/legacy/firebase/database/index.d.mts +7 -0
  28. package/dist/legacy/firebase/database/index.mjs +7 -0
  29. package/dist/legacy/firebase/database/presence.cjs +131 -0
  30. package/dist/legacy/firebase/database/presence.d.mts +9 -0
  31. package/dist/legacy/firebase/database/presence.mjs +111 -0
  32. package/dist/legacy/firebase/database/saveAsync.cjs +147 -0
  33. package/dist/legacy/firebase/database/saveAsync.d.mts +54 -0
  34. package/dist/legacy/firebase/database/saveAsync.mjs +147 -0
  35. package/dist/legacy/firebase/databaseEscape.cjs +42 -0
  36. package/dist/legacy/firebase/databaseEscape.d.mts +11 -0
  37. package/dist/legacy/firebase/databaseEscape.mjs +37 -0
  38. package/dist/legacy/firebase/databaseLogger.cjs +258 -0
  39. package/dist/legacy/firebase/databaseLogger.d.mts +7 -0
  40. package/dist/legacy/firebase/databaseLogger.mjs +234 -0
  41. package/dist/legacy/firebase/discord/api/addGuildMember.cjs +71 -0
  42. package/dist/legacy/firebase/discord/api/addGuildMember.d.mts +38 -0
  43. package/dist/legacy/firebase/discord/api/addGuildMember.mjs +64 -0
  44. package/dist/legacy/firebase/discord/api/getGuildWidget.cjs +47 -0
  45. package/dist/legacy/firebase/discord/api/getGuildWidget.d.mts +17 -0
  46. package/dist/legacy/firebase/discord/api/getGuildWidget.mjs +43 -0
  47. package/dist/legacy/firebase/discord/api/getToken.cjs +67 -0
  48. package/dist/legacy/firebase/discord/api/getToken.d.mts +35 -0
  49. package/dist/legacy/firebase/discord/api/getToken.mjs +63 -0
  50. package/dist/legacy/firebase/discord/api/getUser.cjs +58 -0
  51. package/dist/legacy/firebase/discord/api/getUser.d.mts +27 -0
  52. package/dist/legacy/firebase/discord/api/getUser.mjs +54 -0
  53. package/dist/legacy/firebase/discord/api/getUserConnections.cjs +57 -0
  54. package/dist/legacy/firebase/discord/api/getUserConnections.d.mts +26 -0
  55. package/dist/legacy/firebase/discord/api/getUserConnections.mjs +53 -0
  56. package/dist/legacy/firebase/discord/api/getUserGuilds.cjs +56 -0
  57. package/dist/legacy/firebase/discord/api/getUserGuilds.d.mts +25 -0
  58. package/dist/legacy/firebase/discord/api/getUserGuilds.mjs +52 -0
  59. package/dist/legacy/firebase/discord/api/index.cjs +24 -0
  60. package/dist/legacy/firebase/discord/api/index.d.mts +19 -0
  61. package/dist/legacy/firebase/discord/api/index.mjs +20 -0
  62. package/dist/legacy/firebase/discord/api/refreshToken.cjs +77 -0
  63. package/dist/legacy/firebase/discord/api/refreshToken.d.mts +45 -0
  64. package/dist/legacy/firebase/discord/api/refreshToken.mjs +73 -0
  65. package/dist/legacy/firebase/discord/api/revokeToken.cjs +61 -0
  66. package/dist/legacy/firebase/discord/api/revokeToken.d.mts +29 -0
  67. package/dist/legacy/firebase/discord/api/revokeToken.mjs +58 -0
  68. package/dist/legacy/firebase/discord/config.cjs +21 -0
  69. package/dist/legacy/firebase/discord/config.d.mts +27 -0
  70. package/dist/legacy/firebase/discord/config.mjs +17 -0
  71. package/dist/legacy/firebase/discord/firebase_redirect/index.cjs +11 -0
  72. package/dist/legacy/firebase/discord/firebase_redirect/index.d.mts +7 -0
  73. package/dist/legacy/firebase/discord/firebase_redirect/index.mjs +7 -0
  74. package/dist/legacy/firebase/discord/firebase_redirect/login.cjs +110 -0
  75. package/dist/legacy/firebase/discord/firebase_redirect/login.d.mts +4 -0
  76. package/dist/legacy/firebase/discord/firebase_redirect/login.mjs +107 -0
  77. package/dist/legacy/firebase/discord/firebase_redirect/logout.cjs +100 -0
  78. package/dist/legacy/firebase/discord/firebase_redirect/logout.d.mts +4 -0
  79. package/dist/legacy/firebase/discord/firebase_redirect/logout.mjs +97 -0
  80. package/dist/legacy/firebase/discord/get/authURLGenerator.cjs +76 -0
  81. package/dist/legacy/firebase/discord/get/authURLGenerator.d.mts +23 -0
  82. package/dist/legacy/firebase/discord/get/authURLGenerator.mjs +67 -0
  83. package/dist/legacy/firebase/discord/get/cookie-session.cjs +32 -0
  84. package/dist/legacy/firebase/discord/get/cookie-session.d.mts +20 -0
  85. package/dist/legacy/firebase/discord/get/cookie-session.mjs +28 -0
  86. package/dist/legacy/firebase/discord/get/credentials.cjs +24 -0
  87. package/dist/legacy/firebase/discord/get/credentials.d.mts +19 -0
  88. package/dist/legacy/firebase/discord/get/credentials.mjs +20 -0
  89. package/dist/legacy/firebase/discord/get/errorValidator.cjs +60 -0
  90. package/dist/legacy/firebase/discord/get/errorValidator.d.mts +28 -0
  91. package/dist/legacy/firebase/discord/get/errorValidator.mjs +55 -0
  92. package/dist/legacy/firebase/discord/get/index.cjs +17 -0
  93. package/dist/legacy/firebase/discord/get/index.d.mts +13 -0
  94. package/dist/legacy/firebase/discord/get/index.mjs +13 -0
  95. package/dist/legacy/firebase/discord/get/randomAvatar.cjs +37 -0
  96. package/dist/legacy/firebase/discord/get/randomAvatar.d.mts +22 -0
  97. package/dist/legacy/firebase/discord/get/randomAvatar.mjs +30 -0
  98. package/dist/legacy/firebase/discord/http/index.cjs +15 -0
  99. package/dist/legacy/firebase/discord/http/index.d.mts +11 -0
  100. package/dist/legacy/firebase/discord/http/index.mjs +11 -0
  101. package/dist/legacy/firebase/discord/http/login.cjs +127 -0
  102. package/dist/legacy/firebase/discord/http/login.d.mts +21 -0
  103. package/dist/legacy/firebase/discord/http/login.mjs +123 -0
  104. package/dist/legacy/firebase/discord/http/logout.cjs +155 -0
  105. package/dist/legacy/firebase/discord/http/logout.d.mts +22 -0
  106. package/dist/legacy/firebase/discord/http/logout.mjs +143 -0
  107. package/dist/legacy/firebase/discord/http/redirect.cjs +188 -0
  108. package/dist/legacy/firebase/discord/http/redirect.d.mts +24 -0
  109. package/dist/legacy/firebase/discord/http/redirect.mjs +178 -0
  110. package/dist/legacy/firebase/discord/http/refreshToken.cjs +133 -0
  111. package/dist/legacy/firebase/discord/http/refreshToken.d.mts +24 -0
  112. package/dist/legacy/firebase/discord/http/refreshToken.mjs +121 -0
  113. package/dist/legacy/firebase/discord/index.cjs +19 -0
  114. package/dist/legacy/firebase/discord/index.d.mts +15 -0
  115. package/dist/legacy/firebase/discord/index.mjs +15 -0
  116. package/dist/legacy/firebase/discord/template/cookie-session.cjs +1430 -0
  117. package/dist/legacy/firebase/discord/template/cookie-session.d.mts +22 -0
  118. package/dist/legacy/firebase/discord/template/cookie-session.mjs +1159 -0
  119. package/dist/legacy/firebase/domainRedirect.cjs +35 -0
  120. package/dist/legacy/firebase/domainRedirect.d.mts +12 -0
  121. package/dist/legacy/firebase/domainRedirect.mjs +27 -0
  122. package/dist/legacy/firebase/escape.cjs +75 -0
  123. package/dist/legacy/firebase/escape.d.mts +17 -0
  124. package/dist/legacy/firebase/escape.mjs +58 -0
  125. package/dist/legacy/firebase/getDBAsync.cjs +33 -0
  126. package/dist/legacy/firebase/getDBAsync.d.mts +10 -0
  127. package/dist/legacy/firebase/getDBAsync.mjs +26 -0
  128. package/dist/legacy/firebase/getDBData.cjs +21 -0
  129. package/dist/legacy/firebase/getDBData.d.mts +1 -0
  130. package/dist/legacy/firebase/getDBData.mjs +17 -0
  131. package/dist/legacy/firebase/getDBValue.cjs +17 -0
  132. package/dist/legacy/firebase/getDBValue.d.mts +9 -0
  133. package/dist/legacy/firebase/getDBValue.mjs +14 -0
  134. package/dist/legacy/firebase/index.cjs +261 -0
  135. package/dist/legacy/firebase/index.d.mts +51 -0
  136. package/dist/legacy/firebase/index.mjs +234 -0
  137. package/dist/legacy/firebase/isEmulator.cjs +14 -0
  138. package/dist/legacy/firebase/isEmulator.d.mts +8 -0
  139. package/dist/legacy/firebase/isEmulator.mjs +10 -0
  140. package/dist/legacy/firebase/logger.cjs +137 -0
  141. package/dist/legacy/firebase/logger.d.mts +7 -0
  142. package/dist/legacy/firebase/logger.mjs +125 -0
  143. package/dist/legacy/firebase/mySQL.cjs +26 -0
  144. package/dist/legacy/firebase/mySQL.d.mts +10 -0
  145. package/dist/legacy/firebase/mySQL.mjs +22 -0
  146. package/dist/legacy/firebase/mysqlConnector/create.cjs +119 -0
  147. package/dist/legacy/firebase/mysqlConnector/create.d.mts +36 -0
  148. package/dist/legacy/firebase/mysqlConnector/create.mjs +109 -0
  149. package/dist/legacy/firebase/mysqlConnector/index.cjs +23 -0
  150. package/dist/legacy/firebase/mysqlConnector/index.d.mts +11 -0
  151. package/dist/legacy/firebase/mysqlConnector/index.mjs +16 -0
  152. package/dist/legacy/firebase/mysqlConnector/nextPrev.cjs +75 -0
  153. package/dist/legacy/firebase/mysqlConnector/nextPrev.d.mts +31 -0
  154. package/dist/legacy/firebase/mysqlConnector/nextPrev.mjs +63 -0
  155. package/dist/legacy/firebase/mysqlConnector/pagination.cjs +91 -0
  156. package/dist/legacy/firebase/mysqlConnector/pagination.d.mts +33 -0
  157. package/dist/legacy/firebase/mysqlConnector/pagination.mjs +87 -0
  158. package/dist/legacy/firebase/mysqlConnector/sameUser.cjs +28 -0
  159. package/dist/legacy/firebase/mysqlConnector/sameUser.d.mts +12 -0
  160. package/dist/legacy/firebase/mysqlConnector/sameUser.mjs +23 -0
  161. package/dist/legacy/firebase/transactionDBAsync.cjs +33 -0
  162. package/dist/legacy/firebase/transactionDBAsync.d.mts +11 -0
  163. package/dist/legacy/firebase/transactionDBAsync.mjs +27 -0
  164. package/dist/legacy/get/countObj.cjs +24 -0
  165. package/dist/legacy/get/countObj.d.mts +11 -0
  166. package/dist/legacy/get/countObj.mjs +21 -0
  167. package/dist/legacy/get/decimalColor.cjs +60 -0
  168. package/dist/legacy/get/decimalColor.d.mts +12 -0
  169. package/dist/legacy/get/decimalColor.mjs +54 -0
  170. package/dist/legacy/get/objType.cjs +43 -0
  171. package/dist/legacy/get/objType.d.mts +19 -0
  172. package/dist/legacy/get/objType.mjs +40 -0
  173. package/dist/legacy/get/pagination.cjs +100 -0
  174. package/dist/legacy/get/pagination.d.mts +25 -0
  175. package/dist/legacy/get/pagination.mjs +91 -0
  176. package/dist/legacy/get/queryUrlByName.cjs +31 -0
  177. package/dist/legacy/get/queryUrlByName.d.mts +20 -0
  178. package/dist/legacy/get/queryUrlByName.mjs +28 -0
  179. package/dist/legacy/get/queryUrlJSON.cjs +54 -0
  180. package/dist/legacy/get/queryUrlJSON.d.mts +23 -0
  181. package/dist/legacy/get/queryUrlJSON.mjs +57 -0
  182. package/dist/legacy/get/super_string_filter.cjs +97 -0
  183. package/dist/legacy/get/super_string_filter.d.mts +25 -0
  184. package/dist/legacy/get/super_string_filter.mjs +83 -0
  185. package/dist/legacy/get/versionCheck.cjs +49 -0
  186. package/dist/legacy/get/versionCheck.d.mts +17 -0
  187. package/dist/legacy/get/versionCheck.mjs +38 -0
  188. package/dist/legacy/http/HTTP-1.0.cjs +151 -0
  189. package/dist/legacy/http/HTTP-1.0.d.mts +8 -0
  190. package/dist/legacy/http/HTTP-1.0.mjs +136 -0
  191. package/dist/legacy/http/auth.cjs +70 -0
  192. package/dist/legacy/http/auth.d.mts +41 -0
  193. package/dist/legacy/http/auth.mjs +63 -0
  194. package/dist/legacy/http/check_domain.cjs +84 -0
  195. package/dist/legacy/http/check_domain.d.mts +10 -0
  196. package/dist/legacy/http/check_domain.mjs +82 -0
  197. package/dist/legacy/http/csrfTokenAnalyze.cjs +46 -0
  198. package/dist/legacy/http/csrfTokenAnalyze.d.mts +21 -0
  199. package/dist/legacy/http/csrfTokenAnalyze.mjs +40 -0
  200. package/dist/legacy/http/domainValidator.cjs +98 -0
  201. package/dist/legacy/http/domainValidator.d.mts +30 -0
  202. package/dist/legacy/http/domainValidator.mjs +82 -0
  203. package/dist/legacy/http/errorsCallback.cjs +55 -0
  204. package/dist/legacy/http/errorsCallback.d.mts +29 -0
  205. package/dist/legacy/http/errorsCallback.mjs +48 -0
  206. package/dist/legacy/http/fetch/json.cjs +48 -0
  207. package/dist/legacy/http/fetch/json.d.mts +22 -0
  208. package/dist/legacy/http/fetch/json.mjs +41 -0
  209. package/dist/legacy/http/fetch/text.cjs +47 -0
  210. package/dist/legacy/http/fetch/text.d.mts +21 -0
  211. package/dist/legacy/http/fetch/text.mjs +40 -0
  212. package/dist/legacy/http/fileCache.cjs +79 -0
  213. package/dist/legacy/http/fileCache.d.mts +35 -0
  214. package/dist/legacy/http/fileCache.mjs +70 -0
  215. package/dist/legacy/http/getDomainURL.cjs +59 -0
  216. package/dist/legacy/http/getDomainURL.d.mts +18 -0
  217. package/dist/legacy/http/getDomainURL.mjs +54 -0
  218. package/dist/legacy/http/userIP.cjs +59 -0
  219. package/dist/legacy/http/userIP.d.mts +21 -0
  220. package/dist/legacy/http/userIP.mjs +48 -0
  221. package/dist/legacy/index.cjs +122 -0
  222. package/dist/legacy/index.d.mts +89 -0
  223. package/dist/legacy/index.mjs +92 -0
  224. package/dist/legacy/libs/arraySortPositions.cjs +30 -0
  225. package/dist/legacy/libs/arraySortPositions.d.mts +16 -0
  226. package/dist/legacy/libs/arraySortPositions.mjs +27 -0
  227. package/dist/legacy/libs/capitalize.cjs +21 -0
  228. package/dist/legacy/libs/capitalize.d.mts +13 -0
  229. package/dist/legacy/libs/capitalize.mjs +17 -0
  230. package/dist/legacy/libs/convertBytes.cjs +64 -0
  231. package/dist/legacy/libs/convertBytes.d.mts +17 -0
  232. package/dist/legacy/libs/convertBytes.mjs +55 -0
  233. package/dist/legacy/libs/custom_module_loader.cjs +82 -0
  234. package/dist/legacy/libs/custom_module_loader.d.mts +5 -0
  235. package/dist/legacy/libs/custom_module_loader.mjs +79 -0
  236. package/dist/legacy/libs/dice.cjs +35 -0
  237. package/dist/legacy/libs/dice.d.mts +5 -0
  238. package/dist/legacy/libs/dice.mjs +31 -0
  239. package/dist/legacy/libs/markdown.cjs +85 -0
  240. package/dist/legacy/libs/markdown.d.mts +75 -0
  241. package/dist/legacy/libs/markdown.mjs +78 -0
  242. package/dist/legacy/libs/percentage.cjs +22 -0
  243. package/dist/legacy/libs/percentage.d.mts +4 -0
  244. package/dist/legacy/libs/percentage.mjs +19 -0
  245. package/dist/legacy/libs/regex/getLetter.cjs +22 -0
  246. package/dist/legacy/libs/regex/getLetter.d.mts +12 -0
  247. package/dist/legacy/libs/regex/getLetter.mjs +19 -0
  248. package/dist/legacy/libs/replaceAsync.cjs +32 -0
  249. package/dist/legacy/libs/replaceAsync.d.mts +15 -0
  250. package/dist/legacy/libs/replaceAsync.mjs +25 -0
  251. package/dist/legacy/libs/rule3.cjs +58 -0
  252. package/dist/legacy/libs/rule3.d.mts +5 -0
  253. package/dist/legacy/libs/rule3.mjs +54 -0
  254. package/dist/legacy/libs/userLevel.cjs +134 -0
  255. package/dist/legacy/libs/userLevel.d.mts +69 -0
  256. package/dist/legacy/libs/userLevel.mjs +123 -0
  257. package/dist/legacy/momentjs/getAge.cjs +28 -0
  258. package/dist/legacy/momentjs/getAge.d.mts +8 -0
  259. package/dist/legacy/momentjs/getAge.mjs +22 -0
  260. package/dist/legacy/momentjs/index.cjs +9 -0
  261. package/dist/legacy/momentjs/index.d.mts +3 -0
  262. package/dist/legacy/momentjs/index.mjs +3 -0
  263. package/dist/legacy/momentjs/timeDuration.cjs +29 -0
  264. package/dist/legacy/momentjs/timeDuration.d.mts +9 -0
  265. package/dist/legacy/momentjs/timeDuration.mjs +23 -0
  266. package/dist/legacy/socket.io/antiFlood/index.cjs +9 -0
  267. package/dist/legacy/socket.io/antiFlood/index.d.mts +3 -0
  268. package/dist/legacy/socket.io/antiFlood/index.mjs +3 -0
  269. package/dist/legacy/socket.io/antiFlood/install.cjs +32 -0
  270. package/dist/legacy/socket.io/antiFlood/install.d.mts +14 -0
  271. package/dist/legacy/socket.io/antiFlood/install.mjs +27 -0
  272. package/dist/legacy/socket.io/antiFlood/verify.cjs +87 -0
  273. package/dist/legacy/socket.io/antiFlood/verify.d.mts +15 -0
  274. package/dist/legacy/socket.io/antiFlood/verify.mjs +73 -0
  275. package/dist/legacy/socket.io/cookie-session.cjs +25 -0
  276. package/dist/legacy/socket.io/cookie-session.d.mts +9 -0
  277. package/dist/legacy/socket.io/cookie-session.mjs +20 -0
  278. package/dist/legacy/socket.io/discord.cjs +61 -0
  279. package/dist/legacy/socket.io/discord.d.mts +10 -0
  280. package/dist/legacy/socket.io/discord.mjs +52 -0
  281. package/dist/legacy/socket.io/index.cjs +13 -0
  282. package/dist/legacy/socket.io/index.d.mts +9 -0
  283. package/dist/legacy/socket.io/index.mjs +9 -0
  284. package/dist/v1/basics/array.cjs +31 -0
  285. package/dist/v1/basics/array.d.mts +10 -0
  286. package/dist/v1/basics/array.mjs +22 -0
  287. package/dist/v1/basics/clock.cjs +187 -0
  288. package/dist/v1/basics/clock.d.mts +37 -0
  289. package/dist/v1/basics/clock.mjs +152 -0
  290. package/dist/v1/basics/objFilter.cjs +55 -0
  291. package/dist/v1/basics/objFilter.d.mts +27 -0
  292. package/dist/v1/basics/objFilter.mjs +52 -0
  293. package/dist/v1/basics/simpleMath.cjs +88 -0
  294. package/dist/v1/basics/simpleMath.d.mts +54 -0
  295. package/dist/v1/basics/simpleMath.mjs +75 -0
  296. package/dist/v1/basics/text.cjs +34 -0
  297. package/dist/v1/basics/text.d.mts +20 -0
  298. package/dist/v1/basics/text.mjs +25 -0
  299. package/dist/v1/index.cjs +26 -0
  300. package/dist/v1/index.d.mts +15 -0
  301. package/dist/v1/index.mjs +8 -0
  302. 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
+ }