@abtnode/blocklet-services 1.16.8-beta-186fd5aa → 1.16.8-next-c66e39c7

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 (31) hide show
  1. package/api/index.js +2 -2
  2. package/api/libs/auth/utils.js +1 -1
  3. package/api/libs/connect/session.js +25 -67
  4. package/api/libs/connect/v1.js +2 -5
  5. package/api/libs/connect/v2.js +1 -1
  6. package/api/libs/jwt.js +6 -5
  7. package/api/routes/blocklet.js +1 -1
  8. package/api/routes/oauth.js +10 -38
  9. package/api/routes/user.js +1 -1
  10. package/api/services/auth/connect/receive-transfer-app-owner.js +7 -15
  11. package/api/services/auth/connect/setup.js +2 -1
  12. package/api/services/auth/session.js +4 -3
  13. package/api/services/oauth/index.js +0 -156
  14. package/api/socket/channel/did.js +1 -1
  15. package/api/state/index.js +14 -5
  16. package/api/state/message.js +3 -16
  17. package/build/asset-manifest.json +10 -10
  18. package/build/index.html +1 -1
  19. package/build/static/css/{290.07ab3f1e.chunk.css → 59.f0957009.chunk.css} +1 -1
  20. package/build/static/js/343.f1104d63.chunk.js +2 -0
  21. package/build/static/js/59.c408028b.chunk.js +3 -0
  22. package/build/static/js/main.2fbec507.js +3 -0
  23. package/build/static/js/{main.94c49b7d.js.LICENSE.txt → main.2fbec507.js.LICENSE.txt} +3 -3
  24. package/build/static/media/iconify.212917dd32288c600255.cjs +2 -0
  25. package/package.json +18 -19
  26. package/build/static/js/290.8692063d.chunk.js +0 -3
  27. package/build/static/js/343.6fc2089d.chunk.js +0 -2
  28. package/build/static/js/main.94c49b7d.js +0 -3
  29. package/build/static/media/iconify.26e4076719101e021ba0.cjs +0 -2
  30. /package/build/static/js/{290.8692063d.chunk.js.LICENSE.txt → 59.c408028b.chunk.js.LICENSE.txt} +0 -0
  31. /package/build/static/media/{iconify.26e4076719101e021ba0.cjs.LICENSE.txt → iconify.212917dd32288c600255.cjs.LICENSE.txt} +0 -0
package/api/index.js CHANGED
@@ -23,7 +23,7 @@ const logger = require('@abtnode/logger')(require('../package.json').name);
23
23
  const cache = require('./cache');
24
24
  const { ensureProxyUrl } = require('./util');
25
25
  const { isProduction, isE2E } = require('./libs/env');
26
- const { init: initStates } = require('./state/index');
26
+ const states = require('./state/index');
27
27
 
28
28
  const { init: initNotification } = require('./services/notification');
29
29
  const { init: initRelay } = require('./services/relay');
@@ -82,7 +82,7 @@ module.exports = function createServer(node, serverOptions = {}) {
82
82
 
83
83
  logger.info('init blocklet service', { isProduction });
84
84
 
85
- initStates(options.dataDir);
85
+ states.init(options.dataDir);
86
86
 
87
87
  const { middlewares: authMiddlewares, routes: authRoutes, ensureWsUser } = initAuth({ node, options });
88
88
  const notificationService = initNotification({ node });
@@ -4,7 +4,7 @@ const logger = require('@abtnode/auth/lib/logger');
4
4
  const { getPassportStatusEndpoint, getApplicationInfo } = require('@abtnode/auth/lib/auth');
5
5
  const { createPassportVC } = require('@abtnode/auth/lib/passport');
6
6
  const { VC_TYPE_NODE_PASSPORT, PASSPORT_STATUS } = require('@abtnode/constant');
7
- const { parseUserAvatar } = require('@abtnode/util/lib/user-avatar');
7
+ const { parseUserAvatar } = require('@abtnode/util/lib/user');
8
8
  const { getBlockletAppIdList } = require('@blocklet/meta/lib/util');
9
9
  const pick = require('lodash/pick');
10
10
  const uniq = require('lodash/uniq');
@@ -2,7 +2,7 @@
2
2
  const get = require('lodash/get');
3
3
  const joinUrl = require('url-join');
4
4
  const formatContext = require('@abtnode/util/lib/format-context');
5
- const { extractUserAvatar } = require('@abtnode/util/lib/user-avatar');
5
+ const { extractUserAvatar } = require('@abtnode/util/lib/user');
6
6
  const {
7
7
  messages,
8
8
  getVCFromClaims,
@@ -42,7 +42,7 @@ const logger = require('@abtnode/logger')(require('../../../package.json').name)
42
42
  const { isInvitedUserOnly } = require('../../util');
43
43
  const { transferPassport } = require('../auth/utils');
44
44
  const { generateTranslate } = require('../translate');
45
- const { mergeUserData, migrateAccount, declareAccount } = require('../../services/oauth');
45
+ const { migrateAccount, declareAccount } = require('../../services/oauth');
46
46
 
47
47
  const vcTypes = [VC_TYPE_GENERAL_PASSPORT, VC_TYPE_NODE_PASSPORT];
48
48
 
@@ -178,7 +178,6 @@ module.exports = {
178
178
  },
179
179
  options: {
180
180
  enableConnectedAccount: true,
181
- enableNormalize: true,
182
181
  blockletSk: blockletWallet.secretKey,
183
182
  },
184
183
  });
@@ -203,14 +202,7 @@ module.exports = {
203
202
  action,
204
203
  }) => {
205
204
  const blocklet = await request.getBlocklet();
206
- const {
207
- wallet,
208
- secret,
209
- name,
210
- passportColor,
211
- did: teamDid,
212
- wallet: blockletWallet,
213
- } = await request.getBlockletInfo();
205
+ const { wallet, secret, name, passportColor, did: teamDid } = await request.getBlockletInfo();
214
206
 
215
207
  // Check user approved
216
208
  const user = await node.getUser({
@@ -220,8 +212,6 @@ module.exports = {
220
212
  },
221
213
  options: {
222
214
  enableConnectedAccount: true,
223
- enableNormalize: true,
224
- blockletSk: blockletWallet.secretKey,
225
215
  },
226
216
  });
227
217
  if (user && !user.approved) {
@@ -251,8 +241,8 @@ module.exports = {
251
241
  }
252
242
  } else if (action === 'exchangePassport') {
253
243
  const claim = claims.find((x) => x.type === 'asset');
254
- const { users } = await node.getUsers({ teamDid, query: { connectedDid: claim.asset } });
255
- if (users.length) {
244
+ const isConnected = await node.isConnectedAccount({ teamDid, did: claim.asset });
245
+ if (isConnected) {
256
246
  throw new Error(messages.nftAlreadyUsed[locale]);
257
247
  }
258
248
 
@@ -437,7 +427,7 @@ module.exports = {
437
427
  throw new Error(messages.actionForbidden[locale]);
438
428
  }
439
429
 
440
- const { did: teamDid, wallet: blockletWallet } = await request.getBlockletInfo();
430
+ const { did: teamDid } = await request.getBlockletInfo();
441
431
  const user = await node.getUser({
442
432
  teamDid,
443
433
  user: {
@@ -445,8 +435,6 @@ module.exports = {
445
435
  },
446
436
  options: {
447
437
  enableConnectedAccount: true,
448
- enableNormalize: true,
449
- blockletSk: blockletWallet.secretKey,
450
438
  },
451
439
  });
452
440
 
@@ -467,7 +455,7 @@ module.exports = {
467
455
  },
468
456
  onApprove: async ({ node, request, locale, profile, userDid }) => {
469
457
  const blocklet = await request.getBlocklet();
470
- const { did: teamDid, wallet: blockletWallet } = await request.getBlockletInfo();
458
+ const { did: teamDid } = await request.getBlockletInfo();
471
459
 
472
460
  // check user approved
473
461
  const user = await node.getUser({
@@ -477,8 +465,6 @@ module.exports = {
477
465
  },
478
466
  options: {
479
467
  enableConnectedAccount: true,
480
- enableNormalize: true,
481
- blockletSk: blockletWallet.secretKey,
482
468
  },
483
469
  });
484
470
  if (!user) {
@@ -518,7 +504,7 @@ module.exports = {
518
504
  throw new Error(messages.userMismatch[locale]);
519
505
  }
520
506
 
521
- const { did: teamDid, wallet: blockletWallet } = await request.getBlockletInfo();
507
+ const { did: teamDid } = await request.getBlockletInfo();
522
508
 
523
509
  const user = await node.getUser({
524
510
  teamDid,
@@ -527,8 +513,6 @@ module.exports = {
527
513
  },
528
514
  options: {
529
515
  enableConnectedAccount: true,
530
- enableNormalize: true,
531
- blockletSk: blockletWallet.secretKey,
532
516
  },
533
517
  });
534
518
 
@@ -567,7 +551,7 @@ module.exports = {
567
551
  componentId,
568
552
  }) => {
569
553
  const blocklet = await request.getBlocklet();
570
- const { name, did: teamDid, wallet: blockletWallet, secret } = await request.getBlockletInfo();
554
+ const { name, did: teamDid, secret } = await request.getBlockletInfo();
571
555
 
572
556
  // Validate user
573
557
  const user = await node.getUser({
@@ -577,8 +561,6 @@ module.exports = {
577
561
  },
578
562
  options: {
579
563
  enableConnectedAccount: true,
580
- enableNormalize: true,
581
- blockletSk: blockletWallet.secretKey,
582
564
  },
583
565
  });
584
566
  if (!user) {
@@ -678,7 +660,7 @@ module.exports = {
678
660
  },
679
661
  };
680
662
  const t = generateTranslate({ translations });
681
- const { did: teamDid, wallet: blockletWallet } = await request.getBlockletInfo();
663
+ const { did: teamDid } = await request.getBlockletInfo();
682
664
 
683
665
  const walletUser = await node.getUser({ teamDid, user: { did: userDid } });
684
666
  if (walletUser) {
@@ -693,16 +675,14 @@ module.exports = {
693
675
  },
694
676
  options: {
695
677
  enableConnectedAccount: true,
696
- enableNormalize: true,
697
- blockletSk: blockletWallet.secretKey,
698
678
  },
699
679
  });
700
680
 
701
681
  if (!oauthUser) {
702
682
  throw new Error(t('notFound', locale));
703
683
  }
704
- const oauthConnectedAccounts = oauthUser.extraConfigs?.connectedAccounts || [];
705
- const sourceProvider = oauthUser.extraConfigs?.sourceProvider || 'wallet';
684
+ const oauthConnectedAccounts = oauthUser.connectedAccounts || [];
685
+ const sourceProvider = oauthUser.sourceProvider || 'wallet';
706
686
  if (oauthConnectedAccounts.find((item) => item.provider === 'wallet')) {
707
687
  throw new Error(t('alreadyBindWallet', locale));
708
688
  }
@@ -714,13 +694,11 @@ module.exports = {
714
694
  },
715
695
  options: {
716
696
  enableConnectedAccount: true,
717
- enableNormalize: true,
718
- blockletSk: blockletWallet.secretKey,
719
697
  },
720
698
  });
721
699
 
722
700
  if (bindUser) {
723
- const bindConnectedAccounts = bindUser.extraConfigs?.connectedAccounts || [];
701
+ const bindConnectedAccounts = bindUser.connectedAccounts || [];
724
702
  if (bindConnectedAccounts.find((item) => item.provider === sourceProvider)) {
725
703
  throw new Error(`${oauthUser.email} ${t('alreadyBindOAuth', locale)}`);
726
704
  }
@@ -759,8 +737,6 @@ module.exports = {
759
737
  },
760
738
  options: {
761
739
  enableConnectedAccount: true,
762
- enableNormalize: true,
763
- blockletSk: blockletWallet.secretKey,
764
740
  },
765
741
  });
766
742
  if (bindUser && !bindUser.approved) {
@@ -799,36 +775,18 @@ module.exports = {
799
775
 
800
776
  await node.updateUser({
801
777
  teamDid,
802
- user: mergeUserData(
803
- {
804
- ...mergeProfile,
805
- did: oauthUser.did,
806
- pk: oauthUser.pk,
807
- passports: mergePassport,
808
- extraConfigs: oauthUser.extraConfigs,
809
- },
810
- {
811
- locale,
812
- lastLoginIp: get(request, 'headers[x-real-ip]') || '',
813
- connectedAccount,
814
- }
815
- ),
778
+ user: {
779
+ did: oauthUser.did,
780
+ pk: oauthUser.pk,
781
+ ...mergeProfile,
782
+ locale,
783
+ lastLoginIp: get(request, 'headers[x-real-ip]') || '',
784
+ connectedAccounts: [connectedAccount],
785
+ passports: mergePassport,
786
+ },
816
787
  });
817
788
 
818
- if (bindUser) {
819
- // 更新 bind 用户记录的绑定信息
820
- await node.updateUser({
821
- teamDid,
822
- user: {
823
- did: bindUser.did,
824
- pk: bindUser.pk,
825
- extraConfigs: {
826
- ...(bindUser.extraConfigs || {}),
827
- bindDid: userDid,
828
- },
829
- },
830
- });
831
- } else {
789
+ if (!bindUser) {
832
790
  bindUser = {
833
791
  ...oauthUser,
834
792
  // 发送 passport 的对象要设置为 wallet-did
@@ -839,8 +797,8 @@ module.exports = {
839
797
 
840
798
  await transferPassport(oauthUser, bindUser, { req: request, node, nodeInfo, teamDid });
841
799
 
842
- const connectedAccounts = oauthUser?.extraConfigs?.connectedAccounts || [];
843
- const sourceProvider = oauthUser?.extraConfigs?.sourceProvider;
800
+ const connectedAccounts = oauthUser?.connectedAccounts || [];
801
+ const sourceProvider = oauthUser?.sourceProvider;
844
802
  const oauthAccount = connectedAccounts.find((item) => item.provider === sourceProvider);
845
803
  const userWallet = fromAppDid(oauthAccount.id, blockletWallet.secretKey);
846
804
  await declareAccount({ wallet: userWallet, blocklet });
@@ -1,6 +1,5 @@
1
1
  const path = require('path');
2
2
  const get = require('lodash/get');
3
- const DiskStorage = require('@arcblock/did-auth-storage-nedb');
4
3
  const { toAddress } = require('@ocap/util');
5
4
  const { WalletAuthenticator } = require('@arcblock/did-auth');
6
5
  const getBlockletInfo = require('@blocklet/meta/lib/info');
@@ -8,6 +7,7 @@ const WalletHandlers = require('@blocklet/sdk/lib/wallet-handler');
8
7
  const { getDelegation } = require('@blocklet/sdk/lib/connect/shared');
9
8
  const { sendToUser, sendToRelay } = require('@blocklet/sdk/lib/util/send-notification');
10
9
  const { WELLKNOWN_SERVICE_PATH_PREFIX, NODE_SERVICES_PREFIX } = require('@abtnode/constant');
10
+ const DynamicStorage = require('@abtnode/connect-storage');
11
11
 
12
12
  const cache = require('../../cache');
13
13
  const { appInfo, chainInfo } = require('./shared');
@@ -39,10 +39,7 @@ module.exports = (node, opts) => {
39
39
 
40
40
  const handlerOpts = {
41
41
  authenticator,
42
- tokenStorage: new DiskStorage({
43
- dbPath: path.join(opts.dataDir, 'auth.db'),
44
- dbPort: process.env.NODE_ENV === 'test' ? null : Number(process.env.NEDB_MULTI_PORT),
45
- }),
42
+ tokenStorage: new DynamicStorage({ dbPath: path.join(opts.dataDir, 'connections.db') }),
46
43
  sendNotificationFn: async (connectedDid, message, { req }) => {
47
44
  const { wallet } = await req.getBlockletInfo();
48
45
  return sendToUser(
@@ -23,8 +23,8 @@ module.exports = (node, opts) => {
23
23
  logger,
24
24
  authenticator,
25
25
  storage: new NedbStorage({
26
+ // FIXME: @wangshijun this does not work anymore
26
27
  dbPath: path.join(opts.dataDir, 'sessions.db'),
27
- dbPort: process.env.NODE_ENV === 'test' ? null : Number(process.env.NEDB_MULTI_PORT),
28
28
  }),
29
29
  socketPathname: `${WELLKNOWN_SERVICE_PATH_PREFIX}/api/connect/relay/websocket`,
30
30
  sendNotificationFn: async (connectedDid, message, { request }) => {
package/api/libs/jwt.js CHANGED
@@ -1,11 +1,9 @@
1
1
  /* eslint-disable no-underscore-dangle */
2
2
  const jwt = require('jsonwebtoken');
3
3
  const { createAuthToken } = require('@abtnode/auth/lib/auth');
4
- const { isUserPassportRevoked } = require('@abtnode/auth/lib/passport');
5
4
 
6
- // FIXME: we need to test performance for this code
7
5
  const getUser = async (node, teamDid, userDid) => {
8
- const user = await node.getUser({ teamDid, user: { did: userDid } });
6
+ const user = await node.getUserByDid({ teamDid, userDid });
9
7
  if (user && user.approved) {
10
8
  return user;
11
9
  }
@@ -44,8 +42,11 @@ const initJwt = (node, options) => {
44
42
  return reject(new Error('Invalid jwt token: invalid user'));
45
43
  }
46
44
 
47
- if (passport && passport.id && isUserPassportRevoked(user, passport)) {
48
- return reject(new Error(`Passport ${passport.name} has been revoked`));
45
+ if (passport && passport.id) {
46
+ const valid = await node.isPassportValid({ teamDid, passportId: passport.id });
47
+ if (valid === false) {
48
+ return reject(new Error(`Passport ${passport.name} has been revoked`));
49
+ }
49
50
  }
50
51
 
51
52
  user.role = role;
@@ -7,7 +7,7 @@ const JWT = require('@arcblock/jwt');
7
7
  const handleInstanceInStore = require('@abtnode/core/lib/util/public-to-store');
8
8
 
9
9
  const formatContext = require('@abtnode/util/lib/format-context');
10
- const { parseUserAvatar, getAvatarFile } = require('@abtnode/util/lib/user-avatar');
10
+ const { parseUserAvatar, getAvatarFile } = require('@abtnode/util/lib/user');
11
11
  const {
12
12
  attachSendLogoContext,
13
13
  ensureBlockletExist,
@@ -1,7 +1,7 @@
1
1
  const { handleInvitationReceive, getApplicationInfo } = require('@abtnode/auth/lib/auth');
2
2
  const { upsertToPassports, createPassportSvg } = require('@abtnode/auth/lib/passport');
3
3
  const { WELLKNOWN_SERVICE_PATH_PREFIX, NODE_SERVICES, PASSPORT_STATUS } = require('@abtnode/constant');
4
- const { parseUserAvatar, extractUserAvatar } = require('@abtnode/util/lib/user-avatar');
4
+ const { parseUserAvatar, extractUserAvatar } = require('@abtnode/util/lib/user');
5
5
  const { fromAppDid } = require('@arcblock/did-ext');
6
6
  const { getBlockletAppIdList } = require('@blocklet/meta/lib/util');
7
7
  const get = require('lodash/get');
@@ -20,7 +20,6 @@ const { getAvatarByEmail, transferPassport, getAvatarByUrl } = require('../libs/
20
20
  const initJwt = require('../libs/jwt');
21
21
  const { sendToUser } = require('../libs/notification');
22
22
  const { generateTranslate } = require('../libs/translate');
23
- const { mergeUserData, migrateAccount, declareAccount } = require('../services/oauth');
24
23
  const { isInvitedUserOnly } = require('../util');
25
24
  const { ApiError } = require('../util/error');
26
25
 
@@ -85,8 +84,6 @@ async function login(req, node, options) {
85
84
  },
86
85
  options: {
87
86
  enableConnectedAccount: true,
88
- enableNormalize: true,
89
- blockletSk: blockletWallet.secretKey,
90
87
  },
91
88
  });
92
89
  let doc;
@@ -183,8 +180,6 @@ async function invite(req, node, options) {
183
180
  },
184
181
  options: {
185
182
  enableConnectedAccount: true,
186
- enableNormalize: true,
187
- blockletSk: blockletWallet.secretKey,
188
183
  },
189
184
  });
190
185
  const { dataDir, name: applicationName } = await getApplicationInfo({ node, nodeInfo, teamDid });
@@ -293,8 +288,7 @@ async function bind(req, node, options) {
293
288
 
294
289
  // NOTICE: 这里获得的 did 是当前登录用户的永久 did,无需再去查询 connectedAccount
295
290
  const bindUser = await node.getUser({ teamDid, user: { did: userDid } });
296
-
297
- if (bindUser.extraConfigs?.sourceProvider !== 'wallet') {
291
+ if (bindUser.sourceProvider !== 'wallet') {
298
292
  throw new ApiError(400, t('oauthCantBindOauth', locale));
299
293
  }
300
294
 
@@ -330,38 +324,16 @@ async function bind(req, node, options) {
330
324
  await node.updateUser({
331
325
  teamDid,
332
326
  user: {
327
+ did: bindUser.did,
328
+ pk: bindUser.pk,
333
329
  ...mergeProfile,
334
- ...mergeUserData(
335
- {
336
- did: bindUser.did,
337
- pk: bindUser.pk,
338
- passports: mergePassport,
339
- extraConfigs: bindUser.extraConfigs,
340
- },
341
- {
342
- locale,
343
- connectedAccount,
344
- }
345
- ),
330
+ passports: mergePassport,
331
+ locale,
332
+ connectedAccounts: [connectedAccount],
346
333
  },
347
334
  });
348
- if (oauthUser) {
349
- // NOTICE: 这种情况已经不存在了,目前只有当 oauthUser 不存在时,才能进行 connect 操作(将来可能放开这个限制) 2023-05-03
350
- // 将 oauth 绑定的 did 记录在 oauth 用户的表中
351
- await node.updateUser({
352
- teamDid,
353
- user: {
354
- did: userWallet.address,
355
- pk: userWallet.publicKey,
356
- extraConfigs: {
357
- ...(oauthUser.extraConfigs || {}),
358
- bindDid: bindUser.did,
359
- },
360
- },
361
- });
362
- await declareAccount({ wallet: userWallet, blocklet });
363
- await migrateAccount({ wallet: userWallet, blocklet, user: bindUser });
364
- } else {
335
+
336
+ if (!oauthUser) {
365
337
  oauthUser = {
366
338
  did: userWallet.address,
367
339
  pk: userWallet.publicKey,
@@ -453,7 +425,7 @@ module.exports = {
453
425
  await node.createAuditLog(
454
426
  {
455
427
  action: 'switchPassport',
456
- args: { teamDid, userDid, passport, provider: user?.extraConfigs?.sourceProvider },
428
+ args: { teamDid, userDid, passport, provider: user?.sourceProvider },
457
429
  context: formatContext(Object.assign(req, { user })),
458
430
  result: user,
459
431
  },
@@ -1,7 +1,7 @@
1
1
  const { NODE_SERVICES, WELLKNOWN_SERVICE_PATH_PREFIX } = require('@abtnode/constant');
2
2
  const { getApplicationInfo } = require('@abtnode/auth/lib/auth');
3
3
  const { fromAppDid } = require('@arcblock/did-ext');
4
- const { extractUserAvatar } = require('@abtnode/util/lib/user-avatar');
4
+ const { extractUserAvatar } = require('@abtnode/util/lib/user');
5
5
  const formatContext = require('@abtnode/util/lib/format-context');
6
6
  const logger = require('@abtnode/logger')('blocklet-services:user');
7
7
 
@@ -6,7 +6,7 @@ const { getKeyPairClaim, getAuthPrincipalForTransferAppOwnerShip } = require('@a
6
6
  const sleep = require('@abtnode/util/lib/sleep');
7
7
  const { getChainClient } = require('@abtnode/util/lib/get-chain-client');
8
8
  const formatContext = require('@abtnode/util/lib/format-context');
9
- const { extractUserAvatar } = require('@abtnode/util/lib/user-avatar');
9
+ const { extractUserAvatar } = require('@abtnode/util/lib/user');
10
10
  const { ensureAccountOnMainChain } = require('@abtnode/util/lib/ensure-account-on-main-chain');
11
11
  const {
12
12
  createPassport,
@@ -19,8 +19,6 @@ const { getBlockletChainInfo, isInProgress } = require('@blocklet/meta/lib/util'
19
19
  const { ROLES } = require('@abtnode/constant');
20
20
  const logger = require('@abtnode/logger')('blocklet-service:transfer-blocklet-owner');
21
21
 
22
- const { mergeUserData } = require('../../oauth');
23
-
24
22
  const migrateAppOnChain = async (blocklet, oldSk, newSk) => {
25
23
  if (process.env.NODE_ENV === 'test') {
26
24
  return;
@@ -238,24 +236,18 @@ module.exports = function createRoutes(node, _, createSessionToken) {
238
236
  const user = await getUser(node, appPid, userDid);
239
237
 
240
238
  // update state
241
-
242
239
  await node.updateBlockletOwner({ did: appPid, owner: { did: userDid, pk: userPk } });
243
-
244
- const avatar = await extractUserAvatar(get(profile, 'avatar'), {
245
- dataDir,
246
- });
240
+ const avatar = await extractUserAvatar(get(profile, 'avatar'), { dataDir });
247
241
 
248
242
  if (user) {
249
243
  const doc = await node.updateUser({
250
244
  teamDid: appPid,
251
245
  user: {
252
- ...mergeUserData(user, {
253
- avatar,
254
- locale,
255
- lastLoginIp: get(req, 'headers[x-real-ip]') || '',
256
- lastUsedPassport: passport,
257
- connectedAccount: { provider: 'wallet', did: userDid },
258
- }),
246
+ did: user.did,
247
+ locale,
248
+ lastLoginIp: get(req, 'headers[x-real-ip]') || '',
249
+ passports: [passport],
250
+ connectedAccounts: [{ provider: 'wallet', did: userDid, pk: userPk }],
259
251
  ...profile,
260
252
  avatar,
261
253
  },
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable arrow-parens */
2
2
  const get = require('lodash/get');
3
3
  const { messages } = require('@abtnode/auth/lib/auth');
4
- const { extractUserAvatar } = require('@abtnode/util/lib/user-avatar');
4
+ const { extractUserAvatar } = require('@abtnode/util/lib/user');
5
5
  const formatContext = require('@abtnode/util/lib/format-context');
6
6
  const verifySignature = require('@abtnode/auth/lib/util/verify-signature');
7
7
 
@@ -68,6 +68,7 @@ module.exports = function createRoutes(node, _authenticator, createSessionToken)
68
68
  locale,
69
69
  lastLoginAt: new Date().toISOString(),
70
70
  lastLoginIp: get(req, 'headers[x-real-ip]') || '',
71
+ // FIXME: @linchen this temporary field should not be recorded in user state
71
72
  extra: {
72
73
  baseUrl,
73
74
  },
@@ -15,12 +15,13 @@ module.exports = {
15
15
  return;
16
16
  }
17
17
 
18
- const user = { ...req.user };
19
- if (user.role) {
20
- const teamDid = req.getBlockletDid();
18
+ const teamDid = req.getBlockletDid();
19
+ const user = await node.getUser({ teamDid, user: { did: req.user.did } });
20
+ if (req.user.role) {
21
21
  // FIXME: this code may have performance issue
22
22
  const rbac = await node.getRBAC(teamDid);
23
23
  user.permissions = await rbac.getScope(req.user.role);
24
+ user.role = req.user.role;
24
25
  }
25
26
 
26
27
  const encKey = '_ek_';