@oneuptime/common 8.0.5574 → 8.0.5575
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/StatusPagePrivateUserSession.ts +413 -0
- package/Models/DatabaseModels/UserSession.ts +318 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1762890441920-MigrationName.ts +91 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/StatusPagePrivateUserSessionService.ts +369 -0
- package/Server/Services/UserSessionService.ts +350 -0
- package/Server/Utils/Cookie.ts +127 -5
- package/Server/Utils/Express.ts +100 -0
- package/Server/Utils/JsonWebToken.ts +8 -1
- package/Types/CookieName.ts +1 -0
- package/Types/JsonWebTokenData.ts +1 -0
- package/Types/Text.ts +15 -0
- package/UI/Utils/API/API.ts +39 -1
- package/Utils/API.ts +74 -5
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUserSession.js +456 -0
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUserSession.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserSession.js +356 -0
- package/build/dist/Models/DatabaseModels/UserSession.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1762890441920-MigrationName.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1762890441920-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/Index.js +4 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js +214 -0
- package/build/dist/Server/Services/StatusPagePrivateUserSessionService.js.map +1 -0
- package/build/dist/Server/Services/UserSessionService.js +202 -0
- package/build/dist/Server/Services/UserSessionService.js.map +1 -0
- package/build/dist/Server/Utils/Cookie.js +74 -7
- package/build/dist/Server/Utils/Cookie.js.map +1 -1
- package/build/dist/Server/Utils/Express.js +62 -0
- package/build/dist/Server/Utils/Express.js.map +1 -1
- package/build/dist/Server/Utils/JsonWebToken.js +8 -2
- package/build/dist/Server/Utils/JsonWebToken.js.map +1 -1
- package/build/dist/Types/CookieName.js +1 -0
- package/build/dist/Types/CookieName.js.map +1 -1
- package/build/dist/Types/Text.js +9 -0
- package/build/dist/Types/Text.js.map +1 -1
- package/build/dist/UI/Utils/API/API.js +27 -0
- package/build/dist/UI/Utils/API/API.js.map +1 -1
- package/build/dist/Utils/API.js +36 -6
- package/build/dist/Utils/API.js.map +1 -1
- 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
|
-
|
|
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:
|
|
60
|
+
expiresInSeconds: accessTokenExpiresInSeconds,
|
|
59
61
|
});
|
|
60
62
|
// Set a cookie with token.
|
|
61
63
|
CookieUtil.setCookie(res, CookieUtil.getUserTokenKey(), token, {
|
|
62
|
-
maxAge:
|
|
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
|
-
|
|
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":";;;;;;;;;AAEA,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAE5C,OAAO,YAAY,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"Cookie.js","sourceRoot":"","sources":["../../../../Server/Utils/Cookie.ts"],"names":[],"mappings":"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"}
|