protonfile-auth 1.0.8 → 1.1.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.
@@ -0,0 +1,6 @@
1
+ import { BaseEntity } from 'typeorm';
2
+ import { User } from './User';
3
+ export declare class QRSession extends BaseEntity {
4
+ auth_id: string;
5
+ user: User;
6
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.QRSession = void 0;
10
+ const typeorm_1 = require("typeorm");
11
+ const User_1 = require("./User");
12
+ let QRSession = class QRSession extends typeorm_1.BaseEntity {
13
+ };
14
+ __decorate([
15
+ (0, typeorm_1.PrimaryGeneratedColumn)('uuid')
16
+ ], QRSession.prototype, "auth_id", void 0);
17
+ __decorate([
18
+ (0, typeorm_1.ManyToOne)(() => User_1.User, { nullable: false }),
19
+ (0, typeorm_1.JoinColumn)({ name: 'user_id' })
20
+ ], QRSession.prototype, "user", void 0);
21
+ QRSession = __decorate([
22
+ (0, typeorm_1.Entity)()
23
+ ], QRSession);
24
+ exports.QRSession = QRSession;
@@ -15,14 +15,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  const bcryptjs_1 = __importDefault(require("bcryptjs"));
16
16
  const auth_1 = require("../services/auth");
17
17
  const User_1 = require("../Entities/User");
18
- const Session_1 = require("../Entities/Session");
19
- const session_1 = require("../services/session");
20
18
  exports.default = (req, res) => __awaiter(void 0, void 0, void 0, function* () {
21
19
  try {
22
20
  const { email, password } = req.body;
23
- if (process.env.NODE_ENV === 'debug') {
24
- console.debug(email, password, req.body);
25
- }
26
21
  if (!(email && password)) {
27
22
  return res.status(400).send('All input is required');
28
23
  }
@@ -32,44 +27,9 @@ exports.default = (req, res) => __awaiter(void 0, void 0, void 0, function* () {
32
27
  }
33
28
  if (user && (yield bcryptjs_1.default.compare(password, user.password))) {
34
29
  // Create token
35
- const token = (0, auth_1.createAccessToken)({ user_id: user.user_id });
36
- (0, auth_1.setRefreshTokenCookie)(res, (0, auth_1.createRefreshToken)({
37
- user_id: user.user_id,
38
- }));
39
- if (req.cookies.session_id) {
40
- const session = JSON.parse(req.cookies.session_id);
41
- try {
42
- (0, session_1.verifySessionToken)(session.token);
43
- const newSession = yield (0, session_1.bumpSessionToken)(session.session_id);
44
- (0, session_1.setSessionCookie)(res, JSON.stringify(newSession));
45
- }
46
- catch (err) {
47
- res.clearCookie('session_id');
48
- res.clearCookie('jid');
49
- if (process.env.NODE_ENV === 'debug') {
50
- console.debug(err);
51
- }
52
- }
53
- }
54
- else {
55
- const insert = yield Session_1.Session.insert({
56
- token: (0, session_1.createSessionToken)({ user_id: user.user_id }),
57
- user_id: user.user_id,
58
- user_agent: req.headers['user-agent'] || 'Unknown',
59
- });
60
- const session = yield Session_1.Session.findOne({
61
- session_id: insert.generatedMaps[0].session_id,
62
- });
63
- if (!session) {
64
- return;
65
- }
66
- (0, session_1.setSessionCookie)(res, JSON.stringify(session));
67
- }
30
+ const token = yield (0, auth_1.performLogin)(req, res, user);
68
31
  return res.status(200).json(Object.assign(Object.assign({}, user), { token }));
69
32
  }
70
- if (process.env.NODE_ENV === 'debug') {
71
- console.debug(user, yield bcryptjs_1.default.compare(password, user.password));
72
- }
73
33
  res.status(400).send('Invalid Credentials');
74
34
  }
75
35
  catch (err) {
@@ -1,3 +1,3 @@
1
1
  import { Request, Response } from 'express';
2
- declare const _default: (_req: Request, res: Response) => void;
2
+ declare const _default: (_req: Request, res: Response) => Promise<void>;
3
3
  export default _default;
@@ -1,7 +1,18 @@
1
1
  "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = (_req, res) => {
4
- res.clearCookie('jid');
5
- res.clearCookie('session_id');
12
+ const auth_1 = require("../services/auth");
13
+ const session_1 = require("../services/session");
14
+ exports.default = (_req, res) => __awaiter(void 0, void 0, void 0, function* () {
15
+ yield (0, auth_1.clearRefreshTokenCookie)(res);
16
+ yield (0, session_1.clearSessionCookie)(res);
6
17
  res.sendStatus(200);
7
- };
18
+ });
@@ -0,0 +1,3 @@
1
+ import { Request, Response } from 'express';
2
+ export declare const get: (req: Request, res: Response) => Promise<Response<any, Record<string, any>> | undefined>;
3
+ export declare const post: (req: Request, res: Response) => Promise<Response<any, Record<string, any>> | undefined>;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.post = exports.get = void 0;
16
+ const auth_1 = require("../services/auth");
17
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
18
+ const events_1 = __importDefault(require("events"));
19
+ const User_1 = require("../Entities/User");
20
+ const emitter = new events_1.default();
21
+ const get = (req, res) => __awaiter(void 0, void 0, void 0, function* () {
22
+ if (!req.query.request_id) {
23
+ const request = yield (0, auth_1.generateQrAuth)();
24
+ return res.send(request);
25
+ }
26
+ const request_id = req.query.request_id;
27
+ if (typeof request_id !== 'string') {
28
+ return res.sendStatus(400);
29
+ }
30
+ emitter.on(request_id, (user) => __awaiter(void 0, void 0, void 0, function* () {
31
+ const token = yield (0, auth_1.performLogin)(req, res, user);
32
+ return res.status(200).json(Object.assign(Object.assign({}, user), { token }));
33
+ }));
34
+ });
35
+ exports.get = get;
36
+ const post = (req, res) => __awaiter(void 0, void 0, void 0, function* () {
37
+ try {
38
+ const token = jsonwebtoken_1.default.verify(req.body.qr_token, process.env.ACCESS_TOKEN_KEY);
39
+ if (typeof token === 'string') {
40
+ return res.sendStatus(500);
41
+ }
42
+ const user = yield User_1.User.findOne({ user_id: req.user.user_id });
43
+ if (!user) {
44
+ throw 'User not found';
45
+ }
46
+ emitter.emit(token.auth_id, user);
47
+ res.sendStatus(200);
48
+ }
49
+ catch (err) {
50
+ res.status(500).send(err);
51
+ }
52
+ });
53
+ exports.post = post;
@@ -34,7 +34,7 @@ exports.default = (req, res) => __awaiter(void 0, void 0, void 0, function* () {
34
34
  }
35
35
  catch (err) {
36
36
  console.log(err);
37
- res.clearCookie('session_id');
37
+ yield (0, session_1.clearSessionCookie)(res);
38
38
  return res.sendStatus(403);
39
39
  }
40
40
  const user = yield User_1.User.findOne({ user_id: payload.user_id });
package/lib/index.js CHANGED
@@ -11,6 +11,7 @@ const login_1 = __importDefault(require("./controllers/login"));
11
11
  const verifyToken_1 = __importDefault(require("./middlewares/verifyToken"));
12
12
  const refresh_token_1 = __importDefault(require("./controllers/refresh_token"));
13
13
  const logout_1 = __importDefault(require("./controllers/logout"));
14
+ const qr_1 = require("./controllers/qr");
14
15
  const cookie_parser_1 = __importDefault(require("cookie-parser"));
15
16
  const typeorm_1 = require("typeorm");
16
17
  const User_1 = require("./Entities/User");
@@ -24,6 +25,8 @@ exports.default = {
24
25
  router.post('/login', (0, cookie_parser_1.default)(), login_1.default);
25
26
  router.post('/refresh_token', (0, cookie_parser_1.default)(), refresh_token_1.default);
26
27
  router.post('/logout', (0, cookie_parser_1.default)(), logout_1.default);
28
+ router.get('/qr', (0, cookie_parser_1.default)(), qr_1.get);
29
+ router.post('/qr', verifyToken_1.default, qr_1.post);
27
30
  return router;
28
31
  },
29
32
  authMiddleware: verifyToken_1.default,
@@ -1,4 +1,11 @@
1
- import { Response } from 'express';
1
+ import { Response, Request } from 'express';
2
+ import { User } from '../Entities/User';
2
3
  export declare const createAccessToken: (payload: any) => string;
3
4
  export declare const createRefreshToken: (payload: any) => string;
4
5
  export declare const setRefreshTokenCookie: (res: Response, value: string) => Promise<void>;
6
+ export declare const clearRefreshTokenCookie: (res: Response) => Promise<Response<any, Record<string, any>>>;
7
+ export declare const generateQrAuth: () => Promise<{
8
+ request_id: string;
9
+ token: string;
10
+ }>;
11
+ export declare const performLogin: (req: Request, res: Response, user: User) => Promise<string>;
@@ -9,8 +9,11 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.setRefreshTokenCookie = exports.createRefreshToken = exports.createAccessToken = void 0;
12
+ exports.performLogin = exports.generateQrAuth = exports.clearRefreshTokenCookie = exports.setRefreshTokenCookie = exports.createRefreshToken = exports.createAccessToken = void 0;
13
13
  const jsonwebtoken_1 = require("jsonwebtoken");
14
+ const uuid_1 = require("uuid");
15
+ const Session_1 = require("../Entities/Session");
16
+ const session_1 = require("./session");
14
17
  const createAccessToken = (payload) => {
15
18
  return (0, jsonwebtoken_1.sign)({ user_id: payload.user_id }, process.env.ACCESS_TOKEN_KEY, {
16
19
  expiresIn: '15m',
@@ -34,3 +37,65 @@ const setRefreshTokenCookie = (res, value) => __awaiter(void 0, void 0, void 0,
34
37
  });
35
38
  });
36
39
  exports.setRefreshTokenCookie = setRefreshTokenCookie;
40
+ const clearRefreshTokenCookie = (res) => __awaiter(void 0, void 0, void 0, function* () {
41
+ return res.clearCookie('jid');
42
+ });
43
+ exports.clearRefreshTokenCookie = clearRefreshTokenCookie;
44
+ const generateQrAuth = () => __awaiter(void 0, void 0, void 0, function* () {
45
+ const id = (0, uuid_1.v4)();
46
+ return {
47
+ request_id: id,
48
+ token: (0, jsonwebtoken_1.sign)({ auth_id: id }, process.env.ACCESS_TOKEN_KEY, {
49
+ expiresIn: '5m',
50
+ }),
51
+ };
52
+ });
53
+ exports.generateQrAuth = generateQrAuth;
54
+ const performLogin = (req, res, user) => {
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 });
57
+ (0, exports.setRefreshTokenCookie)(res, (0, exports.createRefreshToken)({
58
+ user_id: user.user_id,
59
+ }));
60
+ if (req.cookies.session_id) {
61
+ const session = JSON.parse(req.cookies.session_id);
62
+ try {
63
+ (0, session_1.verifySessionToken)(session.token);
64
+ const newSession = yield (0, session_1.bumpSessionToken)(session.session_id);
65
+ (0, session_1.setSessionCookie)(res, JSON.stringify(newSession));
66
+ }
67
+ catch (err) {
68
+ yield (0, session_1.clearSessionCookie)(res);
69
+ yield (0, exports.clearRefreshTokenCookie)(res);
70
+ const insert = yield Session_1.Session.insert({
71
+ token: (0, session_1.createSessionToken)({ user_id: user.user_id }),
72
+ user_id: user.user_id,
73
+ user_agent: req.headers['user-agent'] || 'Unknown',
74
+ });
75
+ const session = yield Session_1.Session.findOne({
76
+ session_id: insert.generatedMaps[0].session_id,
77
+ });
78
+ if (!session) {
79
+ return;
80
+ }
81
+ (0, session_1.setSessionCookie)(res, JSON.stringify(session));
82
+ }
83
+ }
84
+ else {
85
+ const insert = yield Session_1.Session.insert({
86
+ token: (0, session_1.createSessionToken)({ user_id: user.user_id }),
87
+ user_id: user.user_id,
88
+ user_agent: req.headers['user-agent'] || 'Unknown',
89
+ });
90
+ const session = yield Session_1.Session.findOne({
91
+ session_id: insert.generatedMaps[0].session_id,
92
+ });
93
+ if (!session) {
94
+ return;
95
+ }
96
+ (0, session_1.setSessionCookie)(res, JSON.stringify(session));
97
+ }
98
+ resolve(token);
99
+ }));
100
+ };
101
+ exports.performLogin = performLogin;
@@ -5,3 +5,4 @@ export declare const verifySessionToken: (token: string) => string | import("jso
5
5
  export declare const bumpSessionToken: (session_id: string) => Promise<Session>;
6
6
  export declare const compareSessionTokenVersion: (session_id: string, token: string) => Promise<import("jsonwebtoken").JwtPayload>;
7
7
  export declare const setSessionCookie: (res: Response, value: string) => Promise<void>;
8
+ export declare const clearSessionCookie: (res: Response) => Promise<Response<any, Record<string, any>>>;
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.setSessionCookie = exports.compareSessionTokenVersion = exports.bumpSessionToken = exports.verifySessionToken = exports.createSessionToken = void 0;
12
+ exports.clearSessionCookie = exports.setSessionCookie = exports.compareSessionTokenVersion = exports.bumpSessionToken = exports.verifySessionToken = exports.createSessionToken = void 0;
13
13
  const jsonwebtoken_1 = require("jsonwebtoken");
14
14
  const Session_1 = require("../Entities/Session");
15
15
  const createSessionToken = (payload, version) => {
@@ -76,3 +76,7 @@ const setSessionCookie = (res, value) => __awaiter(void 0, void 0, void 0, funct
76
76
  });
77
77
  });
78
78
  exports.setSessionCookie = setSessionCookie;
79
+ const clearSessionCookie = (res) => __awaiter(void 0, void 0, void 0, function* () {
80
+ return res.clearCookie('session_id');
81
+ });
82
+ exports.clearSessionCookie = clearSessionCookie;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "protonfile-auth",
3
- "version": "1.0.8",
3
+ "version": "1.1.0",
4
4
  "description": "protonfile-auth",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -17,6 +17,7 @@
17
17
  "@types/express": "^4.17.13",
18
18
  "@types/jsonwebtoken": "^8.5.5",
19
19
  "@types/pg": "^8.6.1",
20
+ "@types/uuid": "^8.3.1",
20
21
  "typescript": "^4.4.4"
21
22
  },
22
23
  "files": [
@@ -32,6 +33,7 @@
32
33
  "express": "^4.17.1",
33
34
  "jsonwebtoken": "^8.5.1",
34
35
  "pg": "^8.7.1",
35
- "typeorm": "^0.2.38"
36
+ "typeorm": "^0.2.38",
37
+ "uuid": "^8.3.2"
36
38
  }
37
39
  }