@oneuptime/common 8.0.5574 → 8.0.5576

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 (47) hide show
  1. package/Models/DatabaseModels/Index.ts +4 -0
  2. package/Models/DatabaseModels/StatusPagePrivateUserSession.ts +413 -0
  3. package/Models/DatabaseModels/UserSession.ts +318 -0
  4. package/Server/Infrastructure/Postgres/SchemaMigrations/1762890441920-MigrationName.ts +91 -0
  5. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
  6. package/Server/Services/Index.ts +4 -0
  7. package/Server/Services/StatusPagePrivateUserSessionService.ts +368 -0
  8. package/Server/Services/UserSessionService.ts +350 -0
  9. package/Server/Utils/Cookie.ts +122 -5
  10. package/Server/Utils/Express.ts +100 -0
  11. package/Server/Utils/JsonWebToken.ts +8 -1
  12. package/Types/CookieName.ts +1 -0
  13. package/Types/JsonWebTokenData.ts +1 -0
  14. package/Types/Text.ts +15 -0
  15. package/UI/Utils/API/API.ts +39 -1
  16. package/Utils/API.ts +74 -5
  17. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  18. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  19. package/build/dist/Models/DatabaseModels/StatusPagePrivateUserSession.js +456 -0
  20. package/build/dist/Models/DatabaseModels/StatusPagePrivateUserSession.js.map +1 -0
  21. package/build/dist/Models/DatabaseModels/UserSession.js +356 -0
  22. package/build/dist/Models/DatabaseModels/UserSession.js.map +1 -0
  23. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1762890441920-MigrationName.js +38 -0
  24. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1762890441920-MigrationName.js.map +1 -0
  25. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
  26. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  27. package/build/dist/Server/Services/Index.js +4 -0
  28. package/build/dist/Server/Services/Index.js.map +1 -1
  29. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js +214 -0
  30. package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js.map +1 -0
  31. package/build/dist/Server/Services/UserSessionService.js +202 -0
  32. package/build/dist/Server/Services/UserSessionService.js.map +1 -0
  33. package/build/dist/Server/Utils/Cookie.js +74 -7
  34. package/build/dist/Server/Utils/Cookie.js.map +1 -1
  35. package/build/dist/Server/Utils/Express.js +62 -0
  36. package/build/dist/Server/Utils/Express.js.map +1 -1
  37. package/build/dist/Server/Utils/JsonWebToken.js +8 -2
  38. package/build/dist/Server/Utils/JsonWebToken.js.map +1 -1
  39. package/build/dist/Types/CookieName.js +1 -0
  40. package/build/dist/Types/CookieName.js.map +1 -1
  41. package/build/dist/Types/Text.js +9 -0
  42. package/build/dist/Types/Text.js.map +1 -1
  43. package/build/dist/UI/Utils/API/API.js +27 -0
  44. package/build/dist/UI/Utils/API/API.js.map +1 -1
  45. package/build/dist/Utils/API.js +36 -6
  46. package/build/dist/Utils/API.js.map +1 -1
  47. package/package.json +146 -146
@@ -0,0 +1,214 @@
1
+ import DatabaseService from "./DatabaseService";
2
+ import Model from "../../Models/DatabaseModels/StatusPagePrivateUserSession";
3
+ import ObjectID from "../../Types/ObjectID";
4
+ import HashedString from "../../Types/HashedString";
5
+ import { EncryptionSecret } from "../EnvironmentConfig";
6
+ import OneUptimeDate from "../../Types/Date";
7
+ import Text from "../../Types/Text";
8
+ import logger from "../Utils/Logger";
9
+ import BadDataException from "../../Types/Exception/BadDataException";
10
+ export class Service extends DatabaseService {
11
+ constructor() {
12
+ super(Model);
13
+ }
14
+ async createSession(options) {
15
+ const refreshToken = options.refreshToken || Service.generateRefreshToken();
16
+ const refreshTokenExpiresAt = options.refreshTokenExpiresAt || Service.getRefreshTokenExpiry();
17
+ const session = this.buildSessionModel(options, {
18
+ refreshToken,
19
+ refreshTokenExpiresAt,
20
+ });
21
+ try {
22
+ const createdSession = await this.create({
23
+ data: session,
24
+ props: {
25
+ isRoot: true,
26
+ },
27
+ });
28
+ return {
29
+ session: createdSession,
30
+ refreshToken,
31
+ refreshTokenExpiresAt,
32
+ };
33
+ }
34
+ catch (error) {
35
+ throw error;
36
+ }
37
+ }
38
+ async findActiveSessionByRefreshToken(refreshToken) {
39
+ const hashedValue = await HashedString.hashValue(refreshToken, EncryptionSecret);
40
+ const session = await this.findOneBy({
41
+ query: {
42
+ refreshToken: new HashedString(hashedValue, true),
43
+ isRevoked: false,
44
+ },
45
+ select: {
46
+ _id: true,
47
+ projectId: true,
48
+ statusPageId: true,
49
+ statusPagePrivateUserId: true,
50
+ refreshTokenExpiresAt: true,
51
+ lastActiveAt: true,
52
+ additionalInfo: true,
53
+ deviceName: true,
54
+ deviceType: true,
55
+ deviceOS: true,
56
+ deviceBrowser: true,
57
+ ipAddress: true,
58
+ userAgent: true,
59
+ isRevoked: true,
60
+ },
61
+ props: {
62
+ isRoot: true,
63
+ },
64
+ });
65
+ if (!session) {
66
+ return null;
67
+ }
68
+ if (!session.refreshTokenExpiresAt ||
69
+ OneUptimeDate.hasExpired(session.refreshTokenExpiresAt)) {
70
+ return null;
71
+ }
72
+ return session;
73
+ }
74
+ async renewSessionWithNewRefreshToken(options) {
75
+ const refreshToken = Service.generateRefreshToken();
76
+ const refreshTokenExpiresAt = options.refreshTokenExpiresAt || Service.getRefreshTokenExpiry();
77
+ const updatePayload = {
78
+ refreshToken: HashedString.fromString(refreshToken),
79
+ refreshTokenExpiresAt: refreshTokenExpiresAt,
80
+ lastActiveAt: OneUptimeDate.getCurrentDate(),
81
+ isRevoked: false,
82
+ };
83
+ const ipAddress = Text.truncate(options.ipAddress, Service.SHORT_TEXT_LIMIT);
84
+ if (ipAddress) {
85
+ updatePayload.ipAddress = ipAddress;
86
+ }
87
+ if (options.userAgent) {
88
+ updatePayload.userAgent = options.userAgent;
89
+ }
90
+ const deviceName = Text.truncate(options.deviceName, Service.SHORT_TEXT_LIMIT);
91
+ if (deviceName) {
92
+ updatePayload.deviceName = deviceName;
93
+ }
94
+ const deviceType = Text.truncate(options.deviceType, Service.SHORT_TEXT_LIMIT);
95
+ if (deviceType) {
96
+ updatePayload.deviceType = deviceType;
97
+ }
98
+ const deviceOS = Text.truncate(options.deviceOS, Service.SHORT_TEXT_LIMIT);
99
+ if (deviceOS) {
100
+ updatePayload.deviceOS = deviceOS;
101
+ }
102
+ const deviceBrowser = Text.truncate(options.deviceBrowser, Service.SHORT_TEXT_LIMIT);
103
+ if (deviceBrowser) {
104
+ updatePayload.deviceBrowser = deviceBrowser;
105
+ }
106
+ if (options.additionalInfo || options.session.additionalInfo) {
107
+ updatePayload.additionalInfo = Object.assign(Object.assign({}, (options.session.additionalInfo || {})), (options.additionalInfo || {}));
108
+ }
109
+ const updatedSession = await this.updateOneByIdAndFetch({
110
+ id: options.session.id,
111
+ data: updatePayload,
112
+ props: {
113
+ isRoot: true,
114
+ },
115
+ });
116
+ if (!updatedSession) {
117
+ throw new BadDataException("Unable to renew status page user session");
118
+ }
119
+ return {
120
+ session: updatedSession,
121
+ refreshToken,
122
+ refreshTokenExpiresAt,
123
+ };
124
+ }
125
+ async touchSession(sessionId, options) {
126
+ const updatePayload = {
127
+ lastActiveAt: OneUptimeDate.getCurrentDate(),
128
+ };
129
+ const ipAddress = Text.truncate(options.ipAddress, Service.SHORT_TEXT_LIMIT);
130
+ if (ipAddress) {
131
+ updatePayload.ipAddress = ipAddress;
132
+ }
133
+ if (options.userAgent) {
134
+ updatePayload.userAgent = options.userAgent;
135
+ }
136
+ try {
137
+ await this.updateOneById({
138
+ id: sessionId,
139
+ data: updatePayload,
140
+ props: {
141
+ isRoot: true,
142
+ },
143
+ });
144
+ }
145
+ catch (err) {
146
+ logger.warn(`Failed to update status page session activity for session ${sessionId.toString()}: ${err.message}`);
147
+ }
148
+ }
149
+ async revokeSessionById(sessionId, options) {
150
+ var _a;
151
+ await this.updateOneById({
152
+ id: sessionId,
153
+ data: {
154
+ isRevoked: true,
155
+ revokedAt: OneUptimeDate.getCurrentDate(),
156
+ revokedReason: (_a = options === null || options === void 0 ? void 0 : options.reason) !== null && _a !== void 0 ? _a : null,
157
+ },
158
+ props: {
159
+ isRoot: true,
160
+ },
161
+ });
162
+ }
163
+ async revokeSessionByRefreshToken(refreshToken, options) {
164
+ const session = await this.findActiveSessionByRefreshToken(refreshToken);
165
+ if (!session || !session.id) {
166
+ return;
167
+ }
168
+ await this.revokeSessionById(session.id, options);
169
+ }
170
+ buildSessionModel(options, tokenMeta) {
171
+ const session = new Model();
172
+ session.projectId = options.projectId;
173
+ session.statusPageId = options.statusPageId;
174
+ session.statusPagePrivateUserId = options.statusPagePrivateUserId;
175
+ session.refreshToken = HashedString.fromString(tokenMeta.refreshToken);
176
+ session.refreshTokenExpiresAt = tokenMeta.refreshTokenExpiresAt;
177
+ session.lastActiveAt = OneUptimeDate.getCurrentDate();
178
+ if (options.userAgent) {
179
+ session.userAgent = options.userAgent;
180
+ }
181
+ const deviceName = Text.truncate(options.deviceName, Service.SHORT_TEXT_LIMIT);
182
+ if (deviceName) {
183
+ session.deviceName = deviceName;
184
+ }
185
+ const deviceType = Text.truncate(options.deviceType, Service.SHORT_TEXT_LIMIT);
186
+ if (deviceType) {
187
+ session.deviceType = deviceType;
188
+ }
189
+ const deviceOS = Text.truncate(options.deviceOS, Service.SHORT_TEXT_LIMIT);
190
+ if (deviceOS) {
191
+ session.deviceOS = deviceOS;
192
+ }
193
+ const deviceBrowser = Text.truncate(options.deviceBrowser, Service.SHORT_TEXT_LIMIT);
194
+ if (deviceBrowser) {
195
+ session.deviceBrowser = deviceBrowser;
196
+ }
197
+ const ipAddress = Text.truncate(options.ipAddress, Service.SHORT_TEXT_LIMIT);
198
+ if (ipAddress) {
199
+ session.ipAddress = ipAddress;
200
+ }
201
+ session.additionalInfo = Object.assign({}, (options.additionalInfo || {}));
202
+ return session;
203
+ }
204
+ static generateRefreshToken() {
205
+ return ObjectID.generate().toString();
206
+ }
207
+ static getRefreshTokenExpiry() {
208
+ return OneUptimeDate.getSomeDaysAfter(Service.DEFAULT_REFRESH_TOKEN_TTL_DAYS);
209
+ }
210
+ }
211
+ Service.DEFAULT_REFRESH_TOKEN_TTL_DAYS = 30;
212
+ Service.SHORT_TEXT_LIMIT = 100;
213
+ export default new Service();
214
+ //# sourceMappingURL=StatusPagePrivateUserSessionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusPagePrivateUserSessionService.js","sourceRoot":"","sources":["../../../../Server/Services/StatusPagePrivateUserSessionService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ import DatabaseService from "./DatabaseService";
2
+ import Model from "../../Models/DatabaseModels/UserSession";
3
+ import ObjectID from "../../Types/ObjectID";
4
+ import HashedString from "../../Types/HashedString";
5
+ import { EncryptionSecret } from "../EnvironmentConfig";
6
+ import OneUptimeDate from "../../Types/Date";
7
+ import Text from "../../Types/Text";
8
+ import logger from "../Utils/Logger";
9
+ import BadDataException from "../../Types/Exception/BadDataException";
10
+ export class Service extends DatabaseService {
11
+ constructor() {
12
+ super(Model);
13
+ }
14
+ async createSession(options) {
15
+ const refreshToken = options.refreshToken || Service.generateRefreshToken();
16
+ const refreshTokenExpiresAt = options.refreshTokenExpiresAt || Service.getRefreshTokenExpiry();
17
+ const session = this.buildSessionModel(options, {
18
+ refreshToken,
19
+ refreshTokenExpiresAt,
20
+ });
21
+ try {
22
+ const createdSession = await this.create({
23
+ data: session,
24
+ props: {
25
+ isRoot: true,
26
+ },
27
+ });
28
+ return {
29
+ session: createdSession,
30
+ refreshToken: refreshToken,
31
+ refreshTokenExpiresAt: refreshTokenExpiresAt,
32
+ };
33
+ }
34
+ catch (error) {
35
+ throw error;
36
+ }
37
+ }
38
+ async findActiveSessionByRefreshToken(refreshToken) {
39
+ const hashedValue = await HashedString.hashValue(refreshToken, EncryptionSecret);
40
+ return await this.findOneBy({
41
+ query: {
42
+ refreshToken: new HashedString(hashedValue, true),
43
+ isRevoked: false,
44
+ },
45
+ select: {
46
+ _id: true,
47
+ userId: true,
48
+ refreshTokenExpiresAt: true,
49
+ lastActiveAt: true,
50
+ isRevoked: true,
51
+ additionalInfo: true,
52
+ deviceName: true,
53
+ deviceType: true,
54
+ deviceOS: true,
55
+ deviceBrowser: true,
56
+ ipAddress: true,
57
+ userAgent: true,
58
+ },
59
+ props: {
60
+ isRoot: true,
61
+ },
62
+ });
63
+ }
64
+ async renewSessionWithNewRefreshToken(options) {
65
+ const refreshToken = Service.generateRefreshToken();
66
+ const refreshTokenExpiresAt = options.refreshTokenExpiresAt || Service.getRefreshTokenExpiry();
67
+ const updatePayload = {
68
+ refreshToken: HashedString.fromString(refreshToken),
69
+ refreshTokenExpiresAt: refreshTokenExpiresAt,
70
+ lastActiveAt: OneUptimeDate.getCurrentDate(),
71
+ isRevoked: false,
72
+ };
73
+ const ipAddress = Text.truncate(options.ipAddress, Service.SHORT_TEXT_LIMIT);
74
+ if (ipAddress) {
75
+ updatePayload.ipAddress = ipAddress;
76
+ }
77
+ if (options.userAgent) {
78
+ updatePayload.userAgent = options.userAgent;
79
+ }
80
+ const deviceName = Text.truncate(options.deviceName, Service.SHORT_TEXT_LIMIT);
81
+ if (deviceName) {
82
+ updatePayload.deviceName = deviceName;
83
+ }
84
+ const deviceType = Text.truncate(options.deviceType, Service.SHORT_TEXT_LIMIT);
85
+ if (deviceType) {
86
+ updatePayload.deviceType = deviceType;
87
+ }
88
+ const deviceOS = Text.truncate(options.deviceOS, Service.SHORT_TEXT_LIMIT);
89
+ if (deviceOS) {
90
+ updatePayload.deviceOS = deviceOS;
91
+ }
92
+ const deviceBrowser = Text.truncate(options.deviceBrowser, Service.SHORT_TEXT_LIMIT);
93
+ if (deviceBrowser) {
94
+ updatePayload.deviceBrowser = deviceBrowser;
95
+ }
96
+ if (options.additionalInfo || options.session.additionalInfo) {
97
+ updatePayload.additionalInfo = Object.assign(Object.assign({}, (options.session.additionalInfo || {})), (options.additionalInfo || {}));
98
+ }
99
+ const updatedSession = await this.updateOneByIdAndFetch({
100
+ id: options.session.id,
101
+ data: updatePayload,
102
+ props: {
103
+ isRoot: true,
104
+ },
105
+ });
106
+ if (!updatedSession) {
107
+ throw new BadDataException("Unable to renew user session");
108
+ }
109
+ return {
110
+ session: updatedSession,
111
+ refreshToken: refreshToken,
112
+ refreshTokenExpiresAt: refreshTokenExpiresAt,
113
+ };
114
+ }
115
+ async touchSession(sessionId, options) {
116
+ const updatePayload = {
117
+ lastActiveAt: OneUptimeDate.getCurrentDate(),
118
+ };
119
+ const ipAddress = Text.truncate(options.ipAddress, Service.SHORT_TEXT_LIMIT);
120
+ if (ipAddress) {
121
+ updatePayload.ipAddress = ipAddress;
122
+ }
123
+ if (options.userAgent) {
124
+ updatePayload.userAgent = options.userAgent;
125
+ }
126
+ try {
127
+ await this.updateOneById({
128
+ id: sessionId,
129
+ data: updatePayload,
130
+ props: {
131
+ isRoot: true,
132
+ },
133
+ });
134
+ }
135
+ catch (err) {
136
+ logger.warn(`Failed to update session activity timestamp for session ${sessionId.toString()}: ${err.message}`);
137
+ }
138
+ }
139
+ async revokeSessionById(sessionId, options) {
140
+ var _a;
141
+ await this.updateOneById({
142
+ id: sessionId,
143
+ data: {
144
+ isRevoked: true,
145
+ revokedAt: OneUptimeDate.getCurrentDate(),
146
+ revokedReason: (_a = options === null || options === void 0 ? void 0 : options.reason) !== null && _a !== void 0 ? _a : null,
147
+ },
148
+ props: {
149
+ isRoot: true,
150
+ },
151
+ });
152
+ }
153
+ async revokeSessionByRefreshToken(refreshToken, options) {
154
+ const session = await this.findActiveSessionByRefreshToken(refreshToken);
155
+ if (!session || !session.id) {
156
+ return;
157
+ }
158
+ await this.revokeSessionById(session.id, options);
159
+ }
160
+ buildSessionModel(options, tokenMeta) {
161
+ const session = new Model();
162
+ session.userId = options.userId;
163
+ session.refreshToken = HashedString.fromString(tokenMeta.refreshToken);
164
+ session.refreshTokenExpiresAt = tokenMeta.refreshTokenExpiresAt;
165
+ session.lastActiveAt = OneUptimeDate.getCurrentDate();
166
+ if (options.userAgent) {
167
+ session.userAgent = options.userAgent;
168
+ }
169
+ const deviceName = Text.truncate(options.deviceName, Service.SHORT_TEXT_LIMIT);
170
+ if (deviceName) {
171
+ session.deviceName = deviceName;
172
+ }
173
+ const deviceType = Text.truncate(options.deviceType, Service.SHORT_TEXT_LIMIT);
174
+ if (deviceType) {
175
+ session.deviceType = deviceType;
176
+ }
177
+ const deviceOS = Text.truncate(options.deviceOS, Service.SHORT_TEXT_LIMIT);
178
+ if (deviceOS) {
179
+ session.deviceOS = deviceOS;
180
+ }
181
+ const deviceBrowser = Text.truncate(options.deviceBrowser, Service.SHORT_TEXT_LIMIT);
182
+ if (deviceBrowser) {
183
+ session.deviceBrowser = deviceBrowser;
184
+ }
185
+ const ipAddress = Text.truncate(options.ipAddress, Service.SHORT_TEXT_LIMIT);
186
+ if (ipAddress) {
187
+ session.ipAddress = ipAddress;
188
+ }
189
+ session.additionalInfo = Object.assign(Object.assign({}, (options.additionalInfo || {})), { isGlobalLogin: options.isGlobalLogin });
190
+ return session;
191
+ }
192
+ static generateRefreshToken() {
193
+ return ObjectID.generate().toString();
194
+ }
195
+ static getRefreshTokenExpiry() {
196
+ return OneUptimeDate.getSomeDaysAfter(Service.DEFAULT_REFRESH_TOKEN_TTL_DAYS);
197
+ }
198
+ }
199
+ Service.DEFAULT_REFRESH_TOKEN_TTL_DAYS = 30;
200
+ Service.SHORT_TEXT_LIMIT = 100;
201
+ export default new Service();
202
+ //# sourceMappingURL=UserSessionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserSessionService.js","sourceRoot":"","sources":["../../../../Server/Services/UserSessionService.ts"],"names":[],"mappings":"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"}
@@ -13,8 +13,7 @@ import OneUptimeDate from "../../Types/Date";
13
13
  import PositiveNumber from "../../Types/PositiveNumber";
14
14
  import CookieName from "../../Types/CookieName";
15
15
  import CaptureSpan from "./Telemetry/CaptureSpan";
16
- export default class CookieUtil {
17
- // set cookie with express response
16
+ class CookieUtil {
18
17
  static getCookiesFromCookieString(cookieString) {
19
18
  const cookies = {};
20
19
  cookieString.split(";").forEach((cookie) => {
@@ -45,7 +44,9 @@ export default class CookieUtil {
45
44
  }
46
45
  static setUserCookie(data) {
47
46
  var _a, _b, _c, _d, _e;
48
- const { expressResponse: res, user, isGlobalLogin } = data;
47
+ const { expressResponse: res, user, isGlobalLogin, sessionId, refreshToken, refreshTokenExpiresAt, } = data;
48
+ const accessTokenExpiresInSeconds = data.accessTokenExpiresInSeconds ||
49
+ CookieUtil.DEFAULT_ACCESS_TOKEN_EXPIRY_SECONDS;
49
50
  const token = JSONWebToken.signUserLoginToken({
50
51
  tokenData: {
51
52
  userId: user.id,
@@ -54,12 +55,18 @@ export default class CookieUtil {
54
55
  timezone: user.timezone || null,
55
56
  isMasterAdmin: user.isMasterAdmin,
56
57
  isGlobalLogin: isGlobalLogin, // This is a general login without SSO. So, we will set this to true. This will give access to all the projects that dont require SSO.
58
+ sessionId: sessionId,
57
59
  },
58
- expiresInSeconds: OneUptimeDate.getSecondsInDays(new PositiveNumber(30)),
60
+ expiresInSeconds: accessTokenExpiresInSeconds,
59
61
  });
60
62
  // Set a cookie with token.
61
63
  CookieUtil.setCookie(res, CookieUtil.getUserTokenKey(), token, {
62
- maxAge: OneUptimeDate.getMillisecondsInDays(new PositiveNumber(30)),
64
+ maxAge: accessTokenExpiresInSeconds * 1000,
65
+ httpOnly: true,
66
+ });
67
+ const refreshTokenTtl = Math.max(refreshTokenExpiresAt.getTime() - Date.now(), 0);
68
+ CookieUtil.setCookie(res, CookieUtil.getRefreshTokenKey(), refreshToken, {
69
+ maxAge: refreshTokenTtl,
63
70
  httpOnly: true,
64
71
  });
65
72
  if (user.id) {
@@ -105,16 +112,47 @@ export default class CookieUtil {
105
112
  });
106
113
  }
107
114
  }
115
+ static setStatusPagePrivateUserCookie(data) {
116
+ const { expressResponse: res, user, statusPageId, sessionId, refreshToken, refreshTokenExpiresAt, } = data;
117
+ const accessTokenExpiresInSeconds = data.accessTokenExpiresInSeconds ||
118
+ CookieUtil.DEFAULT_ACCESS_TOKEN_EXPIRY_SECONDS;
119
+ const token = JSONWebToken.sign({
120
+ data: {
121
+ userId: user.id,
122
+ email: user.email,
123
+ statusPageId: statusPageId,
124
+ sessionId: sessionId,
125
+ },
126
+ expiresInSeconds: accessTokenExpiresInSeconds,
127
+ });
128
+ CookieUtil.setCookie(res, CookieUtil.getUserTokenKey(statusPageId), token, {
129
+ maxAge: accessTokenExpiresInSeconds * 1000,
130
+ httpOnly: true,
131
+ });
132
+ const refreshTokenTtl = Math.max(refreshTokenExpiresAt.getTime() - Date.now(), 0);
133
+ CookieUtil.setCookie(res, CookieUtil.getRefreshTokenKey(statusPageId), refreshToken, {
134
+ maxAge: refreshTokenTtl,
135
+ httpOnly: true,
136
+ });
137
+ return token;
138
+ }
108
139
  static setCookie(res, name, value, options) {
109
- res.cookie(name, value, options);
140
+ const cookieOptions = Object.assign({ path: "/", sameSite: "lax" }, options);
141
+ res.cookie(name, value, cookieOptions);
110
142
  }
111
143
  // get cookie with express request
112
144
  static getCookieFromExpressRequest(req, name) {
113
145
  return req.cookies[name];
114
146
  }
147
+ static getRefreshTokenFromExpressRequest(req, id) {
148
+ return CookieUtil.getCookieFromExpressRequest(req, CookieUtil.getRefreshTokenKey(id));
149
+ }
115
150
  // delete cookie with express response
116
151
  static removeCookie(res, name) {
117
- res.clearCookie(name);
152
+ res.clearCookie(name, {
153
+ path: "/",
154
+ sameSite: "lax",
155
+ });
118
156
  }
119
157
  // get all cookies with express request
120
158
  static getAllCookies(req) {
@@ -126,6 +164,12 @@ export default class CookieUtil {
126
164
  }
127
165
  return `${CookieName.Token}-${id.toString()}`;
128
166
  }
167
+ static getRefreshTokenKey(id) {
168
+ if (!id) {
169
+ return CookieName.RefreshToken;
170
+ }
171
+ return `${CookieName.RefreshToken}-${id.toString()}`;
172
+ }
129
173
  static getUserSSOKey(id) {
130
174
  return `${this.getSSOKey()}${id.toString()}`;
131
175
  }
@@ -138,8 +182,13 @@ export default class CookieUtil {
138
182
  for (const key in cookies) {
139
183
  this.removeCookie(res, key);
140
184
  }
185
+ // Always attempt to remove refresh token cookie even if not parsed.
186
+ this.removeCookie(res, this.getRefreshTokenKey());
141
187
  }
142
188
  }
189
+ // set cookie with express response
190
+ CookieUtil.DEFAULT_ACCESS_TOKEN_EXPIRY_SECONDS = 15 * 60;
191
+ export default CookieUtil;
143
192
  __decorate([
144
193
  CaptureSpan(),
145
194
  __metadata("design:type", Function),
@@ -158,6 +207,12 @@ __decorate([
158
207
  __metadata("design:paramtypes", [Object]),
159
208
  __metadata("design:returntype", void 0)
160
209
  ], CookieUtil, "setUserCookie", null);
210
+ __decorate([
211
+ CaptureSpan(),
212
+ __metadata("design:type", Function),
213
+ __metadata("design:paramtypes", [Object]),
214
+ __metadata("design:returntype", String)
215
+ ], CookieUtil, "setStatusPagePrivateUserCookie", null);
161
216
  __decorate([
162
217
  CaptureSpan(),
163
218
  __metadata("design:type", Function),
@@ -170,6 +225,12 @@ __decorate([
170
225
  __metadata("design:paramtypes", [Object, String]),
171
226
  __metadata("design:returntype", Object)
172
227
  ], CookieUtil, "getCookieFromExpressRequest", null);
228
+ __decorate([
229
+ CaptureSpan(),
230
+ __metadata("design:type", Function),
231
+ __metadata("design:paramtypes", [Object, ObjectID]),
232
+ __metadata("design:returntype", Object)
233
+ ], CookieUtil, "getRefreshTokenFromExpressRequest", null);
173
234
  __decorate([
174
235
  CaptureSpan(),
175
236
  __metadata("design:type", Function),
@@ -188,6 +249,12 @@ __decorate([
188
249
  __metadata("design:paramtypes", [ObjectID]),
189
250
  __metadata("design:returntype", String)
190
251
  ], CookieUtil, "getUserTokenKey", null);
252
+ __decorate([
253
+ CaptureSpan(),
254
+ __metadata("design:type", Function),
255
+ __metadata("design:paramtypes", [ObjectID]),
256
+ __metadata("design:returntype", String)
257
+ ], CookieUtil, "getRefreshTokenKey", null);
191
258
  __decorate([
192
259
  CaptureSpan(),
193
260
  __metadata("design:type", Function),
@@ -1 +1 @@
1
- {"version":3,"file":"Cookie.js","sourceRoot":"","sources":["../../../../Server/Utils/Cookie.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Cookie.js","sourceRoot":"","sources":["../../../../Server/Utils/Cookie.ts"],"names":[],"mappings":"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"}