protonfile-auth 1.6.0 → 1.6.3

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.
@@ -1,3 +1,3 @@
1
1
  import { Request, Response } from 'express';
2
- declare const _default: (_req: Request, res: Response) => Promise<Response<any, Record<string, any>> | undefined>;
2
+ declare const _default: (req: Request, res: Response) => Promise<Response<any, Record<string, any>> | undefined>;
3
3
  export default _default;
@@ -11,11 +11,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  const auth_1 = require("../services/auth");
13
13
  const session_1 = require("../services/session");
14
- exports.default = (_req, res) => __awaiter(void 0, void 0, void 0, function* () {
14
+ exports.default = (req, res) => __awaiter(void 0, void 0, void 0, function* () {
15
15
  yield (0, auth_1.clearRefreshTokenCookie)(res);
16
16
  yield (0, session_1.clearSessionCookie)(res);
17
+ const sessionCache = req.sessionCache;
17
18
  try {
18
- const session_id = JSON.parse(_req.cookies.session_id).session_id;
19
+ const session_id = JSON.parse(req.cookies.session_id).session_id;
20
+ sessionCache.set(session_id, 60 * 15);
19
21
  yield (0, session_1.deleteSession)(session_id);
20
22
  }
21
23
  catch (err) {
@@ -44,6 +44,9 @@ exports.default = (req, res) => __awaiter(void 0, void 0, void 0, function* () {
44
44
  (0, auth_1.setRefreshTokenCookie)(res, (0, auth_1.createRefreshToken)({ user_id: user.user_id }));
45
45
  return res.send({
46
46
  ok: true,
47
- accessToken: (0, auth_1.createAccessToken)({ user_id: user.user_id }),
47
+ accessToken: (0, auth_1.createAccessToken)({
48
+ user_id: user.user_id,
49
+ session_id: JSON.parse(session).session_id,
50
+ }),
48
51
  });
49
52
  });
@@ -17,7 +17,7 @@ exports.default = (req, res) => __awaiter(void 0, void 0, void 0, function* () {
17
17
  const user = yield User_1.User.findOne({ email });
18
18
  if (!user)
19
19
  return res.sendStatus(403);
20
- const otp = yield OTP_1.OTP.findOne({ code, user_id: user.user_id });
20
+ const otp = yield OTP_1.OTP.findOne({ code, user_id: user.user_id, scope: 'registration' });
21
21
  if (!otp)
22
22
  return res.sendStatus(404);
23
23
  yield OTP_1.OTP.delete({ code: otp.code });
package/lib/index.d.ts CHANGED
@@ -9,6 +9,7 @@ import { TempTokenService } from './services/TempToken';
9
9
  import SessionCleaner from './services/SessionCleaner';
10
10
  import { OTP } from './Entities/OTP';
11
11
  import OTPVacuum from './services/OTPVacuum';
12
+ import SessionCache from './services/SessionCache';
12
13
  declare const _default: {
13
14
  router: (typeormConfig: ConnectionOptions) => import("express-serve-static-core").Router;
14
15
  authMiddleware: (req: express.Request<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>, res: express.Response<any, Record<string, any>>, next: express.NextFunction) => Promise<void | express.Response<any, Record<string, any>>>;
@@ -22,6 +23,7 @@ declare const _default: {
22
23
  TempTokenService: typeof TempTokenService;
23
24
  SessionCleaner: typeof SessionCleaner;
24
25
  OTPVacuum: typeof OTPVacuum;
26
+ sessionCache: SessionCache;
25
27
  };
26
28
  };
27
29
  export default _default;
package/lib/index.js CHANGED
@@ -23,6 +23,9 @@ const SessionCleaner_1 = __importDefault(require("./services/SessionCleaner"));
23
23
  const OTP_1 = require("./Entities/OTP");
24
24
  const OTPVacuum_1 = __importDefault(require("./services/OTPVacuum"));
25
25
  const registerOtp_1 = __importDefault(require("./controllers/registerOtp"));
26
+ const SessionCache_1 = __importDefault(require("./services/SessionCache"));
27
+ const appendSessionCache_1 = __importDefault(require("./middlewares/appendSessionCache"));
28
+ const sessionCache = new SessionCache_1.default();
26
29
  exports.default = {
27
30
  router: (typeormConfig) => {
28
31
  (0, typeorm_1.createConnection)(Object.assign(Object.assign({}, typeormConfig), { entities: [User_1.User, Session_1.Session, TempToken_1.TempToken, OTP_1.OTP] })).then((connection) => {
@@ -30,6 +33,11 @@ exports.default = {
30
33
  Session_1.Session.useConnection(connection);
31
34
  TempToken_1.TempToken.useConnection(connection);
32
35
  OTP_1.OTP.useConnection(connection);
36
+ TempToken_1.TempToken.find().then((res) => {
37
+ for (const session of res) {
38
+ sessionCache.set(session.token, (session.expires - Date.now()) / 1000);
39
+ }
40
+ });
33
41
  });
34
42
  const router = express_1.default.Router();
35
43
  router.use(body_parser_1.default.urlencoded({ extended: false }));
@@ -37,14 +45,14 @@ exports.default = {
37
45
  router.post('/register/otp', registerOtp_1.default);
38
46
  router.post('/login', (0, cookie_parser_1.default)(), login_1.default);
39
47
  router.post('/refresh_token', (0, cookie_parser_1.default)(), refresh_token_1.default);
40
- router.post('/logout', (0, cookie_parser_1.default)(), logout_1.default);
48
+ router.post('/logout', appendSessionCache_1.default.bind(null, sessionCache), (0, cookie_parser_1.default)(), logout_1.default);
41
49
  router.get('/qr', (0, cookie_parser_1.default)(), qr_1.get);
42
- router.post('/qr', verifyToken_1.default, qr_1.post);
50
+ router.post('/qr', verifyToken_1.default.bind(null, sessionCache), qr_1.post);
43
51
  router.get('/change_password/:email', change_password_1.get);
44
52
  router.post('/change_password', change_password_1.post);
45
53
  return router;
46
54
  },
47
- authMiddleware: verifyToken_1.default,
55
+ authMiddleware: verifyToken_1.default.bind(null, sessionCache),
48
56
  entities: { User: User_1.User, Session: Session_1.Session, TempToken: TempToken_1.TempToken, OTP: OTP_1.OTP },
49
- services: { TempTokenService: TempToken_2.TempTokenService, SessionCleaner: SessionCleaner_1.default, OTPVacuum: OTPVacuum_1.default },
57
+ services: { TempTokenService: TempToken_2.TempTokenService, SessionCleaner: SessionCleaner_1.default, OTPVacuum: OTPVacuum_1.default, sessionCache },
50
58
  };
@@ -0,0 +1,4 @@
1
+ import { NextFunction, Request, Response } from 'express';
2
+ import SessionCache from '../services/SessionCache';
3
+ declare const appendSessionCache: (sessionCache: SessionCache, req: Request, _res: Response, next: NextFunction) => void;
4
+ export default appendSessionCache;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const appendSessionCache = (sessionCache, req, _res, next) => {
4
+ req.sessionCache = sessionCache;
5
+ next();
6
+ };
7
+ exports.default = appendSessionCache;
@@ -1,3 +1,4 @@
1
1
  import { NextFunction, Request, Response } from 'express';
2
- declare const _default: (req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
2
+ import SessionCache from '../services/SessionCache';
3
+ declare const _default: (cache: SessionCache, req: Request, res: Response, next: NextFunction) => Promise<void | Response<any, Record<string, any>>>;
3
4
  export default _default;
@@ -13,12 +13,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
16
- exports.default = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
16
+ exports.default = (cache, req, res, next) => __awaiter(void 0, void 0, void 0, function* () {
17
17
  const config = process.env;
18
18
  const token = req.body.token || req.query.token || req.headers['x-access-token'];
19
19
  if (!token) {
20
20
  return res.status(403).send('A token is required for authentication');
21
21
  }
22
+ const decoded = jsonwebtoken_1.default.decode(token);
23
+ if (cache.has(decoded.session_id)) {
24
+ return res.status(401).send('Token expired');
25
+ }
22
26
  try {
23
27
  const decoded = jsonwebtoken_1.default.verify(token, config.ACCESS_TOKEN_KEY);
24
28
  req.user = decoded;
@@ -0,0 +1,8 @@
1
+ import NodeCache from 'node-cache';
2
+ declare class SessionCache {
3
+ cache: NodeCache;
4
+ constructor();
5
+ set(session: string, ttl: number): boolean;
6
+ has(session: string): boolean;
7
+ }
8
+ export default SessionCache;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_cache_1 = __importDefault(require("node-cache"));
7
+ const TempToken_1 = require("../Entities/TempToken");
8
+ class SessionCache {
9
+ constructor() {
10
+ this.cache = new node_cache_1.default();
11
+ }
12
+ set(session, ttl) {
13
+ const tempToken = new TempToken_1.TempToken();
14
+ tempToken.token = session;
15
+ tempToken.expires = Date.now() + (15 * 60000 + 0);
16
+ tempToken
17
+ .save()
18
+ .catch((err) => console.log('Error while persisting session', err));
19
+ return this.cache.set(session, undefined, ttl);
20
+ }
21
+ has(session) {
22
+ return this.cache.has(session);
23
+ }
24
+ }
25
+ exports.default = SessionCache;
@@ -15,7 +15,7 @@ const uuid_1 = require("uuid");
15
15
  const Session_1 = require("../Entities/Session");
16
16
  const session_1 = require("./session");
17
17
  const createAccessToken = (payload) => {
18
- return (0, jsonwebtoken_1.sign)({ user_id: payload.user_id }, process.env.ACCESS_TOKEN_KEY, {
18
+ return (0, jsonwebtoken_1.sign)({ user_id: payload.user_id, session_id: payload.session_id }, process.env.ACCESS_TOKEN_KEY, {
19
19
  expiresIn: '15m',
20
20
  });
21
21
  };
@@ -53,7 +53,7 @@ const generateQrAuth = () => __awaiter(void 0, void 0, void 0, function* () {
53
53
  exports.generateQrAuth = generateQrAuth;
54
54
  const performLogin = (req, res, user) => {
55
55
  return new Promise((resolve, reject) => __awaiter(void 0, void 0, void 0, function* () {
56
- const token = (0, exports.createAccessToken)({ user_id: user.user_id });
56
+ let session_id;
57
57
  (0, exports.setRefreshTokenCookie)(res, (0, exports.createRefreshToken)({
58
58
  user_id: user.user_id,
59
59
  }));
@@ -62,6 +62,7 @@ const performLogin = (req, res, user) => {
62
62
  try {
63
63
  (0, session_1.verifySessionToken)(session.token);
64
64
  const newSession = yield (0, session_1.bumpSessionToken)(session.session_id);
65
+ session_id = newSession.session_id;
65
66
  (0, session_1.setSessionCookie)(res, JSON.stringify(newSession));
66
67
  }
67
68
  catch (err) {
@@ -78,6 +79,7 @@ const performLogin = (req, res, user) => {
78
79
  if (!session) {
79
80
  return;
80
81
  }
82
+ session_id = session.session_id;
81
83
  (0, session_1.setSessionCookie)(res, JSON.stringify(session));
82
84
  }
83
85
  }
@@ -93,8 +95,10 @@ const performLogin = (req, res, user) => {
93
95
  if (!session) {
94
96
  return;
95
97
  }
98
+ session_id = session.session_id;
96
99
  (0, session_1.setSessionCookie)(res, JSON.stringify(session));
97
100
  }
101
+ const token = (0, exports.createAccessToken)({ user_id: user.user_id, session_id });
98
102
  resolve(token);
99
103
  }));
100
104
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "protonfile-auth",
3
- "version": "1.6.0",
3
+ "version": "1.6.3",
4
4
  "description": "protonfile-auth",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -34,6 +34,7 @@
34
34
  "express": "^4.17.1",
35
35
  "handlebars": "^4.7.7",
36
36
  "jsonwebtoken": "^8.5.1",
37
+ "node-cache": "^5.1.2",
37
38
  "nodemailer": "^6.7.0",
38
39
  "pg": "^8.7.1",
39
40
  "typeorm": "^0.2.38",