@prosopo/types-database 3.0.12 → 3.3.5
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 +280 -0
- package/dist/cjs/index.cjs +5 -0
- package/dist/cjs/types/captcha.cjs +15 -10
- package/dist/cjs/types/client.cjs +11 -1
- package/dist/cjs/types/index.cjs +5 -0
- package/dist/cjs/types/provider.cjs +81 -23
- package/dist/index.js +8 -3
- package/dist/types/captcha.js +15 -10
- package/dist/types/client.js +11 -1
- package/dist/types/index.js +8 -3
- package/dist/types/provider.js +83 -25
- package/package.json +12 -18
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,285 @@
|
|
1
1
|
# @prosopo/types-database
|
2
2
|
|
3
|
+
## 3.3.5
|
4
|
+
### Patch Changes
|
5
|
+
|
6
|
+
- Updated dependencies [1e3a838]
|
7
|
+
- @prosopo/config@3.1.20
|
8
|
+
- @prosopo/common@3.1.20
|
9
|
+
- @prosopo/locale@3.1.20
|
10
|
+
- @prosopo/types@3.5.3
|
11
|
+
- @prosopo/user-access-policy@3.5.19
|
12
|
+
|
13
|
+
## 3.3.4
|
14
|
+
### Patch Changes
|
15
|
+
|
16
|
+
- 5659b24: Release 3.4.4
|
17
|
+
- Updated dependencies [f912439]
|
18
|
+
- Updated dependencies [5659b24]
|
19
|
+
- @prosopo/common@3.1.19
|
20
|
+
- @prosopo/user-access-policy@3.5.18
|
21
|
+
- @prosopo/locale@3.1.19
|
22
|
+
- @prosopo/types@3.5.2
|
23
|
+
- @prosopo/config@3.1.19
|
24
|
+
|
25
|
+
## 3.3.3
|
26
|
+
### Patch Changes
|
27
|
+
|
28
|
+
- 50c4120: Release 3.4.3
|
29
|
+
- Updated dependencies [52cd544]
|
30
|
+
- Updated dependencies [b117ba3]
|
31
|
+
- Updated dependencies [50c4120]
|
32
|
+
- @prosopo/types@3.5.1
|
33
|
+
- @prosopo/user-access-policy@3.5.17
|
34
|
+
- @prosopo/common@3.1.18
|
35
|
+
- @prosopo/locale@3.1.18
|
36
|
+
- @prosopo/config@3.1.18
|
37
|
+
|
38
|
+
## 3.3.2
|
39
|
+
### Patch Changes
|
40
|
+
|
41
|
+
- 618703f: Release 3.4.2
|
42
|
+
- Updated dependencies [618703f]
|
43
|
+
- Updated dependencies [e20ad6b]
|
44
|
+
- @prosopo/user-access-policy@3.5.16
|
45
|
+
- @prosopo/common@3.1.17
|
46
|
+
- @prosopo/locale@3.1.17
|
47
|
+
- @prosopo/types@3.5.0
|
48
|
+
- @prosopo/config@3.1.17
|
49
|
+
|
50
|
+
## 3.3.1
|
51
|
+
### Patch Changes
|
52
|
+
|
53
|
+
- b6794f8: Timestamp decay fn
|
54
|
+
- 11303d9: Release 3.4.0
|
55
|
+
- bac2d91: Fix mongoose composite ip getting
|
56
|
+
- 18cb28b: Release 3.4.1
|
57
|
+
- Updated dependencies [11303d9]
|
58
|
+
- Updated dependencies [11303d9]
|
59
|
+
- Updated dependencies [18cb28b]
|
60
|
+
- Updated dependencies [11303d9]
|
61
|
+
- @prosopo/user-access-policy@3.5.15
|
62
|
+
- @prosopo/common@3.1.16
|
63
|
+
- @prosopo/locale@3.1.16
|
64
|
+
- @prosopo/types@3.4.1
|
65
|
+
- @prosopo/config@3.1.16
|
66
|
+
|
67
|
+
## 3.3.0
|
68
|
+
### Minor Changes
|
69
|
+
|
70
|
+
- 6768f14: Update salt
|
71
|
+
|
72
|
+
### Patch Changes
|
73
|
+
|
74
|
+
- f3f7aec: Release 3.4.0
|
75
|
+
- Updated dependencies [f3f7aec]
|
76
|
+
- Updated dependencies [6768f14]
|
77
|
+
- @prosopo/user-access-policy@3.5.14
|
78
|
+
- @prosopo/common@3.1.15
|
79
|
+
- @prosopo/locale@3.1.15
|
80
|
+
- @prosopo/types@3.4.0
|
81
|
+
- @prosopo/config@3.1.15
|
82
|
+
|
83
|
+
## 3.2.2
|
84
|
+
### Patch Changes
|
85
|
+
|
86
|
+
- Release 3.3.1
|
87
|
+
- 0824221: Release 3.2.4
|
88
|
+
- Updated dependencies [97edf3f]
|
89
|
+
- Updated dependencies
|
90
|
+
- Updated dependencies [0824221]
|
91
|
+
- @prosopo/types@3.3.0
|
92
|
+
- @prosopo/user-access-policy@3.5.13
|
93
|
+
- @prosopo/common@3.1.14
|
94
|
+
- @prosopo/locale@3.1.14
|
95
|
+
- @prosopo/config@3.1.14
|
96
|
+
|
97
|
+
## 3.2.1
|
98
|
+
### Patch Changes
|
99
|
+
|
100
|
+
- 5137f01: Update pow record at verify
|
101
|
+
- 0555cd8: Fix type
|
102
|
+
- 008d112: Release 3.3.0
|
103
|
+
- Updated dependencies [509be28]
|
104
|
+
- Updated dependencies [008d112]
|
105
|
+
- @prosopo/types@3.2.1
|
106
|
+
- @prosopo/user-access-policy@3.5.12
|
107
|
+
- @prosopo/common@3.1.13
|
108
|
+
- @prosopo/locale@3.1.13
|
109
|
+
- @prosopo/config@3.1.13
|
110
|
+
|
111
|
+
## 3.2.0
|
112
|
+
### Minor Changes
|
113
|
+
|
114
|
+
- cf48565: Store additional details. Remove duplicate indexes.
|
115
|
+
- 260de39: Fix indexes so that stuff properly expires
|
116
|
+
|
117
|
+
### Patch Changes
|
118
|
+
|
119
|
+
- d644c04: Make schema public
|
120
|
+
- 0824221: Release 3.2.4
|
121
|
+
- Updated dependencies [cf48565]
|
122
|
+
- Updated dependencies [0824221]
|
123
|
+
- @prosopo/types@3.2.0
|
124
|
+
- @prosopo/user-access-policy@3.5.11
|
125
|
+
- @prosopo/common@3.1.12
|
126
|
+
- @prosopo/locale@3.1.12
|
127
|
+
- @prosopo/config@3.1.12
|
128
|
+
|
129
|
+
## 3.1.5
|
130
|
+
### Patch Changes
|
131
|
+
|
132
|
+
- 0d1a33e: Adding ipcomparison service with user features
|
133
|
+
- 1a23649: Release 3.2.3
|
134
|
+
- Updated dependencies [0d1a33e]
|
135
|
+
- Updated dependencies [0d1a33e]
|
136
|
+
- Updated dependencies [1a23649]
|
137
|
+
- @prosopo/locale@3.1.11
|
138
|
+
- @prosopo/types@3.1.4
|
139
|
+
- @prosopo/user-access-policy@3.5.10
|
140
|
+
- @prosopo/common@3.1.11
|
141
|
+
- @prosopo/config@3.1.11
|
142
|
+
|
143
|
+
## 3.1.4
|
144
|
+
### Patch Changes
|
145
|
+
|
146
|
+
- a8a9251: Add index on IP parts
|
147
|
+
- 657a827: Release 3.2.2
|
148
|
+
- Updated dependencies [657a827]
|
149
|
+
- @prosopo/user-access-policy@3.5.9
|
150
|
+
- @prosopo/common@3.1.10
|
151
|
+
- @prosopo/locale@3.1.10
|
152
|
+
- @prosopo/types@3.1.3
|
153
|
+
- @prosopo/config@3.1.10
|
154
|
+
|
155
|
+
## 3.1.3
|
156
|
+
### Patch Changes
|
157
|
+
|
158
|
+
- 4440947: fix type-only tsc compilation
|
159
|
+
- 7bdaca6: Release 3.2.1
|
160
|
+
- 1249ce0: Be more lenient with random provider selection
|
161
|
+
- Updated dependencies [4440947]
|
162
|
+
- Updated dependencies [7bdaca6]
|
163
|
+
- Updated dependencies [809b984]
|
164
|
+
- Updated dependencies [1249ce0]
|
165
|
+
- Updated dependencies [809b984]
|
166
|
+
- @prosopo/user-access-policy@3.5.8
|
167
|
+
- @prosopo/common@3.1.9
|
168
|
+
- @prosopo/locale@3.1.9
|
169
|
+
- @prosopo/types@3.1.2
|
170
|
+
- @prosopo/config@3.1.9
|
171
|
+
|
172
|
+
## 3.1.2
|
173
|
+
### Patch Changes
|
174
|
+
|
175
|
+
- 6fe8570: Release 3.2.0
|
176
|
+
- Updated dependencies [1f980c4]
|
177
|
+
- Updated dependencies [6fe8570]
|
178
|
+
- @prosopo/types@3.1.1
|
179
|
+
- @prosopo/user-access-policy@3.5.7
|
180
|
+
- @prosopo/common@3.1.8
|
181
|
+
- @prosopo/locale@3.1.8
|
182
|
+
- @prosopo/config@3.1.8
|
183
|
+
|
184
|
+
## 3.1.1
|
185
|
+
### Patch Changes
|
186
|
+
|
187
|
+
- f304be9: Release 3.1.13
|
188
|
+
- Updated dependencies [f304be9]
|
189
|
+
- Updated dependencies [8bdc7f0]
|
190
|
+
- @prosopo/user-access-policy@3.5.6
|
191
|
+
- @prosopo/common@3.1.7
|
192
|
+
- @prosopo/locale@3.1.7
|
193
|
+
- @prosopo/types@3.1.0
|
194
|
+
- @prosopo/config@3.1.7
|
195
|
+
|
196
|
+
## 3.1.0
|
197
|
+
### Minor Changes
|
198
|
+
|
199
|
+
- 9b92339: fix/ipv6-in-captcha-flow
|
200
|
+
|
201
|
+
### Patch Changes
|
202
|
+
|
203
|
+
- a07db04: Release 3.1.12
|
204
|
+
- Updated dependencies [9eed772]
|
205
|
+
- Updated dependencies [a07db04]
|
206
|
+
- @prosopo/config@3.1.6
|
207
|
+
- @prosopo/user-access-policy@3.5.5
|
208
|
+
- @prosopo/common@3.1.6
|
209
|
+
- @prosopo/locale@3.1.6
|
210
|
+
- @prosopo/types@3.0.10
|
211
|
+
|
212
|
+
## 3.0.19
|
213
|
+
### Patch Changes
|
214
|
+
|
215
|
+
- Updated dependencies [553025d]
|
216
|
+
- @prosopo/user-access-policy@3.5.4
|
217
|
+
|
218
|
+
## 3.0.18
|
219
|
+
### Patch Changes
|
220
|
+
|
221
|
+
- d8e855c: Adding checks for IP consistency throughout the verification process
|
222
|
+
- 6960643: lint detect missing and unneccessary imports
|
223
|
+
- Updated dependencies [d8e855c]
|
224
|
+
- Updated dependencies [6960643]
|
225
|
+
- @prosopo/locale@3.1.5
|
226
|
+
- @prosopo/user-access-policy@3.5.3
|
227
|
+
- @prosopo/common@3.1.5
|
228
|
+
- @prosopo/types@3.0.9
|
229
|
+
|
230
|
+
## 3.0.17
|
231
|
+
### Patch Changes
|
232
|
+
|
233
|
+
- Updated dependencies [30e7d4d]
|
234
|
+
- @prosopo/config@3.1.5
|
235
|
+
- @prosopo/common@3.1.4
|
236
|
+
- @prosopo/types@3.0.8
|
237
|
+
- @prosopo/user-access-policy@3.5.2
|
238
|
+
|
239
|
+
## 3.0.16
|
240
|
+
### Patch Changes
|
241
|
+
|
242
|
+
- 1f3a02f: Release 3.1.8
|
243
|
+
- Updated dependencies [1f3a02f]
|
244
|
+
- @prosopo/user-access-policy@3.5.1
|
245
|
+
|
246
|
+
## 3.0.15
|
247
|
+
### Patch Changes
|
248
|
+
|
249
|
+
- Updated dependencies [e0628d9]
|
250
|
+
- @prosopo/user-access-policy@3.5.0
|
251
|
+
|
252
|
+
## 3.0.14
|
253
|
+
### Patch Changes
|
254
|
+
|
255
|
+
- Updated dependencies [44ffda2]
|
256
|
+
- Updated dependencies [a49b538]
|
257
|
+
- Updated dependencies [e090e2f]
|
258
|
+
- @prosopo/config@3.1.4
|
259
|
+
- @prosopo/user-access-policy@3.4.1
|
260
|
+
- @prosopo/common@3.1.3
|
261
|
+
- @prosopo/types@3.0.7
|
262
|
+
|
263
|
+
## 3.0.13
|
264
|
+
### Patch Changes
|
265
|
+
|
266
|
+
- 828066d: remove empty test npm scripts, add missing npm test scripts
|
267
|
+
- 91bbe87: configure typecheck before bundle for vue packages
|
268
|
+
- 91bbe87: make typecheck script always recompile
|
269
|
+
- 346e092: NODE_ENV default to "development"
|
270
|
+
- 5d36e05: remove tsc --force
|
271
|
+
- Updated dependencies [828066d]
|
272
|
+
- Updated dependencies [df4e030]
|
273
|
+
- Updated dependencies [91bbe87]
|
274
|
+
- Updated dependencies [3ef4fd2]
|
275
|
+
- Updated dependencies [91bbe87]
|
276
|
+
- Updated dependencies [346e092]
|
277
|
+
- Updated dependencies [5d36e05]
|
278
|
+
- @prosopo/common@3.1.2
|
279
|
+
- @prosopo/types@3.0.6
|
280
|
+
- @prosopo/config@3.1.3
|
281
|
+
- @prosopo/user-access-policy@3.4.0
|
282
|
+
|
3
283
|
## 3.0.12
|
4
284
|
### Patch Changes
|
5
285
|
|
package/dist/cjs/index.cjs
CHANGED
@@ -6,9 +6,12 @@ const client = require("./types/client.cjs");
|
|
6
6
|
const captcha = require("./types/captcha.cjs");
|
7
7
|
exports.CaptchaRecordSchema = provider.CaptchaRecordSchema;
|
8
8
|
exports.ClientRecordSchema = provider.ClientRecordSchema;
|
9
|
+
exports.CompositeIpAddressRecordSchemaObj = provider.CompositeIpAddressRecordSchemaObj;
|
10
|
+
exports.CompositeIpAddressSchema = provider.CompositeIpAddressSchema;
|
9
11
|
exports.DatasetRecordSchema = provider.DatasetRecordSchema;
|
10
12
|
exports.DetectorRecordSchema = provider.DetectorRecordSchema;
|
11
13
|
exports.FrictionlessTokenRecordSchema = provider.FrictionlessTokenRecordSchema;
|
14
|
+
exports.IpAddressType = provider.IpAddressType;
|
12
15
|
exports.PendingRecordSchema = provider.PendingRecordSchema;
|
13
16
|
exports.PoWCaptchaRecordSchema = provider.PoWCaptchaRecordSchema;
|
14
17
|
exports.ScheduledTaskRecordSchema = provider.ScheduledTaskRecordSchema;
|
@@ -20,7 +23,9 @@ exports.UserCommitmentSchema = provider.UserCommitmentSchema;
|
|
20
23
|
exports.UserCommitmentWithSolutionsSchema = provider.UserCommitmentWithSolutionsSchema;
|
21
24
|
exports.UserSolutionRecordSchema = provider.UserSolutionRecordSchema;
|
22
25
|
exports.UserSolutionSchema = provider.UserSolutionSchema;
|
26
|
+
exports.parseMongooseCompositeIpAddress = provider.parseMongooseCompositeIpAddress;
|
23
27
|
exports.AccountSchema = client.AccountSchema;
|
28
|
+
exports.IPValidationRulesSchema = client.IPValidationRulesSchema;
|
24
29
|
exports.TableNames = client.TableNames;
|
25
30
|
exports.UserDataSchema = client.UserDataSchema;
|
26
31
|
exports.UserSettingsSchema = client.UserSettingsSchema;
|
@@ -3,15 +3,22 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const mongoose = require("mongoose");
|
4
4
|
const provider = require("./provider.cjs");
|
5
5
|
const StoredSessionRecordSchema = new mongoose.Schema({
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
scoreComponents: provider.FrictionlessTokenRecordSchema.obj.scoreComponents,
|
13
|
-
threshold: provider.FrictionlessTokenRecordSchema.obj.threshold
|
6
|
+
...provider.SessionRecordSchema.obj,
|
7
|
+
...Object.fromEntries(
|
8
|
+
Object.entries(provider.FrictionlessTokenRecordSchema.obj).filter(
|
9
|
+
([key]) => key !== "token"
|
10
|
+
)
|
11
|
+
)
|
14
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 });
|
15
22
|
const StoredUserCommitmentRecordSchema = new mongoose.Schema({
|
16
23
|
...provider.UserCommitmentRecordSchema.obj
|
17
24
|
});
|
@@ -20,8 +27,6 @@ const StoredPoWCaptchaRecordSchema = new mongoose.Schema({
|
|
20
27
|
...provider.PoWCaptchaRecordSchema.obj
|
21
28
|
});
|
22
29
|
StoredPoWCaptchaRecordSchema.index({ frictionlessTokenId: 1 });
|
23
|
-
StoredSessionRecordSchema.index({ sessionId: 1 });
|
24
|
-
StoredSessionRecordSchema.index({ tokenId: 1 });
|
25
30
|
exports.StoredPoWCaptchaRecordSchema = StoredPoWCaptchaRecordSchema;
|
26
31
|
exports.StoredSessionRecordSchema = StoredSessionRecordSchema;
|
27
32
|
exports.StoredUserCommitmentRecordSchema = StoredUserCommitmentRecordSchema;
|
@@ -1,11 +1,19 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
3
3
|
const mongoose = require("mongoose");
|
4
|
+
const IPValidationRulesSchema = new mongoose.Schema({
|
5
|
+
countryChangeAction: String,
|
6
|
+
ispChangeAction: String,
|
7
|
+
distanceThresholdKm: Number,
|
8
|
+
distanceExceedAction: String,
|
9
|
+
requireAllConditions: Boolean
|
10
|
+
});
|
4
11
|
const UserSettingsSchema = new mongoose.Schema({
|
5
12
|
captchaType: String,
|
6
13
|
frictionlessThreshold: Number,
|
7
14
|
powDifficulty: Number,
|
8
15
|
imageThreshold: Number,
|
16
|
+
ipValidationRules: IPValidationRulesSchema,
|
9
17
|
domains: [String]
|
10
18
|
});
|
11
19
|
const UserDataSchema = new mongoose.Schema({
|
@@ -49,7 +57,8 @@ const AccountSchema = new mongoose.Schema({
|
|
49
57
|
domains: [String],
|
50
58
|
powDifficulty: Number,
|
51
59
|
captchaType: String,
|
52
|
-
frictionlessThreshold: Number
|
60
|
+
frictionlessThreshold: Number,
|
61
|
+
ipValidationRules: IPValidationRulesSchema
|
53
62
|
},
|
54
63
|
createdAt: Number,
|
55
64
|
updatedAt: Number,
|
@@ -63,6 +72,7 @@ var TableNames = /* @__PURE__ */ ((TableNames2) => {
|
|
63
72
|
return TableNames2;
|
64
73
|
})(TableNames || {});
|
65
74
|
exports.AccountSchema = AccountSchema;
|
75
|
+
exports.IPValidationRulesSchema = IPValidationRulesSchema;
|
66
76
|
exports.TableNames = TableNames;
|
67
77
|
exports.UserDataSchema = UserDataSchema;
|
68
78
|
exports.UserSettingsSchema = UserSettingsSchema;
|
package/dist/cjs/types/index.cjs
CHANGED
@@ -7,9 +7,12 @@ const captcha = require("./captcha.cjs");
|
|
7
7
|
require("./userAgent.cjs");
|
8
8
|
exports.CaptchaRecordSchema = provider.CaptchaRecordSchema;
|
9
9
|
exports.ClientRecordSchema = provider.ClientRecordSchema;
|
10
|
+
exports.CompositeIpAddressRecordSchemaObj = provider.CompositeIpAddressRecordSchemaObj;
|
11
|
+
exports.CompositeIpAddressSchema = provider.CompositeIpAddressSchema;
|
10
12
|
exports.DatasetRecordSchema = provider.DatasetRecordSchema;
|
11
13
|
exports.DetectorRecordSchema = provider.DetectorRecordSchema;
|
12
14
|
exports.FrictionlessTokenRecordSchema = provider.FrictionlessTokenRecordSchema;
|
15
|
+
exports.IpAddressType = provider.IpAddressType;
|
13
16
|
exports.PendingRecordSchema = provider.PendingRecordSchema;
|
14
17
|
exports.PoWCaptchaRecordSchema = provider.PoWCaptchaRecordSchema;
|
15
18
|
exports.ScheduledTaskRecordSchema = provider.ScheduledTaskRecordSchema;
|
@@ -21,7 +24,9 @@ exports.UserCommitmentSchema = provider.UserCommitmentSchema;
|
|
21
24
|
exports.UserCommitmentWithSolutionsSchema = provider.UserCommitmentWithSolutionsSchema;
|
22
25
|
exports.UserSolutionRecordSchema = provider.UserSolutionRecordSchema;
|
23
26
|
exports.UserSolutionSchema = provider.UserSolutionSchema;
|
27
|
+
exports.parseMongooseCompositeIpAddress = provider.parseMongooseCompositeIpAddress;
|
24
28
|
exports.AccountSchema = client.AccountSchema;
|
29
|
+
exports.IPValidationRulesSchema = client.IPValidationRulesSchema;
|
25
30
|
exports.TableNames = client.TableNames;
|
26
31
|
exports.UserDataSchema = client.UserDataSchema;
|
27
32
|
exports.UserSettingsSchema = client.UserSettingsSchema;
|
@@ -16,6 +16,40 @@ const ClientRecordSchema = new mongoose.Schema({
|
|
16
16
|
tier: { type: String, enum: types.Tier, required: true }
|
17
17
|
});
|
18
18
|
ClientRecordSchema.index({ account: 1 });
|
19
|
+
var IpAddressType = /* @__PURE__ */ ((IpAddressType2) => {
|
20
|
+
IpAddressType2["v4"] = "v4";
|
21
|
+
IpAddressType2["v6"] = "v6";
|
22
|
+
return IpAddressType2;
|
23
|
+
})(IpAddressType || {});
|
24
|
+
const CompositeIpAddressSchema = zod.object({
|
25
|
+
lower: zod.bigint(),
|
26
|
+
upper: zod.bigint().optional(),
|
27
|
+
type: zod.nativeEnum(IpAddressType)
|
28
|
+
});
|
29
|
+
const CompositeIpAddressRecordSchemaObj = {
|
30
|
+
lower: {
|
31
|
+
// INT64 isn't enough capable - it reserves extra bits for the sign bit, etc, so Decimal128 guarantees no overflow
|
32
|
+
type: mongoose.Schema.Types.Decimal128,
|
33
|
+
required: true,
|
34
|
+
// without casting to string Mongoose not able to set bigint to Decimal128
|
35
|
+
set: (value) => "bigint" === typeof value ? value.toString() : value
|
36
|
+
},
|
37
|
+
upper: {
|
38
|
+
// INT64 isn't enough capable - it reserves extra bits for the sign bit, etc, so Decimal128 guarantees no overflow
|
39
|
+
type: mongoose.Schema.Types.Decimal128,
|
40
|
+
required: false,
|
41
|
+
// without casting to string Mongoose not able to set bigint to Decimal128
|
42
|
+
set: (value) => "bigint" === typeof value ? value.toString() : value
|
43
|
+
},
|
44
|
+
type: { type: String, enum: IpAddressType, required: true }
|
45
|
+
};
|
46
|
+
const parseMongooseCompositeIpAddress = (ip) => {
|
47
|
+
return {
|
48
|
+
lower: BigInt(ip.lower.$numberDecimal ?? ip.lower),
|
49
|
+
upper: ip.upper ? BigInt(ip.upper?.$numberDecimal ?? ip.upper) : void 0,
|
50
|
+
type: ip.type
|
51
|
+
};
|
52
|
+
};
|
19
53
|
const CaptchaResultSchema = zod.object({
|
20
54
|
status: zod.nativeEnum(types.CaptchaStatus),
|
21
55
|
reason: locale.TranslationKeysSchema.optional(),
|
@@ -29,7 +63,8 @@ const UserCommitmentSchema = zod.object({
|
|
29
63
|
id: zod.string(),
|
30
64
|
result: CaptchaResultSchema,
|
31
65
|
userSignature: zod.string(),
|
32
|
-
ipAddress:
|
66
|
+
ipAddress: CompositeIpAddressSchema,
|
67
|
+
providedIp: CompositeIpAddressSchema.optional(),
|
33
68
|
headers: zod.object({}).catchall(zod.string()),
|
34
69
|
ja4: zod.string(),
|
35
70
|
userSubmitted: zod.boolean(),
|
@@ -40,7 +75,8 @@ const UserCommitmentSchema = zod.object({
|
|
40
75
|
frictionlessTokenId: zod.union([
|
41
76
|
zod.string(),
|
42
77
|
zod.instanceof(mongoose.Types.ObjectId)
|
43
|
-
]).optional()
|
78
|
+
]).optional(),
|
79
|
+
coords: zod.array(zod.array(zod.array(zod.number()))).optional()
|
44
80
|
});
|
45
81
|
const CaptchaRecordSchema = new mongoose.Schema({
|
46
82
|
captchaId: { type: String, required: true },
|
@@ -84,7 +120,11 @@ const PoWCaptchaRecordSchema = new mongoose.Schema({
|
|
84
120
|
error: { type: String, required: false }
|
85
121
|
},
|
86
122
|
difficulty: { type: Number, required: true },
|
87
|
-
ipAddress:
|
123
|
+
ipAddress: CompositeIpAddressRecordSchemaObj,
|
124
|
+
providedIp: {
|
125
|
+
type: new mongoose.Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
|
126
|
+
required: false
|
127
|
+
},
|
88
128
|
headers: { type: Object, required: true },
|
89
129
|
ja4: { type: String, required: true },
|
90
130
|
userSignature: { type: String, required: false },
|
@@ -97,12 +137,14 @@ const PoWCaptchaRecordSchema = new mongoose.Schema({
|
|
97
137
|
frictionlessTokenId: {
|
98
138
|
type: mongoose.Schema.Types.ObjectId,
|
99
139
|
required: false
|
100
|
-
}
|
140
|
+
},
|
141
|
+
coords: { type: [[[Number]]], required: false }
|
101
142
|
});
|
102
143
|
PoWCaptchaRecordSchema.index({ challenge: 1 });
|
103
|
-
PoWCaptchaRecordSchema.index({ storedAtTimestamp: 1 });
|
104
144
|
PoWCaptchaRecordSchema.index({ storedAtTimestamp: 1, lastUpdatedTimestamp: 1 });
|
105
145
|
PoWCaptchaRecordSchema.index({ dappAccount: 1, requestedAtTimestamp: 1 });
|
146
|
+
PoWCaptchaRecordSchema.index({ "ipAddress.lower": 1 });
|
147
|
+
PoWCaptchaRecordSchema.index({ "ipAddress.upper": 1 });
|
106
148
|
const UserCommitmentRecordSchema = new mongoose.Schema({
|
107
149
|
userAccount: { type: String, required: true },
|
108
150
|
dappAccount: { type: String, required: true },
|
@@ -118,13 +160,17 @@ const UserCommitmentRecordSchema = new mongoose.Schema({
|
|
118
160
|
},
|
119
161
|
error: { type: String, required: false }
|
120
162
|
},
|
121
|
-
ipAddress:
|
163
|
+
ipAddress: CompositeIpAddressRecordSchemaObj,
|
164
|
+
providedIp: {
|
165
|
+
type: new mongoose.Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
|
166
|
+
required: false
|
167
|
+
},
|
122
168
|
headers: { type: Object, required: true },
|
123
169
|
ja4: { type: String, required: true },
|
124
170
|
userSignature: { type: String, required: true },
|
125
171
|
userSubmitted: { type: Boolean, required: true },
|
126
172
|
serverChecked: { type: Boolean, required: true },
|
127
|
-
storedAtTimestamp: { type:
|
173
|
+
storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
|
128
174
|
requestedAtTimestamp: { type: Number, required: true },
|
129
175
|
lastUpdatedTimestamp: { type: Number, required: false },
|
130
176
|
geolocation: { type: String, required: false },
|
@@ -133,15 +179,17 @@ const UserCommitmentRecordSchema = new mongoose.Schema({
|
|
133
179
|
frictionlessTokenId: {
|
134
180
|
type: mongoose.Schema.Types.ObjectId,
|
135
181
|
required: false
|
136
|
-
}
|
182
|
+
},
|
183
|
+
coords: { type: [[[Number]]], required: false }
|
137
184
|
});
|
138
185
|
UserCommitmentRecordSchema.index({ id: -1 });
|
139
|
-
UserCommitmentRecordSchema.index({ storedAtTimestamp: 1 });
|
140
186
|
UserCommitmentRecordSchema.index({
|
141
187
|
storedAtTimestamp: 1,
|
142
188
|
lastUpdatedTimestamp: 1
|
143
189
|
});
|
144
190
|
UserCommitmentRecordSchema.index({ userAccount: 1, dappAccount: 1 });
|
191
|
+
UserCommitmentRecordSchema.index({ "ipAddress.lower": 1 });
|
192
|
+
UserCommitmentRecordSchema.index({ "ipAddress.upper": 1 });
|
145
193
|
const DatasetRecordSchema = new mongoose.Schema({
|
146
194
|
contentTree: { type: [[String]], required: true },
|
147
195
|
datasetContentId: { type: String, required: true },
|
@@ -162,7 +210,8 @@ SolutionRecordSchema.index({ captchaId: 1 });
|
|
162
210
|
const UserSolutionSchema = types.CaptchaSolutionSchema.extend({
|
163
211
|
processed: zod.boolean(),
|
164
212
|
checked: zod.boolean(),
|
165
|
-
commitmentId: zod.string()
|
213
|
+
commitmentId: zod.string(),
|
214
|
+
createdAt: zod.date()
|
166
215
|
});
|
167
216
|
const UserSolutionRecordSchema = new mongoose.Schema(
|
168
217
|
{
|
@@ -172,7 +221,8 @@ const UserSolutionRecordSchema = new mongoose.Schema(
|
|
172
221
|
solution: [{ type: String, required: true }],
|
173
222
|
processed: { type: Boolean, required: true },
|
174
223
|
checked: { type: Boolean, required: true },
|
175
|
-
commitmentId: { type: String, required: true }
|
224
|
+
commitmentId: { type: String, required: true },
|
225
|
+
createdAt: { type: Date, default: Date.now, expires: ONE_MONTH }
|
176
226
|
},
|
177
227
|
{ _id: false }
|
178
228
|
);
|
@@ -189,7 +239,7 @@ const PendingRecordSchema = new mongoose.Schema({
|
|
189
239
|
deadlineTimestamp: { type: Number, required: true },
|
190
240
|
// unix timestamp
|
191
241
|
requestedAtTimestamp: { type: Date, required: true, expires: ONE_WEEK },
|
192
|
-
ipAddress:
|
242
|
+
ipAddress: CompositeIpAddressRecordSchemaObj,
|
193
243
|
frictionlessTokenId: {
|
194
244
|
type: mongoose.Schema.Types.ObjectId,
|
195
245
|
required: false
|
@@ -236,38 +286,45 @@ const FrictionlessTokenRecordSchema = new mongoose.Schema({
|
|
236
286
|
timeout: { type: Number, required: false },
|
237
287
|
accessPolicy: { type: Number, required: false }
|
238
288
|
},
|
239
|
-
|
240
|
-
|
241
|
-
|
289
|
+
providerSelectEntropy: { type: Number, required: true },
|
290
|
+
ipAddress: CompositeIpAddressRecordSchemaObj,
|
291
|
+
createdAt: { type: Date, default: Date.now },
|
292
|
+
lastUpdatedTimestamp: { type: Date, required: false },
|
293
|
+
storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY }
|
242
294
|
});
|
243
|
-
FrictionlessTokenRecordSchema.index({
|
244
|
-
FrictionlessTokenRecordSchema.index({
|
295
|
+
FrictionlessTokenRecordSchema.index({ createdAt: 1 });
|
296
|
+
FrictionlessTokenRecordSchema.index({ providerSelectEntropy: 1 });
|
245
297
|
const SessionRecordSchema = new mongoose.Schema({
|
246
|
-
sessionId: { type: String, required: true
|
247
|
-
createdAt: { type: Date, required: true
|
298
|
+
sessionId: { type: String, required: true },
|
299
|
+
createdAt: { type: Date, required: true },
|
248
300
|
tokenId: {
|
249
301
|
type: mongoose.Schema.Types.ObjectId
|
250
302
|
},
|
251
303
|
captchaType: { type: String, enum: types.CaptchaType, required: true },
|
252
|
-
|
304
|
+
solvedImagesCount: { type: Number, required: false },
|
305
|
+
powDifficulty: { type: Number, required: false },
|
306
|
+
storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY },
|
253
307
|
lastUpdatedTimestamp: { type: Date, required: false },
|
254
308
|
deleted: { type: Boolean, required: false }
|
255
309
|
});
|
256
|
-
SessionRecordSchema.index({
|
257
|
-
SessionRecordSchema.index({ storedAtTimestamp: 1 });
|
310
|
+
SessionRecordSchema.index({ createdAt: 1 });
|
258
311
|
SessionRecordSchema.index({ deleted: 1 });
|
312
|
+
SessionRecordSchema.index({ sessionId: 1 }, { unique: true });
|
259
313
|
const DetectorRecordSchema = new mongoose.Schema({
|
260
314
|
createdAt: { type: Date, required: true },
|
261
315
|
detectorKey: { type: String, required: true },
|
262
|
-
expiresAt: { type: Date, required: false
|
316
|
+
expiresAt: { type: Date, required: false }
|
263
317
|
});
|
264
318
|
DetectorRecordSchema.index({ createdAt: 1 }, { unique: true });
|
265
319
|
DetectorRecordSchema.index({ expiresAt: 1 }, { expireAfterSeconds: 0 });
|
266
320
|
exports.CaptchaRecordSchema = CaptchaRecordSchema;
|
267
321
|
exports.ClientRecordSchema = ClientRecordSchema;
|
322
|
+
exports.CompositeIpAddressRecordSchemaObj = CompositeIpAddressRecordSchemaObj;
|
323
|
+
exports.CompositeIpAddressSchema = CompositeIpAddressSchema;
|
268
324
|
exports.DatasetRecordSchema = DatasetRecordSchema;
|
269
325
|
exports.DetectorRecordSchema = DetectorRecordSchema;
|
270
326
|
exports.FrictionlessTokenRecordSchema = FrictionlessTokenRecordSchema;
|
327
|
+
exports.IpAddressType = IpAddressType;
|
271
328
|
exports.PendingRecordSchema = PendingRecordSchema;
|
272
329
|
exports.PoWCaptchaRecordSchema = PoWCaptchaRecordSchema;
|
273
330
|
exports.ScheduledTaskRecordSchema = ScheduledTaskRecordSchema;
|
@@ -279,3 +336,4 @@ exports.UserCommitmentSchema = UserCommitmentSchema;
|
|
279
336
|
exports.UserCommitmentWithSolutionsSchema = UserCommitmentWithSolutionsSchema;
|
280
337
|
exports.UserSolutionRecordSchema = UserSolutionRecordSchema;
|
281
338
|
exports.UserSolutionSchema = UserSolutionSchema;
|
339
|
+
exports.parseMongooseCompositeIpAddress = parseMongooseCompositeIpAddress;
|
package/dist/index.js
CHANGED
@@ -1,14 +1,18 @@
|
|
1
1
|
import "./types/index.js";
|
2
|
-
import { CaptchaRecordSchema, ClientRecordSchema, DatasetRecordSchema, DetectorRecordSchema, FrictionlessTokenRecordSchema, PendingRecordSchema, PoWCaptchaRecordSchema, ScheduledTaskRecordSchema, ScheduledTaskSchema, SessionRecordSchema, SolutionRecordSchema, UserCommitmentRecordSchema, UserCommitmentSchema, UserCommitmentWithSolutionsSchema, UserSolutionRecordSchema, UserSolutionSchema } from "./types/provider.js";
|
3
|
-
import { AccountSchema, TableNames, UserDataSchema, UserSettingsSchema } from "./types/client.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";
|
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
8
|
ClientRecordSchema,
|
9
|
+
CompositeIpAddressRecordSchemaObj,
|
10
|
+
CompositeIpAddressSchema,
|
9
11
|
DatasetRecordSchema,
|
10
12
|
DetectorRecordSchema,
|
11
13
|
FrictionlessTokenRecordSchema,
|
14
|
+
IPValidationRulesSchema,
|
15
|
+
IpAddressType,
|
12
16
|
PendingRecordSchema,
|
13
17
|
PoWCaptchaRecordSchema,
|
14
18
|
ScheduledTaskRecordSchema,
|
@@ -25,5 +29,6 @@ export {
|
|
25
29
|
UserDataSchema,
|
26
30
|
UserSettingsSchema,
|
27
31
|
UserSolutionRecordSchema,
|
28
|
-
UserSolutionSchema
|
32
|
+
UserSolutionSchema,
|
33
|
+
parseMongooseCompositeIpAddress
|
29
34
|
};
|
package/dist/types/captcha.js
CHANGED
@@ -1,15 +1,22 @@
|
|
1
1
|
import { Schema } from "mongoose";
|
2
2
|
import { FrictionlessTokenRecordSchema, SessionRecordSchema, UserCommitmentRecordSchema, PoWCaptchaRecordSchema } from "./provider.js";
|
3
3
|
const StoredSessionRecordSchema = new Schema({
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
scoreComponents: FrictionlessTokenRecordSchema.obj.scoreComponents,
|
11
|
-
threshold: FrictionlessTokenRecordSchema.obj.threshold
|
4
|
+
...SessionRecordSchema.obj,
|
5
|
+
...Object.fromEntries(
|
6
|
+
Object.entries(FrictionlessTokenRecordSchema.obj).filter(
|
7
|
+
([key]) => key !== "token"
|
8
|
+
)
|
9
|
+
)
|
12
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 });
|
13
20
|
const StoredUserCommitmentRecordSchema = new Schema({
|
14
21
|
...UserCommitmentRecordSchema.obj
|
15
22
|
});
|
@@ -18,8 +25,6 @@ const StoredPoWCaptchaRecordSchema = new Schema({
|
|
18
25
|
...PoWCaptchaRecordSchema.obj
|
19
26
|
});
|
20
27
|
StoredPoWCaptchaRecordSchema.index({ frictionlessTokenId: 1 });
|
21
|
-
StoredSessionRecordSchema.index({ sessionId: 1 });
|
22
|
-
StoredSessionRecordSchema.index({ tokenId: 1 });
|
23
28
|
export {
|
24
29
|
StoredPoWCaptchaRecordSchema,
|
25
30
|
StoredSessionRecordSchema,
|
package/dist/types/client.js
CHANGED
@@ -1,9 +1,17 @@
|
|
1
1
|
import { Schema } from "mongoose";
|
2
|
+
const IPValidationRulesSchema = new Schema({
|
3
|
+
countryChangeAction: String,
|
4
|
+
ispChangeAction: String,
|
5
|
+
distanceThresholdKm: Number,
|
6
|
+
distanceExceedAction: String,
|
7
|
+
requireAllConditions: Boolean
|
8
|
+
});
|
2
9
|
const UserSettingsSchema = new Schema({
|
3
10
|
captchaType: String,
|
4
11
|
frictionlessThreshold: Number,
|
5
12
|
powDifficulty: Number,
|
6
13
|
imageThreshold: Number,
|
14
|
+
ipValidationRules: IPValidationRulesSchema,
|
7
15
|
domains: [String]
|
8
16
|
});
|
9
17
|
const UserDataSchema = new Schema({
|
@@ -47,7 +55,8 @@ const AccountSchema = new Schema({
|
|
47
55
|
domains: [String],
|
48
56
|
powDifficulty: Number,
|
49
57
|
captchaType: String,
|
50
|
-
frictionlessThreshold: Number
|
58
|
+
frictionlessThreshold: Number,
|
59
|
+
ipValidationRules: IPValidationRulesSchema
|
51
60
|
},
|
52
61
|
createdAt: Number,
|
53
62
|
updatedAt: Number,
|
@@ -62,6 +71,7 @@ var TableNames = /* @__PURE__ */ ((TableNames2) => {
|
|
62
71
|
})(TableNames || {});
|
63
72
|
export {
|
64
73
|
AccountSchema,
|
74
|
+
IPValidationRulesSchema,
|
65
75
|
TableNames,
|
66
76
|
UserDataSchema,
|
67
77
|
UserSettingsSchema
|
package/dist/types/index.js
CHANGED
@@ -1,15 +1,19 @@
|
|
1
1
|
import "./mongo.js";
|
2
|
-
import { CaptchaRecordSchema, ClientRecordSchema, DatasetRecordSchema, DetectorRecordSchema, FrictionlessTokenRecordSchema, PendingRecordSchema, PoWCaptchaRecordSchema, ScheduledTaskRecordSchema, ScheduledTaskSchema, SessionRecordSchema, SolutionRecordSchema, UserCommitmentRecordSchema, UserCommitmentSchema, UserCommitmentWithSolutionsSchema, UserSolutionRecordSchema, UserSolutionSchema } from "./provider.js";
|
3
|
-
import { AccountSchema, TableNames, UserDataSchema, UserSettingsSchema } from "./client.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";
|
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
9
|
ClientRecordSchema,
|
10
|
+
CompositeIpAddressRecordSchemaObj,
|
11
|
+
CompositeIpAddressSchema,
|
10
12
|
DatasetRecordSchema,
|
11
13
|
DetectorRecordSchema,
|
12
14
|
FrictionlessTokenRecordSchema,
|
15
|
+
IPValidationRulesSchema,
|
16
|
+
IpAddressType,
|
13
17
|
PendingRecordSchema,
|
14
18
|
PoWCaptchaRecordSchema,
|
15
19
|
ScheduledTaskRecordSchema,
|
@@ -26,5 +30,6 @@ export {
|
|
26
30
|
UserDataSchema,
|
27
31
|
UserSettingsSchema,
|
28
32
|
UserSolutionRecordSchema,
|
29
|
-
UserSolutionSchema
|
33
|
+
UserSolutionSchema,
|
34
|
+
parseMongooseCompositeIpAddress
|
30
35
|
};
|
package/dist/types/provider.js
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
import { TranslationKeysSchema } from "@prosopo/locale";
|
2
2
|
import { Tier, CaptchaStatus, TimestampSchema, CaptchaSolutionSchema, ScheduledTaskStatus, ScheduledTaskNames, CaptchaType } from "@prosopo/types";
|
3
3
|
import mongoose, { Schema } from "mongoose";
|
4
|
-
import { object, string,
|
4
|
+
import { object, nativeEnum, bigint, string, array, number, union, instanceof as _instanceof, boolean, date, 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;
|
@@ -14,6 +14,40 @@ const ClientRecordSchema = new Schema({
|
|
14
14
|
tier: { type: String, enum: Tier, required: true }
|
15
15
|
});
|
16
16
|
ClientRecordSchema.index({ account: 1 });
|
17
|
+
var IpAddressType = /* @__PURE__ */ ((IpAddressType2) => {
|
18
|
+
IpAddressType2["v4"] = "v4";
|
19
|
+
IpAddressType2["v6"] = "v6";
|
20
|
+
return IpAddressType2;
|
21
|
+
})(IpAddressType || {});
|
22
|
+
const CompositeIpAddressSchema = object({
|
23
|
+
lower: bigint(),
|
24
|
+
upper: bigint().optional(),
|
25
|
+
type: nativeEnum(IpAddressType)
|
26
|
+
});
|
27
|
+
const CompositeIpAddressRecordSchemaObj = {
|
28
|
+
lower: {
|
29
|
+
// INT64 isn't enough capable - it reserves extra bits for the sign bit, etc, so Decimal128 guarantees no overflow
|
30
|
+
type: Schema.Types.Decimal128,
|
31
|
+
required: true,
|
32
|
+
// without casting to string Mongoose not able to set bigint to Decimal128
|
33
|
+
set: (value) => "bigint" === typeof value ? value.toString() : value
|
34
|
+
},
|
35
|
+
upper: {
|
36
|
+
// INT64 isn't enough capable - it reserves extra bits for the sign bit, etc, so Decimal128 guarantees no overflow
|
37
|
+
type: Schema.Types.Decimal128,
|
38
|
+
required: false,
|
39
|
+
// without casting to string Mongoose not able to set bigint to Decimal128
|
40
|
+
set: (value) => "bigint" === typeof value ? value.toString() : value
|
41
|
+
},
|
42
|
+
type: { type: String, enum: IpAddressType, required: true }
|
43
|
+
};
|
44
|
+
const parseMongooseCompositeIpAddress = (ip) => {
|
45
|
+
return {
|
46
|
+
lower: BigInt(ip.lower.$numberDecimal ?? ip.lower),
|
47
|
+
upper: ip.upper ? BigInt(ip.upper?.$numberDecimal ?? ip.upper) : void 0,
|
48
|
+
type: ip.type
|
49
|
+
};
|
50
|
+
};
|
17
51
|
const CaptchaResultSchema = object({
|
18
52
|
status: nativeEnum(CaptchaStatus),
|
19
53
|
reason: TranslationKeysSchema.optional(),
|
@@ -27,7 +61,8 @@ const UserCommitmentSchema = object({
|
|
27
61
|
id: string(),
|
28
62
|
result: CaptchaResultSchema,
|
29
63
|
userSignature: string(),
|
30
|
-
ipAddress:
|
64
|
+
ipAddress: CompositeIpAddressSchema,
|
65
|
+
providedIp: CompositeIpAddressSchema.optional(),
|
31
66
|
headers: object({}).catchall(string()),
|
32
67
|
ja4: string(),
|
33
68
|
userSubmitted: boolean(),
|
@@ -38,7 +73,8 @@ const UserCommitmentSchema = object({
|
|
38
73
|
frictionlessTokenId: union([
|
39
74
|
string(),
|
40
75
|
_instanceof(mongoose.Types.ObjectId)
|
41
|
-
]).optional()
|
76
|
+
]).optional(),
|
77
|
+
coords: array(array(array(number()))).optional()
|
42
78
|
});
|
43
79
|
const CaptchaRecordSchema = new Schema({
|
44
80
|
captchaId: { type: String, required: true },
|
@@ -82,7 +118,11 @@ const PoWCaptchaRecordSchema = new Schema({
|
|
82
118
|
error: { type: String, required: false }
|
83
119
|
},
|
84
120
|
difficulty: { type: Number, required: true },
|
85
|
-
ipAddress:
|
121
|
+
ipAddress: CompositeIpAddressRecordSchemaObj,
|
122
|
+
providedIp: {
|
123
|
+
type: new Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
|
124
|
+
required: false
|
125
|
+
},
|
86
126
|
headers: { type: Object, required: true },
|
87
127
|
ja4: { type: String, required: true },
|
88
128
|
userSignature: { type: String, required: false },
|
@@ -95,12 +135,14 @@ const PoWCaptchaRecordSchema = new Schema({
|
|
95
135
|
frictionlessTokenId: {
|
96
136
|
type: mongoose.Schema.Types.ObjectId,
|
97
137
|
required: false
|
98
|
-
}
|
138
|
+
},
|
139
|
+
coords: { type: [[[Number]]], required: false }
|
99
140
|
});
|
100
141
|
PoWCaptchaRecordSchema.index({ challenge: 1 });
|
101
|
-
PoWCaptchaRecordSchema.index({ storedAtTimestamp: 1 });
|
102
142
|
PoWCaptchaRecordSchema.index({ storedAtTimestamp: 1, lastUpdatedTimestamp: 1 });
|
103
143
|
PoWCaptchaRecordSchema.index({ dappAccount: 1, requestedAtTimestamp: 1 });
|
144
|
+
PoWCaptchaRecordSchema.index({ "ipAddress.lower": 1 });
|
145
|
+
PoWCaptchaRecordSchema.index({ "ipAddress.upper": 1 });
|
104
146
|
const UserCommitmentRecordSchema = new Schema({
|
105
147
|
userAccount: { type: String, required: true },
|
106
148
|
dappAccount: { type: String, required: true },
|
@@ -116,13 +158,17 @@ const UserCommitmentRecordSchema = new Schema({
|
|
116
158
|
},
|
117
159
|
error: { type: String, required: false }
|
118
160
|
},
|
119
|
-
ipAddress:
|
161
|
+
ipAddress: CompositeIpAddressRecordSchemaObj,
|
162
|
+
providedIp: {
|
163
|
+
type: new Schema(CompositeIpAddressRecordSchemaObj, { _id: false }),
|
164
|
+
required: false
|
165
|
+
},
|
120
166
|
headers: { type: Object, required: true },
|
121
167
|
ja4: { type: String, required: true },
|
122
168
|
userSignature: { type: String, required: true },
|
123
169
|
userSubmitted: { type: Boolean, required: true },
|
124
170
|
serverChecked: { type: Boolean, required: true },
|
125
|
-
storedAtTimestamp: { type:
|
171
|
+
storedAtTimestamp: { type: Date, required: false, expires: ONE_MONTH },
|
126
172
|
requestedAtTimestamp: { type: Number, required: true },
|
127
173
|
lastUpdatedTimestamp: { type: Number, required: false },
|
128
174
|
geolocation: { type: String, required: false },
|
@@ -131,15 +177,17 @@ const UserCommitmentRecordSchema = new Schema({
|
|
131
177
|
frictionlessTokenId: {
|
132
178
|
type: mongoose.Schema.Types.ObjectId,
|
133
179
|
required: false
|
134
|
-
}
|
180
|
+
},
|
181
|
+
coords: { type: [[[Number]]], required: false }
|
135
182
|
});
|
136
183
|
UserCommitmentRecordSchema.index({ id: -1 });
|
137
|
-
UserCommitmentRecordSchema.index({ storedAtTimestamp: 1 });
|
138
184
|
UserCommitmentRecordSchema.index({
|
139
185
|
storedAtTimestamp: 1,
|
140
186
|
lastUpdatedTimestamp: 1
|
141
187
|
});
|
142
188
|
UserCommitmentRecordSchema.index({ userAccount: 1, dappAccount: 1 });
|
189
|
+
UserCommitmentRecordSchema.index({ "ipAddress.lower": 1 });
|
190
|
+
UserCommitmentRecordSchema.index({ "ipAddress.upper": 1 });
|
143
191
|
const DatasetRecordSchema = new Schema({
|
144
192
|
contentTree: { type: [[String]], required: true },
|
145
193
|
datasetContentId: { type: String, required: true },
|
@@ -160,7 +208,8 @@ SolutionRecordSchema.index({ captchaId: 1 });
|
|
160
208
|
const UserSolutionSchema = CaptchaSolutionSchema.extend({
|
161
209
|
processed: boolean(),
|
162
210
|
checked: boolean(),
|
163
|
-
commitmentId: string()
|
211
|
+
commitmentId: string(),
|
212
|
+
createdAt: date()
|
164
213
|
});
|
165
214
|
const UserSolutionRecordSchema = new Schema(
|
166
215
|
{
|
@@ -170,7 +219,8 @@ const UserSolutionRecordSchema = new Schema(
|
|
170
219
|
solution: [{ type: String, required: true }],
|
171
220
|
processed: { type: Boolean, required: true },
|
172
221
|
checked: { type: Boolean, required: true },
|
173
|
-
commitmentId: { type: String, required: true }
|
222
|
+
commitmentId: { type: String, required: true },
|
223
|
+
createdAt: { type: Date, default: Date.now, expires: ONE_MONTH }
|
174
224
|
},
|
175
225
|
{ _id: false }
|
176
226
|
);
|
@@ -187,7 +237,7 @@ const PendingRecordSchema = new Schema({
|
|
187
237
|
deadlineTimestamp: { type: Number, required: true },
|
188
238
|
// unix timestamp
|
189
239
|
requestedAtTimestamp: { type: Date, required: true, expires: ONE_WEEK },
|
190
|
-
ipAddress:
|
240
|
+
ipAddress: CompositeIpAddressRecordSchemaObj,
|
191
241
|
frictionlessTokenId: {
|
192
242
|
type: mongoose.Schema.Types.ObjectId,
|
193
243
|
required: false
|
@@ -234,39 +284,46 @@ const FrictionlessTokenRecordSchema = new Schema({
|
|
234
284
|
timeout: { type: Number, required: false },
|
235
285
|
accessPolicy: { type: Number, required: false }
|
236
286
|
},
|
237
|
-
|
238
|
-
|
239
|
-
|
287
|
+
providerSelectEntropy: { type: Number, required: true },
|
288
|
+
ipAddress: CompositeIpAddressRecordSchemaObj,
|
289
|
+
createdAt: { type: Date, default: Date.now },
|
290
|
+
lastUpdatedTimestamp: { type: Date, required: false },
|
291
|
+
storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY }
|
240
292
|
});
|
241
|
-
FrictionlessTokenRecordSchema.index({
|
242
|
-
FrictionlessTokenRecordSchema.index({
|
293
|
+
FrictionlessTokenRecordSchema.index({ createdAt: 1 });
|
294
|
+
FrictionlessTokenRecordSchema.index({ providerSelectEntropy: 1 });
|
243
295
|
const SessionRecordSchema = new Schema({
|
244
|
-
sessionId: { type: String, required: true
|
245
|
-
createdAt: { type: Date, required: true
|
296
|
+
sessionId: { type: String, required: true },
|
297
|
+
createdAt: { type: Date, required: true },
|
246
298
|
tokenId: {
|
247
299
|
type: mongoose.Schema.Types.ObjectId
|
248
300
|
},
|
249
301
|
captchaType: { type: String, enum: CaptchaType, required: true },
|
250
|
-
|
302
|
+
solvedImagesCount: { type: Number, required: false },
|
303
|
+
powDifficulty: { type: Number, required: false },
|
304
|
+
storedAtTimestamp: { type: Date, required: false, expires: ONE_DAY },
|
251
305
|
lastUpdatedTimestamp: { type: Date, required: false },
|
252
306
|
deleted: { type: Boolean, required: false }
|
253
307
|
});
|
254
|
-
SessionRecordSchema.index({
|
255
|
-
SessionRecordSchema.index({ storedAtTimestamp: 1 });
|
308
|
+
SessionRecordSchema.index({ createdAt: 1 });
|
256
309
|
SessionRecordSchema.index({ deleted: 1 });
|
310
|
+
SessionRecordSchema.index({ sessionId: 1 }, { unique: true });
|
257
311
|
const DetectorRecordSchema = new Schema({
|
258
312
|
createdAt: { type: Date, required: true },
|
259
313
|
detectorKey: { type: String, required: true },
|
260
|
-
expiresAt: { type: Date, required: false
|
314
|
+
expiresAt: { type: Date, required: false }
|
261
315
|
});
|
262
316
|
DetectorRecordSchema.index({ createdAt: 1 }, { unique: true });
|
263
317
|
DetectorRecordSchema.index({ expiresAt: 1 }, { expireAfterSeconds: 0 });
|
264
318
|
export {
|
265
319
|
CaptchaRecordSchema,
|
266
320
|
ClientRecordSchema,
|
321
|
+
CompositeIpAddressRecordSchemaObj,
|
322
|
+
CompositeIpAddressSchema,
|
267
323
|
DatasetRecordSchema,
|
268
324
|
DetectorRecordSchema,
|
269
325
|
FrictionlessTokenRecordSchema,
|
326
|
+
IpAddressType,
|
270
327
|
PendingRecordSchema,
|
271
328
|
PoWCaptchaRecordSchema,
|
272
329
|
ScheduledTaskRecordSchema,
|
@@ -277,5 +334,6 @@ export {
|
|
277
334
|
UserCommitmentSchema,
|
278
335
|
UserCommitmentWithSolutionsSchema,
|
279
336
|
UserSolutionRecordSchema,
|
280
|
-
UserSolutionSchema
|
337
|
+
UserSolutionSchema,
|
338
|
+
parseMongooseCompositeIpAddress
|
281
339
|
};
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@prosopo/types-database",
|
3
|
-
"version": "3.
|
3
|
+
"version": "3.3.5",
|
4
4
|
"description": "Types for prosopo database",
|
5
5
|
"type": "module",
|
6
6
|
"main": "dist/index.js",
|
@@ -18,11 +18,10 @@
|
|
18
18
|
},
|
19
19
|
"scripts": {
|
20
20
|
"clean": "del-cli --verbose dist tsconfig.tsbuildinfo",
|
21
|
-
"build": "NODE_ENV=${NODE_ENV:-
|
21
|
+
"build": "NODE_ENV=${NODE_ENV:-development}; vite build --config vite.esm.config.ts --mode $NODE_ENV",
|
22
22
|
"build:tsc": "tsc --build --verbose",
|
23
|
-
"build:cjs": "NODE_ENV=${NODE_ENV:-
|
24
|
-
"typecheck": "tsc --
|
25
|
-
"test": "echo no tests"
|
23
|
+
"build:cjs": "NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV",
|
24
|
+
"typecheck": "tsc --project tsconfig.types.json"
|
26
25
|
},
|
27
26
|
"repository": {
|
28
27
|
"type": "git",
|
@@ -35,21 +34,16 @@
|
|
35
34
|
},
|
36
35
|
"homepage": "https://github.com/prosopo/captcha#readme",
|
37
36
|
"dependencies": {
|
38
|
-
"@prosopo/common": "3.1.
|
39
|
-
"@prosopo/
|
40
|
-
"@prosopo/
|
41
|
-
"@
|
42
|
-
"
|
43
|
-
"
|
44
|
-
"
|
45
|
-
"mongodb": "6.9.0",
|
46
|
-
"mongoose": "8.6.2",
|
47
|
-
"zod": "3.23.8",
|
48
|
-
"@prosopo/config": "3.1.2",
|
49
|
-
"openpgp": "5.11.3",
|
50
|
-
"webpack-dev-server": "5.2.2"
|
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",
|
42
|
+
"mongoose": "8.13.0",
|
43
|
+
"zod": "3.23.8"
|
51
44
|
},
|
52
45
|
"devDependencies": {
|
46
|
+
"@types/node": "22.10.2",
|
53
47
|
"@vitest/coverage-v8": "3.0.9",
|
54
48
|
"concurrently": "9.0.1",
|
55
49
|
"del-cli": "6.0.0",
|