@abtnode/blocklet-services 1.16.8-beta-186fd5aa → 1.16.8-next-d1e52353
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/api/index.js +2 -2
- package/api/libs/auth/utils.js +1 -1
- package/api/libs/connect/session.js +23 -65
- package/api/libs/connect/v1.js +2 -5
- package/api/libs/connect/v2.js +1 -1
- package/api/routes/blocklet.js +1 -1
- package/api/routes/oauth.js +10 -38
- package/api/routes/user.js +1 -1
- package/api/services/auth/connect/receive-transfer-app-owner.js +7 -15
- package/api/services/auth/connect/setup.js +2 -1
- package/api/services/oauth/index.js +0 -156
- package/api/socket/channel/did.js +1 -1
- package/api/state/index.js +14 -5
- package/api/state/message.js +3 -16
- package/build/asset-manifest.json +10 -10
- package/build/index.html +1 -1
- package/build/static/css/{290.07ab3f1e.chunk.css → 59.f0957009.chunk.css} +1 -1
- package/build/static/js/343.f1104d63.chunk.js +2 -0
- package/build/static/js/59.c408028b.chunk.js +3 -0
- package/build/static/js/main.2fbec507.js +3 -0
- package/build/static/js/{main.94c49b7d.js.LICENSE.txt → main.2fbec507.js.LICENSE.txt} +3 -3
- package/build/static/media/iconify.212917dd32288c600255.cjs +2 -0
- package/package.json +18 -19
- package/build/static/js/290.8692063d.chunk.js +0 -3
- package/build/static/js/343.6fc2089d.chunk.js +0 -2
- package/build/static/js/main.94c49b7d.js +0 -3
- package/build/static/media/iconify.26e4076719101e021ba0.cjs +0 -2
- /package/build/static/js/{290.8692063d.chunk.js.LICENSE.txt → 59.c408028b.chunk.js.LICENSE.txt} +0 -0
- /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
|
|
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
|
-
|
|
85
|
+
states.init(options.dataDir);
|
|
86
86
|
|
|
87
87
|
const { middlewares: authMiddlewares, routes: authRoutes, ensureWsUser } = initAuth({ node, options });
|
|
88
88
|
const notificationService = initNotification({ node });
|
package/api/libs/auth/utils.js
CHANGED
|
@@ -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
|
|
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
|
|
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 {
|
|
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) {
|
|
@@ -437,7 +427,7 @@ module.exports = {
|
|
|
437
427
|
throw new Error(messages.actionForbidden[locale]);
|
|
438
428
|
}
|
|
439
429
|
|
|
440
|
-
const { did: teamDid
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
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.
|
|
705
|
-
const sourceProvider = oauthUser.
|
|
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.
|
|
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:
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
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?.
|
|
843
|
-
const sourceProvider = oauthUser?.
|
|
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 });
|
package/api/libs/connect/v1.js
CHANGED
|
@@ -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
|
|
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(
|
package/api/libs/connect/v2.js
CHANGED
|
@@ -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/routes/blocklet.js
CHANGED
|
@@ -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
|
|
10
|
+
const { parseUserAvatar, getAvatarFile } = require('@abtnode/util/lib/user');
|
|
11
11
|
const {
|
|
12
12
|
attachSendLogoContext,
|
|
13
13
|
ensureBlockletExist,
|
package/api/routes/oauth.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
335
|
-
|
|
336
|
-
|
|
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
|
-
|
|
349
|
-
|
|
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?.
|
|
428
|
+
args: { teamDid, userDid, passport, provider: user?.sourceProvider },
|
|
457
429
|
context: formatContext(Object.assign(req, { user })),
|
|
458
430
|
result: user,
|
|
459
431
|
},
|
package/api/routes/user.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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
|
|
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
|
},
|
|
@@ -1,62 +1,10 @@
|
|
|
1
|
-
const { upsertToPassports } = require('@abtnode/auth/lib/passport');
|
|
2
1
|
const { getChainClient } = require('@abtnode/util/lib/get-chain-client');
|
|
3
|
-
const cloneDeep = require('lodash/cloneDeep');
|
|
4
2
|
const { default: urlFriendly } = require('@blocklet/meta/lib/url-friendly');
|
|
5
3
|
const { slugify } = require('transliteration');
|
|
6
4
|
const { MAIN_CHAIN_ENDPOINT } = require('@abtnode/constant');
|
|
7
5
|
const { getBlockletChainInfo } = require('@blocklet/meta/lib/util');
|
|
8
|
-
const { fromAppDid } = require('@arcblock/did-ext');
|
|
9
6
|
const logger = require('@abtnode/logger')('blocklet-services:oauth');
|
|
10
7
|
|
|
11
|
-
function mergeUserData(oldUser, updateData) {
|
|
12
|
-
const now = new Date().toISOString();
|
|
13
|
-
const { extraConfigs = {} } = oldUser || {};
|
|
14
|
-
const newUser = {
|
|
15
|
-
did: oldUser.did,
|
|
16
|
-
pk: oldUser.pk,
|
|
17
|
-
passports: upsertToPassports(
|
|
18
|
-
oldUser.passports || [],
|
|
19
|
-
updateData.lastUsedPassport && {
|
|
20
|
-
...updateData.lastUsedPassport,
|
|
21
|
-
lastLoginAt: now,
|
|
22
|
-
}
|
|
23
|
-
),
|
|
24
|
-
extraConfigs: {
|
|
25
|
-
...extraConfigs,
|
|
26
|
-
connectedAccounts: updateConnectedAccount(extraConfigs.connectedAccounts || [], updateData.connectedAccount),
|
|
27
|
-
},
|
|
28
|
-
lastLoginAt: now,
|
|
29
|
-
};
|
|
30
|
-
if (updateData.lastLoginIp) {
|
|
31
|
-
newUser.lastLoginIp = updateData.lastLoginIp;
|
|
32
|
-
}
|
|
33
|
-
if (updateData.locale) {
|
|
34
|
-
newUser.locale = updateData.locale;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return newUser;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function updateConnectedAccount(connectedAccounts = [], connectedAccount = {}) {
|
|
41
|
-
const now = new Date().toISOString();
|
|
42
|
-
const updated = cloneDeep(connectedAccounts);
|
|
43
|
-
const updates = Array.isArray(connectedAccount) ? connectedAccount : [connectedAccount];
|
|
44
|
-
updates.forEach((x) => {
|
|
45
|
-
const findAccountIndex = updated.findIndex((item) => item.provider === x.provider && item.did === x.did);
|
|
46
|
-
if (findAccountIndex > -1) {
|
|
47
|
-
updated[findAccountIndex] = {
|
|
48
|
-
...connectedAccounts[findAccountIndex],
|
|
49
|
-
...x,
|
|
50
|
-
lastLoginAt: now,
|
|
51
|
-
};
|
|
52
|
-
} else {
|
|
53
|
-
updated.push(x);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
return updated;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
8
|
async function declareAccountByChain({ chainHost, wallet, moniker }) {
|
|
61
9
|
const chainClient = getChainClient(chainHost);
|
|
62
10
|
const { address } = wallet;
|
|
@@ -129,111 +77,7 @@ async function migrateAccount({ wallet, blocklet, user }) {
|
|
|
129
77
|
await Promise.all(waitingList);
|
|
130
78
|
}
|
|
131
79
|
|
|
132
|
-
/**
|
|
133
|
-
* user 版本标准化,统一将 user 转换为最新的结构,结构参考 core/state/lib/states/user.js L12-L75
|
|
134
|
-
*/
|
|
135
|
-
// 1: 没有 extraConfigs 字段
|
|
136
|
-
// 2: 有 source 和 extraConfigs 字段,oauth 账号的 extraConfigs 中包含 sourceId 和 sourceProvider 字段
|
|
137
|
-
// 3: 只有 extraConfigs 字段,且 extraConfigs.connectedAccounts 中包含 extraConfigs.sourceProvider 的 account
|
|
138
|
-
async function normalizeUser(teamDid, user, { updateUser, getBlockletInfo }) {
|
|
139
|
-
if (!teamDid || !user) {
|
|
140
|
-
return user;
|
|
141
|
-
}
|
|
142
|
-
let version = 1;
|
|
143
|
-
if (user.extraConfigs) {
|
|
144
|
-
version = 2;
|
|
145
|
-
|
|
146
|
-
const connectedAccounts = user.extraConfigs?.connectedAccounts || [];
|
|
147
|
-
const sourceProvider = user.extraConfigs?.sourceProvider || '';
|
|
148
|
-
if (connectedAccounts.some((item) => item.provider === sourceProvider)) {
|
|
149
|
-
version = 3;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
const versionMap = {
|
|
154
|
-
1: async () => {
|
|
155
|
-
const connectedAccounts = [
|
|
156
|
-
{
|
|
157
|
-
provider: 'wallet',
|
|
158
|
-
did: user.did,
|
|
159
|
-
pk: user.pk,
|
|
160
|
-
firstLoginAt: user.firstLoginAt,
|
|
161
|
-
lastLoginAt: user.lastLoginAt,
|
|
162
|
-
},
|
|
163
|
-
];
|
|
164
|
-
const sourceProvider = 'wallet';
|
|
165
|
-
const updatedUser = await updateUser({
|
|
166
|
-
teamDid,
|
|
167
|
-
user: {
|
|
168
|
-
did: user.did,
|
|
169
|
-
pk: user.pk,
|
|
170
|
-
extraConfigs: {
|
|
171
|
-
sourceProvider,
|
|
172
|
-
connectedAccounts,
|
|
173
|
-
},
|
|
174
|
-
},
|
|
175
|
-
});
|
|
176
|
-
return updatedUser;
|
|
177
|
-
},
|
|
178
|
-
2: async () => {
|
|
179
|
-
// eslint-disable-next-line prefer-const
|
|
180
|
-
let { sourceId, sourceProvider, connectedAccounts = [] } = user.extraConfigs || {};
|
|
181
|
-
if (sourceId && sourceProvider) {
|
|
182
|
-
connectedAccounts = [
|
|
183
|
-
{
|
|
184
|
-
provider: sourceProvider,
|
|
185
|
-
id: sourceId,
|
|
186
|
-
did: user.did,
|
|
187
|
-
pk: user.pk,
|
|
188
|
-
firstLoginAt: user.firstLoginAt,
|
|
189
|
-
lastLoginAt: user.lastLoginAt,
|
|
190
|
-
},
|
|
191
|
-
];
|
|
192
|
-
} else {
|
|
193
|
-
sourceProvider = 'wallet';
|
|
194
|
-
const { wallet: blockletWallet } = await getBlockletInfo();
|
|
195
|
-
connectedAccounts.forEach((account) => {
|
|
196
|
-
if (account.id) {
|
|
197
|
-
const accountWallet = fromAppDid(account.id, blockletWallet.secretKey);
|
|
198
|
-
account.did = accountWallet.address;
|
|
199
|
-
account.pk = accountWallet.publicKey;
|
|
200
|
-
account.firstLoginAt = account.firstLoginAt || new Date().toISOString();
|
|
201
|
-
account.lastLoginAt = account.lastLoginAt || new Date().toISOString();
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
connectedAccounts.unshift({
|
|
205
|
-
provider: 'wallet',
|
|
206
|
-
did: user.did,
|
|
207
|
-
pk: user.pk,
|
|
208
|
-
firstLoginAt: user.firstLoginAt,
|
|
209
|
-
lastLoginAt: user.lastLoginAt,
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
const updatedUser = await updateUser({
|
|
213
|
-
teamDid,
|
|
214
|
-
user: {
|
|
215
|
-
did: user.did,
|
|
216
|
-
pk: user.pk,
|
|
217
|
-
extraConfigs: {
|
|
218
|
-
sourceProvider,
|
|
219
|
-
connectedAccounts,
|
|
220
|
-
},
|
|
221
|
-
source: undefined,
|
|
222
|
-
},
|
|
223
|
-
});
|
|
224
|
-
return updatedUser;
|
|
225
|
-
},
|
|
226
|
-
3: () => {
|
|
227
|
-
return user;
|
|
228
|
-
},
|
|
229
|
-
};
|
|
230
|
-
return versionMap[version]();
|
|
231
|
-
}
|
|
232
|
-
|
|
233
80
|
module.exports = {
|
|
234
|
-
updateConnectedAccount,
|
|
235
|
-
mergeUserData,
|
|
236
81
|
declareAccount,
|
|
237
82
|
migrateAccount,
|
|
238
|
-
normalizeUser,
|
|
239
83
|
};
|
|
@@ -113,7 +113,7 @@ const sendCachedMessages = async (wsServer, did) => {
|
|
|
113
113
|
wsServer.broadcast(channel, event, data);
|
|
114
114
|
});
|
|
115
115
|
|
|
116
|
-
await states.message.remove({ did }
|
|
116
|
+
await states.message.remove({ did });
|
|
117
117
|
} catch (error) {
|
|
118
118
|
logger.error('Error on sending cached messages', { error });
|
|
119
119
|
}
|