@unchainedshop/core-users 2.14.2 → 3.0.0-alpha3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/lib/db/UsersCollection.d.ts +1 -1
  2. package/lib/db/UsersCollection.d.ts.map +1 -1
  3. package/lib/db/UsersCollection.js +0 -8
  4. package/lib/db/UsersCollection.js.map +1 -1
  5. package/lib/db/WebAuthnCredentialsCreationRequestsCollection.d.ts +8 -0
  6. package/lib/db/WebAuthnCredentialsCreationRequestsCollection.d.ts.map +1 -0
  7. package/lib/db/WebAuthnCredentialsCreationRequestsCollection.js +13 -0
  8. package/lib/db/WebAuthnCredentialsCreationRequestsCollection.js.map +1 -0
  9. package/lib/module/addMigrations.d.ts +1 -1
  10. package/lib/module/addMigrations.d.ts.map +1 -1
  11. package/lib/module/configureUsersModule.d.ts +128 -3
  12. package/lib/module/configureUsersModule.d.ts.map +1 -1
  13. package/lib/module/configureUsersModule.js +279 -51
  14. package/lib/module/configureUsersModule.js.map +1 -1
  15. package/lib/module/configureUsersWebAuthnModule.d.ts +12 -0
  16. package/lib/module/configureUsersWebAuthnModule.d.ts.map +1 -0
  17. package/lib/module/configureUsersWebAuthnModule.js +148 -0
  18. package/lib/module/configureUsersWebAuthnModule.js.map +1 -0
  19. package/lib/module/pbkdf2.d.ts +4 -0
  20. package/lib/module/pbkdf2.d.ts.map +1 -0
  21. package/lib/module/pbkdf2.js +27 -0
  22. package/lib/module/pbkdf2.js.map +1 -0
  23. package/lib/module/sha256.d.ts +2 -0
  24. package/lib/module/sha256.d.ts.map +1 -0
  25. package/lib/module/sha256.js +6 -0
  26. package/lib/module/sha256.js.map +1 -0
  27. package/lib/services/migrateUserDataService.d.ts +4 -0
  28. package/lib/services/migrateUserDataService.d.ts.map +1 -0
  29. package/lib/services/migrateUserDataService.js +18 -0
  30. package/lib/services/migrateUserDataService.js.map +1 -0
  31. package/lib/services/updateUserAvatarAfterUploadService.d.ts +5 -1
  32. package/lib/services/updateUserAvatarAfterUploadService.d.ts.map +1 -1
  33. package/lib/services/updateUserAvatarAfterUploadService.js.map +1 -1
  34. package/lib/services/userServices.d.ts +6 -1
  35. package/lib/services/userServices.d.ts.map +1 -1
  36. package/lib/services/userServices.js +3 -5
  37. package/lib/services/userServices.js.map +1 -1
  38. package/lib/types.d.ts +88 -0
  39. package/lib/types.d.ts.map +1 -0
  40. package/lib/types.js +2 -0
  41. package/lib/types.js.map +1 -0
  42. package/lib/users-index.d.ts +4 -2
  43. package/lib/users-index.d.ts.map +1 -1
  44. package/lib/users-index.js +4 -2
  45. package/lib/users-index.js.map +1 -1
  46. package/lib/users-settings.d.ts +21 -0
  47. package/lib/users-settings.d.ts.map +1 -0
  48. package/lib/users-settings.js +48 -0
  49. package/lib/users-settings.js.map +1 -0
  50. package/package.json +10 -11
  51. package/src/db/UsersCollection.ts +1 -10
  52. package/src/db/WebAuthnCredentialsCreationRequestsCollection.ts +20 -0
  53. package/src/module/addMigrations.ts +1 -1
  54. package/src/module/configureUsersModule.ts +480 -68
  55. package/src/module/configureUsersWebAuthnModule.ts +221 -0
  56. package/src/module/pbkdf2.ts +39 -0
  57. package/src/module/removeConfidentialServiceHashes.test.ts +1 -1
  58. package/src/module/sha256.ts +5 -0
  59. package/src/services/migrateUserDataService.ts +37 -0
  60. package/src/services/updateUserAvatarAfterUploadService.ts +7 -1
  61. package/src/services/userServices.ts +11 -6
  62. package/src/types.ts +101 -0
  63. package/src/users-index.ts +4 -3
  64. package/src/users-settings.ts +78 -0
  65. package/tests/mock/user-mock.ts +0 -8
  66. package/lib/services/getUserCountryService.d.ts +0 -3
  67. package/lib/services/getUserCountryService.d.ts.map +0 -1
  68. package/lib/services/getUserCountryService.js +0 -7
  69. package/lib/services/getUserCountryService.js.map +0 -1
  70. package/lib/services/getUserLanguageService.d.ts +0 -3
  71. package/lib/services/getUserLanguageService.d.ts.map +0 -1
  72. package/lib/services/getUserLanguageService.js +0 -7
  73. package/lib/services/getUserLanguageService.js.map +0 -1
  74. package/src/services/getUserCountryService.ts +0 -8
  75. package/src/services/getUserLanguageService.ts +0 -8
@@ -0,0 +1,148 @@
1
+ import { Fido2Lib, } from 'fido2-lib';
2
+ import { createLogger } from '@unchainedshop/logger';
3
+ import { WebAuthnCredentialsCreationRequestsCollection } from '../db/WebAuthnCredentialsCreationRequestsCollection.js';
4
+ const logger = createLogger('unchained:core-users');
5
+ const { ROOT_URL, EMAIL_WEBSITE_NAME } = process.env;
6
+ let setupMDSPromise;
7
+ const setupMDSCollection = async () => {
8
+ try {
9
+ const tocResult = await fetch('https://mds.fidoalliance.org');
10
+ const tocBase64 = await tocResult.text();
11
+ const mc = Fido2Lib.createMdsCollection('FIDO MDS v3'); // createMdsCollection exists but not typed in official package!
12
+ const tocObj = await mc.addToc(tocBase64);
13
+ return tocObj.entries;
14
+ }
15
+ catch (e) {
16
+ logger.error(e);
17
+ return [];
18
+ }
19
+ };
20
+ const fetchMDS = async () => {
21
+ if (setupMDSPromise)
22
+ return setupMDSPromise;
23
+ setupMDSPromise = setupMDSCollection();
24
+ return setupMDSPromise;
25
+ };
26
+ export function toArrayBuffer(buffer) {
27
+ return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
28
+ }
29
+ export function buf2hex(buffer) {
30
+ // buffer is an ArrayBuffer
31
+ return Array.prototype.map
32
+ .call(new Uint8Array(buffer), (x) => `00${x.toString(16)}`.slice(-2))
33
+ .join('');
34
+ }
35
+ export const configureUsersWebAuthnModule = async ({ db, }) => {
36
+ const WebAuthnCredentialsCreationRequests = await WebAuthnCredentialsCreationRequestsCollection(db);
37
+ const thisDomain = new URL(ROOT_URL).hostname;
38
+ const f2l = new Fido2Lib({
39
+ rpId: thisDomain,
40
+ rpName: EMAIL_WEBSITE_NAME,
41
+ rpIcon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARCSURBVHgB7Ve9UxNbFL8fm7yA4ktegHnlMk98dMbOMnR2D6pnGTqtCH+BWFoBpZXQaaelFbGzEztHHF26DKizzijDx+Zef+fu3vXuJgsxztjonQnZOZw993d+5zOM/epHslFO1a/KS/UbuvTnETsKQ/YDh3+XNi72yuVlzVgbL1YhCaOTk2ssDAI24hHDKsrpfxZkufwCj6t0OUAEBMkrlR6wHzjDMVCd872yemeete7gczeKoh2wQTICsyi0DrTWVc55eHqwu8OGPEMCMNSby5hS89H7Nx0Se9NXVvF1J69O7MDwJsKzgfCcmSP9SQhvxcV6S5cnummCHYVH4kJ9DE9NfHx1+HGLxKo0sSOkvIXHSnyz7mjOySufdLmUN3Vp4slZiSoyXk7NrhHVQui1fGzhzTq+QsZ5U07NtowQ3oH2FavDhXjS2389w7W+lrDgI2+2yfaZAEpT/y5LopjztnEkf1F6GXsc38TvWKO9g91NfO3EBGgjpxzooTosCISvXQjAm7zc1Fyvm7IChRHQM+uVcxGBAbstI84bVcqyUE3lAMyVWkrky0UsuGUYRqeni4zQk1cAk15ELxMYy07OqElKqo5ieVWWymsDAbhKGa9Qatag8P5omcQiUEot9nmb1c9cFkm5FJPJWqWp2UYegKkCMf7XHjRaeGwgs+9T1iPTA8ibkM/h5ev4XwVJthEd7D7kF+ozANRI9B9RlpO+lUO/IcZqz0jGPr8PUUFU7k185mwFZUIwBAuGUqWUob8nxCqLQ0H6qbeOnNmQGftOBVHO9QEw+ozZRKLE8y0wxDxFLISIE6n7KsDfjUS8kBoludZbCYBvl8XNaCMPLAOASsde5vYAlFPbeqWV+q/Pq5xR6HRS6zkWzPzIlXdmGKWXFaM/V06zwAGQaVppSJ3yzk7DAqpcb7UQD/q8cuRoxb75dtlxm5Zb3mzALEj7O7I/zWRUBRurHcO7G9Sw5MXJT+rLh+dmRlSqe6iOm1aOC/5nBELr2yTDOw3YO4Z+x3icq7iB01BMXm4j4dbIO+rtVi6nr7xLBg0tIjN20mGGbBPdVs+8J07mvcjzkbnbGf14tNNeYcb4wJVMH358jpo2zSf1lgCM1V4m6CsFXiUG9Iref9txe4kQXgVT9jqXejNZaEKAvFu4D5ikStBjus3bJcPxdjALNE8OduetHep+yIsXGQcZf9wTxyusGwSFS2mCvmaMcn6Lj9d9OV77BGN7iOuCYQFeqcMPT43+peln2IraFH/EdsvuALDTTTthvE0tIRnvsc/x/8/diIq2HnsSFoKEhXUAWM6zYA5VwoDtaLiV7O85XypFy+hVnbRlhCXoo9zZHWkpGWY3/L613D25PZFzeVVxvZqs6ywSYKZ7/ro+2g8TOu6eSBXAGfWIio2z2n871GY8OgN06BcSfitQuZr1CxuQ3Zh/6qkk0/P3GeV8BeBCYUHc/WHIAAAAAElFTkSuQmCC',
42
+ challengeSize: 128,
43
+ attestation: 'none',
44
+ });
45
+ return {
46
+ findMDSMetadataForAAGUID: async (aaguid) => {
47
+ const mdsCollection = await fetchMDS();
48
+ const foundEntry = mdsCollection.find((entry) => {
49
+ return entry.aaguid === aaguid;
50
+ });
51
+ return foundEntry?.metadataStatement;
52
+ },
53
+ createCredentialCreationOptions: async (origin, username, extensionOptions) => {
54
+ const registrationOptions = await f2l.attestationOptions(extensionOptions);
55
+ const challenge = Buffer.from(registrationOptions.challenge).toString('base64');
56
+ const { insertedId } = await WebAuthnCredentialsCreationRequests.insertOne({
57
+ _id: new Date().getTime(),
58
+ challenge,
59
+ origin,
60
+ factor: registrationOptions.factor || 'either',
61
+ username,
62
+ });
63
+ return {
64
+ ...registrationOptions,
65
+ challenge,
66
+ requestId: insertedId,
67
+ };
68
+ },
69
+ createCredentialRequestOptions: async (origin, username, extensionOptions) => {
70
+ const loginOptions = await f2l.assertionOptions(extensionOptions);
71
+ const challenge = Buffer.from(loginOptions.challenge).toString('base64');
72
+ const { insertedId } = await WebAuthnCredentialsCreationRequests.insertOne({
73
+ _id: new Date().getTime(),
74
+ challenge,
75
+ origin,
76
+ factor: loginOptions.factor || 'either',
77
+ username,
78
+ });
79
+ return {
80
+ ...loginOptions,
81
+ challenge,
82
+ requestId: insertedId,
83
+ };
84
+ },
85
+ verifyCredentialCreation: async (username, credentials) => {
86
+ const request = await WebAuthnCredentialsCreationRequests.findOne({
87
+ username,
88
+ }, { sort: { _id: -1 } });
89
+ const attestationExpectations = {
90
+ challenge: request.challenge,
91
+ origin: request.origin,
92
+ factor: request.factor,
93
+ };
94
+ const id = Buffer.from(credentials.id, 'base64');
95
+ const attestationObject = Buffer.from(credentials.response.attestationObject, 'base64');
96
+ const clientDataJSON = Buffer.from(credentials.response.clientDataJSON, 'base64');
97
+ const attestationResponse = {
98
+ id: toArrayBuffer(id),
99
+ response: {
100
+ attestationObject: toArrayBuffer(attestationObject),
101
+ clientDataJSON: toArrayBuffer(clientDataJSON),
102
+ },
103
+ };
104
+ const registrationOptions = await f2l.attestationResult(attestationResponse, attestationExpectations);
105
+ const publicKey = registrationOptions?.authnrData?.get('credentialPublicKeyPem');
106
+ const aaguidArrayBuffer = registrationOptions?.authnrData?.get('aaguid'); // ArrayBuffer Uint8...
107
+ const counter = registrationOptions?.authnrData?.get('counter');
108
+ const aaguidConcatenated = buf2hex(aaguidArrayBuffer);
109
+ const aaguid = `${aaguidConcatenated.slice(0, 8)}-${aaguidConcatenated.slice(8, 12)}-${aaguidConcatenated.slice(12, 16)}-${aaguidConcatenated.slice(16, 20)}-${aaguidConcatenated.slice(20)}`;
110
+ return { publicKey, counter, id: credentials.id, aaguid, created: new Date() };
111
+ },
112
+ verifyCredentialRequest: async (userPublicKeys, username, credentials) => {
113
+ const request = await WebAuthnCredentialsCreationRequests.findOne({
114
+ _id: credentials.requestId,
115
+ }, { sort: { _id: -1 } });
116
+ const id = Buffer.from(credentials.id, 'base64');
117
+ const authenticatorData = Buffer.from(credentials.response.authenticatorData, 'base64');
118
+ const signature = Buffer.from(credentials.response.signature, 'base64');
119
+ const userHandle = Buffer.from(credentials.response.userHandle, 'base64');
120
+ const clientDataJSON = Buffer.from(credentials.response.clientDataJSON, 'base64');
121
+ const { publicKey, counter } = userPublicKeys.find((publicCredentials) => {
122
+ return credentials.id === publicCredentials.id;
123
+ }) || {};
124
+ if (!publicKey)
125
+ throw new Error('WebAuthn not setup');
126
+ const assertionExpectations = {
127
+ challenge: request.challenge,
128
+ origin: request.origin,
129
+ factor: request.factor,
130
+ prevCounter: counter,
131
+ publicKey,
132
+ userHandle: toArrayBuffer(Buffer.from(username)),
133
+ };
134
+ const assertionResponse = {
135
+ id: toArrayBuffer(id),
136
+ response: {
137
+ authenticatorData: toArrayBuffer(authenticatorData),
138
+ clientDataJSON: toArrayBuffer(clientDataJSON),
139
+ signature: toArrayBuffer(signature),
140
+ userHandle: toArrayBuffer(userHandle),
141
+ },
142
+ };
143
+ const loginResult = await f2l.assertionResult(assertionResponse, assertionExpectations);
144
+ return { userHandle: loginResult?.authnrData?.get('userHandle') };
145
+ },
146
+ };
147
+ };
148
+ //# sourceMappingURL=configureUsersWebAuthnModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configureUsersWebAuthnModule.js","sourceRoot":"","sources":["../../src/module/configureUsersWebAuthnModule.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,GAGT,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,6CAA6C,EAAE,MAAM,wDAAwD,CAAC;AAoBvH,MAAM,MAAM,GAAG,YAAY,CAAC,sBAAsB,CAAC,CAAC;AAEpD,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;AAOrD,IAAI,eAAe,CAAC;AACpB,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE;IACpC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,EAAE,GAAI,QAAgB,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,gEAAgE;QACjI,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1C,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;IAC1B,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAC5C,eAAe,GAAG,kBAAkB,EAAE,CAAC;IACvC,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,MAAM;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAM;IAC5B,2BAA2B;IAC3B,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG;SACvB,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACpE,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,EAAE,EACjD,EAAE,GACe,EAAgC,EAAE;IACnD,MAAM,mCAAmC,GAAG,MAAM,6CAA6C,CAAC,EAAE,CAAC,CAAC;IAEpG,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC;IAE9C,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC;QACvB,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EACJ,olDAAolD;QACtlD,aAAa,EAAE,GAAG;QAClB,WAAW,EAAE,MAAM;KACpB,CAAC,CAAC;IAEH,OAAO;QACL,wBAAwB,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACzC,MAAM,aAAa,GAAG,MAAM,QAAQ,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBAC9C,OAAO,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC;YACjC,CAAC,CAAC,CAAC;YACH,OAAO,UAAU,EAAE,iBAAiB,CAAC;QACvC,CAAC;QAED,+BAA+B,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE;YAC5E,MAAM,mBAAmB,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC;YAC3E,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAChF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,mCAAmC,CAAC,SAAS,CAAC;gBACzE,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;gBACzB,SAAS;gBACT,MAAM;gBACN,MAAM,EAAG,mBAA2B,CAAC,MAAM,IAAI,QAAQ;gBACvD,QAAQ;aACT,CAAC,CAAC;YAEH,OAAO;gBACL,GAAG,mBAAmB;gBACtB,SAAS;gBACT,SAAS,EAAE,UAAU;aACmC,CAAC;QAC7D,CAAC;QAED,8BAA8B,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE;YAC3E,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;YAClE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACzE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,mCAAmC,CAAC,SAAS,CAAC;gBACzE,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;gBACzB,SAAS;gBACT,MAAM;gBACN,MAAM,EAAG,YAAoB,CAAC,MAAM,IAAI,QAAQ;gBAChD,QAAQ;aACT,CAAC,CAAC;YAEH,OAAO;gBACL,GAAG,YAAY;gBACf,SAAS;gBACT,SAAS,EAAE,UAAU;aACkC,CAAC;QAC5D,CAAC;QAED,wBAAwB,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE;YACxD,MAAM,OAAO,GAAG,MAAM,mCAAmC,CAAC,OAAO,CAC/D;gBACE,QAAQ;aACT,EACD,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CACtB,CAAC;YAEF,MAAM,uBAAuB,GAAG;gBAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;YAEF,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACjD,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YACxF,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;YAElF,MAAM,mBAAmB,GAAG;gBAC1B,EAAE,EAAE,aAAa,CAAC,EAAE,CAAC;gBACrB,QAAQ,EAAE;oBACR,iBAAiB,EAAE,aAAa,CAAC,iBAAiB,CAAC;oBACnD,cAAc,EAAE,aAAa,CAAC,cAAc,CAAC;iBAC9C;aACF,CAAC;YAEF,MAAM,mBAAmB,GAAG,MAAM,GAAG,CAAC,iBAAiB,CACrD,mBAAmB,EACnB,uBAAuB,CACxB,CAAC;YAEF,MAAM,SAAS,GAAG,mBAAmB,EAAE,UAAU,EAAE,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACjF,MAAM,iBAAiB,GAAG,mBAAmB,EAAE,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,uBAAuB;YACjG,MAAM,OAAO,GAAG,mBAAmB,EAAE,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YAEhE,MAAM,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAC1E,CAAC,EACD,EAAE,CACH,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAC/D,EAAE,EACF,EAAE,CACH,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YAEpC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QACjF,CAAC;QAED,uBAAuB,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE;YACvE,MAAM,OAAO,GAAG,MAAM,mCAAmC,CAAC,OAAO,CAC/D;gBACE,GAAG,EAAE,WAAW,CAAC,SAAS;aAC3B,EACD,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CACtB,CAAC;YAEF,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACjD,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YACxF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACxE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC1E,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;YAElF,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAC1B,cAAc,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,EAAE;gBACxC,OAAO,WAAW,CAAC,EAAE,KAAK,iBAAiB,CAAC,EAAE,CAAC;YACjD,CAAC,CAAC,IAAI,EAAE,CAAC;YAEX,IAAI,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAEtD,MAAM,qBAAqB,GAAG;gBAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,WAAW,EAAE,OAAO;gBACpB,SAAS;gBACT,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aACjD,CAAC;YAEF,MAAM,iBAAiB,GAAG;gBACxB,EAAE,EAAE,aAAa,CAAC,EAAE,CAAC;gBACrB,QAAQ,EAAE;oBACR,iBAAiB,EAAE,aAAa,CAAC,iBAAiB,CAAC;oBACnD,cAAc,EAAE,aAAa,CAAC,cAAc,CAAC;oBAC7C,SAAS,EAAE,aAAa,CAAC,SAAS,CAAC;oBACnC,UAAU,EAAE,aAAa,CAAC,UAAU,CAAC;iBACtC;aACF,CAAC;YAEF,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,eAAe,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;YACxF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACpE,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function generateSalt(saltLength?: number): string;
2
+ export declare function getDerivedKey(salt: string, password: string, iterations?: number, keyLength?: number): Promise<string>;
3
+ export declare function compare(password: string, hash: string, salt: string): Promise<boolean>;
4
+ //# sourceMappingURL=pbkdf2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pbkdf2.d.ts","sourceRoot":"","sources":["../../src/module/pbkdf2.ts"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,CAAC,UAAU,SAAqB,UAG3D;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,UAAU,SAAoB,EAC9B,SAAS,SAAoB,mBAmB9B;AAED,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,oBAGzE"}
@@ -0,0 +1,27 @@
1
+ // https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#pbkdf2
2
+ const PBKDF2_ITERATIONS = 300000; // Iterations, > 210'000
3
+ const PBKDF2_KEY_LENGTH = 256; // Bytes
4
+ const PBKDF2_SALT_LENGTH = 16; // Bytes
5
+ export function generateSalt(saltLength = PBKDF2_SALT_LENGTH) {
6
+ const array = new Uint32Array(saltLength);
7
+ return Buffer.from(crypto.getRandomValues(array)).toString('hex');
8
+ }
9
+ export async function getDerivedKey(salt, password, iterations = PBKDF2_ITERATIONS, keyLength = PBKDF2_KEY_LENGTH) {
10
+ const textEncoder = new TextEncoder();
11
+ const passwordBuffer = textEncoder.encode(password);
12
+ const importedKey = await crypto.subtle.importKey('raw', passwordBuffer, 'PBKDF2', false, [
13
+ 'deriveBits',
14
+ ]);
15
+ const bits = await crypto.subtle.deriveBits({
16
+ name: 'PBKDF2',
17
+ hash: 'SHA-512',
18
+ salt: textEncoder.encode(salt),
19
+ iterations,
20
+ }, importedKey, keyLength);
21
+ return Buffer.from(bits).toString('hex');
22
+ }
23
+ export async function compare(password, hash, salt) {
24
+ const comparableHash = await getDerivedKey(salt, password);
25
+ return comparableHash === hash;
26
+ }
27
+ //# sourceMappingURL=pbkdf2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pbkdf2.js","sourceRoot":"","sources":["../../src/module/pbkdf2.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,MAAM,iBAAiB,GAAG,MAAM,CAAC,CAAC,wBAAwB;AAC1D,MAAM,iBAAiB,GAAG,GAAG,CAAC,CAAC,QAAQ;AACvC,MAAM,kBAAkB,GAAG,EAAE,CAAC,CAAC,QAAQ;AAEvC,MAAM,UAAU,YAAY,CAAC,UAAU,GAAG,kBAAkB;IAC1D,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,QAAgB,EAChB,UAAU,GAAG,iBAAiB,EAC9B,SAAS,GAAG,iBAAiB;IAE7B,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IACtC,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE;QACxF,YAAY;KACb,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CACzC;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9B,UAAU;KACX,EACD,WAAW,EACX,SAAS,CACV,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB,EAAE,IAAY,EAAE,IAAY;IACxE,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC3D,OAAO,cAAc,KAAK,IAAI,CAAC;AACjC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const hash: (message: any) => Promise<string>;
2
+ //# sourceMappingURL=sha256.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sha256.d.ts","sourceRoot":"","sources":["../../src/module/sha256.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,mCAIhB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export const hash = async (message) => {
2
+ const bytes = new TextEncoder().encode(message);
3
+ const hashBuffer = await crypto.subtle.digest('SHA-256', bytes);
4
+ return Buffer.from(hashBuffer).toString('hex');
5
+ };
6
+ //# sourceMappingURL=sha256.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sha256.js","sourceRoot":"","sources":["../../src/module/sha256.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE;IACpC,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { UnchainedCore } from '@unchainedshop/core';
2
+ export type MigrateUserDataService = (userIdBeforeLogin: any, userId: any, unchainedAPI: UnchainedCore) => Promise<void>;
3
+ export declare const migrateUserDataService: MigrateUserDataService;
4
+ //# sourceMappingURL=migrateUserDataService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrateUserDataService.d.ts","sourceRoot":"","sources":["../../src/services/migrateUserDataService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,MAAM,MAAM,sBAAsB,GAAG,CACnC,iBAAiB,KAAA,EACjB,MAAM,KAAA,EACN,YAAY,EAAE,aAAa,KACxB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,eAAO,MAAM,sBAAsB,EAAE,sBA2BpC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { userSettings } from '../users-settings.js';
2
+ export const migrateUserDataService = async (userIdBeforeLogin, userId, unchainedAPI) => {
3
+ const user = await unchainedAPI.modules.users.findUserById(userId);
4
+ const userBeforeLogin = await unchainedAPI.modules.users.findUserById(userIdBeforeLogin);
5
+ await unchainedAPI.services.orders.migrateOrderCarts({
6
+ fromUserId: userIdBeforeLogin,
7
+ toUserId: userId,
8
+ shouldMerge: userSettings.mergeUserCartsOnLogin,
9
+ countryContext: userBeforeLogin.lastLogin?.countryCode || user.lastLogin?.countryCode,
10
+ }, unchainedAPI);
11
+ await unchainedAPI.services.bookmarks.migrateBookmarks({
12
+ fromUserId: userIdBeforeLogin,
13
+ toUserId: userId,
14
+ shouldMerge: userSettings.mergeUserCartsOnLogin,
15
+ countryContext: userBeforeLogin.lastLogin?.countryCode || user.lastLogin?.countryCode,
16
+ }, unchainedAPI);
17
+ };
18
+ //# sourceMappingURL=migrateUserDataService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrateUserDataService.js","sourceRoot":"","sources":["../../src/services/migrateUserDataService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAQpD,MAAM,CAAC,MAAM,sBAAsB,GAA2B,KAAK,EACjE,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,EAAE;IACF,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;IAEzF,MAAM,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,CAClD;QACE,UAAU,EAAE,iBAAiB;QAC7B,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,YAAY,CAAC,qBAAqB;QAC/C,cAAc,EAAE,eAAe,CAAC,SAAS,EAAE,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW;KACtF,EACD,YAAY,CACb,CAAC;IAEF,MAAM,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,gBAAgB,CACpD;QACE,UAAU,EAAE,iBAAiB;QAC7B,QAAQ,EAAE,MAAM;QAChB,WAAW,EAAE,YAAY,CAAC,qBAAqB;QAC/C,cAAc,EAAE,eAAe,CAAC,SAAS,EAAE,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW;KACtF,EACD,YAAY,CACb,CAAC;AACJ,CAAC,CAAC"}
@@ -1,3 +1,7 @@
1
- import { UpdateUserAvatarAfterUploadService } from '@unchainedshop/types/user.js';
1
+ import { File } from '@unchainedshop/core-files';
2
+ import { UnchainedCore } from '@unchainedshop/core';
3
+ export type UpdateUserAvatarAfterUploadService = (params: {
4
+ file: File;
5
+ }, context: UnchainedCore) => Promise<void>;
2
6
  export declare const updateUserAvatarAfterUploadService: UpdateUserAvatarAfterUploadService;
3
7
  //# sourceMappingURL=updateUserAvatarAfterUploadService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"updateUserAvatarAfterUploadService.d.ts","sourceRoot":"","sources":["../../src/services/updateUserAvatarAfterUploadService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kCAAkC,EAAE,MAAM,8BAA8B,CAAC;AAGlF,eAAO,MAAM,kCAAkC,EAAE,kCA6BhD,CAAC"}
1
+ {"version":3,"file":"updateUserAvatarAfterUploadService.d.ts","sourceRoot":"","sources":["../../src/services/updateUserAvatarAfterUploadService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,MAAM,kCAAkC,GAAG,CAC/C,MAAM,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,EACtB,OAAO,EAAE,aAAa,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,eAAO,MAAM,kCAAkC,EAAE,kCA6BhD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"updateUserAvatarAfterUploadService.js","sourceRoot":"","sources":["../../src/services/updateUserAvatarAfterUploadService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,CAAC,MAAM,kCAAkC,GAAuC,KAAK,EACzF,EAAE,IAAI,EAAE,EACR,OAAO,EACP,EAAE;IACF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAA0B,CAAC;IAEnD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QAC1C,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;QACtB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,aAAa,EAAE,MAAM;KACtB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAExC,IAAI,CAAC;QACH,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,MAAM,QAAQ,CAAC,KAAK,CAAC,WAAW,CAC9B;gBACE,OAAO;aACR,EACD,OAAO,CACR,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,8BAA8B;QAC9B,GAAG,CAAC,uCAAwC,CAAW,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,MAAM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC,CAAC"}
1
+ {"version":3,"file":"updateUserAvatarAfterUploadService.js","sourceRoot":"","sources":["../../src/services/updateUserAvatarAfterUploadService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAQtD,MAAM,CAAC,MAAM,kCAAkC,GAAuC,KAAK,EACzF,EAAE,IAAI,EAAE,EACR,OAAO,EACP,EAAE;IACF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAA0B,CAAC;IAEnD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;QAC1C,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;QACtB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,aAAa,EAAE,MAAM;KACtB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAExC,IAAI,CAAC;QACH,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,MAAM,QAAQ,CAAC,KAAK,CAAC,WAAW,CAC9B;gBACE,OAAO;aACR,EACD,OAAO,CACR,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,8BAA8B;QAC9B,GAAG,CAAC,uCAAwC,CAAW,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,MAAM,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC,CAAC"}
@@ -1,3 +1,8 @@
1
- import { UserServices } from '@unchainedshop/types/user.js';
1
+ import { UpdateUserAvatarAfterUploadService } from './updateUserAvatarAfterUploadService.js';
2
+ import { MigrateUserDataService } from './migrateUserDataService.js';
3
+ export interface UserServices {
4
+ updateUserAvatarAfterUpload: UpdateUserAvatarAfterUploadService;
5
+ migrateUserData: MigrateUserDataService;
6
+ }
2
7
  export declare const userServices: UserServices;
3
8
  //# sourceMappingURL=userServices.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"userServices.d.ts","sourceRoot":"","sources":["../../src/services/userServices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAK5D,eAAO,MAAM,YAAY,EAAE,YAI1B,CAAC"}
1
+ {"version":3,"file":"userServices.d.ts","sourceRoot":"","sources":["../../src/services/userServices.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kCAAkC,EACnC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAA0B,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE7F,MAAM,WAAW,YAAY;IAC3B,2BAA2B,EAAE,kCAAkC,CAAC;IAChE,eAAe,EAAE,sBAAsB,CAAC;CACzC;AAED,eAAO,MAAM,YAAY,EAAE,YAG1B,CAAC"}
@@ -1,9 +1,7 @@
1
- import { getUserCountryService } from './getUserCountryService.js';
2
- import { getUserLanguageService } from './getUserLanguageService.js';
3
- import { updateUserAvatarAfterUploadService } from './updateUserAvatarAfterUploadService.js';
1
+ import { updateUserAvatarAfterUploadService, } from './updateUserAvatarAfterUploadService.js';
2
+ import { migrateUserDataService } from './migrateUserDataService.js';
4
3
  export const userServices = {
5
- getUserCountry: getUserCountryService,
6
- getUserLanguage: getUserLanguageService,
7
4
  updateUserAvatarAfterUpload: updateUserAvatarAfterUploadService,
5
+ migrateUserData: migrateUserDataService,
8
6
  };
9
7
  //# sourceMappingURL=userServices.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"userServices.js","sourceRoot":"","sources":["../../src/services/userServices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kCAAkC,EAAE,MAAM,yCAAyC,CAAC;AAE7F,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,cAAc,EAAE,qBAAqB;IACrC,eAAe,EAAE,sBAAsB;IACvC,2BAA2B,EAAE,kCAAkC;CAChE,CAAC"}
1
+ {"version":3,"file":"userServices.js","sourceRoot":"","sources":["../../src/services/userServices.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kCAAkC,GAEnC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAA0B,MAAM,6BAA6B,CAAC;AAO7F,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,2BAA2B,EAAE,kCAAkC;IAC/D,eAAe,EAAE,sBAAsB;CACxC,CAAC"}
package/lib/types.d.ts ADDED
@@ -0,0 +1,88 @@
1
+ import type { TimestampFields, Address, Contact, mongodb } from '@unchainedshop/mongodb';
2
+ export interface PushSubscription {
3
+ _id: string;
4
+ userAgent: string;
5
+ expirationTime: number;
6
+ endpoint: string;
7
+ }
8
+ export interface UserProfile {
9
+ displayName?: string;
10
+ birthday?: Date;
11
+ phoneMobile?: string;
12
+ gender?: string;
13
+ address?: Address;
14
+ }
15
+ export interface UserLastLogin {
16
+ timestamp?: Date;
17
+ locale?: string;
18
+ countryCode?: string;
19
+ remoteAddress?: string;
20
+ remotePort?: string;
21
+ userAgent?: string;
22
+ }
23
+ export interface Email {
24
+ address: string;
25
+ verified: boolean;
26
+ }
27
+ export interface WebAuthnCredentials {
28
+ id: string;
29
+ publicKey: string;
30
+ created: Date;
31
+ aaguid: string;
32
+ counter: number;
33
+ mdsMetadata: any;
34
+ }
35
+ export interface Web3Address {
36
+ address: string;
37
+ nonce?: number;
38
+ verified: boolean;
39
+ }
40
+ export interface PushSubscriptionObject {
41
+ userAgent: string;
42
+ endpoint: string;
43
+ expirationTime?: number;
44
+ keys: {
45
+ auth: string;
46
+ p256dh: string;
47
+ };
48
+ }
49
+ export type User = {
50
+ _id?: string;
51
+ deleted?: Date;
52
+ avatarId?: string;
53
+ emails: Array<Email>;
54
+ guest: boolean;
55
+ initialPassword: boolean;
56
+ lastBillingAddress?: Address;
57
+ lastContact?: Contact;
58
+ lastLogin?: UserLastLogin;
59
+ profile?: UserProfile;
60
+ roles: Array<string>;
61
+ services: any;
62
+ tags?: Array<string>;
63
+ pushSubscriptions: Array<PushSubscriptionObject>;
64
+ username?: string;
65
+ meta?: any;
66
+ } & TimestampFields;
67
+ export type UserQuery = mongodb.Filter<User> & {
68
+ includeGuests?: boolean;
69
+ queryString?: string;
70
+ };
71
+ export interface WebAuthnCredentialsCreationRequest {
72
+ challenge: string;
73
+ username: string;
74
+ origin: string;
75
+ factor: 'first' | 'second' | 'either';
76
+ }
77
+ export interface UserData {
78
+ email?: string;
79
+ guest?: boolean;
80
+ initialPassword?: boolean;
81
+ lastBillingAddress?: User['lastBillingAddress'];
82
+ password: string | null;
83
+ webAuthnPublicKeyCredentials?: any;
84
+ profile?: UserProfile;
85
+ roles?: Array<string>;
86
+ username?: string;
87
+ }
88
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/lib/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -1,3 +1,5 @@
1
- export { configureUsersModule } from './module/configureUsersModule.js';
2
- export { userServices } from './services/userServices.js';
1
+ export * from './types.js';
2
+ export * from './module/configureUsersModule.js';
3
+ export * from './services/userServices.js';
4
+ export * from './users-settings.js';
3
5
  //# sourceMappingURL=users-index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"users-index.d.ts","sourceRoot":"","sources":["../src/users-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"users-index.d.ts","sourceRoot":"","sources":["../src/users-index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC"}
@@ -1,3 +1,5 @@
1
- export { configureUsersModule } from './module/configureUsersModule.js';
2
- export { userServices } from './services/userServices.js';
1
+ export * from './types.js';
2
+ export * from './module/configureUsersModule.js';
3
+ export * from './services/userServices.js';
4
+ export * from './users-settings.js';
3
5
  //# sourceMappingURL=users-index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"users-index.js","sourceRoot":"","sources":["../src/users-index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"users-index.js","sourceRoot":"","sources":["../src/users-index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { User } from './types.js';
2
+ import { mongodb } from '@unchainedshop/mongodb';
3
+ export interface UserSettingsOptions {
4
+ mergeUserCartsOnLogin?: boolean;
5
+ autoMessagingAfterUserCreation?: boolean;
6
+ validateEmail?: (email: string) => Promise<boolean>;
7
+ validateUsername?: (username: string) => Promise<boolean>;
8
+ validateNewUser?: (user: Partial<User>) => Promise<User>;
9
+ validatePassword?: (password: string) => Promise<boolean>;
10
+ }
11
+ export interface UserSettings {
12
+ mergeUserCartsOnLogin: boolean;
13
+ autoMessagingAfterUserCreation: boolean;
14
+ validateEmail: (email: string) => Promise<boolean>;
15
+ validateUsername: (username: string) => Promise<boolean>;
16
+ validateNewUser: (user: Partial<User>) => Promise<User>;
17
+ validatePassword: (password: string) => Promise<boolean>;
18
+ configureSettings: (options: UserSettingsOptions, db: mongodb.Db) => void;
19
+ }
20
+ export declare const userSettings: UserSettings;
21
+ //# sourceMappingURL=users-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users-settings.d.ts","sourceRoot":"","sources":["../src/users-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IAClC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3D;AACD,MAAM,WAAW,YAAY;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,8BAA8B,EAAE,OAAO,CAAC;IACxC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,iBAAiB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;CAC3E;AAED,eAAO,MAAM,YAAY,EAAE,YAwD1B,CAAC"}
@@ -0,0 +1,48 @@
1
+ export const userSettings = {
2
+ autoMessagingAfterUserCreation: null,
3
+ mergeUserCartsOnLogin: null,
4
+ validateEmail: null,
5
+ validateUsername: null,
6
+ validateNewUser: null,
7
+ validatePassword: null,
8
+ configureSettings: ({ mergeUserCartsOnLogin, autoMessagingAfterUserCreation, validateEmail, validateUsername, validateNewUser, validatePassword, }, db) => {
9
+ const defaultAutoMessagingAfterUserCreation = true;
10
+ const defaultMergeUserCartsOnLogin = true;
11
+ const defaultValidateEmail = async (rawEmail) => {
12
+ const email = rawEmail.toLowerCase().trim();
13
+ if (!email?.includes?.('@'))
14
+ return false;
15
+ const emailAlreadyExists = await db
16
+ .collection('users')
17
+ .countDocuments({ 'emails.address': { $regex: email, $options: 'i' } }, { limit: 1 });
18
+ if (emailAlreadyExists)
19
+ return false;
20
+ return true;
21
+ };
22
+ const defaultValidateUsername = async (rawUsername) => {
23
+ const username = rawUsername.toLowerCase().trim();
24
+ if (username?.length < 3)
25
+ return false;
26
+ const usernameAlreadyExists = await db
27
+ .collection('users')
28
+ .countDocuments({ username: { $regex: username, $options: 'i' } }, { limit: 1 });
29
+ if (usernameAlreadyExists)
30
+ return false;
31
+ return true;
32
+ };
33
+ const defaultValidateNewUser = async (user) => {
34
+ return user;
35
+ };
36
+ const defaultValidatePassword = async (password) => {
37
+ return password?.length >= 8;
38
+ };
39
+ userSettings.mergeUserCartsOnLogin = mergeUserCartsOnLogin ?? defaultMergeUserCartsOnLogin;
40
+ userSettings.autoMessagingAfterUserCreation =
41
+ autoMessagingAfterUserCreation ?? defaultAutoMessagingAfterUserCreation;
42
+ userSettings.validateEmail = validateEmail || defaultValidateEmail;
43
+ userSettings.validateUsername = validateUsername || defaultValidateUsername;
44
+ userSettings.validateNewUser = validateNewUser || defaultValidateNewUser;
45
+ userSettings.validatePassword = validatePassword || defaultValidatePassword;
46
+ },
47
+ };
48
+ //# sourceMappingURL=users-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users-settings.js","sourceRoot":"","sources":["../src/users-settings.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,MAAM,YAAY,GAAiB;IACxC,8BAA8B,EAAE,IAAI;IACpC,qBAAqB,EAAE,IAAI;IAC3B,aAAa,EAAE,IAAI;IACnB,gBAAgB,EAAE,IAAI;IACtB,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,IAAI;IAEtB,iBAAiB,EAAE,CACjB,EACE,qBAAqB,EACrB,8BAA8B,EAC9B,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GACI,EACtB,EAAc,EACd,EAAE;QACF,MAAM,qCAAqC,GAAG,IAAI,CAAC;QACnD,MAAM,4BAA4B,GAAG,IAAI,CAAC;QAE1C,MAAM,oBAAoB,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;YACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC1C,MAAM,kBAAkB,GAAG,MAAM,EAAE;iBAChC,UAAU,CAAC,OAAO,CAAC;iBACnB,cAAc,CAAC,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACxF,IAAI,kBAAkB;gBAAE,OAAO,KAAK,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,MAAM,uBAAuB,GAAG,KAAK,EAAE,WAAmB,EAAE,EAAE;YAC5D,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,QAAQ,EAAE,MAAM,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;YACvC,MAAM,qBAAqB,GAAG,MAAM,EAAE;iBACnC,UAAU,CAAC,OAAO,CAAC;iBACnB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACnF,IAAI,qBAAqB;gBAAE,OAAO,KAAK,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,MAAM,sBAAsB,GAAG,KAAK,EAAE,IAAU,EAAE,EAAE;YAClD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QAEF,MAAM,uBAAuB,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE;YACzD,OAAO,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,YAAY,CAAC,qBAAqB,GAAG,qBAAqB,IAAI,4BAA4B,CAAC;QAC3F,YAAY,CAAC,8BAA8B;YACzC,8BAA8B,IAAI,qCAAqC,CAAC;QAC1E,YAAY,CAAC,aAAa,GAAG,aAAa,IAAI,oBAAoB,CAAC;QACnE,YAAY,CAAC,gBAAgB,GAAG,gBAAgB,IAAI,uBAAuB,CAAC;QAC5E,YAAY,CAAC,eAAe,GAAG,eAAe,IAAI,sBAAsB,CAAC;QACzE,YAAY,CAAC,gBAAgB,GAAG,gBAAgB,IAAI,uBAAuB,CAAC;IAC9E,CAAC;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unchainedshop/core-users",
3
- "version": "2.14.2",
3
+ "version": "3.0.0-alpha3",
4
4
  "main": "lib/users-index.js",
5
5
  "exports": {
6
6
  ".": "./lib/users-index.js",
@@ -31,20 +31,19 @@
31
31
  },
32
32
  "homepage": "https://github.com/unchainedshop/unchained#readme",
33
33
  "dependencies": {
34
- "@unchainedshop/events": "^2.14.2",
35
- "@unchainedshop/file-upload": "^2.14.2",
36
- "@unchainedshop/logger": "^2.14.2",
37
- "@unchainedshop/roles": "^2.14.2",
38
- "@unchainedshop/utils": "^2.14.2",
39
- "locale": "^0.1.0",
40
- "simpl-schema": "^3.4.6",
34
+ "@unchainedshop/events": "^3.0.0-alpha3",
35
+ "@unchainedshop/file-upload": "^3.0.0-alpha3",
36
+ "@unchainedshop/logger": "^3.0.0-alpha3",
37
+ "@unchainedshop/roles": "^3.0.0-alpha3",
38
+ "@unchainedshop/utils": "^3.0.0-alpha3",
39
+ "bcryptjs": "^2.4.3",
40
+ "fido2-lib": "^3.5.3",
41
41
  "uuid": "^10.0.0"
42
42
  },
43
43
  "devDependencies": {
44
- "@types/node": "^20.16.5",
45
- "@unchainedshop/types": "^2.14.2",
44
+ "@types/node": "^22.5.5",
46
45
  "jest": "^29.7.0",
47
46
  "ts-jest": "^29.2.5",
48
- "typescript": "^5.5.4"
47
+ "typescript": "^5.6.2"
49
48
  }
50
49
  }
@@ -1,5 +1,5 @@
1
1
  import { mongodb, buildDbIndexes } from '@unchainedshop/mongodb';
2
- import { User } from '@unchainedshop/types/user.js';
2
+ import { User } from '../types.js';
3
3
 
4
4
  export const UsersCollection = async (db: mongodb.Db) => {
5
5
  const Users = db.collection<User>('users');
@@ -64,15 +64,6 @@ export const UsersCollection = async (db: mongodb.Db) => {
64
64
  },
65
65
  },
66
66
 
67
- {
68
- index: {
69
- 'services.resume.loginTokens.hashedToken': 1,
70
- } as any,
71
- options: {
72
- sparse: true,
73
- },
74
- },
75
-
76
67
  {
77
68
  index: {
78
69
  _id: 'text',
@@ -0,0 +1,20 @@
1
+ import { WebAuthnCredentialsCreationRequest } from '../types.js';
2
+ import { mongodb, buildDbIndexes } from '@unchainedshop/mongodb';
3
+
4
+ type Collection = WebAuthnCredentialsCreationRequest & { _id: number };
5
+
6
+ export const WebAuthnCredentialsCreationRequestsCollection = async (db: mongodb.Db) => {
7
+ const WebAuthnCredentialsCreationRequests = db.collection<Collection>(
8
+ 'accounts_webauthn_credentials_creation_requests',
9
+ );
10
+
11
+ await buildDbIndexes<Collection>(WebAuthnCredentialsCreationRequests, [
12
+ {
13
+ index: {
14
+ username: 1,
15
+ },
16
+ },
17
+ ]);
18
+
19
+ return WebAuthnCredentialsCreationRequests;
20
+ };
@@ -1,4 +1,4 @@
1
- import { Migration, MigrationRepository } from '@unchainedshop/types/core.js';
1
+ import { Migration, MigrationRepository } from '@unchainedshop/core';
2
2
  import { UsersCollection } from '../db/UsersCollection.js';
3
3
 
4
4
  const convertTagsToLowerCase = async (collection: Awaited<ReturnType<typeof UsersCollection>>) => {