@unchainedshop/core-users 3.0.0-rc5 → 3.0.0-rc6

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 (29) hide show
  1. package/lib/module/configureUsersWebAuthnModule.d.ts.map +1 -1
  2. package/lib/module/configureUsersWebAuthnModule.js +9 -1
  3. package/lib/module/configureUsersWebAuthnModule.js.map +1 -1
  4. package/package.json +7 -7
  5. package/src/module/configureUsersWebAuthnModule.ts +10 -1
  6. package/lib/module/configureUsersModule_BACKUP_57123.d.ts +0 -73
  7. package/lib/module/configureUsersModule_BACKUP_57123.d.ts.map +0 -1
  8. package/lib/module/configureUsersModule_BACKUP_57123.js +0 -567
  9. package/lib/module/configureUsersModule_BACKUP_57123.js.map +0 -1
  10. package/lib/module/configureUsersModule_BASE_57123.d.ts +0 -131
  11. package/lib/module/configureUsersModule_BASE_57123.d.ts.map +0 -1
  12. package/lib/module/configureUsersModule_BASE_57123.js +0 -563
  13. package/lib/module/configureUsersModule_BASE_57123.js.map +0 -1
  14. package/lib/module/configureUsersModule_LOCAL_57123.d.ts +0 -131
  15. package/lib/module/configureUsersModule_LOCAL_57123.d.ts.map +0 -1
  16. package/lib/module/configureUsersModule_LOCAL_57123.js +0 -564
  17. package/lib/module/configureUsersModule_LOCAL_57123.js.map +0 -1
  18. package/lib/module/configureUsersModule_REMOTE_57123.d.ts +0 -74
  19. package/lib/module/configureUsersModule_REMOTE_57123.d.ts.map +0 -1
  20. package/lib/module/configureUsersModule_REMOTE_57123.js +0 -567
  21. package/lib/module/configureUsersModule_REMOTE_57123.js.map +0 -1
  22. package/lib/module/sha256.d.ts +0 -2
  23. package/lib/module/sha256.d.ts.map +0 -1
  24. package/lib/module/sha256.js +0 -6
  25. package/lib/module/sha256.js.map +0 -1
  26. package/lib/types.d.ts +0 -91
  27. package/lib/types.d.ts.map +0 -1
  28. package/lib/types.js +0 -2
  29. package/lib/types.js.map +0 -1
@@ -1,563 +0,0 @@
1
- import bcrypt from 'bcryptjs';
2
- import { emit, registerEvents } from '@unchainedshop/events';
3
- import { generateDbFilterById, buildSortOptions, generateDbObjectId, } from '@unchainedshop/mongodb';
4
- import { systemLocale, SortDirection } from '@unchainedshop/utils';
5
- import { UsersCollection } from '../db/UsersCollection.js';
6
- import addMigrations from './addMigrations.js';
7
- import { userSettings } from '../users-settings.js';
8
- import { configureUsersWebAuthnModule } from './configureUsersWebAuthnModule.js';
9
- import * as pbkdf2 from './pbkdf2.js';
10
- import * as sha256 from './sha256.js';
11
- const USER_EVENTS = [
12
- 'USER_ACCOUNT_ACTION',
13
- 'USER_CREATE',
14
- 'USER_ADD_ROLES',
15
- 'USER_UPDATE',
16
- 'USER_UPDATE_PROFILE',
17
- 'USER_UPDATE_ROLE',
18
- 'USER_UPDATE_TAGS',
19
- 'USER_UPDATE_AVATAR',
20
- 'USER_UPDATE_GUEST',
21
- 'USER_UPDATE_USERNAME',
22
- 'USER_UPDATE_PASSWORD',
23
- 'USER_UPDATE_HEARTBEAT',
24
- 'USER_UPDATE_BILLING_ADDRESS',
25
- 'USER_UPDATE_LAST_CONTACT',
26
- 'USER_REMOVE',
27
- ];
28
- export const removeConfidentialServiceHashes = (rawUser) => {
29
- const user = rawUser;
30
- delete user?.services;
31
- return user;
32
- };
33
- export const buildFindSelector = ({ includeGuests, queryString, ...rest }) => {
34
- const selector = { ...rest, deleted: null };
35
- if (!includeGuests)
36
- selector.guest = { $in: [false, null] };
37
- if (queryString) {
38
- selector.$text = { $search: queryString };
39
- }
40
- return selector;
41
- };
42
- export const configureUsersModule = async ({ db, options, migrationRepository, }) => {
43
- userSettings.configureSettings(options || {}, db);
44
- registerEvents(USER_EVENTS);
45
- const Users = await UsersCollection(db);
46
- // Migration
47
- addMigrations(migrationRepository);
48
- const webAuthn = await configureUsersWebAuthnModule({ db, options });
49
- return {
50
- // Queries
51
- webAuthn,
52
- async count(query) {
53
- const userCount = await Users.countDocuments(buildFindSelector(query));
54
- return userCount;
55
- },
56
- async findUserById(userId) {
57
- if (!userId)
58
- return null;
59
- return Users.findOne(generateDbFilterById(userId), {});
60
- },
61
- async findUserByUsername(username) {
62
- if (!username)
63
- return null;
64
- return Users.findOne({ username }, {});
65
- },
66
- async findUserByEmail(email) {
67
- if (!email)
68
- return null;
69
- return Users.findOne({ 'emails.address': { $regex: email, $options: 'i' } }, {});
70
- },
71
- async findUnverifiedEmailToken(plainToken) {
72
- if (!plainToken)
73
- return null;
74
- const token = await sha256.hash(plainToken);
75
- const user = await Users.findOne({
76
- 'services.email.verificationTokens': {
77
- $elemMatch: {
78
- token,
79
- when: { $gt: new Date().getTime() },
80
- },
81
- },
82
- }, {});
83
- if (!user)
84
- return null;
85
- const verificationToken = user.services.email.verificationTokens.find((v) => v.token === token);
86
- return {
87
- userId: user._id,
88
- ...verificationToken,
89
- };
90
- },
91
- async verifyEmail(userId, address) {
92
- await Users.updateOne({ _id: userId }, {
93
- $set: {
94
- 'emails.$[email].verified': true,
95
- },
96
- $pull: {
97
- 'services.email.verificationTokens': {
98
- address,
99
- },
100
- },
101
- }, {
102
- arrayFilters: [{ 'email.address': address }],
103
- });
104
- await emit('USER_ACCOUNT_ACTION', {
105
- action: 'email-verified',
106
- address,
107
- userId,
108
- });
109
- },
110
- async findUserByResetToken(plainToken) {
111
- const token = await sha256.hash(plainToken);
112
- const user = await Users.findOne({
113
- 'services.password.reset': {
114
- $elemMatch: {
115
- token,
116
- when: { $gt: new Date().getTime() },
117
- },
118
- },
119
- }, {});
120
- return user;
121
- },
122
- async findUserByToken(plainToken) {
123
- const token = await sha256.hash(plainToken);
124
- if (token) {
125
- return Users.findOne({
126
- 'services.token.secret': token,
127
- });
128
- }
129
- return null;
130
- },
131
- async findUser(query, findOptions) {
132
- const selector = buildFindSelector(query);
133
- return Users.findOne(selector, findOptions);
134
- },
135
- async findUsers({ limit, offset, ...query }) {
136
- const defaultSort = [{ key: 'created', value: SortDirection.ASC }];
137
- const selector = buildFindSelector(query);
138
- if (query.queryString) {
139
- return Users.find(selector, {
140
- skip: offset,
141
- limit,
142
- projection: { score: { $meta: 'textScore' } },
143
- sort: { score: { $meta: 'textScore' } },
144
- }).toArray();
145
- }
146
- return Users.find(selector, {
147
- skip: offset,
148
- limit,
149
- sort: buildSortOptions(query.sort || defaultSort),
150
- }).toArray();
151
- },
152
- async userExists({ userId }) {
153
- const selector = generateDbFilterById(userId);
154
- selector.deleted = null; // skip deleted users when checked for existance!
155
- const userCount = await Users.countDocuments(selector, { limit: 1 });
156
- return userCount === 1;
157
- },
158
- // Transformations
159
- primaryEmail(user) {
160
- return (user.emails || []).sort((left, right) => Number(right.verified) - Number(left.verified))?.[0];
161
- },
162
- userLocale(user) {
163
- if (!user?.lastLogin?.locale)
164
- return systemLocale;
165
- return new Intl.Locale(user.lastLogin.locale);
166
- },
167
- // Mutations
168
- async createUser({ password, email, username, initialPassword, roles, webAuthnPublicKeyCredentials, ...userData }, { skipMessaging, skipPasswordEnrollment, } = {}) {
169
- const normalizedUserData = await userSettings.validateNewUser(userData);
170
- const webAuthnService = webAuthnPublicKeyCredentials &&
171
- (await this.webAuthn.verifyCredentialCreation(username, webAuthnPublicKeyCredentials));
172
- const services = {};
173
- if (email) {
174
- if (!(await userSettings.validateEmail(email))) {
175
- throw new Error(`E-Mail address ${email} is invalid`, { cause: 'EMAIL_INVALID' });
176
- }
177
- }
178
- if (password) {
179
- if (!(await userSettings.validatePassword(password))) {
180
- throw new Error(`Provided password is invalid`, { cause: 'PASSWORD_INVALID' });
181
- }
182
- services.password = await this.hashPassword(password);
183
- }
184
- if (webAuthnService) {
185
- services.webAuthn = [webAuthnService];
186
- }
187
- const doc = {
188
- ...normalizedUserData,
189
- _id: normalizedUserData._id || generateDbObjectId(),
190
- roles: roles || [],
191
- initialPassword: Boolean(initialPassword),
192
- services,
193
- emails: email ? [{ address: email, verified: false }] : [],
194
- created: new Date(),
195
- };
196
- if (username) {
197
- if (!(await userSettings.validateUsername(username))) {
198
- throw new Error(`Username ${username} is invalid`, { cause: 'USERNAME_INVALID' });
199
- }
200
- doc.username = username;
201
- }
202
- const { insertedId: userId } = await Users.insertOne(doc);
203
- try {
204
- const autoMessagingEnabled = skipMessaging
205
- ? false
206
- : userSettings.autoMessagingAfterUserCreation && !!email && !!userId;
207
- if (autoMessagingEnabled) {
208
- if (password === undefined) {
209
- if (!skipPasswordEnrollment && !webAuthnService) {
210
- await this.sendResetPasswordEmail(userId, email, true);
211
- }
212
- }
213
- else {
214
- await this.sendVerificationEmail(userId, email);
215
- }
216
- }
217
- }
218
- catch {
219
- /* */
220
- }
221
- const user = await Users.findOne({ _id: userId }, {});
222
- await emit('USER_CREATE', {
223
- user: removeConfidentialServiceHashes(user),
224
- });
225
- return userId;
226
- },
227
- async hashPassword(password) {
228
- const salt = pbkdf2.generateSalt();
229
- const hashedPassword = await pbkdf2.getDerivedKey(salt, password);
230
- return { pbkdf2: `${salt}:${hashedPassword}` };
231
- },
232
- async verifyPassword({ bcrypt: bcryptHash, pbkdf2: pbkdf2SaltAndHash }, plainPassword) {
233
- if (bcryptHash) {
234
- const password = await sha256.hash(plainPassword);
235
- return bcrypt.compare(password, bcryptHash);
236
- }
237
- if (pbkdf2SaltAndHash) {
238
- const [pbkdf2Salt, pbkdf2Hash] = pbkdf2SaltAndHash.split(':');
239
- return pbkdf2.compare(plainPassword, pbkdf2Hash, pbkdf2Salt);
240
- }
241
- return false;
242
- },
243
- async addEmail(userId, address) {
244
- if (!(await userSettings.validateEmail(address))) {
245
- throw new Error(`E-Mail address ${address} is invalid`, { cause: 'EMAIL_INVALID' });
246
- }
247
- await this.updateUser({ _id: userId, 'emails.address': { $not: { $regex: address, $options: 'i' } } }, {
248
- $push: {
249
- emails: {
250
- address: address.trim(),
251
- verified: false,
252
- },
253
- },
254
- });
255
- },
256
- async removeEmail(userId, address) {
257
- await this.updateUser({ _id: userId, 'emails.address': { $regex: address, $options: 'i' } }, {
258
- $pull: {
259
- emails: { address: { $regex: address, $options: 'i' } },
260
- },
261
- });
262
- },
263
- async sendResetPasswordEmail(userId, email, isEnrollment) {
264
- const plainToken = crypto.randomUUID();
265
- const resetToken = {
266
- token: await sha256.hash(plainToken),
267
- address: email,
268
- when: new Date().getTime() + 1000 * 60 * 60, // 1 hour
269
- };
270
- await Users.updateOne({ _id: userId }, {
271
- $push: {
272
- 'services.password.reset': resetToken,
273
- },
274
- });
275
- await emit('USER_ACCOUNT_ACTION', {
276
- action: isEnrollment ? 'enroll-account' : 'reset-password',
277
- userId,
278
- ...resetToken,
279
- token: plainToken,
280
- });
281
- },
282
- async sendVerificationEmail(userId, email) {
283
- const plainToken = crypto.randomUUID();
284
- const verificationToken = {
285
- token: await sha256.hash(plainToken),
286
- address: email,
287
- when: new Date().getTime() + 1000 * 60 * 60, // 1 hour
288
- };
289
- await Users.updateOne({ _id: userId }, {
290
- $push: {
291
- 'services.email.verificationTokens': verificationToken,
292
- },
293
- });
294
- await emit('USER_ACCOUNT_ACTION', {
295
- action: 'verify-email',
296
- userId,
297
- ...verificationToken,
298
- token: plainToken,
299
- });
300
- },
301
- addRoles: async (userId, roles) => {
302
- const selector = generateDbFilterById(userId);
303
- const updateResult = await Users.updateOne(selector, {
304
- $addToSet: { roles: { $each: roles } },
305
- });
306
- const user = await Users.findOne(selector, {});
307
- await emit('USER_ADD_ROLES', {
308
- user: removeConfidentialServiceHashes(user),
309
- });
310
- return updateResult.modifiedCount;
311
- },
312
- async setUsername(userId, username) {
313
- if (!(await userSettings.validateUsername(username))) {
314
- throw new Error(`Username ${username} is invalid`, { cause: 'USERNAME_INVALID' });
315
- }
316
- await Users.updateOne({ _id: userId }, {
317
- $set: {
318
- username: username.trim(),
319
- },
320
- });
321
- const user = await Users.findOne({ _id: userId }, {});
322
- await emit('USER_UPDATE_USERNAME', {
323
- user: removeConfidentialServiceHashes(user),
324
- });
325
- },
326
- async setPassword(userId, plainPassword) {
327
- if (!(await userSettings.validatePassword(plainPassword))) {
328
- throw new Error(`Password ***** is invalid`, { cause: 'PASSWORD_INVALID' });
329
- }
330
- const password = plainPassword || crypto.randomUUID().split('-').pop();
331
- await Users.updateOne({ _id: userId }, {
332
- $set: {
333
- initialPassword: false,
334
- 'services.password': await this.hashPassword(password || crypto.randomUUID().split('-').pop()),
335
- },
336
- });
337
- const user = await Users.findOne({ _id: userId }, {});
338
- await emit('USER_UPDATE_PASSWORD', {
339
- user: removeConfidentialServiceHashes(user),
340
- });
341
- },
342
- updateAvatar: async (_id, fileId) => {
343
- const userFilter = generateDbFilterById(_id);
344
- const modifier = {
345
- $set: {
346
- avatarId: fileId,
347
- updated: new Date(),
348
- },
349
- };
350
- const user = await Users.findOneAndUpdate(userFilter, modifier, {
351
- returnDocument: 'after',
352
- });
353
- await emit('USER_UPDATE_AVATAR', {
354
- user: removeConfidentialServiceHashes(user),
355
- });
356
- return user;
357
- },
358
- updateGuest: async (user, guest) => {
359
- const modifier = { $set: { guest } };
360
- await Users.updateOne(generateDbFilterById(user._id), modifier);
361
- await emit('USER_UPDATE_GUEST', {
362
- user: removeConfidentialServiceHashes({
363
- ...user,
364
- guest,
365
- }),
366
- });
367
- },
368
- updateHeartbeat: async (userId, lastLogin) => {
369
- const modifier = {
370
- $set: {
371
- lastLogin: {
372
- timestamp: new Date(),
373
- ...lastLogin,
374
- },
375
- },
376
- };
377
- const user = await Users.findOneAndUpdate(generateDbFilterById(userId), modifier, {
378
- returnDocument: 'after',
379
- });
380
- await emit('USER_UPDATE_HEARTBEAT', {
381
- user: removeConfidentialServiceHashes(user),
382
- });
383
- return user;
384
- },
385
- delete: async (userId) => {
386
- const userFilter = generateDbFilterById(userId);
387
- const existingUser = await Users.findOne(userFilter, {
388
- projection: { emails: true, username: true },
389
- });
390
- if (!existingUser)
391
- return null;
392
- const uuid = crypto.randomUUID();
393
- const obfuscatedEmails = existingUser.emails?.flatMap(({ address, verified }) => {
394
- if (!verified)
395
- return [];
396
- return [
397
- {
398
- address: `${address}@${uuid}.unchained.local`,
399
- verified: true,
400
- },
401
- ];
402
- });
403
- const obfuscatedUsername = existingUser.username ? `${existingUser.username}-${uuid}` : null;
404
- Users.updateOne(userFilter, {
405
- $set: {
406
- emails: obfuscatedEmails,
407
- username: obfuscatedUsername,
408
- services: {},
409
- },
410
- });
411
- const user = await Users.findOneAndDelete(userFilter);
412
- await emit('USER_REMOVE', {
413
- user: removeConfidentialServiceHashes(user),
414
- });
415
- return user;
416
- },
417
- updateProfile: async (userId, updatedData) => {
418
- const userFilter = generateDbFilterById(userId);
419
- const { meta, profile } = updatedData;
420
- if (!meta && !profile) {
421
- return Users.findOne(userFilter, {});
422
- }
423
- const modifier = { $set: {} };
424
- if (profile) {
425
- modifier.$set = Object.keys(profile).reduce((acc, profileKey) => {
426
- return {
427
- ...acc,
428
- [`profile.${profileKey}`]: profile[profileKey],
429
- };
430
- }, {});
431
- }
432
- if (meta) {
433
- // eslint-disable-next-line
434
- // @ts-ignore
435
- modifier.$set.meta = meta;
436
- }
437
- const user = await Users.findOneAndUpdate(userFilter, modifier, {
438
- returnDocument: 'after',
439
- });
440
- await emit('USER_UPDATE_PROFILE', {
441
- user: removeConfidentialServiceHashes(user),
442
- });
443
- return user;
444
- },
445
- updateLastBillingAddress: async (_id, lastBillingAddress) => {
446
- const userFilter = generateDbFilterById(_id);
447
- const user = await Users.findOne(userFilter, {});
448
- const modifier = {
449
- $set: {
450
- lastBillingAddress,
451
- updated: new Date(),
452
- },
453
- };
454
- const profile = user.profile || {};
455
- const isGuest = !!user.guest;
456
- if (!profile.displayName || isGuest) {
457
- modifier.$set['profile.displayName'] = [
458
- lastBillingAddress.firstName,
459
- lastBillingAddress.lastName,
460
- ]
461
- .filter(Boolean)
462
- .join(' ');
463
- }
464
- const updatedUser = await Users.findOneAndUpdate(generateDbFilterById(_id), modifier, {
465
- returnDocument: 'after',
466
- });
467
- if (updatedUser) {
468
- await emit('USER_UPDATE_BILLING_ADDRESS', {
469
- user: removeConfidentialServiceHashes(updatedUser),
470
- });
471
- }
472
- return updatedUser;
473
- },
474
- updateLastContact: async (_id, lastContact) => {
475
- const userFilter = generateDbFilterById(_id);
476
- const user = await Users.findOne(userFilter, {});
477
- const profile = user.profile || {};
478
- const isGuest = !!user.guest;
479
- const modifier = {
480
- $set: {
481
- updated: new Date(),
482
- lastContact,
483
- },
484
- };
485
- if ((!profile.phoneMobile || isGuest) && lastContact.telNumber) {
486
- // Backport the contact phone number to the user profile
487
- modifier.$set['profile.phoneMobile'] = lastContact.telNumber;
488
- }
489
- const updatedUser = await Users.findOneAndUpdate(userFilter, modifier, {
490
- returnDocument: 'after',
491
- });
492
- await emit('USER_UPDATE_LAST_CONTACT', {
493
- user: removeConfidentialServiceHashes(user),
494
- });
495
- return updatedUser;
496
- },
497
- updateRoles: async (_id, roles) => {
498
- const modifier = {
499
- $set: {
500
- updated: new Date(),
501
- roles,
502
- },
503
- };
504
- const user = await Users.findOneAndUpdate(generateDbFilterById(_id), modifier, {
505
- returnDocument: 'after',
506
- });
507
- await emit('USER_UPDATE_ROLE', {
508
- user: removeConfidentialServiceHashes(user),
509
- });
510
- return user;
511
- },
512
- updateTags: async (_id, tags) => {
513
- const modifier = {
514
- $set: {
515
- updated: new Date(),
516
- tags,
517
- },
518
- };
519
- const user = await Users.findOneAndUpdate(generateDbFilterById(_id), modifier, {
520
- returnDocument: 'after',
521
- });
522
- await emit('USER_UPDATE_TAGS', {
523
- user: removeConfidentialServiceHashes(user),
524
- });
525
- return user;
526
- },
527
- updateUser: async (selector, modifier, updateOptions) => {
528
- const user = await Users.findOneAndUpdate(selector, modifier, {
529
- ...updateOptions,
530
- returnDocument: 'after',
531
- });
532
- await emit('USER_UPDATE', {
533
- user: removeConfidentialServiceHashes(user),
534
- });
535
- return user;
536
- },
537
- addPushSubscription: async (userId, subscription, subscriptionOptions) => {
538
- const updateResult = await Users.updateOne({ _id: userId, 'pushSubscriptions.keys.p256dh': { $ne: subscription?.keys?.p256dh } }, {
539
- $push: {
540
- pushSubscriptions: {
541
- userAgent: subscriptionOptions?.userAgent,
542
- ...subscription,
543
- },
544
- },
545
- }, {});
546
- if (updateResult.modifiedCount === 1 && subscriptionOptions?.unsubscribeFromOtherUsers) {
547
- await Users.updateMany({ _id: { $ne: userId }, 'pushSubscriptions.keys.p256dh': subscription?.keys?.p256dh }, {
548
- $pull: {
549
- pushSubscriptions: { 'keys.p256dh': subscription?.keys?.p256dh },
550
- },
551
- });
552
- }
553
- },
554
- removePushSubscription: async (userId, p256dh) => {
555
- await Users.updateOne({ _id: userId }, {
556
- $pull: {
557
- pushSubscriptions: { 'keys.p256dh': p256dh },
558
- },
559
- }, {});
560
- },
561
- };
562
- };
563
- //# sourceMappingURL=configureUsersModule_BASE_57123.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configureUsersModule_BASE_57123.js","sourceRoot":"","sources":["../../src/module/configureUsersModule_BASE_57123.ts"],"names":[],"mappings":"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"}