yakuza0 2.20.13 → 2.20.15-beta.1
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/nuxt/head.js +60 -0
- package/nuxt/render/csp.js +30 -16
- package/package.json +2 -1
- package/server/proxy/csrf.js +19 -10
- package/utils/csp.js +38 -0
- package/utils/inclusive.js +2 -0
package/nuxt/head.js
CHANGED
|
@@ -28,6 +28,14 @@ var _config2 = _interopRequireDefault(_config);
|
|
|
28
28
|
|
|
29
29
|
var _yakuza = require("yakuza1");
|
|
30
30
|
|
|
31
|
+
var _syncRequest = require("sync-request");
|
|
32
|
+
|
|
33
|
+
var _syncRequest2 = _interopRequireDefault(_syncRequest);
|
|
34
|
+
|
|
35
|
+
var _crypto = require("crypto");
|
|
36
|
+
|
|
37
|
+
var _csp = require("../utils/csp");
|
|
38
|
+
|
|
31
39
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
32
40
|
|
|
33
41
|
exports.default = function (config) {
|
|
@@ -51,6 +59,14 @@ exports.default = function (config) {
|
|
|
51
59
|
var basePath = _yakuza._.bothAddFix(config.appConf.server.basePath, "/");
|
|
52
60
|
|
|
53
61
|
_yakuza._.forEach(head, function (v, key) {
|
|
62
|
+
// switch (key) {
|
|
63
|
+
// case "script":
|
|
64
|
+
// case "style":
|
|
65
|
+
//
|
|
66
|
+
// break;
|
|
67
|
+
// default:
|
|
68
|
+
// }
|
|
69
|
+
|
|
54
70
|
if ((typeof v === "undefined" ? "undefined" : (0, _typeof3.default)(v)) === 'object') {
|
|
55
71
|
v = _yakuza._.map(v, function (gv) {
|
|
56
72
|
if (_yakuza._.startsWith(gv.src, '/')) {
|
|
@@ -59,6 +75,29 @@ exports.default = function (config) {
|
|
|
59
75
|
if (_yakuza._.startsWith(gv.href, '/')) {
|
|
60
76
|
gv.href = basePath + _yakuza._.trimStart(gv.href, "/");
|
|
61
77
|
}
|
|
78
|
+
|
|
79
|
+
var iUrl = gv.src || gv.href;
|
|
80
|
+
if ((_config2.default.security.isStupid || _config2.default.server.sriSwitch) && iUrl && _yakuza._.startsWith(iUrl, 'http')) {
|
|
81
|
+
try {
|
|
82
|
+
if (!gv.integrity) {
|
|
83
|
+
var res = (0, _syncRequest2.default)('GET', iUrl, {
|
|
84
|
+
timeout: parseInt(_config2.default.server.sriTimeout, 10) || 5000,
|
|
85
|
+
headers: {
|
|
86
|
+
"Host": (0, _yakuza.jsUrl)('hostname', iUrl),
|
|
87
|
+
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36"
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
var iBody = res.getBody('utf8');
|
|
91
|
+
var hash = (0, _crypto.createHash)('sha384').update(iBody).digest('base64');
|
|
92
|
+
gv.integrity = "sha384-" + hash;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (gv.integrity) {
|
|
96
|
+
gv.crossorigin = "anonymous";
|
|
97
|
+
}
|
|
98
|
+
} catch (e) {}
|
|
99
|
+
}
|
|
100
|
+
|
|
62
101
|
return gv;
|
|
63
102
|
});
|
|
64
103
|
}
|
|
@@ -66,6 +105,27 @@ exports.default = function (config) {
|
|
|
66
105
|
head[key] = v;
|
|
67
106
|
});
|
|
68
107
|
|
|
108
|
+
if (_config2.default.server.cspSwitch && _config2.default.security.isStupid) {
|
|
109
|
+
var cspObj = (0, _csp.directives)();
|
|
110
|
+
var cspStr = '';
|
|
111
|
+
_yakuza._.forEach(cspObj, function (v, key) {
|
|
112
|
+
cspStr += key + " " + v.join(' ') + '; ';
|
|
113
|
+
});
|
|
114
|
+
cspStr = cspStr.substring(0, cspStr.length - 2);
|
|
115
|
+
|
|
116
|
+
var metaObj = {
|
|
117
|
+
'http-equiv': 'Content-Security-Policy',
|
|
118
|
+
content: cspStr
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
console.log(head['meta'], (0, _typeof3.default)(head['meta']));
|
|
122
|
+
if ((0, _typeof3.default)(head['meta']) === 'object') {
|
|
123
|
+
head['meta'].push(metaObj);
|
|
124
|
+
} else {
|
|
125
|
+
head['meta'] = [metaObj];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
69
129
|
return head;
|
|
70
130
|
};
|
|
71
131
|
|
package/nuxt/render/csp.js
CHANGED
|
@@ -10,29 +10,43 @@ var _config2 = _interopRequireDefault(_config);
|
|
|
10
10
|
|
|
11
11
|
var _yakuza = require('yakuza1');
|
|
12
12
|
|
|
13
|
+
var _csp = require('../../utils/csp');
|
|
14
|
+
|
|
13
15
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
14
16
|
|
|
15
17
|
exports.default = function (config) {
|
|
16
|
-
var csp = _config2.default.server.csp;
|
|
17
18
|
var cspSwitch = _config2.default.server.cspSwitch;
|
|
19
|
+
var cspObj = (0, _csp.directives)();
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
cspObj[_yakuza._.kebabCase(key)] = _yakuza._.compact(v.map(function (k) {
|
|
22
|
-
if (_config2.default.security.stupid && _config2.default.server.cspStrict) {
|
|
23
|
-
if (k === "*" || k === "data:" || k === "'unsafe-eval'" || k === "'unsafe-inline'") {
|
|
24
|
-
return '';
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return k;
|
|
29
|
-
}));
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
if (!_config2.default.security.stupid) {
|
|
33
|
-
cspObj = _yakuza._.omit(cspObj, ['require-sri-for']);
|
|
21
|
+
if (_config2.default.security.stupid) {
|
|
22
|
+
cspSwitch = false;
|
|
34
23
|
}
|
|
35
24
|
|
|
25
|
+
// const csp = yConf.server.csp;
|
|
26
|
+
//
|
|
27
|
+
// let cspObj = {};
|
|
28
|
+
// _.forEach(csp, (v, key) => {
|
|
29
|
+
// cspObj[_.kebabCase(key)] = _.compact(v.map(k => {
|
|
30
|
+
// if (yConf.server.cspStrict) {
|
|
31
|
+
// if (
|
|
32
|
+
// k === "*"
|
|
33
|
+
// || k.indexOf('*') !== -1
|
|
34
|
+
// || k === "data:"
|
|
35
|
+
// || k === "'unsafe-eval'"
|
|
36
|
+
// || k === "'unsafe-inline'"
|
|
37
|
+
// ) {
|
|
38
|
+
// return '';
|
|
39
|
+
// }
|
|
40
|
+
// }
|
|
41
|
+
//
|
|
42
|
+
// return k
|
|
43
|
+
// }))
|
|
44
|
+
// })
|
|
45
|
+
//
|
|
46
|
+
// if (!yConf.security.stupid) {
|
|
47
|
+
// cspObj = _.omit(cspObj, ['require-sri-for'])
|
|
48
|
+
// }
|
|
49
|
+
|
|
36
50
|
return cspSwitch ? {
|
|
37
51
|
enabled: true,
|
|
38
52
|
policies: cspObj,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yakuza0",
|
|
3
|
-
"version": "2.20.
|
|
3
|
+
"version": "2.20.15-beta.1",
|
|
4
4
|
"description": "yakuza0 with nuxt",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -99,6 +99,7 @@
|
|
|
99
99
|
"stylelint-webpack-plugin": "^3.1.0",
|
|
100
100
|
"stylus": "^0.54.7",
|
|
101
101
|
"stylus-loader": "^3.0.2",
|
|
102
|
+
"sync-request": "^6.1.0",
|
|
102
103
|
"tcp-port-used": "^1.0.1",
|
|
103
104
|
"ua-parser-js": "^0.7.20",
|
|
104
105
|
"v8-compile-cache": "^2.0.2",
|
package/server/proxy/csrf.js
CHANGED
|
@@ -92,15 +92,16 @@ var _httpProxy = require('http-proxy');
|
|
|
92
92
|
|
|
93
93
|
var _httpProxy2 = _interopRequireDefault(_httpProxy);
|
|
94
94
|
|
|
95
|
+
var _csp = require('../../utils/csp');
|
|
96
|
+
|
|
95
97
|
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
|
|
96
98
|
|
|
97
99
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
98
100
|
|
|
99
|
-
// import {
|
|
100
|
-
|
|
101
|
-
// import
|
|
102
|
-
|
|
103
|
-
// import nocache from 'nocache';
|
|
101
|
+
// import {getCache, keys} from "../cache/conf";
|
|
102
|
+
// import csrfPri from "./csrfPri";
|
|
103
|
+
// import csrfPub from "yakuza1/lib/cert/csrfPub";
|
|
104
|
+
// import koaJwt from 'koa-jwt';
|
|
104
105
|
var codeMessage = {
|
|
105
106
|
200: '服务器成功返回请求的数据。',
|
|
106
107
|
201: '新建或修改数据成功。',
|
|
@@ -118,10 +119,13 @@ var codeMessage = {
|
|
|
118
119
|
503: '服务不可用,服务器暂时过载或维护。',
|
|
119
120
|
504: '网关超时。'
|
|
120
121
|
};
|
|
121
|
-
// import
|
|
122
|
-
|
|
123
|
-
// import
|
|
124
|
-
|
|
122
|
+
// import helmet from 'helmet';
|
|
123
|
+
|
|
124
|
+
// import {symmetry as gs, asymmetric as as} from 'yakuza1/lib/encrypt/general';
|
|
125
|
+
|
|
126
|
+
// import paths from '../../config/paths';
|
|
127
|
+
|
|
128
|
+
// import nocache from 'nocache';
|
|
125
129
|
|
|
126
130
|
|
|
127
131
|
var apiErr = function apiErr(options, ctx) {
|
|
@@ -168,7 +172,7 @@ exports.default = function () {
|
|
|
168
172
|
var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee11(_ref2) {
|
|
169
173
|
var app = _ref2.app,
|
|
170
174
|
config = _ref2.config;
|
|
171
|
-
var cspConnectSrcVerify, appCp, appCpApiV1, jwtVerC, omConf, cm;
|
|
175
|
+
var cspConnectSrcVerify, appCp, appCpApiV1, jwtVerC, omConf, cm, cspObj;
|
|
172
176
|
return _regenerator2.default.wrap(function _callee11$(_context11) {
|
|
173
177
|
while (1) {
|
|
174
178
|
switch (_context11.prev = _context11.next) {
|
|
@@ -712,6 +716,11 @@ exports.default = function () {
|
|
|
712
716
|
app.use((0, _koaHelmet2.default)());
|
|
713
717
|
|
|
714
718
|
if (_config2.default.security.stupid) {
|
|
719
|
+
cspObj = (0, _csp.directives)();
|
|
720
|
+
|
|
721
|
+
app.use(_koaHelmet2.default.contentSecurityPolicy({
|
|
722
|
+
directives: cspObj
|
|
723
|
+
}));
|
|
715
724
|
appCpApiV1(function () {
|
|
716
725
|
var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee8(ctx, next) {
|
|
717
726
|
var isNext, rHost, rOrigin, rReferer;
|
package/utils/csp.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.directives = undefined;
|
|
7
|
+
|
|
8
|
+
var _yakuza = require("yakuza1");
|
|
9
|
+
|
|
10
|
+
var _config = require("../config");
|
|
11
|
+
|
|
12
|
+
var _config2 = _interopRequireDefault(_config);
|
|
13
|
+
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
|
|
16
|
+
var directives = exports.directives = function directives() {
|
|
17
|
+
var csp = _config2.default.server.csp;
|
|
18
|
+
// const cspSwitch = yConf.server.cspSwitch;
|
|
19
|
+
|
|
20
|
+
var cspObj = {};
|
|
21
|
+
_yakuza._.forEach(csp, function (v, key) {
|
|
22
|
+
cspObj[_yakuza._.kebabCase(key)] = _yakuza._.compact(v.map(function (k) {
|
|
23
|
+
if (_config2.default.server.cspStrict) {
|
|
24
|
+
if (k === "*" || k.indexOf('*') !== -1 || k === "data:" || k === "'unsafe-eval'" || k === "'unsafe-inline'") {
|
|
25
|
+
return '';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return k;
|
|
30
|
+
}));
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
if (!_config2.default.security.stupid) {
|
|
34
|
+
cspObj = _yakuza._.omit(cspObj, ['require-sri-for']);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return cspObj;
|
|
38
|
+
};
|