@abtnode/blocklet-services 1.16.45-beta-20250701-122807-92b03aba → 1.16.45-beta-20250702-091552-478bb5e9

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 CHANGED
@@ -25,7 +25,7 @@ const { getAppOgCacheDir } = require('@abtnode/util/lib/blocklet');
25
25
  const { ensureLocale } = require('@abtnode/util/lib/middlewares/ensure-locale');
26
26
  const normalizePathPrefix = require('@abtnode/util/lib/normalize-path-prefix');
27
27
  const createInvite = require('@abtnode/auth/lib/invitation');
28
- const { getStatusFromError } = require('@blocklet/error');
28
+ const { getStatusFromError, formatError } = require('@blocklet/error');
29
29
  const { withQuery, joinURL, withTrailingSlash } = require('ufo');
30
30
  const { createProxyMiddleware, responseInterceptor } = require('http-proxy-middleware');
31
31
  const { findComponentByIdV2, getMountPoints } = require('@blocklet/meta/lib/util');
@@ -514,6 +514,8 @@ module.exports = function createServer(node, serverOptions = {}) {
514
514
 
515
515
  // 该接口不需要经过 security 中间件
516
516
  server.get(`${WELLKNOWN_SERVICE_PATH_PREFIX}/share/shared-bridge.html`, (req, res) => {
517
+ res.set('cross-origin-resource-policy', 'cross-origin');
518
+ res.set('cross-origin-embedder-policy', 'require-corp');
517
519
  if (isProduction) {
518
520
  res.sendFile(path.join(__dirname, '../dist', 'share', 'shared-bridge.html'));
519
521
  } else {
@@ -850,7 +852,7 @@ self.blocklet = {
850
852
  // eslint-disable-next-line no-unused-vars
851
853
  server.use((err, req, res, next) => {
852
854
  logger.error('Something broke', { url: req.url, error: err });
853
- res.status(getStatusFromError(err)).send(`Blocklet Service: Something broke! ${err.message}`);
855
+ res.status(getStatusFromError(err)).send(formatError(err));
854
856
  });
855
857
 
856
858
  // Web socket server
@@ -578,10 +578,6 @@ module.exports = {
578
578
  res.status(200).json({});
579
579
  } catch (err) {
580
580
  logger.error('Failed bind oauth', { error: err });
581
- if (err instanceof CustomError) {
582
- res.status(err.code).send(err.message);
583
- return;
584
- }
585
581
  throw err;
586
582
  }
587
583
  });
@@ -592,10 +588,6 @@ module.exports = {
592
588
  res.status(200).json({});
593
589
  } catch (err) {
594
590
  logger.error('Failed unbind oauth', { error: err });
595
- if (err instanceof CustomError) {
596
- res.status(err.code).send(err.message);
597
- return;
598
- }
599
591
  throw err;
600
592
  }
601
593
  });
@@ -621,10 +613,6 @@ module.exports = {
621
613
  res.send(result);
622
614
  } catch (err) {
623
615
  logger.error('Failed login oauth', { error: err, action });
624
- if (err instanceof CustomError) {
625
- res.status(err.code).send(err.message);
626
- return;
627
- }
628
616
  throw err;
629
617
  }
630
618
  });
@@ -19,6 +19,7 @@ const { Joi } = require('@arcblock/validator');
19
19
  const { getDeviceData } = require('@abtnode/util/lib/device');
20
20
  const cors = require('cors');
21
21
  const getOrigin = require('@abtnode/util/lib/get-origin');
22
+ const { CustomError } = require('@blocklet/error');
22
23
 
23
24
  const logger = require('../libs/logger')('blocklet-services:user-session');
24
25
  const ensureBlocklet = require('../middlewares/ensure-blocklet');
@@ -135,11 +136,16 @@ module.exports = {
135
136
  // eslint-disable-next-line no-unused-vars
136
137
  init(app, node, options) {
137
138
  const ensureCors = cors(async (req, callback) => {
138
- const domains = await getTrustedDomains({ node, req, blocklet: req.blocklet });
139
- if (domains.includes(req.hostname)) {
139
+ const origin = req.get('origin');
140
+ if (!origin) {
140
141
  callback(null, { origin: true });
141
142
  } else {
142
- callback(null, { origin: false });
143
+ const domains = await getTrustedDomains({ node, req, blocklet: req.blocklet });
144
+ if (domains.includes(origin)) {
145
+ callback(null, { origin: true });
146
+ } else {
147
+ callback(new CustomError(403, 'Not allowed by CORS'));
148
+ }
143
149
  }
144
150
  });
145
151
  app.options(`${prefix}/login`, ensureBlocklet({ useCache: true }), ensureCors);
@@ -395,10 +395,15 @@ async function verifyUserSig({ userDid, signature, teamDid, sourceAppPid, userPk
395
395
 
396
396
  const userDidWallet = getWallet(currentUser);
397
397
 
398
+ if (!userDidWallet) {
399
+ logger.error('User did not have wallet', { userDid, sourceAppPid, teamDid });
400
+ throw new CustomError(404, 'User not exist');
401
+ }
402
+
398
403
  // HACK: @zhanghan 钱包传递的签名使用的是 didWallet 账户,但这个账户可能是 原生的 oauth 账户,所以需要找到对应的 did-wallet 账户
399
404
  const valid = await JWT.verify(signature, userDidWallet.pk);
400
405
  if (!valid) {
401
- throw new Error('invalid signature');
406
+ throw new CustomError(401, 'Invalid signature');
402
407
  }
403
408
  return currentUser;
404
409
  }
@@ -738,11 +743,17 @@ const spaceGatewaySchema = Joi.object({
738
743
  module.exports = {
739
744
  init(server, node, options) {
740
745
  const ensureCors = cors(async (req, callback) => {
741
- const domains = await federatedUtil.getTrustedDomains({ node, req, blocklet: req.blocklet });
742
- if (domains.includes(req.hostname)) {
746
+ const origin = req.get('origin');
747
+ if (!origin) {
743
748
  callback(null, { origin: true });
744
749
  } else {
745
- callback(null, { origin: false });
750
+ const { hostname } = new URL(origin);
751
+ const domains = await federatedUtil.getTrustedDomains({ node, req, blocklet: req.blocklet });
752
+ if (domains.includes(hostname)) {
753
+ callback(null, { origin: true });
754
+ } else {
755
+ callback(new CustomError(403, 'Not allowed by CORS'));
756
+ }
746
757
  }
747
758
  });
748
759
 
@@ -753,10 +764,6 @@ module.exports = {
753
764
  res.status(200).json(data);
754
765
  } catch (err) {
755
766
  logger.error('Failed login', { error: err });
756
- if (err instanceof CustomError) {
757
- res.status(err.code).json(err.message);
758
- return;
759
- }
760
767
  throw err;
761
768
  }
762
769
  });
@@ -1197,6 +1204,9 @@ module.exports = {
1197
1204
  res.json({ verified: false, id: undefined });
1198
1205
  }
1199
1206
  });
1207
+ server.get(`${prefixApi}/email/test`, ensureBlocklet(), ensureCors, async (req, res) => {
1208
+ res.json({ success: true });
1209
+ });
1200
1210
  server.post(
1201
1211
  `${prefixApi}/email/login`,
1202
1212
  ensureBlocklet(),
@@ -1210,7 +1220,7 @@ module.exports = {
1210
1220
  };
1211
1221
  if (!actionMap[action]) {
1212
1222
  logger.error('Failed to login by email', { error: 'action not exist', action });
1213
- throw new Error(`action not exist: ${action}`);
1223
+ throw new CustomError(400, `action not exist: ${action}`);
1214
1224
  }
1215
1225
 
1216
1226
  try {
@@ -1218,10 +1228,6 @@ module.exports = {
1218
1228
  res.json(result);
1219
1229
  } catch (err) {
1220
1230
  logger.error('Failed login email', { error: err, action });
1221
- if (err instanceof CustomError) {
1222
- res.status(err.code).send(err.message);
1223
- return;
1224
- }
1225
1231
  throw err;
1226
1232
  }
1227
1233
  }
@@ -2,5 +2,5 @@ const { createBindWalletRoute } = require('@abtnode/auth/lib/bind-wallet');
2
2
 
3
3
  // eslint-disable-next-line no-unused-vars
4
4
  module.exports = function createRoutes(node, authenticator, createSessionToken) {
5
- return createBindWalletRoute({ node });
5
+ return createBindWalletRoute({ node, isService: true });
6
6
  };
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.45-beta-20250701-122807-92b03aba",
6
+ "version": "1.16.45-beta-20250702-091552-478bb5e9",
7
7
  "description": "Provide unified services for every blocklet",
8
8
  "main": "api/index.js",
9
9
  "files": [
@@ -33,18 +33,18 @@
33
33
  "author": "wangshijun <wangshijun2010@gmail.com> (http://github.com/wangshijun)",
34
34
  "license": "Apache-2.0",
35
35
  "dependencies": {
36
- "@abtnode/analytics": "1.16.45-beta-20250701-122807-92b03aba",
37
- "@abtnode/auth": "1.16.45-beta-20250701-122807-92b03aba",
38
- "@abtnode/client": "1.16.45-beta-20250701-122807-92b03aba",
39
- "@abtnode/connect-storage": "1.16.45-beta-20250701-122807-92b03aba",
40
- "@abtnode/constant": "1.16.45-beta-20250701-122807-92b03aba",
41
- "@abtnode/core": "1.16.45-beta-20250701-122807-92b03aba",
42
- "@abtnode/cron": "1.16.45-beta-20250701-122807-92b03aba",
43
- "@abtnode/db-cache": "1.16.45-beta-20250701-122807-92b03aba",
44
- "@abtnode/logger": "1.16.45-beta-20250701-122807-92b03aba",
45
- "@abtnode/models": "1.16.45-beta-20250701-122807-92b03aba",
46
- "@abtnode/router-templates": "1.16.45-beta-20250701-122807-92b03aba",
47
- "@abtnode/util": "1.16.45-beta-20250701-122807-92b03aba",
36
+ "@abtnode/analytics": "1.16.45-beta-20250702-091552-478bb5e9",
37
+ "@abtnode/auth": "1.16.45-beta-20250702-091552-478bb5e9",
38
+ "@abtnode/client": "1.16.45-beta-20250702-091552-478bb5e9",
39
+ "@abtnode/connect-storage": "1.16.45-beta-20250702-091552-478bb5e9",
40
+ "@abtnode/constant": "1.16.45-beta-20250702-091552-478bb5e9",
41
+ "@abtnode/core": "1.16.45-beta-20250702-091552-478bb5e9",
42
+ "@abtnode/cron": "1.16.45-beta-20250702-091552-478bb5e9",
43
+ "@abtnode/db-cache": "1.16.45-beta-20250702-091552-478bb5e9",
44
+ "@abtnode/logger": "1.16.45-beta-20250702-091552-478bb5e9",
45
+ "@abtnode/models": "1.16.45-beta-20250702-091552-478bb5e9",
46
+ "@abtnode/router-templates": "1.16.45-beta-20250702-091552-478bb5e9",
47
+ "@abtnode/util": "1.16.45-beta-20250702-091552-478bb5e9",
48
48
  "@arcblock/did": "1.20.14",
49
49
  "@arcblock/did-auth": "1.20.14",
50
50
  "@arcblock/did-ext": "1.20.14",
@@ -54,19 +54,19 @@
54
54
  "@arcblock/jwt": "1.20.14",
55
55
  "@arcblock/validator": "1.20.14",
56
56
  "@arcblock/ws": "1.20.14",
57
- "@blocklet/constant": "1.16.45-beta-20250701-122807-92b03aba",
57
+ "@blocklet/constant": "1.16.45-beta-20250702-091552-478bb5e9",
58
58
  "@blocklet/dbhub": "^0.2.9",
59
59
  "@blocklet/did-space-js": "^1.0.62",
60
- "@blocklet/env": "1.16.45-beta-20250701-122807-92b03aba",
60
+ "@blocklet/env": "1.16.45-beta-20250702-091552-478bb5e9",
61
61
  "@blocklet/error": "^0.2.5",
62
62
  "@blocklet/form-builder": "^0.1.12",
63
63
  "@blocklet/form-collector": "^0.1.8",
64
- "@blocklet/images": "1.16.45-beta-20250701-122807-92b03aba",
65
- "@blocklet/js-sdk": "1.16.45-beta-20250701-122807-92b03aba",
64
+ "@blocklet/images": "1.16.45-beta-20250702-091552-478bb5e9",
65
+ "@blocklet/js-sdk": "1.16.45-beta-20250702-091552-478bb5e9",
66
66
  "@blocklet/mcp": "^1.10.2",
67
- "@blocklet/meta": "1.16.45-beta-20250701-122807-92b03aba",
68
- "@blocklet/rate-limit": "1.16.45-beta-20250701-122807-92b03aba",
69
- "@blocklet/sdk": "1.16.45-beta-20250701-122807-92b03aba",
67
+ "@blocklet/meta": "1.16.45-beta-20250702-091552-478bb5e9",
68
+ "@blocklet/rate-limit": "1.16.45-beta-20250702-091552-478bb5e9",
69
+ "@blocklet/sdk": "1.16.45-beta-20250702-091552-478bb5e9",
70
70
  "@blocklet/theme": "^2.13.70",
71
71
  "@blocklet/theme-builder": "^0.2.1",
72
72
  "@blocklet/uploader-server": "^0.1.101",
@@ -121,7 +121,7 @@
121
121
  "whatwg-url": "14.0.0"
122
122
  },
123
123
  "devDependencies": {
124
- "@abtnode/ux": "1.16.45-beta-20250701-122807-92b03aba",
124
+ "@abtnode/ux": "1.16.45-beta-20250702-091552-478bb5e9",
125
125
  "@arcblock/bridge": "^2.13.70",
126
126
  "@arcblock/did-connect": "^2.13.70",
127
127
  "@arcblock/icons": "^2.13.70",
@@ -129,7 +129,7 @@
129
129
  "@arcblock/ux": "^2.13.70",
130
130
  "@blocklet/launcher-layout": "^2.13.70",
131
131
  "@blocklet/payment-react": "^1.18.56",
132
- "@blocklet/tracker": "1.16.45-beta-20250701-122807-92b03aba",
132
+ "@blocklet/tracker": "1.16.45-beta-20250702-091552-478bb5e9",
133
133
  "@blocklet/ui-react": "^2.13.70",
134
134
  "@blocklet/uploader": "^0.1.95",
135
135
  "@emotion/react": "^11.11.4",
@@ -207,5 +207,5 @@
207
207
  "url": "https://github.com/ArcBlock/blocklet-server/issues",
208
208
  "email": "shijun@arcblock.io"
209
209
  },
210
- "gitHead": "f4fc6b6a7d37bd24a2e2493fbad46045cbb7ea81"
210
+ "gitHead": "e3e4aa595d448f040bc508565cddecc52056a4df"
211
211
  }