@prosopo/types-database 3.3.5 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,104 @@
1
1
  # @prosopo/types-database
2
2
 
3
+ ## 4.0.0
4
+ ### Major Changes
5
+
6
+ - 8f22479: Update settings schema
7
+
8
+ ### Minor Changes
9
+
10
+ - bb5f41c: Context awareness
11
+
12
+ ### Patch Changes
13
+
14
+ - 55a64c6: stop refresh image to pow
15
+ - 8ce9205: Change engine requirements
16
+ - b6e98b2: Run npm audit
17
+ - 55a64c6: Persist sessions for user ip combinations
18
+ - Updated dependencies [8ce9205]
19
+ - Updated dependencies [15ae7cf]
20
+ - Updated dependencies [bb5f41c]
21
+ - Updated dependencies [8ce9205]
22
+ - Updated dependencies [df79c03]
23
+ - Updated dependencies [b6e98b2]
24
+ - @prosopo/user-access-policy@3.5.28
25
+ - @prosopo/types@3.6.0
26
+ - @prosopo/common@3.1.22
27
+ - @prosopo/locale@3.1.22
28
+ - @prosopo/config@3.1.22
29
+
30
+ ## 3.3.13
31
+ ### Patch Changes
32
+
33
+ - Updated dependencies [8f1773a]
34
+ - @prosopo/types@3.5.11
35
+ - @prosopo/user-access-policy@3.5.27
36
+
37
+ ## 3.3.12
38
+ ### Patch Changes
39
+
40
+ - cb8ab85: head entropy for bot detection
41
+ - Updated dependencies [cb8ab85]
42
+ - @prosopo/types@3.5.10
43
+ - @prosopo/user-access-policy@3.5.26
44
+
45
+ ## 3.3.11
46
+ ### Patch Changes
47
+
48
+ - 43907e8: Convert timestamp fields from numbers to Date objects throughout codebase
49
+ - b4639ec: Merge frictionless tokens into sessions
50
+ - 7101036: Force consistent IPs logic
51
+ - Updated dependencies [43907e8]
52
+ - Updated dependencies [005ce66]
53
+ - Updated dependencies [7101036]
54
+ - @prosopo/types@3.5.9
55
+ - @prosopo/user-access-policy@3.5.25
56
+
57
+ ## 3.3.10
58
+ ### Patch Changes
59
+
60
+ - b10a65f: Allow saving webview
61
+ - 6420187: Save iframe
62
+ - Updated dependencies [e5c259d]
63
+ - @prosopo/types@3.5.8
64
+ - @prosopo/user-access-policy@3.5.24
65
+
66
+ ## 3.3.9
67
+ ### Patch Changes
68
+
69
+ - 3a027ef: Fix session storer
70
+ - 3a027ef: Release cycle
71
+ - Updated dependencies [c9d8fdf]
72
+ - Updated dependencies [b8185a4]
73
+ - @prosopo/user-access-policy@3.5.23
74
+ - @prosopo/common@3.1.21
75
+ - @prosopo/config@3.1.21
76
+ - @prosopo/locale@3.1.21
77
+ - @prosopo/types@3.5.7
78
+
79
+ ## 3.3.8
80
+ ### Patch Changes
81
+
82
+ - Updated dependencies [5d11a81]
83
+ - @prosopo/types@3.5.6
84
+ - @prosopo/user-access-policy@3.5.22
85
+
86
+ ## 3.3.7
87
+ ### Patch Changes
88
+
89
+ - 494c5a8: Updated payload
90
+ - Updated dependencies [494c5a8]
91
+ - @prosopo/types@3.5.5
92
+ - @prosopo/user-access-policy@3.5.21
93
+
94
+ ## 3.3.6
95
+ ### Patch Changes
96
+
97
+ - 08ff50f: IP Validation Schema update
98
+ - Updated dependencies [08ff50f]
99
+ - @prosopo/types@3.5.4
100
+ - @prosopo/user-access-policy@3.5.20
101
+
3
102
  ## 3.3.5
4
103
  ### Patch Changes
5
104
 
@@ -5,12 +5,12 @@ const provider = require("./types/provider.cjs");
5
5
  const client = require("./types/client.cjs");
6
6
  const captcha = require("./types/captcha.cjs");
7
7
  exports.CaptchaRecordSchema = provider.CaptchaRecordSchema;
8
+ exports.ClientEntropyRecordSchema = provider.ClientEntropyRecordSchema;
8
9
  exports.ClientRecordSchema = provider.ClientRecordSchema;
9
10
  exports.CompositeIpAddressRecordSchemaObj = provider.CompositeIpAddressRecordSchemaObj;
10
11
  exports.CompositeIpAddressSchema = provider.CompositeIpAddressSchema;
11
12
  exports.DatasetRecordSchema = provider.DatasetRecordSchema;
12
13
  exports.DetectorRecordSchema = provider.DetectorRecordSchema;
13
- exports.FrictionlessTokenRecordSchema = provider.FrictionlessTokenRecordSchema;
14
14
  exports.IpAddressType = provider.IpAddressType;
15
15
  exports.PendingRecordSchema = provider.PendingRecordSchema;
16
16
  exports.PoWCaptchaRecordSchema = provider.PoWCaptchaRecordSchema;
@@ -2,31 +2,15 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const mongoose = require("mongoose");
4
4
  const provider = require("./provider.cjs");
5
- const StoredSessionRecordSchema = new mongoose.Schema({
6
- ...provider.SessionRecordSchema.obj,
7
- ...Object.fromEntries(
8
- Object.entries(provider.FrictionlessTokenRecordSchema.obj).filter(
9
- ([key]) => key !== "token"
10
- )
11
- )
12
- });
13
- const existingIndexes = StoredSessionRecordSchema.indexes();
14
- const filteredIndexes = existingIndexes.filter(
15
- (idx) => !("sessionId" in idx[0])
16
- );
17
- for (const [fields, options] of filteredIndexes) {
18
- StoredSessionRecordSchema.index(fields, options);
19
- }
20
- StoredSessionRecordSchema.index({ tokenId: 1 });
21
- StoredSessionRecordSchema.index({ sessionId: 1 }, { unique: false });
5
+ const StoredSessionRecordSchema = provider.SessionRecordSchema;
22
6
  const StoredUserCommitmentRecordSchema = new mongoose.Schema({
23
7
  ...provider.UserCommitmentRecordSchema.obj
24
8
  });
25
- StoredUserCommitmentRecordSchema.index({ frictionlessTokenId: 1 });
9
+ StoredUserCommitmentRecordSchema.index({ sessionId: 1 });
26
10
  const StoredPoWCaptchaRecordSchema = new mongoose.Schema({
27
11
  ...provider.PoWCaptchaRecordSchema.obj
28
12
  });
29
- StoredPoWCaptchaRecordSchema.index({ frictionlessTokenId: 1 });
13
+ StoredPoWCaptchaRecordSchema.index({ sessionId: 1 });
30
14
  exports.StoredPoWCaptchaRecordSchema = StoredPoWCaptchaRecordSchema;
31
15
  exports.StoredSessionRecordSchema = StoredSessionRecordSchema;
32
16
  exports.StoredUserCommitmentRecordSchema = StoredUserCommitmentRecordSchema;
@@ -1,12 +1,64 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const types = require("@prosopo/types");
3
4
  const mongoose = require("mongoose");
4
5
  const IPValidationRulesSchema = new mongoose.Schema({
5
- countryChangeAction: String,
6
- ispChangeAction: String,
7
- distanceThresholdKm: Number,
8
- distanceExceedAction: String,
9
- requireAllConditions: Boolean
6
+ actions: {
7
+ countryChangeAction: {
8
+ type: mongoose.Schema.Types.Mixed,
9
+ default: () => types.countryChangeActionDefault
10
+ },
11
+ cityChangeAction: {
12
+ type: mongoose.Schema.Types.Mixed,
13
+ default: () => types.cityChangeActionDefault
14
+ },
15
+ ispChangeAction: {
16
+ type: mongoose.Schema.Types.Mixed,
17
+ default: () => types.ispChangeActionDefault
18
+ },
19
+ distanceExceedAction: {
20
+ type: mongoose.Schema.Types.Mixed,
21
+ default: () => types.distanceExceedActionDefault
22
+ },
23
+ abuseScoreExceedAction: {
24
+ type: mongoose.Schema.Types.Mixed,
25
+ default: () => types.abuseScoreThresholdExceedActionDefault
26
+ }
27
+ },
28
+ distanceThresholdKm: {
29
+ type: Number,
30
+ min: 0,
31
+ default: types.distanceThresholdKmDefault
32
+ },
33
+ abuseScoreThreshold: {
34
+ type: Number,
35
+ min: 0,
36
+ default: types.abuseScoreThresholdDefault
37
+ },
38
+ requireAllConditions: {
39
+ type: Boolean,
40
+ default: types.requireAllConditionsDefault
41
+ },
42
+ forceConsistentIp: {
43
+ type: Boolean,
44
+ default: false
45
+ },
46
+ countryOverrides: {
47
+ type: Map,
48
+ of: new mongoose.Schema({
49
+ actions: {
50
+ countryChangeAction: { type: mongoose.Schema.Types.Mixed },
51
+ cityChangeAction: { type: mongoose.Schema.Types.Mixed },
52
+ ispChangeAction: { type: mongoose.Schema.Types.Mixed },
53
+ distanceExceedAction: { type: mongoose.Schema.Types.Mixed },
54
+ abuseScoreExceedAction: { type: mongoose.Schema.Types.Mixed }
55
+ },
56
+ distanceThresholdKm: { type: Number, min: 0 },
57
+ abuseScoreThreshold: { type: Number, min: 0 },
58
+ requireAllConditions: { type: Boolean }
59
+ }),
60
+ default: void 0
61
+ }
10
62
  });
11
63
  const UserSettingsSchema = new mongoose.Schema({
12
64
  captchaType: String,
@@ -14,7 +66,15 @@ const UserSettingsSchema = new mongoose.Schema({
14
66
  powDifficulty: Number,
15
67
  imageThreshold: Number,
16
68
  ipValidationRules: IPValidationRulesSchema,
17
- domains: [String]
69
+ domains: [String],
70
+ disallowWebView: {
71
+ type: Boolean,
72
+ default: false
73
+ },
74
+ contextAware: {
75
+ enabled: { type: Boolean, default: false },
76
+ threshold: { type: Number, default: types.contextAwareThresholdDefault }
77
+ }
18
78
  });
19
79
  const UserDataSchema = new mongoose.Schema({
20
80
  email: String,
@@ -22,14 +82,14 @@ const UserDataSchema = new mongoose.Schema({
22
82
  account: String,
23
83
  url: String,
24
84
  mnemonic: String,
25
- createdAt: Number,
85
+ createdAt: Date,
26
86
  activated: Boolean,
27
87
  tier: String,
28
88
  settings: {
29
89
  type: UserSettingsSchema,
30
90
  required: false
31
91
  },
32
- updatedAtTimestamp: Number
92
+ updatedAtTimestamp: Date
33
93
  });
34
94
  const AccountSchema = new mongoose.Schema({
35
95
  createdAt: Number,
@@ -6,12 +6,12 @@ const client = require("./client.cjs");
6
6
  const captcha = require("./captcha.cjs");
7
7
  require("./userAgent.cjs");
8
8
  exports.CaptchaRecordSchema = provider.CaptchaRecordSchema;
9
+ exports.ClientEntropyRecordSchema = provider.ClientEntropyRecordSchema;
9
10
  exports.ClientRecordSchema = provider.ClientRecordSchema;
10
11
  exports.CompositeIpAddressRecordSchemaObj = provider.CompositeIpAddressRecordSchemaObj;
11
12
  exports.CompositeIpAddressSchema = provider.CompositeIpAddressSchema;
12
13
  exports.DatasetRecordSchema = provider.DatasetRecordSchema;
13
14
  exports.DetectorRecordSchema = provider.DetectorRecordSchema;
14
- exports.FrictionlessTokenRecordSchema = provider.FrictionlessTokenRecordSchema;
15
15
  exports.IpAddressType = provider.IpAddressType;
16
16
  exports.PendingRecordSchema = provider.PendingRecordSchema;
17
17
  exports.PoWCaptchaRecordSchema = provider.PoWCaptchaRecordSchema;
@@ -69,13 +69,10 @@ const UserCommitmentSchema = zod.object({
69
69
  ja4: zod.string(),
70
70
  userSubmitted: zod.boolean(),
71
71
  serverChecked: zod.boolean(),
72
- storedAtTimestamp: types.TimestampSchema.optional(),
73
- requestedAtTimestamp: types.TimestampSchema,
74
- lastUpdatedTimestamp: types.TimestampSchema.optional(),
75
- frictionlessTokenId: zod.union([
76
- zod.string(),
77
- zod.instanceof(mongoose.Types.ObjectId)
78
- ]).optional(),
72
+ storedAtTimestamp: zod.date().optional(),
73
+ requestedAtTimestamp: zod.date(),
74
+ lastUpdatedTimestamp: zod.date().optional(),
75
+ sessionId: zod.string().optional(),
79
76
  coords: zod.array(zod.array(zod.array(zod.number()))).optional()
80
77
  });
81
78
  const CaptchaRecordSchema = new mongoose.Schema({
@@ -108,8 +105,8 @@ const PoWCaptchaRecordSchema = new mongoose.Schema({
108
105
  challenge: { type: String, required: true },
109
106
  dappAccount: { type: String, required: true },
110
107
  userAccount: { type: String, required: true },
111
- requestedAtTimestamp: { type: Number, required: true },
112
- lastUpdatedTimestamp: { type: Number, required: false },
108
+ requestedAtTimestamp: { type: Date, required: true },
109
+ lastUpdatedTimestamp: { type: Date, required: false },
113
110
  result: {
114
111
  status: { type: String, enum: types.CaptchaStatus, required: true },
115
112
  reason: {
@@ -134,8 +131,8 @@ const PoWCaptchaRecordSchema = new mongoose.Schema({
134
131
  geolocation: { type: String, required: false },
135
132
  vpn: { type: Boolean, required: false },
136
133
  parsedUserAgentInfo: { type: Object, required: false },
137
- frictionlessTokenId: {
138
- type: mongoose.Schema.Types.ObjectId,
134
+ sessionId: {
135
+ type: String,
139
136
  required: false
140
137
  },
141
138
  coords: { type: [[[Number]]], required: false }
@@ -171,13 +168,13 @@ const UserCommitmentRecordSchema = new mongoose.Schema({
171
168
  userSubmitted: { type: Boolean, required: true },
172
169
  serverChecked: { type: Boolean, required: true },
173
170
  storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
174
- requestedAtTimestamp: { type: Number, required: true },
175
- lastUpdatedTimestamp: { type: Number, required: false },
171
+ requestedAtTimestamp: { type: Date, required: true },
172
+ lastUpdatedTimestamp: { type: Date, required: false },
176
173
  geolocation: { type: String, required: false },
177
174
  vpn: { type: Boolean, required: false },
178
175
  parsedUserAgentInfo: { type: Object, required: false },
179
- frictionlessTokenId: {
180
- type: mongoose.Schema.Types.ObjectId,
176
+ sessionId: {
177
+ type: String,
181
178
  required: false
182
179
  },
183
180
  coords: { type: [[[Number]]], required: false }
@@ -240,8 +237,8 @@ const PendingRecordSchema = new mongoose.Schema({
240
237
  // unix timestamp
241
238
  requestedAtTimestamp: { type: Date, required: true, expires: ONE_WEEK },
242
239
  ipAddress: CompositeIpAddressRecordSchemaObj,
243
- frictionlessTokenId: {
244
- type: mongoose.Schema.Types.ObjectId,
240
+ sessionId: {
241
+ type: String,
245
242
  required: false
246
243
  },
247
244
  threshold: { type: Number, required: true, default: 0.8 }
@@ -249,8 +246,8 @@ const PendingRecordSchema = new mongoose.Schema({
249
246
  PendingRecordSchema.index({ requestHash: -1 });
250
247
  const ScheduledTaskSchema = zod.object({
251
248
  processName: zod.nativeEnum(types.ScheduledTaskNames),
252
- datetime: types.TimestampSchema,
253
- updated: types.TimestampSchema.optional(),
249
+ datetime: zod.date(),
250
+ updated: zod.date().optional(),
254
251
  status: zod.nativeEnum(types.ScheduledTaskStatus),
255
252
  result: zod.object({
256
253
  data: zod.any().optional(),
@@ -260,7 +257,7 @@ const ScheduledTaskSchema = zod.object({
260
257
  const ScheduledTaskRecordSchema = new mongoose.Schema({
261
258
  processName: { type: String, enum: types.ScheduledTaskNames, required: true },
262
259
  datetime: { type: Date, required: true, expires: ONE_WEEK },
263
- updated: { type: Number, required: false },
260
+ updated: { type: Date, required: false },
264
261
  status: { type: String, enum: types.ScheduledTaskStatus, required: true },
265
262
  result: {
266
263
  type: new mongoose.Schema(
@@ -276,7 +273,9 @@ const ScheduledTaskRecordSchema = new mongoose.Schema({
276
273
  ScheduledTaskRecordSchema.index({ processName: 1 });
277
274
  ScheduledTaskRecordSchema.index({ processName: 1, status: 1 });
278
275
  ScheduledTaskRecordSchema.index({ _id: 1, status: 1 });
279
- const FrictionlessTokenRecordSchema = new mongoose.Schema({
276
+ const SessionRecordSchema = new mongoose.Schema({
277
+ sessionId: { type: String, required: true },
278
+ createdAt: { type: Date, required: true },
280
279
  token: { type: String, required: true, unique: true },
281
280
  score: { type: Number, required: true },
282
281
  threshold: { type: Number, required: true },
@@ -284,32 +283,29 @@ const FrictionlessTokenRecordSchema = new mongoose.Schema({
284
283
  baseScore: { type: Number, required: true },
285
284
  lScore: { type: Number, required: false },
286
285
  timeout: { type: Number, required: false },
287
- accessPolicy: { type: Number, required: false }
286
+ accessPolicy: { type: Number, required: false },
287
+ unverifiedHost: { type: Number, required: false },
288
+ webView: { type: Number, required: false }
288
289
  },
289
290
  providerSelectEntropy: { type: Number, required: true },
290
291
  ipAddress: CompositeIpAddressRecordSchemaObj,
291
- createdAt: { type: Date, default: Date.now },
292
- lastUpdatedTimestamp: { type: Date, required: false },
293
- storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY }
294
- });
295
- FrictionlessTokenRecordSchema.index({ createdAt: 1 });
296
- FrictionlessTokenRecordSchema.index({ providerSelectEntropy: 1 });
297
- const SessionRecordSchema = new mongoose.Schema({
298
- sessionId: { type: String, required: true },
299
- createdAt: { type: Date, required: true },
300
- tokenId: {
301
- type: mongoose.Schema.Types.ObjectId
302
- },
303
292
  captchaType: { type: String, enum: types.CaptchaType, required: true },
304
293
  solvedImagesCount: { type: Number, required: false },
305
294
  powDifficulty: { type: Number, required: false },
306
295
  storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY },
307
296
  lastUpdatedTimestamp: { type: Date, required: false },
308
- deleted: { type: Boolean, required: false }
297
+ deleted: { type: Boolean, required: false },
298
+ userSitekeyIpHash: { type: String, required: false },
299
+ webView: { type: Boolean, required: true, default: false },
300
+ iFrame: { type: Boolean, required: true, default: false },
301
+ decryptedHeadHash: { type: String, required: false, default: "" }
309
302
  });
310
303
  SessionRecordSchema.index({ createdAt: 1 });
311
304
  SessionRecordSchema.index({ deleted: 1 });
312
305
  SessionRecordSchema.index({ sessionId: 1 }, { unique: true });
306
+ SessionRecordSchema.index({ userSitekeyIpHash: 1 });
307
+ SessionRecordSchema.index({ providerSelectEntropy: 1 });
308
+ SessionRecordSchema.index({ token: 1 });
313
309
  const DetectorRecordSchema = new mongoose.Schema({
314
310
  createdAt: { type: Date, required: true },
315
311
  detectorKey: { type: String, required: true },
@@ -317,13 +313,20 @@ const DetectorRecordSchema = new mongoose.Schema({
317
313
  });
318
314
  DetectorRecordSchema.index({ createdAt: 1 }, { unique: true });
319
315
  DetectorRecordSchema.index({ expiresAt: 1 }, { expireAfterSeconds: 0 });
316
+ const ClientEntropyRecordSchema = new mongoose.Schema({
317
+ account: { type: String, required: true, unique: true },
318
+ entropy: { type: String, required: true },
319
+ createdAt: { type: Date, required: true },
320
+ updatedAt: { type: Date, required: true }
321
+ });
322
+ ClientEntropyRecordSchema.index({ account: 1 }, { unique: true });
320
323
  exports.CaptchaRecordSchema = CaptchaRecordSchema;
324
+ exports.ClientEntropyRecordSchema = ClientEntropyRecordSchema;
321
325
  exports.ClientRecordSchema = ClientRecordSchema;
322
326
  exports.CompositeIpAddressRecordSchemaObj = CompositeIpAddressRecordSchemaObj;
323
327
  exports.CompositeIpAddressSchema = CompositeIpAddressSchema;
324
328
  exports.DatasetRecordSchema = DatasetRecordSchema;
325
329
  exports.DetectorRecordSchema = DetectorRecordSchema;
326
- exports.FrictionlessTokenRecordSchema = FrictionlessTokenRecordSchema;
327
330
  exports.IpAddressType = IpAddressType;
328
331
  exports.PendingRecordSchema = PendingRecordSchema;
329
332
  exports.PoWCaptchaRecordSchema = PoWCaptchaRecordSchema;
package/dist/index.js CHANGED
@@ -1,16 +1,16 @@
1
1
  import "./types/index.js";
2
- import { CaptchaRecordSchema, ClientRecordSchema, CompositeIpAddressRecordSchemaObj, CompositeIpAddressSchema, DatasetRecordSchema, DetectorRecordSchema, FrictionlessTokenRecordSchema, IpAddressType, PendingRecordSchema, PoWCaptchaRecordSchema, ScheduledTaskRecordSchema, ScheduledTaskSchema, SessionRecordSchema, SolutionRecordSchema, UserCommitmentRecordSchema, UserCommitmentSchema, UserCommitmentWithSolutionsSchema, UserSolutionRecordSchema, UserSolutionSchema, parseMongooseCompositeIpAddress } from "./types/provider.js";
2
+ import { CaptchaRecordSchema, ClientEntropyRecordSchema, ClientRecordSchema, CompositeIpAddressRecordSchemaObj, CompositeIpAddressSchema, DatasetRecordSchema, DetectorRecordSchema, IpAddressType, PendingRecordSchema, PoWCaptchaRecordSchema, ScheduledTaskRecordSchema, ScheduledTaskSchema, SessionRecordSchema, SolutionRecordSchema, UserCommitmentRecordSchema, UserCommitmentSchema, UserCommitmentWithSolutionsSchema, UserSolutionRecordSchema, UserSolutionSchema, parseMongooseCompositeIpAddress } from "./types/provider.js";
3
3
  import { AccountSchema, IPValidationRulesSchema, TableNames, UserDataSchema, UserSettingsSchema } from "./types/client.js";
4
4
  import { StoredPoWCaptchaRecordSchema, StoredSessionRecordSchema, StoredUserCommitmentRecordSchema } from "./types/captcha.js";
5
5
  export {
6
6
  AccountSchema,
7
7
  CaptchaRecordSchema,
8
+ ClientEntropyRecordSchema,
8
9
  ClientRecordSchema,
9
10
  CompositeIpAddressRecordSchemaObj,
10
11
  CompositeIpAddressSchema,
11
12
  DatasetRecordSchema,
12
13
  DetectorRecordSchema,
13
- FrictionlessTokenRecordSchema,
14
14
  IPValidationRulesSchema,
15
15
  IpAddressType,
16
16
  PendingRecordSchema,
@@ -1,30 +1,14 @@
1
1
  import { Schema } from "mongoose";
2
- import { FrictionlessTokenRecordSchema, SessionRecordSchema, UserCommitmentRecordSchema, PoWCaptchaRecordSchema } from "./provider.js";
3
- const StoredSessionRecordSchema = new Schema({
4
- ...SessionRecordSchema.obj,
5
- ...Object.fromEntries(
6
- Object.entries(FrictionlessTokenRecordSchema.obj).filter(
7
- ([key]) => key !== "token"
8
- )
9
- )
10
- });
11
- const existingIndexes = StoredSessionRecordSchema.indexes();
12
- const filteredIndexes = existingIndexes.filter(
13
- (idx) => !("sessionId" in idx[0])
14
- );
15
- for (const [fields, options] of filteredIndexes) {
16
- StoredSessionRecordSchema.index(fields, options);
17
- }
18
- StoredSessionRecordSchema.index({ tokenId: 1 });
19
- StoredSessionRecordSchema.index({ sessionId: 1 }, { unique: false });
2
+ import { SessionRecordSchema, UserCommitmentRecordSchema, PoWCaptchaRecordSchema } from "./provider.js";
3
+ const StoredSessionRecordSchema = SessionRecordSchema;
20
4
  const StoredUserCommitmentRecordSchema = new Schema({
21
5
  ...UserCommitmentRecordSchema.obj
22
6
  });
23
- StoredUserCommitmentRecordSchema.index({ frictionlessTokenId: 1 });
7
+ StoredUserCommitmentRecordSchema.index({ sessionId: 1 });
24
8
  const StoredPoWCaptchaRecordSchema = new Schema({
25
9
  ...PoWCaptchaRecordSchema.obj
26
10
  });
27
- StoredPoWCaptchaRecordSchema.index({ frictionlessTokenId: 1 });
11
+ StoredPoWCaptchaRecordSchema.index({ sessionId: 1 });
28
12
  export {
29
13
  StoredPoWCaptchaRecordSchema,
30
14
  StoredSessionRecordSchema,
@@ -1,10 +1,62 @@
1
+ import { requireAllConditionsDefault, abuseScoreThresholdDefault, distanceThresholdKmDefault, abuseScoreThresholdExceedActionDefault, distanceExceedActionDefault, ispChangeActionDefault, cityChangeActionDefault, countryChangeActionDefault, contextAwareThresholdDefault } from "@prosopo/types";
1
2
  import { Schema } from "mongoose";
2
3
  const IPValidationRulesSchema = new Schema({
3
- countryChangeAction: String,
4
- ispChangeAction: String,
5
- distanceThresholdKm: Number,
6
- distanceExceedAction: String,
7
- requireAllConditions: Boolean
4
+ actions: {
5
+ countryChangeAction: {
6
+ type: Schema.Types.Mixed,
7
+ default: () => countryChangeActionDefault
8
+ },
9
+ cityChangeAction: {
10
+ type: Schema.Types.Mixed,
11
+ default: () => cityChangeActionDefault
12
+ },
13
+ ispChangeAction: {
14
+ type: Schema.Types.Mixed,
15
+ default: () => ispChangeActionDefault
16
+ },
17
+ distanceExceedAction: {
18
+ type: Schema.Types.Mixed,
19
+ default: () => distanceExceedActionDefault
20
+ },
21
+ abuseScoreExceedAction: {
22
+ type: Schema.Types.Mixed,
23
+ default: () => abuseScoreThresholdExceedActionDefault
24
+ }
25
+ },
26
+ distanceThresholdKm: {
27
+ type: Number,
28
+ min: 0,
29
+ default: distanceThresholdKmDefault
30
+ },
31
+ abuseScoreThreshold: {
32
+ type: Number,
33
+ min: 0,
34
+ default: abuseScoreThresholdDefault
35
+ },
36
+ requireAllConditions: {
37
+ type: Boolean,
38
+ default: requireAllConditionsDefault
39
+ },
40
+ forceConsistentIp: {
41
+ type: Boolean,
42
+ default: false
43
+ },
44
+ countryOverrides: {
45
+ type: Map,
46
+ of: new Schema({
47
+ actions: {
48
+ countryChangeAction: { type: Schema.Types.Mixed },
49
+ cityChangeAction: { type: Schema.Types.Mixed },
50
+ ispChangeAction: { type: Schema.Types.Mixed },
51
+ distanceExceedAction: { type: Schema.Types.Mixed },
52
+ abuseScoreExceedAction: { type: Schema.Types.Mixed }
53
+ },
54
+ distanceThresholdKm: { type: Number, min: 0 },
55
+ abuseScoreThreshold: { type: Number, min: 0 },
56
+ requireAllConditions: { type: Boolean }
57
+ }),
58
+ default: void 0
59
+ }
8
60
  });
9
61
  const UserSettingsSchema = new Schema({
10
62
  captchaType: String,
@@ -12,7 +64,15 @@ const UserSettingsSchema = new Schema({
12
64
  powDifficulty: Number,
13
65
  imageThreshold: Number,
14
66
  ipValidationRules: IPValidationRulesSchema,
15
- domains: [String]
67
+ domains: [String],
68
+ disallowWebView: {
69
+ type: Boolean,
70
+ default: false
71
+ },
72
+ contextAware: {
73
+ enabled: { type: Boolean, default: false },
74
+ threshold: { type: Number, default: contextAwareThresholdDefault }
75
+ }
16
76
  });
17
77
  const UserDataSchema = new Schema({
18
78
  email: String,
@@ -20,14 +80,14 @@ const UserDataSchema = new Schema({
20
80
  account: String,
21
81
  url: String,
22
82
  mnemonic: String,
23
- createdAt: Number,
83
+ createdAt: Date,
24
84
  activated: Boolean,
25
85
  tier: String,
26
86
  settings: {
27
87
  type: UserSettingsSchema,
28
88
  required: false
29
89
  },
30
- updatedAtTimestamp: Number
90
+ updatedAtTimestamp: Date
31
91
  });
32
92
  const AccountSchema = new Schema({
33
93
  createdAt: Number,
@@ -1,17 +1,17 @@
1
1
  import "./mongo.js";
2
- import { CaptchaRecordSchema, ClientRecordSchema, CompositeIpAddressRecordSchemaObj, CompositeIpAddressSchema, DatasetRecordSchema, DetectorRecordSchema, FrictionlessTokenRecordSchema, IpAddressType, PendingRecordSchema, PoWCaptchaRecordSchema, ScheduledTaskRecordSchema, ScheduledTaskSchema, SessionRecordSchema, SolutionRecordSchema, UserCommitmentRecordSchema, UserCommitmentSchema, UserCommitmentWithSolutionsSchema, UserSolutionRecordSchema, UserSolutionSchema, parseMongooseCompositeIpAddress } from "./provider.js";
2
+ import { CaptchaRecordSchema, ClientEntropyRecordSchema, ClientRecordSchema, CompositeIpAddressRecordSchemaObj, CompositeIpAddressSchema, DatasetRecordSchema, DetectorRecordSchema, IpAddressType, PendingRecordSchema, PoWCaptchaRecordSchema, ScheduledTaskRecordSchema, ScheduledTaskSchema, SessionRecordSchema, SolutionRecordSchema, UserCommitmentRecordSchema, UserCommitmentSchema, UserCommitmentWithSolutionsSchema, UserSolutionRecordSchema, UserSolutionSchema, parseMongooseCompositeIpAddress } from "./provider.js";
3
3
  import { AccountSchema, IPValidationRulesSchema, TableNames, UserDataSchema, UserSettingsSchema } from "./client.js";
4
4
  import { StoredPoWCaptchaRecordSchema, StoredSessionRecordSchema, StoredUserCommitmentRecordSchema } from "./captcha.js";
5
5
  import "./userAgent.js";
6
6
  export {
7
7
  AccountSchema,
8
8
  CaptchaRecordSchema,
9
+ ClientEntropyRecordSchema,
9
10
  ClientRecordSchema,
10
11
  CompositeIpAddressRecordSchemaObj,
11
12
  CompositeIpAddressSchema,
12
13
  DatasetRecordSchema,
13
14
  DetectorRecordSchema,
14
- FrictionlessTokenRecordSchema,
15
15
  IPValidationRulesSchema,
16
16
  IpAddressType,
17
17
  PendingRecordSchema,
@@ -1,7 +1,7 @@
1
1
  import { TranslationKeysSchema } from "@prosopo/locale";
2
- import { Tier, CaptchaStatus, TimestampSchema, CaptchaSolutionSchema, ScheduledTaskStatus, ScheduledTaskNames, CaptchaType } from "@prosopo/types";
3
- import mongoose, { Schema } from "mongoose";
4
- import { object, nativeEnum, bigint, string, array, number, union, instanceof as _instanceof, boolean, date, any } from "zod";
2
+ import { Tier, CaptchaStatus, CaptchaSolutionSchema, ScheduledTaskStatus, ScheduledTaskNames, CaptchaType } from "@prosopo/types";
3
+ import { Schema } from "mongoose";
4
+ import { object, nativeEnum, bigint, string, array, number, date, boolean, any } from "zod";
5
5
  import { UserSettingsSchema } from "./client.js";
6
6
  const ONE_HOUR = 60 * 60;
7
7
  const ONE_DAY = ONE_HOUR * 24;
@@ -67,13 +67,10 @@ const UserCommitmentSchema = object({
67
67
  ja4: string(),
68
68
  userSubmitted: boolean(),
69
69
  serverChecked: boolean(),
70
- storedAtTimestamp: TimestampSchema.optional(),
71
- requestedAtTimestamp: TimestampSchema,
72
- lastUpdatedTimestamp: TimestampSchema.optional(),
73
- frictionlessTokenId: union([
74
- string(),
75
- _instanceof(mongoose.Types.ObjectId)
76
- ]).optional(),
70
+ storedAtTimestamp: date().optional(),
71
+ requestedAtTimestamp: date(),
72
+ lastUpdatedTimestamp: date().optional(),
73
+ sessionId: string().optional(),
77
74
  coords: array(array(array(number()))).optional()
78
75
  });
79
76
  const CaptchaRecordSchema = new Schema({
@@ -106,8 +103,8 @@ const PoWCaptchaRecordSchema = new Schema({
106
103
  challenge: { type: String, required: true },
107
104
  dappAccount: { type: String, required: true },
108
105
  userAccount: { type: String, required: true },
109
- requestedAtTimestamp: { type: Number, required: true },
110
- lastUpdatedTimestamp: { type: Number, required: false },
106
+ requestedAtTimestamp: { type: Date, required: true },
107
+ lastUpdatedTimestamp: { type: Date, required: false },
111
108
  result: {
112
109
  status: { type: String, enum: CaptchaStatus, required: true },
113
110
  reason: {
@@ -132,8 +129,8 @@ const PoWCaptchaRecordSchema = new Schema({
132
129
  geolocation: { type: String, required: false },
133
130
  vpn: { type: Boolean, required: false },
134
131
  parsedUserAgentInfo: { type: Object, required: false },
135
- frictionlessTokenId: {
136
- type: mongoose.Schema.Types.ObjectId,
132
+ sessionId: {
133
+ type: String,
137
134
  required: false
138
135
  },
139
136
  coords: { type: [[[Number]]], required: false }
@@ -169,13 +166,13 @@ const UserCommitmentRecordSchema = new Schema({
169
166
  userSubmitted: { type: Boolean, required: true },
170
167
  serverChecked: { type: Boolean, required: true },
171
168
  storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
172
- requestedAtTimestamp: { type: Number, required: true },
173
- lastUpdatedTimestamp: { type: Number, required: false },
169
+ requestedAtTimestamp: { type: Date, required: true },
170
+ lastUpdatedTimestamp: { type: Date, required: false },
174
171
  geolocation: { type: String, required: false },
175
172
  vpn: { type: Boolean, required: false },
176
173
  parsedUserAgentInfo: { type: Object, required: false },
177
- frictionlessTokenId: {
178
- type: mongoose.Schema.Types.ObjectId,
174
+ sessionId: {
175
+ type: String,
179
176
  required: false
180
177
  },
181
178
  coords: { type: [[[Number]]], required: false }
@@ -238,8 +235,8 @@ const PendingRecordSchema = new Schema({
238
235
  // unix timestamp
239
236
  requestedAtTimestamp: { type: Date, required: true, expires: ONE_WEEK },
240
237
  ipAddress: CompositeIpAddressRecordSchemaObj,
241
- frictionlessTokenId: {
242
- type: mongoose.Schema.Types.ObjectId,
238
+ sessionId: {
239
+ type: String,
243
240
  required: false
244
241
  },
245
242
  threshold: { type: Number, required: true, default: 0.8 }
@@ -247,8 +244,8 @@ const PendingRecordSchema = new Schema({
247
244
  PendingRecordSchema.index({ requestHash: -1 });
248
245
  const ScheduledTaskSchema = object({
249
246
  processName: nativeEnum(ScheduledTaskNames),
250
- datetime: TimestampSchema,
251
- updated: TimestampSchema.optional(),
247
+ datetime: date(),
248
+ updated: date().optional(),
252
249
  status: nativeEnum(ScheduledTaskStatus),
253
250
  result: object({
254
251
  data: any().optional(),
@@ -258,7 +255,7 @@ const ScheduledTaskSchema = object({
258
255
  const ScheduledTaskRecordSchema = new Schema({
259
256
  processName: { type: String, enum: ScheduledTaskNames, required: true },
260
257
  datetime: { type: Date, required: true, expires: ONE_WEEK },
261
- updated: { type: Number, required: false },
258
+ updated: { type: Date, required: false },
262
259
  status: { type: String, enum: ScheduledTaskStatus, required: true },
263
260
  result: {
264
261
  type: new Schema(
@@ -274,7 +271,9 @@ const ScheduledTaskRecordSchema = new Schema({
274
271
  ScheduledTaskRecordSchema.index({ processName: 1 });
275
272
  ScheduledTaskRecordSchema.index({ processName: 1, status: 1 });
276
273
  ScheduledTaskRecordSchema.index({ _id: 1, status: 1 });
277
- const FrictionlessTokenRecordSchema = new Schema({
274
+ const SessionRecordSchema = new Schema({
275
+ sessionId: { type: String, required: true },
276
+ createdAt: { type: Date, required: true },
278
277
  token: { type: String, required: true, unique: true },
279
278
  score: { type: Number, required: true },
280
279
  threshold: { type: Number, required: true },
@@ -282,32 +281,29 @@ const FrictionlessTokenRecordSchema = new Schema({
282
281
  baseScore: { type: Number, required: true },
283
282
  lScore: { type: Number, required: false },
284
283
  timeout: { type: Number, required: false },
285
- accessPolicy: { type: Number, required: false }
284
+ accessPolicy: { type: Number, required: false },
285
+ unverifiedHost: { type: Number, required: false },
286
+ webView: { type: Number, required: false }
286
287
  },
287
288
  providerSelectEntropy: { type: Number, required: true },
288
289
  ipAddress: CompositeIpAddressRecordSchemaObj,
289
- createdAt: { type: Date, default: Date.now },
290
- lastUpdatedTimestamp: { type: Date, required: false },
291
- storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY }
292
- });
293
- FrictionlessTokenRecordSchema.index({ createdAt: 1 });
294
- FrictionlessTokenRecordSchema.index({ providerSelectEntropy: 1 });
295
- const SessionRecordSchema = new Schema({
296
- sessionId: { type: String, required: true },
297
- createdAt: { type: Date, required: true },
298
- tokenId: {
299
- type: mongoose.Schema.Types.ObjectId
300
- },
301
290
  captchaType: { type: String, enum: CaptchaType, required: true },
302
291
  solvedImagesCount: { type: Number, required: false },
303
292
  powDifficulty: { type: Number, required: false },
304
293
  storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY },
305
294
  lastUpdatedTimestamp: { type: Date, required: false },
306
- deleted: { type: Boolean, required: false }
295
+ deleted: { type: Boolean, required: false },
296
+ userSitekeyIpHash: { type: String, required: false },
297
+ webView: { type: Boolean, required: true, default: false },
298
+ iFrame: { type: Boolean, required: true, default: false },
299
+ decryptedHeadHash: { type: String, required: false, default: "" }
307
300
  });
308
301
  SessionRecordSchema.index({ createdAt: 1 });
309
302
  SessionRecordSchema.index({ deleted: 1 });
310
303
  SessionRecordSchema.index({ sessionId: 1 }, { unique: true });
304
+ SessionRecordSchema.index({ userSitekeyIpHash: 1 });
305
+ SessionRecordSchema.index({ providerSelectEntropy: 1 });
306
+ SessionRecordSchema.index({ token: 1 });
311
307
  const DetectorRecordSchema = new Schema({
312
308
  createdAt: { type: Date, required: true },
313
309
  detectorKey: { type: String, required: true },
@@ -315,14 +311,21 @@ const DetectorRecordSchema = new Schema({
315
311
  });
316
312
  DetectorRecordSchema.index({ createdAt: 1 }, { unique: true });
317
313
  DetectorRecordSchema.index({ expiresAt: 1 }, { expireAfterSeconds: 0 });
314
+ const ClientEntropyRecordSchema = new Schema({
315
+ account: { type: String, required: true, unique: true },
316
+ entropy: { type: String, required: true },
317
+ createdAt: { type: Date, required: true },
318
+ updatedAt: { type: Date, required: true }
319
+ });
320
+ ClientEntropyRecordSchema.index({ account: 1 }, { unique: true });
318
321
  export {
319
322
  CaptchaRecordSchema,
323
+ ClientEntropyRecordSchema,
320
324
  ClientRecordSchema,
321
325
  CompositeIpAddressRecordSchemaObj,
322
326
  CompositeIpAddressSchema,
323
327
  DatasetRecordSchema,
324
328
  DetectorRecordSchema,
325
- FrictionlessTokenRecordSchema,
326
329
  IpAddressType,
327
330
  PendingRecordSchema,
328
331
  PoWCaptchaRecordSchema,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prosopo/types-database",
3
- "version": "3.3.5",
3
+ "version": "4.0.0",
4
4
  "description": "Types for prosopo database",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,8 +13,8 @@
13
13
  }
14
14
  },
15
15
  "engines": {
16
- "node": "20",
17
- "npm": "10.8.2"
16
+ "node": ">=v20.0.0",
17
+ "npm": ">=10.6.0"
18
18
  },
19
19
  "scripts": {
20
20
  "clean": "del-cli --verbose dist tsconfig.tsbuildinfo",
@@ -34,25 +34,25 @@
34
34
  },
35
35
  "homepage": "https://github.com/prosopo/captcha#readme",
36
36
  "dependencies": {
37
- "@prosopo/common": "3.1.20",
38
- "@prosopo/locale": "3.1.20",
39
- "@prosopo/types": "3.5.3",
40
- "@prosopo/user-access-policy": "3.5.19",
41
- "@prosopo/config": "3.1.20",
37
+ "@prosopo/common": "3.1.22",
38
+ "@prosopo/locale": "3.1.22",
39
+ "@prosopo/types": "3.6.0",
40
+ "@prosopo/user-access-policy": "3.5.28",
41
+ "@prosopo/config": "3.1.22",
42
42
  "mongoose": "8.13.0",
43
43
  "zod": "3.23.8"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@types/node": "22.10.2",
47
- "@vitest/coverage-v8": "3.0.9",
47
+ "@vitest/coverage-v8": "3.2.4",
48
48
  "concurrently": "9.0.1",
49
49
  "del-cli": "6.0.0",
50
50
  "npm-run-all": "4.1.5",
51
51
  "tslib": "2.7.0",
52
52
  "tsx": "4.20.3",
53
53
  "typescript": "5.6.2",
54
- "vite": "6.3.5",
55
- "vitest": "3.0.9"
54
+ "vite": "6.4.1",
55
+ "vitest": "3.2.4"
56
56
  },
57
57
  "sideEffects": false
58
58
  }