@strapi/core 0.0.0-experimental.008123965da692a55d02a1df63facc54077c6bde → 0.0.0-experimental.00b482b8dcda6164537baf70d52b4b2535560c36

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.

Potentially problematic release.


This version of @strapi/core might be problematic. Click here for more details.

Files changed (214) hide show
  1. package/dist/Strapi.d.ts +1 -0
  2. package/dist/Strapi.d.ts.map +1 -1
  3. package/dist/Strapi.js +7 -1
  4. package/dist/Strapi.js.map +1 -1
  5. package/dist/Strapi.mjs +7 -1
  6. package/dist/Strapi.mjs.map +1 -1
  7. package/dist/constants.d.ts +3 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +6 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/constants.mjs +4 -0
  12. package/dist/constants.mjs.map +1 -0
  13. package/dist/core-api/controller/index.d.ts.map +1 -1
  14. package/dist/core-api/controller/index.js +2 -1
  15. package/dist/core-api/controller/index.js.map +1 -1
  16. package/dist/core-api/controller/index.mjs +2 -1
  17. package/dist/core-api/controller/index.mjs.map +1 -1
  18. package/dist/core-api/controller/transform.d.ts +3 -2
  19. package/dist/core-api/controller/transform.d.ts.map +1 -1
  20. package/dist/core-api/controller/transform.js +13 -3
  21. package/dist/core-api/controller/transform.js.map +1 -1
  22. package/dist/core-api/controller/transform.mjs +13 -3
  23. package/dist/core-api/controller/transform.mjs.map +1 -1
  24. package/dist/core-api/routes/index.d.ts +4 -22
  25. package/dist/core-api/routes/index.d.ts.map +1 -1
  26. package/dist/core-api/routes/index.js +150 -8
  27. package/dist/core-api/routes/index.js.map +1 -1
  28. package/dist/core-api/routes/index.mjs +131 -8
  29. package/dist/core-api/routes/index.mjs.map +1 -1
  30. package/dist/core-api/routes/validation/attributes.d.ts +244 -0
  31. package/dist/core-api/routes/validation/attributes.d.ts.map +1 -0
  32. package/dist/core-api/routes/validation/attributes.js +560 -0
  33. package/dist/core-api/routes/validation/attributes.js.map +1 -0
  34. package/dist/core-api/routes/validation/attributes.mjs +521 -0
  35. package/dist/core-api/routes/validation/attributes.mjs.map +1 -0
  36. package/dist/core-api/routes/validation/common.d.ts +105 -0
  37. package/dist/core-api/routes/validation/common.d.ts.map +1 -0
  38. package/dist/core-api/routes/validation/common.js +116 -0
  39. package/dist/core-api/routes/validation/common.js.map +1 -0
  40. package/dist/core-api/routes/validation/common.mjs +95 -0
  41. package/dist/core-api/routes/validation/common.mjs.map +1 -0
  42. package/dist/core-api/routes/validation/component.d.ts +34 -0
  43. package/dist/core-api/routes/validation/component.d.ts.map +1 -0
  44. package/dist/core-api/routes/validation/component.js +45 -0
  45. package/dist/core-api/routes/validation/component.js.map +1 -0
  46. package/dist/core-api/routes/validation/component.mjs +43 -0
  47. package/dist/core-api/routes/validation/component.mjs.map +1 -0
  48. package/dist/core-api/routes/validation/constants.d.ts +8 -0
  49. package/dist/core-api/routes/validation/constants.d.ts.map +1 -0
  50. package/dist/core-api/routes/validation/constants.js +18 -0
  51. package/dist/core-api/routes/validation/constants.js.map +1 -0
  52. package/dist/core-api/routes/validation/constants.mjs +16 -0
  53. package/dist/core-api/routes/validation/constants.mjs.map +1 -0
  54. package/dist/core-api/routes/validation/content-type.d.ts +128 -0
  55. package/dist/core-api/routes/validation/content-type.d.ts.map +1 -0
  56. package/dist/core-api/routes/validation/content-type.js +201 -0
  57. package/dist/core-api/routes/validation/content-type.js.map +1 -0
  58. package/dist/core-api/routes/validation/content-type.mjs +180 -0
  59. package/dist/core-api/routes/validation/content-type.mjs.map +1 -0
  60. package/dist/core-api/routes/validation/index.d.ts +5 -0
  61. package/dist/core-api/routes/validation/index.d.ts.map +1 -0
  62. package/dist/core-api/routes/validation/mappers.d.ts +105 -0
  63. package/dist/core-api/routes/validation/mappers.d.ts.map +1 -0
  64. package/dist/core-api/routes/validation/mappers.js +273 -0
  65. package/dist/core-api/routes/validation/mappers.js.map +1 -0
  66. package/dist/core-api/routes/validation/mappers.mjs +249 -0
  67. package/dist/core-api/routes/validation/mappers.mjs.map +1 -0
  68. package/dist/core-api/routes/validation/utils.d.ts +47 -0
  69. package/dist/core-api/routes/validation/utils.d.ts.map +1 -0
  70. package/dist/core-api/routes/validation/utils.js +128 -0
  71. package/dist/core-api/routes/validation/utils.js.map +1 -0
  72. package/dist/core-api/routes/validation/utils.mjs +106 -0
  73. package/dist/core-api/routes/validation/utils.mjs.map +1 -0
  74. package/dist/domain/content-type/index.d.ts.map +1 -1
  75. package/dist/domain/content-type/index.js +17 -1
  76. package/dist/domain/content-type/index.js.map +1 -1
  77. package/dist/domain/content-type/index.mjs +17 -1
  78. package/dist/domain/content-type/index.mjs.map +1 -1
  79. package/dist/domain/module/index.d.ts.map +1 -1
  80. package/dist/domain/module/index.js +3 -0
  81. package/dist/domain/module/index.js.map +1 -1
  82. package/dist/domain/module/index.mjs +3 -0
  83. package/dist/domain/module/index.mjs.map +1 -1
  84. package/dist/factories.d.ts +3 -1
  85. package/dist/factories.d.ts.map +1 -1
  86. package/dist/factories.js +10 -2
  87. package/dist/factories.js.map +1 -1
  88. package/dist/factories.mjs +10 -3
  89. package/dist/factories.mjs.map +1 -1
  90. package/dist/loaders/plugins/index.js +1 -1
  91. package/dist/loaders/plugins/index.js.map +1 -1
  92. package/dist/loaders/plugins/index.mjs +1 -1
  93. package/dist/loaders/plugins/index.mjs.map +1 -1
  94. package/dist/middlewares/cors.d.ts +9 -1
  95. package/dist/middlewares/cors.d.ts.map +1 -1
  96. package/dist/middlewares/cors.js +39 -17
  97. package/dist/middlewares/cors.js.map +1 -1
  98. package/dist/middlewares/cors.mjs +39 -18
  99. package/dist/middlewares/cors.mjs.map +1 -1
  100. package/dist/migrations/first-published-at.d.ts +4 -0
  101. package/dist/migrations/first-published-at.d.ts.map +1 -0
  102. package/dist/migrations/first-published-at.js +51 -0
  103. package/dist/migrations/first-published-at.js.map +1 -0
  104. package/dist/migrations/first-published-at.mjs +49 -0
  105. package/dist/migrations/first-published-at.mjs.map +1 -0
  106. package/dist/migrations/index.d.ts.map +1 -1
  107. package/dist/migrations/index.js +5 -0
  108. package/dist/migrations/index.js.map +1 -1
  109. package/dist/migrations/index.mjs +5 -0
  110. package/dist/migrations/index.mjs.map +1 -1
  111. package/dist/package.json.js +17 -12
  112. package/dist/package.json.js.map +1 -1
  113. package/dist/package.json.mjs +17 -12
  114. package/dist/package.json.mjs.map +1 -1
  115. package/dist/providers/index.d.ts.map +1 -1
  116. package/dist/providers/index.js +2 -0
  117. package/dist/providers/index.js.map +1 -1
  118. package/dist/providers/index.mjs +2 -0
  119. package/dist/providers/index.mjs.map +1 -1
  120. package/dist/providers/sessionManager.d.ts +3 -0
  121. package/dist/providers/sessionManager.d.ts.map +1 -0
  122. package/dist/providers/sessionManager.js +36 -0
  123. package/dist/providers/sessionManager.js.map +1 -0
  124. package/dist/providers/sessionManager.mjs +34 -0
  125. package/dist/providers/sessionManager.mjs.map +1 -0
  126. package/dist/services/content-api/index.d.ts +1 -1
  127. package/dist/services/content-api/index.d.ts.map +1 -1
  128. package/dist/services/content-api/index.js +1 -1
  129. package/dist/services/content-api/index.js.map +1 -1
  130. package/dist/services/content-api/index.mjs +2 -2
  131. package/dist/services/content-api/index.mjs.map +1 -1
  132. package/dist/services/content-source-maps.d.ts +13 -0
  133. package/dist/services/content-source-maps.d.ts.map +1 -0
  134. package/dist/services/content-source-maps.js +108 -0
  135. package/dist/services/content-source-maps.js.map +1 -0
  136. package/dist/services/content-source-maps.mjs +106 -0
  137. package/dist/services/content-source-maps.mjs.map +1 -0
  138. package/dist/services/document-service/components.d.ts +6 -1
  139. package/dist/services/document-service/components.d.ts.map +1 -1
  140. package/dist/services/document-service/components.js +97 -0
  141. package/dist/services/document-service/components.js.map +1 -1
  142. package/dist/services/document-service/components.mjs +97 -1
  143. package/dist/services/document-service/components.mjs.map +1 -1
  144. package/dist/services/document-service/entries.d.ts.map +1 -1
  145. package/dist/services/document-service/entries.js.map +1 -1
  146. package/dist/services/document-service/entries.mjs.map +1 -1
  147. package/dist/services/document-service/first-published-at.d.ts +7 -0
  148. package/dist/services/document-service/first-published-at.d.ts.map +1 -0
  149. package/dist/services/document-service/first-published-at.js +31 -0
  150. package/dist/services/document-service/first-published-at.js.map +1 -0
  151. package/dist/services/document-service/first-published-at.mjs +28 -0
  152. package/dist/services/document-service/first-published-at.mjs.map +1 -0
  153. package/dist/services/document-service/internationalization.d.ts +6 -1
  154. package/dist/services/document-service/internationalization.d.ts.map +1 -1
  155. package/dist/services/document-service/internationalization.js +32 -0
  156. package/dist/services/document-service/internationalization.js.map +1 -1
  157. package/dist/services/document-service/internationalization.mjs +32 -1
  158. package/dist/services/document-service/internationalization.mjs.map +1 -1
  159. package/dist/services/document-service/repository.d.ts.map +1 -1
  160. package/dist/services/document-service/repository.js +16 -8
  161. package/dist/services/document-service/repository.js.map +1 -1
  162. package/dist/services/document-service/repository.mjs +18 -10
  163. package/dist/services/document-service/repository.mjs.map +1 -1
  164. package/dist/services/document-service/utils/unidirectional-relations.d.ts +19 -2
  165. package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -1
  166. package/dist/services/document-service/utils/unidirectional-relations.js +21 -6
  167. package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
  168. package/dist/services/document-service/utils/unidirectional-relations.mjs +21 -6
  169. package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
  170. package/dist/services/entity-validator/index.d.ts.map +1 -1
  171. package/dist/services/entity-validator/index.js +9 -0
  172. package/dist/services/entity-validator/index.js.map +1 -1
  173. package/dist/services/entity-validator/index.mjs +9 -0
  174. package/dist/services/entity-validator/index.mjs.map +1 -1
  175. package/dist/services/entity-validator/validators.d.ts +1 -0
  176. package/dist/services/entity-validator/validators.d.ts.map +1 -1
  177. package/dist/services/entity-validator/validators.js.map +1 -1
  178. package/dist/services/entity-validator/validators.mjs.map +1 -1
  179. package/dist/services/metrics/index.d.ts +1 -1
  180. package/dist/services/metrics/index.d.ts.map +1 -1
  181. package/dist/services/metrics/index.js +9 -8
  182. package/dist/services/metrics/index.js.map +1 -1
  183. package/dist/services/metrics/index.mjs +9 -8
  184. package/dist/services/metrics/index.mjs.map +1 -1
  185. package/dist/services/metrics/sender.d.ts.map +1 -1
  186. package/dist/services/metrics/sender.js +2 -2
  187. package/dist/services/metrics/sender.js.map +1 -1
  188. package/dist/services/metrics/sender.mjs +2 -2
  189. package/dist/services/metrics/sender.mjs.map +1 -1
  190. package/dist/services/server/register-routes.js +22 -2
  191. package/dist/services/server/register-routes.js.map +1 -1
  192. package/dist/services/server/register-routes.mjs +22 -2
  193. package/dist/services/server/register-routes.mjs.map +1 -1
  194. package/dist/services/server/routing.d.ts +10 -0
  195. package/dist/services/server/routing.d.ts.map +1 -1
  196. package/dist/services/server/routing.js +7 -1
  197. package/dist/services/server/routing.js.map +1 -1
  198. package/dist/services/server/routing.mjs +7 -1
  199. package/dist/services/server/routing.mjs.map +1 -1
  200. package/dist/services/session-manager.d.ts +115 -0
  201. package/dist/services/session-manager.d.ts.map +1 -0
  202. package/dist/services/session-manager.js +380 -0
  203. package/dist/services/session-manager.js.map +1 -0
  204. package/dist/services/session-manager.mjs +377 -0
  205. package/dist/services/session-manager.mjs.map +1 -0
  206. package/dist/services/utils/conditional-fields.d.ts +3 -0
  207. package/dist/services/utils/conditional-fields.d.ts.map +1 -0
  208. package/dist/services/utils/conditional-fields.js +22 -0
  209. package/dist/services/utils/conditional-fields.js.map +1 -0
  210. package/dist/services/utils/conditional-fields.mjs +20 -0
  211. package/dist/services/utils/conditional-fields.mjs.map +1 -0
  212. package/dist/utils/transform-content-types-to-models.d.ts +196 -0
  213. package/dist/utils/transform-content-types-to-models.d.ts.map +1 -1
  214. package/package.json +17 -12
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/services/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,380 @@
1
+ 'use strict';
2
+
3
+ var crypto = require('crypto');
4
+ var jwt = require('jsonwebtoken');
5
+ var constants = require('../constants.js');
6
+
7
+ class DatabaseSessionProvider {
8
+ async create(session) {
9
+ const result = await this.db.query(this.contentType).create({
10
+ data: session
11
+ });
12
+ return result;
13
+ }
14
+ async findBySessionId(sessionId) {
15
+ const result = await this.db.query(this.contentType).findOne({
16
+ where: {
17
+ sessionId
18
+ }
19
+ });
20
+ return result;
21
+ }
22
+ async updateBySessionId(sessionId, data) {
23
+ await this.db.query(this.contentType).update({
24
+ where: {
25
+ sessionId
26
+ },
27
+ data
28
+ });
29
+ }
30
+ async deleteBySessionId(sessionId) {
31
+ await this.db.query(this.contentType).delete({
32
+ where: {
33
+ sessionId
34
+ }
35
+ });
36
+ }
37
+ async deleteExpired() {
38
+ await this.db.query(this.contentType).deleteMany({
39
+ where: {
40
+ absoluteExpiresAt: {
41
+ $lt: new Date()
42
+ }
43
+ }
44
+ });
45
+ }
46
+ async deleteBy(criteria) {
47
+ await this.db.query(this.contentType).deleteMany({
48
+ where: {
49
+ ...criteria.userId ? {
50
+ userId: criteria.userId
51
+ } : {},
52
+ ...criteria.origin ? {
53
+ origin: criteria.origin
54
+ } : {},
55
+ ...criteria.deviceId ? {
56
+ deviceId: criteria.deviceId
57
+ } : {}
58
+ }
59
+ });
60
+ }
61
+ constructor(db, contentType){
62
+ this.db = db;
63
+ this.contentType = contentType;
64
+ }
65
+ }
66
+ class SessionManager {
67
+ generateSessionId() {
68
+ return crypto.randomBytes(16).toString('hex');
69
+ }
70
+ async maybeCleanupExpired() {
71
+ this.cleanupInvocationCounter += 1;
72
+ if (this.cleanupInvocationCounter >= this.cleanupEveryCalls) {
73
+ this.cleanupInvocationCounter = 0;
74
+ await this.provider.deleteExpired();
75
+ }
76
+ }
77
+ async generateRefreshToken(userId, deviceId, origin, options) {
78
+ await this.maybeCleanupExpired();
79
+ const sessionId = this.generateSessionId();
80
+ const familyType = options?.familyType ?? 'refresh';
81
+ const isRefresh = familyType === 'refresh';
82
+ const idleLifespan = isRefresh ? this.config.idleRefreshTokenLifespan : this.config.idleSessionLifespan;
83
+ const maxLifespan = isRefresh ? this.config.maxRefreshTokenLifespan : this.config.maxSessionLifespan;
84
+ const now = Date.now();
85
+ const expiresAt = new Date(now + idleLifespan * 1000);
86
+ const absoluteExpiresAt = new Date(now + maxLifespan * 1000);
87
+ // Create the root record first so createdAt can be used for signing.
88
+ const record = await this.provider.create({
89
+ userId,
90
+ sessionId,
91
+ deviceId,
92
+ origin,
93
+ parentId: null,
94
+ childId: null,
95
+ familyId: sessionId,
96
+ type: familyType,
97
+ status: 'active',
98
+ expiresAt,
99
+ absoluteExpiresAt
100
+ });
101
+ const issuedAtSeconds = Math.floor(new Date(record.createdAt ?? new Date()).getTime() / 1000);
102
+ const expiresAtSeconds = Math.floor(new Date(record.expiresAt).getTime() / 1000);
103
+ const payload = {
104
+ userId,
105
+ sessionId,
106
+ type: 'refresh',
107
+ iat: issuedAtSeconds,
108
+ exp: expiresAtSeconds
109
+ };
110
+ const token = jwt.sign(payload, this.config.jwtSecret, {
111
+ algorithm: this.config.algorithm ?? constants.DEFAULT_ALGORITHM,
112
+ noTimestamp: true
113
+ });
114
+ return {
115
+ token,
116
+ sessionId,
117
+ absoluteExpiresAt: absoluteExpiresAt.toISOString(),
118
+ familyId: record.familyId
119
+ };
120
+ }
121
+ validateAccessToken(token) {
122
+ try {
123
+ const payload = jwt.verify(token, this.config.jwtSecret, {
124
+ algorithms: [
125
+ this.config.algorithm ?? constants.DEFAULT_ALGORITHM
126
+ ]
127
+ });
128
+ // Ensure this is an access token
129
+ if (!payload || payload.type !== 'access') {
130
+ return {
131
+ isValid: false,
132
+ payload: null
133
+ };
134
+ }
135
+ return {
136
+ isValid: true,
137
+ payload
138
+ };
139
+ } catch (err) {
140
+ return {
141
+ isValid: false,
142
+ payload: null
143
+ };
144
+ }
145
+ }
146
+ async validateRefreshToken(token) {
147
+ try {
148
+ const verifyOptions = {
149
+ algorithms: [
150
+ this.config.algorithm ?? constants.DEFAULT_ALGORITHM
151
+ ]
152
+ };
153
+ const payload = jwt.verify(token, this.config.jwtSecret, verifyOptions);
154
+ if (payload.type !== 'refresh') {
155
+ return {
156
+ isValid: false
157
+ };
158
+ }
159
+ const session = await this.provider.findBySessionId(payload.sessionId);
160
+ if (!session) {
161
+ return {
162
+ isValid: false
163
+ };
164
+ }
165
+ const now = new Date();
166
+ if (new Date(session.expiresAt) <= now) {
167
+ return {
168
+ isValid: false
169
+ };
170
+ }
171
+ // Absolute family expiry check
172
+ if (session.absoluteExpiresAt && new Date(session.absoluteExpiresAt) <= now) {
173
+ return {
174
+ isValid: false
175
+ };
176
+ }
177
+ // Only 'active' sessions are eligible to create access tokens.
178
+ if (session.status !== 'active') {
179
+ return {
180
+ isValid: false
181
+ };
182
+ }
183
+ if (session.userId !== payload.userId) {
184
+ return {
185
+ isValid: false
186
+ };
187
+ }
188
+ return {
189
+ isValid: true,
190
+ userId: payload.userId,
191
+ sessionId: payload.sessionId
192
+ };
193
+ } catch (error) {
194
+ if (error instanceof jwt.JsonWebTokenError) {
195
+ return {
196
+ isValid: false
197
+ };
198
+ }
199
+ throw error;
200
+ }
201
+ }
202
+ async invalidateRefreshToken(origin, userId, deviceId) {
203
+ await this.provider.deleteBy({
204
+ userId,
205
+ origin,
206
+ deviceId
207
+ });
208
+ }
209
+ async generateAccessToken(refreshToken) {
210
+ const validation = await this.validateRefreshToken(refreshToken);
211
+ if (!validation.isValid) {
212
+ return {
213
+ error: 'invalid_refresh_token'
214
+ };
215
+ }
216
+ const payload = {
217
+ userId: String(validation.userId),
218
+ sessionId: validation.sessionId,
219
+ type: 'access'
220
+ };
221
+ const token = jwt.sign(payload, this.config.jwtSecret, {
222
+ algorithm: this.config.algorithm ?? constants.DEFAULT_ALGORITHM,
223
+ expiresIn: this.config.accessTokenLifespan
224
+ });
225
+ return {
226
+ token
227
+ };
228
+ }
229
+ async rotateRefreshToken(refreshToken) {
230
+ try {
231
+ const payload = jwt.verify(refreshToken, this.config.jwtSecret, {
232
+ algorithms: [
233
+ this.config.algorithm ?? constants.DEFAULT_ALGORITHM
234
+ ]
235
+ });
236
+ if (!payload || payload.type !== 'refresh') {
237
+ return {
238
+ error: 'invalid_refresh_token'
239
+ };
240
+ }
241
+ const current = await this.provider.findBySessionId(payload.sessionId);
242
+ if (!current) {
243
+ return {
244
+ error: 'invalid_refresh_token'
245
+ };
246
+ }
247
+ // If parent already has a child, return the same child token
248
+ if (current.childId) {
249
+ const child = await this.provider.findBySessionId(current.childId);
250
+ if (child) {
251
+ const childIat = Math.floor(new Date(child.createdAt ?? new Date()).getTime() / 1000);
252
+ const childExp = Math.floor(new Date(child.expiresAt).getTime() / 1000);
253
+ const childPayload = {
254
+ userId: child.userId,
255
+ sessionId: child.sessionId,
256
+ type: 'refresh',
257
+ iat: childIat,
258
+ exp: childExp
259
+ };
260
+ const childToken = jwt.sign(childPayload, this.config.jwtSecret, {
261
+ algorithm: this.config.algorithm ?? constants.DEFAULT_ALGORITHM,
262
+ noTimestamp: true
263
+ });
264
+ let absoluteExpiresAt;
265
+ if (child.absoluteExpiresAt) {
266
+ absoluteExpiresAt = typeof child.absoluteExpiresAt === 'string' ? child.absoluteExpiresAt : child.absoluteExpiresAt.toISOString();
267
+ } else {
268
+ absoluteExpiresAt = new Date(0).toISOString();
269
+ }
270
+ return {
271
+ token: childToken,
272
+ sessionId: child.sessionId,
273
+ absoluteExpiresAt,
274
+ familyId: String(child.familyId ?? child.sessionId),
275
+ type: child.type ?? 'refresh'
276
+ };
277
+ }
278
+ }
279
+ const now = Date.now();
280
+ const familyType = current.type ?? 'refresh';
281
+ const idleLifespan = familyType === 'refresh' ? this.config.idleRefreshTokenLifespan : this.config.idleSessionLifespan;
282
+ // Enforce idle window since creation of the current token
283
+ if (current.createdAt && now - new Date(current.createdAt).getTime() > idleLifespan * 1000) {
284
+ return {
285
+ error: 'idle_window_elapsed'
286
+ };
287
+ }
288
+ // Enforce max family window using absoluteExpiresAt
289
+ const absolute = current.absoluteExpiresAt ? new Date(current.absoluteExpiresAt).getTime() : now;
290
+ if (absolute <= now) {
291
+ return {
292
+ error: 'max_window_elapsed'
293
+ };
294
+ }
295
+ // Create child token
296
+ const childSessionId = this.generateSessionId();
297
+ const childExpiresAt = new Date(now + idleLifespan * 1000);
298
+ const childRecord = await this.provider.create({
299
+ userId: current.userId,
300
+ sessionId: childSessionId,
301
+ deviceId: current.deviceId,
302
+ origin: current.origin,
303
+ parentId: current.sessionId,
304
+ childId: null,
305
+ familyId: current.familyId ?? current.sessionId,
306
+ type: familyType,
307
+ status: 'active',
308
+ expiresAt: childExpiresAt,
309
+ absoluteExpiresAt: current.absoluteExpiresAt ?? new Date(absolute)
310
+ });
311
+ const childIat = Math.floor(new Date(childRecord.createdAt ?? new Date()).getTime() / 1000);
312
+ const childExp = Math.floor(new Date(childRecord.expiresAt).getTime() / 1000);
313
+ const payloadOut = {
314
+ userId: current.userId,
315
+ sessionId: childSessionId,
316
+ type: 'refresh',
317
+ iat: childIat,
318
+ exp: childExp
319
+ };
320
+ const childToken = jwt.sign(payloadOut, this.config.jwtSecret, {
321
+ algorithm: this.config.algorithm ?? constants.DEFAULT_ALGORITHM,
322
+ noTimestamp: true
323
+ });
324
+ await this.provider.updateBySessionId(current.sessionId, {
325
+ status: 'rotated',
326
+ childId: childSessionId
327
+ });
328
+ let absoluteExpiresAt;
329
+ if (childRecord.absoluteExpiresAt) {
330
+ absoluteExpiresAt = typeof childRecord.absoluteExpiresAt === 'string' ? childRecord.absoluteExpiresAt : childRecord.absoluteExpiresAt.toISOString();
331
+ } else {
332
+ absoluteExpiresAt = new Date(absolute).toISOString();
333
+ }
334
+ return {
335
+ token: childToken,
336
+ sessionId: childSessionId,
337
+ absoluteExpiresAt,
338
+ familyId: String(childRecord.familyId ?? childRecord.sessionId),
339
+ type: familyType
340
+ };
341
+ } catch {
342
+ return {
343
+ error: 'invalid_refresh_token'
344
+ };
345
+ }
346
+ }
347
+ /**
348
+ * Returns true when a session exists and is not expired.
349
+ * If the session exists but is expired, it will be deleted as part of this check.
350
+ */ async isSessionActive(sessionId) {
351
+ const session = await this.provider.findBySessionId(sessionId);
352
+ if (!session) {
353
+ return false;
354
+ }
355
+ if (new Date(session.expiresAt) <= new Date()) {
356
+ // Clean up expired session eagerly
357
+ await this.provider.deleteBySessionId(sessionId);
358
+ return false;
359
+ }
360
+ return true;
361
+ }
362
+ constructor(provider, config){
363
+ // Run expired cleanup only every N calls to avoid extra queries
364
+ this.cleanupInvocationCounter = 0;
365
+ this.cleanupEveryCalls = 50;
366
+ this.provider = provider;
367
+ this.config = config;
368
+ }
369
+ }
370
+ const createDatabaseProvider = (db, contentType)=>{
371
+ return new DatabaseSessionProvider(db, contentType);
372
+ };
373
+ const createSessionManager = ({ db, config })=>{
374
+ const provider = createDatabaseProvider(db, 'admin::session');
375
+ return new SessionManager(provider, config);
376
+ };
377
+
378
+ exports.createDatabaseProvider = createDatabaseProvider;
379
+ exports.createSessionManager = createSessionManager;
380
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sources":["../../src/services/session-manager.ts"],"sourcesContent":["import crypto from 'crypto';\nimport jwt from 'jsonwebtoken';\nimport type { Algorithm, VerifyOptions } from 'jsonwebtoken';\nimport type { Database } from '@strapi/database';\nimport { DEFAULT_ALGORITHM } from '../constants';\n\nexport interface SessionProvider {\n create(session: SessionData): Promise<SessionData>;\n findBySessionId(sessionId: string): Promise<SessionData | null>;\n updateBySessionId(sessionId: string, data: Partial<SessionData>): Promise<void>;\n deleteBySessionId(sessionId: string): Promise<void>;\n deleteExpired(): Promise<void>;\n deleteBy(criteria: { userId?: string; origin?: string; deviceId?: string }): Promise<void>;\n}\n\nexport interface SessionData {\n id?: string;\n userId: string; // User ID stored as string (key-value store)\n sessionId: string;\n deviceId: string;\n origin: string;\n parentId?: string | null;\n childId?: string | null;\n familyId?: string | null;\n type?: 'refresh' | 'session';\n status?: 'active' | 'rotated' | 'revoked';\n expiresAt: Date;\n absoluteExpiresAt?: Date | null;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport interface RefreshTokenPayload {\n userId: string;\n sessionId: string;\n type: 'refresh';\n exp: number;\n iat: number;\n}\n\nexport interface AccessTokenPayload {\n userId: string;\n sessionId: string;\n type: 'access';\n exp: number;\n iat: number;\n}\n\nexport type TokenPayload = RefreshTokenPayload | AccessTokenPayload;\n\nexport interface ValidateRefreshTokenResult {\n isValid: boolean;\n userId?: string;\n sessionId?: string;\n error?:\n | 'invalid_token'\n | 'token_expired'\n | 'session_not_found'\n | 'session_expired'\n | 'wrong_token_type';\n}\n\nclass DatabaseSessionProvider implements SessionProvider {\n private db: Database;\n\n private contentType: string;\n\n constructor(db: Database, contentType: string) {\n this.db = db;\n this.contentType = contentType;\n }\n\n async create(session: SessionData): Promise<SessionData> {\n const result = await this.db.query(this.contentType).create({\n data: session,\n });\n return result as SessionData;\n }\n\n async findBySessionId(sessionId: string): Promise<SessionData | null> {\n const result = await this.db.query(this.contentType).findOne({\n where: { sessionId },\n });\n return result as SessionData | null;\n }\n\n async updateBySessionId(sessionId: string, data: Partial<SessionData>): Promise<void> {\n await this.db.query(this.contentType).update({ where: { sessionId }, data });\n }\n\n async deleteBySessionId(sessionId: string): Promise<void> {\n await this.db.query(this.contentType).delete({\n where: { sessionId },\n });\n }\n\n async deleteExpired(): Promise<void> {\n await this.db.query(this.contentType).deleteMany({\n where: { absoluteExpiresAt: { $lt: new Date() } },\n });\n }\n\n async deleteBy(criteria: { userId?: string; origin?: string; deviceId?: string }): Promise<void> {\n await this.db.query(this.contentType).deleteMany({\n where: {\n ...(criteria.userId ? { userId: criteria.userId } : {}),\n ...(criteria.origin ? { origin: criteria.origin } : {}),\n ...(criteria.deviceId ? { deviceId: criteria.deviceId } : {}),\n },\n });\n }\n}\n\nexport interface SessionManagerConfig {\n jwtSecret: string;\n accessTokenLifespan: number;\n maxRefreshTokenLifespan: number;\n idleRefreshTokenLifespan: number;\n maxSessionLifespan: number;\n idleSessionLifespan: number;\n /**\n * JWT signing/verification algorithm. Defaults to 'HS256' when not provided.\n */\n algorithm?: Algorithm;\n}\n\nclass SessionManager {\n private provider: SessionProvider;\n\n private config: SessionManagerConfig;\n\n // Run expired cleanup only every N calls to avoid extra queries\n private cleanupInvocationCounter: number = 0;\n\n private readonly cleanupEveryCalls: number = 50;\n\n constructor(provider: SessionProvider, config: SessionManagerConfig) {\n this.provider = provider;\n this.config = config;\n }\n\n generateSessionId(): string {\n return crypto.randomBytes(16).toString('hex');\n }\n\n private async maybeCleanupExpired(): Promise<void> {\n this.cleanupInvocationCounter += 1;\n if (this.cleanupInvocationCounter >= this.cleanupEveryCalls) {\n this.cleanupInvocationCounter = 0;\n\n await this.provider.deleteExpired();\n }\n }\n\n async generateRefreshToken(\n userId: string,\n deviceId: string,\n origin: string,\n options?: { familyType?: 'refresh' | 'session' }\n ): Promise<{ token: string; sessionId: string; absoluteExpiresAt: string; familyId: string }> {\n await this.maybeCleanupExpired();\n\n const sessionId = this.generateSessionId();\n const familyType = options?.familyType ?? 'refresh';\n const isRefresh = familyType === 'refresh';\n\n const idleLifespan = isRefresh\n ? this.config.idleRefreshTokenLifespan\n : this.config.idleSessionLifespan;\n\n const maxLifespan = isRefresh\n ? this.config.maxRefreshTokenLifespan\n : this.config.maxSessionLifespan;\n\n const now = Date.now();\n const expiresAt = new Date(now + idleLifespan * 1000);\n const absoluteExpiresAt = new Date(now + maxLifespan * 1000);\n\n // Create the root record first so createdAt can be used for signing.\n const record = await this.provider.create({\n userId,\n sessionId,\n deviceId,\n origin,\n parentId: null,\n childId: null,\n familyId: sessionId,\n type: familyType,\n status: 'active',\n expiresAt,\n absoluteExpiresAt,\n });\n\n const issuedAtSeconds = Math.floor(new Date(record.createdAt ?? new Date()).getTime() / 1000);\n const expiresAtSeconds = Math.floor(new Date(record.expiresAt).getTime() / 1000);\n\n const payload: RefreshTokenPayload = {\n userId,\n sessionId,\n type: 'refresh',\n iat: issuedAtSeconds,\n exp: expiresAtSeconds,\n };\n\n const token = jwt.sign(payload, this.config.jwtSecret, {\n algorithm: this.config.algorithm ?? DEFAULT_ALGORITHM,\n noTimestamp: true,\n });\n\n return {\n token,\n sessionId,\n absoluteExpiresAt: absoluteExpiresAt.toISOString(),\n familyId: record.familyId!,\n };\n }\n\n validateAccessToken(\n token: string\n ): { isValid: true; payload: AccessTokenPayload } | { isValid: false; payload: null } {\n try {\n const payload = jwt.verify(token, this.config.jwtSecret, {\n algorithms: [this.config.algorithm ?? DEFAULT_ALGORITHM],\n }) as TokenPayload;\n\n // Ensure this is an access token\n if (!payload || payload.type !== 'access') {\n return { isValid: false, payload: null };\n }\n\n return { isValid: true, payload };\n } catch (err) {\n return { isValid: false, payload: null };\n }\n }\n\n async validateRefreshToken(token: string): Promise<ValidateRefreshTokenResult> {\n try {\n const verifyOptions: VerifyOptions = {\n algorithms: [this.config.algorithm ?? DEFAULT_ALGORITHM],\n };\n\n const payload = jwt.verify(\n token,\n this.config.jwtSecret,\n verifyOptions\n ) as RefreshTokenPayload;\n\n if (payload.type !== 'refresh') {\n return { isValid: false };\n }\n\n const session = await this.provider.findBySessionId(payload.sessionId);\n if (!session) {\n return { isValid: false };\n }\n\n const now = new Date();\n if (new Date(session.expiresAt) <= now) {\n return { isValid: false };\n }\n\n // Absolute family expiry check\n if (session.absoluteExpiresAt && new Date(session.absoluteExpiresAt) <= now) {\n return { isValid: false };\n }\n\n // Only 'active' sessions are eligible to create access tokens.\n if (session.status !== 'active') {\n return { isValid: false };\n }\n\n if (session.userId !== payload.userId) {\n return { isValid: false };\n }\n\n return {\n isValid: true,\n userId: payload.userId,\n sessionId: payload.sessionId,\n };\n } catch (error: any) {\n if (error instanceof jwt.JsonWebTokenError) {\n return { isValid: false };\n }\n\n throw error;\n }\n }\n\n async invalidateRefreshToken(origin: string, userId: string, deviceId?: string): Promise<void> {\n await this.provider.deleteBy({ userId, origin, deviceId });\n }\n\n async generateAccessToken(refreshToken: string): Promise<{ token: string } | { error: string }> {\n const validation = await this.validateRefreshToken(refreshToken);\n\n if (!validation.isValid) {\n return { error: 'invalid_refresh_token' };\n }\n\n const payload: Omit<AccessTokenPayload, 'iat' | 'exp'> = {\n userId: String(validation.userId!),\n sessionId: validation.sessionId!,\n type: 'access',\n };\n\n const token = jwt.sign(payload, this.config.jwtSecret, {\n algorithm: this.config.algorithm ?? DEFAULT_ALGORITHM,\n expiresIn: this.config.accessTokenLifespan,\n });\n\n return { token };\n }\n\n async rotateRefreshToken(refreshToken: string): Promise<\n | {\n token: string;\n sessionId: string;\n absoluteExpiresAt: string;\n familyId: string;\n type: 'refresh' | 'session';\n }\n | { error: string }\n > {\n try {\n const payload = jwt.verify(refreshToken, this.config.jwtSecret, {\n algorithms: [this.config.algorithm ?? DEFAULT_ALGORITHM],\n }) as RefreshTokenPayload;\n\n if (!payload || payload.type !== 'refresh') {\n return { error: 'invalid_refresh_token' };\n }\n\n const current = await this.provider.findBySessionId(payload.sessionId);\n if (!current) {\n return { error: 'invalid_refresh_token' };\n }\n\n // If parent already has a child, return the same child token\n if (current.childId) {\n const child = await this.provider.findBySessionId(current.childId);\n\n if (child) {\n const childIat = Math.floor(new Date(child.createdAt ?? new Date()).getTime() / 1000);\n const childExp = Math.floor(new Date(child.expiresAt).getTime() / 1000);\n\n const childPayload: RefreshTokenPayload = {\n userId: child.userId,\n sessionId: child.sessionId,\n type: 'refresh',\n iat: childIat,\n exp: childExp,\n };\n\n const childToken = jwt.sign(childPayload, this.config.jwtSecret, {\n algorithm: this.config.algorithm ?? DEFAULT_ALGORITHM,\n noTimestamp: true,\n });\n\n let absoluteExpiresAt;\n if (child.absoluteExpiresAt) {\n absoluteExpiresAt =\n typeof child.absoluteExpiresAt === 'string'\n ? child.absoluteExpiresAt\n : child.absoluteExpiresAt.toISOString();\n } else {\n absoluteExpiresAt = new Date(0).toISOString();\n }\n\n return {\n token: childToken,\n sessionId: child.sessionId,\n absoluteExpiresAt,\n familyId: String(child.familyId ?? child.sessionId),\n type: child.type ?? 'refresh',\n };\n }\n }\n\n const now = Date.now();\n const familyType = current.type ?? 'refresh';\n const idleLifespan =\n familyType === 'refresh'\n ? this.config.idleRefreshTokenLifespan\n : this.config.idleSessionLifespan;\n\n // Enforce idle window since creation of the current token\n if (current.createdAt && now - new Date(current.createdAt).getTime() > idleLifespan * 1000) {\n return { error: 'idle_window_elapsed' };\n }\n\n // Enforce max family window using absoluteExpiresAt\n const absolute = current.absoluteExpiresAt\n ? new Date(current.absoluteExpiresAt).getTime()\n : now;\n if (absolute <= now) {\n return { error: 'max_window_elapsed' };\n }\n\n // Create child token\n const childSessionId = this.generateSessionId();\n const childExpiresAt = new Date(now + idleLifespan * 1000);\n\n const childRecord = await this.provider.create({\n userId: current.userId,\n sessionId: childSessionId,\n deviceId: current.deviceId,\n origin: current.origin,\n parentId: current.sessionId,\n childId: null,\n familyId: current.familyId ?? current.sessionId,\n type: familyType,\n status: 'active',\n expiresAt: childExpiresAt,\n absoluteExpiresAt: current.absoluteExpiresAt ?? new Date(absolute),\n });\n\n const childIat = Math.floor(new Date(childRecord.createdAt ?? new Date()).getTime() / 1000);\n const childExp = Math.floor(new Date(childRecord.expiresAt).getTime() / 1000);\n const payloadOut: RefreshTokenPayload = {\n userId: current.userId,\n sessionId: childSessionId,\n type: 'refresh',\n iat: childIat,\n exp: childExp,\n };\n const childToken = jwt.sign(payloadOut, this.config.jwtSecret, {\n algorithm: this.config.algorithm ?? DEFAULT_ALGORITHM,\n noTimestamp: true,\n });\n\n await this.provider.updateBySessionId(current.sessionId, {\n status: 'rotated',\n childId: childSessionId,\n });\n\n let absoluteExpiresAt;\n if (childRecord.absoluteExpiresAt) {\n absoluteExpiresAt =\n typeof childRecord.absoluteExpiresAt === 'string'\n ? childRecord.absoluteExpiresAt\n : childRecord.absoluteExpiresAt.toISOString();\n } else {\n absoluteExpiresAt = new Date(absolute).toISOString();\n }\n\n return {\n token: childToken,\n sessionId: childSessionId,\n absoluteExpiresAt,\n familyId: String(childRecord.familyId ?? childRecord.sessionId),\n type: familyType,\n };\n } catch {\n return { error: 'invalid_refresh_token' };\n }\n }\n\n /**\n * Returns true when a session exists and is not expired.\n * If the session exists but is expired, it will be deleted as part of this check.\n */\n async isSessionActive(sessionId: string): Promise<boolean> {\n const session = await this.provider.findBySessionId(sessionId);\n if (!session) {\n return false;\n }\n\n if (new Date(session.expiresAt) <= new Date()) {\n // Clean up expired session eagerly\n await this.provider.deleteBySessionId(sessionId);\n\n return false;\n }\n\n return true;\n }\n}\n\nconst createDatabaseProvider = (db: Database, contentType: string): SessionProvider => {\n return new DatabaseSessionProvider(db, contentType);\n};\n\nconst createSessionManager = ({ db, config }: { db: Database; config: SessionManagerConfig }) => {\n const provider = createDatabaseProvider(db, 'admin::session');\n return new SessionManager(provider, config);\n};\n\nexport { createSessionManager, createDatabaseProvider };\n"],"names":["DatabaseSessionProvider","create","session","result","db","query","contentType","data","findBySessionId","sessionId","findOne","where","updateBySessionId","update","deleteBySessionId","delete","deleteExpired","deleteMany","absoluteExpiresAt","$lt","Date","deleteBy","criteria","userId","origin","deviceId","constructor","SessionManager","generateSessionId","crypto","randomBytes","toString","maybeCleanupExpired","cleanupInvocationCounter","cleanupEveryCalls","provider","generateRefreshToken","options","familyType","isRefresh","idleLifespan","config","idleRefreshTokenLifespan","idleSessionLifespan","maxLifespan","maxRefreshTokenLifespan","maxSessionLifespan","now","expiresAt","record","parentId","childId","familyId","type","status","issuedAtSeconds","Math","floor","createdAt","getTime","expiresAtSeconds","payload","iat","exp","token","jwt","sign","jwtSecret","algorithm","DEFAULT_ALGORITHM","noTimestamp","toISOString","validateAccessToken","verify","algorithms","isValid","err","validateRefreshToken","verifyOptions","error","JsonWebTokenError","invalidateRefreshToken","generateAccessToken","refreshToken","validation","String","expiresIn","accessTokenLifespan","rotateRefreshToken","current","child","childIat","childExp","childPayload","childToken","absolute","childSessionId","childExpiresAt","childRecord","payloadOut","isSessionActive","createDatabaseProvider","createSessionManager"],"mappings":"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"}