@abtnode/blocklet-services 1.8.69-beta-76f8a46f → 1.16.0-beta-b16cb035

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/README.md CHANGED
@@ -93,6 +93,7 @@ node.onReady(() => {
93
93
  - /api/did/issue-passport
94
94
  - /api/did/lost-passport-list
95
95
  - /api/did/lost-passport-issue
96
+ - /api/did/pre-setup
96
97
  - /api/did/setup
97
98
  - /api/did/switch-profile
98
99
  - /api/did/switch-passport
@@ -6,7 +6,7 @@ const pick = require('lodash/pick');
6
6
  const md5 = require('@abtnode/util/lib/md5');
7
7
  const { AUTH_CERT_TYPE } = require('@abtnode/constant');
8
8
 
9
- const cacheKey = (userDid, appDid) => md5(`${userDid}:${appDid}`);
9
+ const cacheKey = (userDid, appPid) => md5(`${userDid}:${appPid}`);
10
10
 
11
11
  const proxyToDaemon = ({ proxy, pathname, sessionSecret }) => {
12
12
  const cache = new LRU({
@@ -39,6 +39,8 @@ const proxyToDaemon = ({ proxy, pathname, sessionSecret }) => {
39
39
 
40
40
  return async (req, res) => {
41
41
  req.url = `${pathname}?${qs.stringify(req.query)}`;
42
+ // did returned ty req.getBlockletDid() is blocklet.meta.did
43
+ // the blocklet.meta.did is always the same as appPid in structV2 application
42
44
  const did = req.getBlockletDid();
43
45
  const token = getToken(did, pick(req.user, ['did', 'role']));
44
46
 
@@ -0,0 +1,24 @@
1
+ const pick = require('lodash/pick');
2
+ const { getSetupBlockletClaims } = require('@abtnode/auth/lib/server');
3
+ const verifySignature = require('@abtnode/auth/lib/util/verify-signature');
4
+
5
+ const logger = require('@abtnode/logger')(require('../../../../package.json').name);
6
+
7
+ module.exports = function createRoutes() {
8
+ return {
9
+ action: 'pre-setup',
10
+ authPrincipal: false,
11
+ claims: getSetupBlockletClaims(),
12
+ onAuth: async ({ claims, userDid, userPk, extraParams: { locale } }) => {
13
+ const claim = claims.find((x) => x.type === 'signature');
14
+ verifySignature(claim, userDid, userPk, locale);
15
+ logger.info('pre-setup.connect.success', { userDid });
16
+ return {
17
+ nextWorkflowData: {
18
+ claim: pick(claim, ['origin', 'sig']),
19
+ pk: userPk,
20
+ },
21
+ };
22
+ },
23
+ };
24
+ };
@@ -1,10 +1,9 @@
1
1
  /* eslint-disable arrow-parens */
2
2
  const get = require('lodash/get');
3
3
  const { messages } = require('@abtnode/auth/lib/auth');
4
- const formatContext = require('@abtnode/util/lib/format-context');
5
- const { getServerAuthMethod } = require('@abtnode/auth/lib/util/get-auth-method');
6
- const { getSetupBlockletClaims, ensureBlockletPermission } = require('@abtnode/auth/lib/server');
7
4
  const { extractUserAvatar } = require('@abtnode/util/lib/user-avatar');
5
+ const formatContext = require('@abtnode/util/lib/format-context');
6
+ const verifySignature = require('@abtnode/auth/lib/util/verify-signature');
8
7
 
9
8
  const logger = require('@abtnode/logger')(require('../../../../package.json').name);
10
9
 
@@ -31,52 +30,29 @@ const checkOwner = async ({ node, userDid, blocklet }) => {
31
30
  module.exports = function createRoutes(node, _authenticator, createSessionToken) {
32
31
  return {
33
32
  action: 'setup',
34
- onConnect: async ({ req, userDid, extraParams: { launchType } }) => {
35
- const [blocklet, info] = await Promise.all([req.getBlocklet(), req.getNodeInfo()]);
36
-
37
- const claims = {
38
- profile: async ({ extraParams }) => {
39
- const { locale } = extraParams;
33
+ onConnect: async ({ req, userDid, extraParams: { locale } }) => {
34
+ const blocklet = await req.getBlocklet();
35
+ await checkOwner({ node, userDid, blocklet });
40
36
 
41
- return {
42
- fields: ['fullName', 'avatar'],
43
- description: messages.description[locale],
44
- };
37
+ return {
38
+ profile: {
39
+ fields: ['fullName', 'avatar'],
40
+ description: messages.description[locale],
45
41
  },
46
42
  };
47
-
48
- const authMethod = getServerAuthMethod(info, launchType);
49
- const serverClaims = await getSetupBlockletClaims(node, authMethod, blocklet);
50
-
51
- await checkOwner({ node, userDid, blocklet });
52
-
53
- return Object.assign(serverClaims, claims);
54
43
  },
55
44
 
56
- // eslint-disable-next-line consistent-return
57
- onAuth: async ({ claims, userDid, userPk, updateSession, extraParams, req, baseUrl, challenge }) => {
58
- const { locale, launchType, chainHost } = extraParams;
59
- const [blocklet, info] = await Promise.all([req.getBlocklet(), req.getNodeInfo()]);
45
+ onAuth: async ({ claims, userDid, userPk, updateSession, extraParams, req, baseUrl }) => {
46
+ const { locale, previousWorkflowData: proof } = extraParams;
47
+ const blocklet = await req.getBlocklet();
60
48
  const teamDid = blocklet.meta.did;
49
+ const user = await checkOwner({ node, userDid, blocklet });
61
50
 
62
- const authMethod = getServerAuthMethod(info, launchType);
63
- if (authMethod === 'nft' && !chainHost) {
64
- throw new Error(messages.invalidParams[locale]);
51
+ // ensure owner proof form previous workflow
52
+ if (!proof || !proof.claim || !proof.pk) {
53
+ throw new Error('No owner proof found from previous workflow');
65
54
  }
66
-
67
- await ensureBlockletPermission({
68
- authMethod,
69
- node,
70
- userDid,
71
- claims,
72
- challenge,
73
- locale,
74
- blocklet,
75
- isAuth: true,
76
- chainHost,
77
- });
78
-
79
- const user = await checkOwner({ node, userDid, blocklet });
55
+ verifySignature(proof.claim, blocklet.appDid, proof.pk, locale);
80
56
 
81
57
  try {
82
58
  if (user) {
@@ -27,6 +27,7 @@ const createInviteRoutes = require('./connect/invite');
27
27
  const createIssuePassportAuth = require('./connect/issue-passport');
28
28
  const createLostPassportListAuth = require('./connect/lost-passport-list');
29
29
  const createLostPassportIssueAuth = require('./connect/lost-passport-issue');
30
+ const createPreSetupAuth = require('./connect/pre-setup');
30
31
  const createSetupAuth = require('./connect/setup');
31
32
  const createSwitchProfileAuth = require('./connect/switch-profile');
32
33
  const createSwitchPassportAuth = require('./connect/switch-passport');
@@ -168,6 +169,7 @@ const init = ({ node, options }) => {
168
169
  handler.attach(Object.assign({ app }, createIssuePassportAuth(node, authenticator, createSessionToken)));
169
170
  handler.attach(Object.assign({ app }, createLostPassportListAuth(node, authenticator, createSessionToken)));
170
171
  handler.attach(Object.assign({ app }, createLostPassportIssueAuth(node, authenticator, createSessionToken)));
172
+ handler.attach(Object.assign({ app }, createPreSetupAuth(node, authenticator, createSessionToken)));
171
173
  handler.attach(Object.assign({ app }, createSetupAuth(node, authenticator, createSessionToken)));
172
174
  handler.attach(Object.assign({ app }, createSwitchProfileAuth(node, authenticator, createSessionToken)));
173
175
  handler.attach(Object.assign({ app }, createSwitchPassportAuth(node, authenticator, createSessionToken)));
@@ -1,6 +1,6 @@
1
1
  const get = require('lodash/get');
2
2
 
3
- const { CHANNEL_TYPE, parseChannel } = require('@blocklet/meta/lib/channel');
3
+ const { CHANNEL_TYPE, parseChannel, getAppPublicChannel } = require('@blocklet/meta/lib/channel');
4
4
  const { validateNotification } = require('@blocklet/sdk/lib/validators/notification');
5
5
  const { NODE_MODES } = require('@abtnode/constant');
6
6
 
@@ -45,9 +45,6 @@ const sendToAppChannel = async ({
45
45
  if (socketId) {
46
46
  socketFilters.id = socketId;
47
47
  }
48
- if (socketDid) {
49
- socketFilters[`channel.${channel}.authInfo.did`] = socketDid;
50
- }
51
48
 
52
49
  // validate
53
50
 
@@ -57,19 +54,25 @@ const sendToAppChannel = async ({
57
54
 
58
55
  // parse sender
59
56
 
60
- const senderInfo = await ensureSender({ sender, node, nodeInfo });
57
+ const appInfo = await ensureSender({ sender, node, nodeInfo });
61
58
 
62
- if (channelInfo.appDid !== senderInfo.wallet.address) {
59
+ if (![appInfo.wallet.address, appInfo.permanentWallet.address].includes(channelInfo.appDid)) {
63
60
  throw new Error('Cannot sent message to channel of other app');
64
61
  }
65
62
 
66
63
  // parse notification
67
64
 
68
- const notifications = parseNotification(notification, senderInfo);
65
+ const notifications = parseNotification(notification, appInfo);
66
+
67
+ const actualChannel = getAppPublicChannel(appInfo.permanentWallet.address);
68
+
69
+ if (socketDid) {
70
+ socketFilters[`channel.${actualChannel}.authInfo.did`] = socketDid;
71
+ }
69
72
 
70
73
  // send notification
71
74
  notifications.forEach((data) => {
72
- broadcast(wsServer, channel, event, data, { socketFilters });
75
+ broadcast(wsServer, actualChannel, event, data, { socketFilters });
73
76
  });
74
77
  };
75
78
 
@@ -1,22 +1,28 @@
1
- const { CHANNEL_TYPE, parseChannel } = require('@blocklet/meta/lib/channel');
1
+ const { CHANNEL_TYPE, parseChannel, getRelayChannel } = require('@blocklet/meta/lib/channel');
2
2
  const { ensureSender, broadcast, EVENTS } = require('../util');
3
3
 
4
- // Only a blocklet can send message to a relay channel
4
+ // Only an application can send message to a relay channel
5
5
  // But multiple clients can subscribe to the same relay channel
6
6
  const sendToRelay = async ({ sender, channel, event = EVENTS.MESSAGE, data, node, wsServer }) => {
7
- const info = parseChannel(channel);
8
- if (info.type !== CHANNEL_TYPE.RELAY) {
7
+ const channelInfo = parseChannel(channel);
8
+ if (channelInfo.type !== CHANNEL_TYPE.RELAY) {
9
9
  throw new Error('Cannot send message to non-relay channel');
10
10
  }
11
11
 
12
12
  const nodeInfo = await node.getNodeInfo();
13
- const result = await ensureSender({ sender, node, nodeInfo });
14
- if (info.appDid !== result.wallet.address) {
13
+
14
+ // Sender is appDid of application
15
+ const appInfo = await ensureSender({ sender, node, nodeInfo });
16
+
17
+ if (![appInfo.wallet.address, appInfo.permanentWallet.address].includes(channelInfo.appDid)) {
15
18
  throw new Error('Cannot sent message to relay channel of other app');
16
19
  }
17
20
 
18
- const socketFilters = { [`channel.${channel}.authInfo.topic`]: info.topic };
19
- broadcast(wsServer, channel, event, data, { socketFilters });
21
+ const actualChannel = getRelayChannel(appInfo.permanentWallet.address, channelInfo.topic);
22
+
23
+ const socketFilters = { [`channel.${actualChannel}.authInfo.topic`]: channelInfo.topic };
24
+
25
+ broadcast(wsServer, actualChannel, event, data, { socketFilters });
20
26
  };
21
27
 
22
28
  const onAuthenticate = () => {};
@@ -1,7 +1,7 @@
1
1
  const { nanoid } = require('nanoid');
2
2
  const JWT = require('@arcblock/jwt');
3
3
 
4
- const { getTeamInfo } = require('@abtnode/auth/lib/auth');
4
+ const { getApplicationInfo } = require('@abtnode/auth/lib/auth');
5
5
 
6
6
  // eslint-disable-next-line global-require
7
7
  const logger = require('@abtnode/logger')(`${require('../../package.json').name}:socket`);
@@ -24,9 +24,13 @@ const parseNotification = (notification, senderInfo) => {
24
24
  }
25
25
 
26
26
  x.sender = {
27
- did: senderInfo.wallet.address,
28
- pk: senderInfo.wallet.pk,
27
+ // did is permanent did of an application that is used to identify the application by DID Wallet
28
+ did: senderInfo.permanentWallet.address,
29
+ pk: senderInfo.permanentWallet.pk,
29
30
  name: senderInfo.name,
31
+ // actualDid is the did of the application that is used to decrypt the message if needed
32
+ actualDid: senderInfo.wallet.address,
33
+ actualPk: senderInfo.wallet.pk,
30
34
  };
31
35
  });
32
36
 
@@ -44,9 +48,9 @@ const broadcast = (...args) => {
44
48
  };
45
49
 
46
50
  const ensureSender = async ({ sender, node, nodeInfo }) => {
47
- let senderInfo;
51
+ let appInfo;
48
52
  try {
49
- senderInfo = await getTeamInfo({ node, nodeInfo, teamDid: sender.appDid });
53
+ appInfo = await getApplicationInfo({ node, nodeInfo, teamDid: sender.appDid });
50
54
  } catch (err) {
51
55
  if (err.message === 'Blocklet state must be an object') {
52
56
  err.message = `Sender blocklet does not exist: ${sender.appDid}`;
@@ -54,12 +58,12 @@ const ensureSender = async ({ sender, node, nodeInfo }) => {
54
58
  throw err;
55
59
  }
56
60
 
57
- const { wallet } = senderInfo;
61
+ const { wallet } = appInfo;
58
62
  if (!JWT.verify(sender.token, wallet.publicKey)) {
59
- throw new Error(`Invalid authentication token for sender blocklet: ${sender.did}`);
63
+ throw new Error(`Invalid authentication token for sender blocklet: ${sender.appDid}`);
60
64
  }
61
65
 
62
- return senderInfo;
66
+ return appInfo;
63
67
  };
64
68
 
65
69
  const getTokenInfo = (decoded) => ({
@@ -1,24 +1,24 @@
1
1
  {
2
2
  "files": {
3
3
  "main.css": "/.blocklet/proxy/blocklet-service/static/css/main.632501d5.css",
4
- "main.js": "/.blocklet/proxy/blocklet-service/static/js/main.ccf2aa21.js",
4
+ "main.js": "/.blocklet/proxy/blocklet-service/static/js/main.cb6e6a93.js",
5
5
  "static/js/560.4d01281e.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/560.4d01281e.chunk.js",
6
6
  "static/js/255.4b68f586.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/255.4b68f586.chunk.js",
7
7
  "static/js/371.60842581.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/371.60842581.chunk.js",
8
8
  "static/js/737.76692b09.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/737.76692b09.chunk.js",
9
- "static/js/906.8d0bbdde.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/906.8d0bbdde.chunk.js",
9
+ "static/js/906.a980020a.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/906.a980020a.chunk.js",
10
10
  "static/js/868.43103624.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/868.43103624.chunk.js",
11
- "static/js/409.f7b6e2fd.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/409.f7b6e2fd.chunk.js",
11
+ "static/js/409.1dcd48aa.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/409.1dcd48aa.chunk.js",
12
12
  "static/js/682.c64ae291.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/682.c64ae291.chunk.js",
13
13
  "static/js/711.6c22b7c7.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/711.6c22b7c7.chunk.js",
14
14
  "static/js/437.d815f0c0.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/437.d815f0c0.chunk.js",
15
15
  "static/js/690.f9a59613.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/690.f9a59613.chunk.js",
16
- "static/js/313.546141b2.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/313.546141b2.chunk.js",
16
+ "static/js/950.8e1097d2.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/950.8e1097d2.chunk.js",
17
17
  "static/js/712.9667cdcd.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/712.9667cdcd.chunk.js",
18
18
  "static/js/511.1dd226f9.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/511.1dd226f9.chunk.js",
19
19
  "static/js/248.ad6363a4.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/248.ad6363a4.chunk.js",
20
20
  "static/css/503.b2c1f856.chunk.css": "/.blocklet/proxy/blocklet-service/static/css/503.b2c1f856.chunk.css",
21
- "static/js/503.c96d3943.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/503.c96d3943.chunk.js",
21
+ "static/js/503.8399a560.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/503.8399a560.chunk.js",
22
22
  "static/js/203.0c856580.chunk.js": "/.blocklet/proxy/blocklet-service/static/js/203.0c856580.chunk.js",
23
23
  "static/media/ubuntu-mono-all-400-normal.woff": "/.blocklet/proxy/blocklet-service/static/media/ubuntu-mono-all-400-normal.c879328bc62e9c68268f.woff",
24
24
  "static/media/lato-all-400-normal.woff": "/.blocklet/proxy/blocklet-service/static/media/lato-all-400-normal.3dc1eff492ab1f598560.woff",
@@ -42,28 +42,28 @@
42
42
  "router-template-styles/styles.css": "/.blocklet/proxy/blocklet-service/router-template-styles/styles.css",
43
43
  "index.html": "/.blocklet/proxy/blocklet-service/index.html",
44
44
  "main.632501d5.css.map": "/.blocklet/proxy/blocklet-service/static/css/main.632501d5.css.map",
45
- "main.ccf2aa21.js.map": "/.blocklet/proxy/blocklet-service/static/js/main.ccf2aa21.js.map",
45
+ "main.cb6e6a93.js.map": "/.blocklet/proxy/blocklet-service/static/js/main.cb6e6a93.js.map",
46
46
  "560.4d01281e.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/560.4d01281e.chunk.js.map",
47
47
  "255.4b68f586.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/255.4b68f586.chunk.js.map",
48
48
  "371.60842581.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/371.60842581.chunk.js.map",
49
49
  "737.76692b09.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/737.76692b09.chunk.js.map",
50
- "906.8d0bbdde.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/906.8d0bbdde.chunk.js.map",
50
+ "906.a980020a.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/906.a980020a.chunk.js.map",
51
51
  "868.43103624.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/868.43103624.chunk.js.map",
52
- "409.f7b6e2fd.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/409.f7b6e2fd.chunk.js.map",
52
+ "409.1dcd48aa.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/409.1dcd48aa.chunk.js.map",
53
53
  "682.c64ae291.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/682.c64ae291.chunk.js.map",
54
54
  "711.6c22b7c7.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/711.6c22b7c7.chunk.js.map",
55
55
  "437.d815f0c0.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/437.d815f0c0.chunk.js.map",
56
56
  "690.f9a59613.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/690.f9a59613.chunk.js.map",
57
- "313.546141b2.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/313.546141b2.chunk.js.map",
57
+ "950.8e1097d2.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/950.8e1097d2.chunk.js.map",
58
58
  "712.9667cdcd.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/712.9667cdcd.chunk.js.map",
59
59
  "511.1dd226f9.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/511.1dd226f9.chunk.js.map",
60
60
  "248.ad6363a4.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/248.ad6363a4.chunk.js.map",
61
61
  "503.b2c1f856.chunk.css.map": "/.blocklet/proxy/blocklet-service/static/css/503.b2c1f856.chunk.css.map",
62
- "503.c96d3943.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/503.c96d3943.chunk.js.map",
62
+ "503.8399a560.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/503.8399a560.chunk.js.map",
63
63
  "203.0c856580.chunk.js.map": "/.blocklet/proxy/blocklet-service/static/js/203.0c856580.chunk.js.map"
64
64
  },
65
65
  "entrypoints": [
66
66
  "static/css/main.632501d5.css",
67
- "static/js/main.ccf2aa21.js"
67
+ "static/js/main.cb6e6a93.js"
68
68
  ]
69
69
  }
package/build/index.html CHANGED
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"/><meta name="theme-color" content="#000000"/><title>Blocklet Service</title><script src=".well-known/service/api/env"></script><script src="/__blocklet__.js"></script><script defer="defer" src="/.blocklet/proxy/blocklet-service/static/js/main.ccf2aa21.js"></script><link href="/.blocklet/proxy/blocklet-service/static/css/main.632501d5.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=0"/><meta name="theme-color" content="#000000"/><title>Blocklet Service</title><script src=".well-known/service/api/env"></script><script src="/__blocklet__.js"></script><script defer="defer" src="/.blocklet/proxy/blocklet-service/static/js/main.cb6e6a93.js"></script><link href="/.blocklet/proxy/blocklet-service/static/css/main.632501d5.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>