@eggjs/security 5.0.0-beta.20 → 5.0.0-beta.21

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 (113) hide show
  1. package/dist/agent.d.ts +5 -9
  2. package/dist/agent.js +11 -15
  3. package/dist/app/extend/agent.d.ts +4 -9
  4. package/dist/app/extend/agent.js +8 -12
  5. package/dist/app/extend/application.d.ts +8 -4
  6. package/dist/app/extend/application.js +32 -4
  7. package/dist/app/extend/context.d.ts +58 -4
  8. package/dist/app/extend/context.js +244 -4
  9. package/dist/app/extend/helper.d.ts +10 -22
  10. package/dist/app/extend/helper.js +5 -17
  11. package/dist/app/extend/response.d.ts +35 -4
  12. package/dist/app/extend/response.js +83 -5
  13. package/dist/app/middleware/securities.d.ts +4 -8
  14. package/dist/app/middleware/securities.js +52 -49
  15. package/dist/app.d.ts +5 -9
  16. package/dist/app.js +26 -24
  17. package/dist/config/config.default.d.ts +867 -2
  18. package/dist/config/config.default.js +366 -3
  19. package/dist/config/config.local.d.ts +2 -5
  20. package/dist/config/config.local.js +8 -5
  21. package/dist/index.d.ts +4 -5
  22. package/dist/index.js +5 -8
  23. package/dist/lib/extend/safe_curl.d.ts +16 -3
  24. package/dist/lib/extend/safe_curl.js +25 -3
  25. package/dist/lib/helper/cliFilter.d.ts +4 -2
  26. package/dist/lib/helper/cliFilter.js +17 -3
  27. package/dist/lib/helper/escape.d.ts +2 -2
  28. package/dist/lib/helper/escape.js +3 -3
  29. package/dist/lib/helper/escapeShellArg.d.ts +1 -2
  30. package/dist/lib/helper/escapeShellArg.js +5 -3
  31. package/dist/lib/helper/escapeShellCmd.d.ts +1 -2
  32. package/dist/lib/helper/escapeShellCmd.js +14 -3
  33. package/dist/lib/helper/index.d.ts +19 -22
  34. package/dist/lib/helper/index.js +21 -13
  35. package/dist/lib/helper/shtml.d.ts +2 -2
  36. package/dist/lib/helper/shtml.js +69 -4
  37. package/dist/lib/helper/sjs.d.ts +4 -2
  38. package/dist/lib/helper/sjs.js +49 -3
  39. package/dist/lib/helper/sjson.d.ts +1 -2
  40. package/dist/lib/helper/sjson.js +39 -4
  41. package/dist/lib/helper/spath.d.ts +5 -2
  42. package/dist/lib/helper/spath.js +25 -3
  43. package/dist/lib/helper/surl.d.ts +2 -2
  44. package/dist/lib/helper/surl.js +30 -3
  45. package/dist/lib/middlewares/csp.d.ts +3 -6
  46. package/dist/lib/middlewares/csp.js +57 -4
  47. package/dist/lib/middlewares/csrf.d.ts +3 -6
  48. package/dist/lib/middlewares/csrf.js +37 -4
  49. package/dist/lib/middlewares/dta.d.ts +2 -5
  50. package/dist/lib/middlewares/dta.js +12 -4
  51. package/dist/lib/middlewares/hsts.d.ts +3 -6
  52. package/dist/lib/middlewares/hsts.js +21 -4
  53. package/dist/lib/middlewares/index.d.ts +11 -16
  54. package/dist/lib/middlewares/index.js +23 -14
  55. package/dist/lib/middlewares/methodnoallow.d.ts +2 -5
  56. package/dist/lib/middlewares/methodnoallow.js +20 -3
  57. package/dist/lib/middlewares/noopen.d.ts +3 -6
  58. package/dist/lib/middlewares/noopen.js +15 -4
  59. package/dist/lib/middlewares/nosniff.d.ts +3 -6
  60. package/dist/lib/middlewares/nosniff.js +28 -4
  61. package/dist/lib/middlewares/referrerPolicy.d.ts +3 -6
  62. package/dist/lib/middlewares/referrerPolicy.js +35 -4
  63. package/dist/lib/middlewares/xframe.d.ts +3 -6
  64. package/dist/lib/middlewares/xframe.js +17 -4
  65. package/dist/lib/middlewares/xssProtection.d.ts +3 -6
  66. package/dist/lib/middlewares/xssProtection.js +14 -4
  67. package/dist/lib/utils.d.ts +12 -17
  68. package/dist/lib/utils.js +192 -3
  69. package/dist/types.d.ts +36 -3
  70. package/dist/types.js +2 -3
  71. package/package.json +6 -6
  72. package/dist/application-COC0mYEe.js +0 -32
  73. package/dist/application-n5bk2L_z.d.ts +0 -12
  74. package/dist/cliFilter-7BSD8Nc_.js +0 -18
  75. package/dist/cliFilter-DKZxCxSe.d.ts +0 -7
  76. package/dist/config.default-AcwQOAG0.js +0 -166
  77. package/dist/config.default-D8v08Vox.d.ts +0 -870
  78. package/dist/context-C-N1IY85.d.ts +0 -95
  79. package/dist/context-e-QJTKfq.js +0 -191
  80. package/dist/csp-BW5AJd_f.js +0 -46
  81. package/dist/csrf-9aSLHiby.js +0 -33
  82. package/dist/dta-DVAKEpJ3.js +0 -13
  83. package/dist/escape-Dex_Pk9e.d.ts +0 -2
  84. package/dist/escape-p8-cW8c_.js +0 -7
  85. package/dist/escapeShellArg-BnzDicAC.d.ts +0 -4
  86. package/dist/escapeShellArg-C0v1ZeCl.js +0 -7
  87. package/dist/escapeShellCmd-CkAdyhtO.js +0 -15
  88. package/dist/escapeShellCmd-DQZZIHde.d.ts +0 -4
  89. package/dist/helper-DylzfQ_5.js +0 -25
  90. package/dist/hsts-CWMKNTEh.js +0 -19
  91. package/dist/methodnoallow-BAZONArS.js +0 -15
  92. package/dist/middlewares-CkQjv8t0.js +0 -27
  93. package/dist/noopen-C3jUBwoH.js +0 -17
  94. package/dist/nosniff-CcLkhX2I.js +0 -27
  95. package/dist/referrerPolicy-D4Uafq6c.js +0 -31
  96. package/dist/response-BFnHAJrV.js +0 -69
  97. package/dist/safe_curl-UlViaxoF.js +0 -19
  98. package/dist/safe_curl-mqZZv_YQ.d.ts +0 -20
  99. package/dist/shtml-CAquTzgV.d.ts +0 -6
  100. package/dist/shtml-CgF4kOx-.js +0 -53
  101. package/dist/sjs-Cbmkk5xS.js +0 -36
  102. package/dist/sjs-QZIJYS71.d.ts +0 -7
  103. package/dist/sjson-BetFnVR6.js +0 -32
  104. package/dist/sjson-O-vKJPws.d.ts +0 -4
  105. package/dist/spath-Bu9sy6Kz.js +0 -16
  106. package/dist/spath-DseDPHxf.d.ts +0 -7
  107. package/dist/surl-ClleTea7.js +0 -25
  108. package/dist/surl-JV70X_RZ.d.ts +0 -6
  109. package/dist/types-BZR2U30p.d.ts +0 -38
  110. package/dist/types-DnJpiSJb.js +0 -1
  111. package/dist/utils-Cajs5P8M.js +0 -127
  112. package/dist/xframe-q9fEZkVI.js +0 -18
  113. package/dist/xssProtection-D5QsHX-e.js +0 -17
@@ -1,2 +1,2 @@
1
- import { shtml } from "../../shtml-CAquTzgV.js";
2
- export { shtml as default };
1
+ import type { BaseContextClass } from 'egg';
2
+ export default function shtml(this: BaseContextClass, val: string): string;
@@ -1,4 +1,69 @@
1
- import "../../utils-Cajs5P8M.js";
2
- import { shtml } from "../../shtml-CgF4kOx-.js";
3
-
4
- export { shtml as default };
1
+ import xss from 'xss';
2
+ import { isSafeDomain, getFromUrl } from "../utils.js";
3
+ const BUILD_IN_ON_TAG_ATTR = Symbol('buildInOnTagAttr');
4
+ // default rule: https://github.com/leizongmin/js-xss/blob/master/lib/default.js
5
+ // add domain filter based on xss module
6
+ // custom options http://jsxss.com/zh/options.html
7
+ // eg: support a tag,filter attributes except for title : whiteList: {a: ['title']}
8
+ export default function shtml(val) {
9
+ if (typeof val !== 'string') {
10
+ return val;
11
+ }
12
+ const securityOptions = this.ctx.securityOptions;
13
+ const shtmlConfig = {
14
+ ...this.app.config.helper.shtml,
15
+ ...securityOptions.shtml,
16
+ [BUILD_IN_ON_TAG_ATTR]: undefined,
17
+ };
18
+ const domainWhiteList = this.app.config.security.domainWhiteList;
19
+ const app = this.app;
20
+ // filter href and src attribute if not in domain white list
21
+ if (!shtmlConfig[BUILD_IN_ON_TAG_ATTR]) {
22
+ shtmlConfig[BUILD_IN_ON_TAG_ATTR] = (_tag, name, value, isWhiteAttr) => {
23
+ if (isWhiteAttr && (name === 'href' || name === 'src')) {
24
+ if (!value) {
25
+ return;
26
+ }
27
+ value = String(value);
28
+ if (value[0] === '/' || value[0] === '#') {
29
+ return;
30
+ }
31
+ const hostname = getFromUrl(value, 'hostname');
32
+ if (!hostname) {
33
+ return;
34
+ }
35
+ // If we don't have our hostname in the app.security.domainWhiteList,
36
+ // Just check for `shtmlConfig.domainWhiteList` and `ctx.whiteList`.
37
+ if (!isSafeDomain(hostname, domainWhiteList)) {
38
+ // Check for `shtmlConfig.domainWhiteList` first (duplicated now)
39
+ if (shtmlConfig.domainWhiteList && shtmlConfig.domainWhiteList.length > 0) {
40
+ app.deprecate('[@eggjs/security/lib/helper/shtml] `config.helper.shtml.domainWhiteList` has been deprecate. Please use `config.security.domainWhiteList` instead.');
41
+ if (!isSafeDomain(hostname, shtmlConfig.domainWhiteList)) {
42
+ return '';
43
+ }
44
+ }
45
+ else {
46
+ return '';
47
+ }
48
+ }
49
+ }
50
+ };
51
+ // avoid overriding user configuration 'onTagAttr'
52
+ if (shtmlConfig.onTagAttr) {
53
+ const customOnTagAttrHandler = shtmlConfig.onTagAttr;
54
+ shtmlConfig.onTagAttr = function (tag, name, value, isWhiteAttr) {
55
+ const result = customOnTagAttrHandler.apply(this, [tag, name, value, isWhiteAttr]);
56
+ if (result !== undefined) {
57
+ return result;
58
+ }
59
+ // fallback to build-in handler
60
+ return shtmlConfig[BUILD_IN_ON_TAG_ATTR].apply(this, [tag, name, value, isWhiteAttr]);
61
+ };
62
+ }
63
+ else {
64
+ shtmlConfig.onTagAttr = shtmlConfig[BUILD_IN_ON_TAG_ATTR];
65
+ }
66
+ }
67
+ return xss(val, shtmlConfig);
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2h0bWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2hlbHBlci9zaHRtbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFFdEIsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHdkQsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUV4RCxnRkFBZ0Y7QUFDaEYsd0NBQXdDO0FBQ3hDLGtEQUFrRDtBQUNsRCxtRkFBbUY7QUFDbkYsTUFBTSxDQUFDLE9BQU8sVUFBVSxLQUFLLENBQXlCLEdBQVc7SUFDL0QsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztJQUNqRCxNQUFNLFdBQVcsR0FBRztRQUNsQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLO1FBQy9CLEdBQUcsZUFBZSxDQUFDLEtBQUs7UUFDeEIsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLFNBQXVEO0tBQ2hGLENBQUM7SUFDRixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO0lBQ2pFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDckIsNERBQTREO0lBQzVELElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUU7WUFDckUsSUFBSSxXQUFXLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ1gsT0FBTztnQkFDVCxDQUFDO2dCQUVELEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3RCLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7b0JBQ3pDLE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUMvQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2QsT0FBTztnQkFDVCxDQUFDO2dCQUVELHFFQUFxRTtnQkFDckUsb0VBQW9FO2dCQUNwRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxlQUFlLENBQUMsRUFBRSxDQUFDO29CQUM3QyxpRUFBaUU7b0JBQ2pFLElBQUksV0FBVyxDQUFDLGVBQWUsSUFBSSxXQUFXLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDMUUsR0FBRyxDQUFDLFNBQVMsQ0FDWCxvSkFBb0osQ0FDckosQ0FBQzt3QkFDRixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQzs0QkFDekQsT0FBTyxFQUFFLENBQUM7d0JBQ1osQ0FBQztvQkFDSCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sT0FBTyxFQUFFLENBQUM7b0JBQ1osQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLGtEQUFrRDtRQUNsRCxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMxQixNQUFNLHNCQUFzQixHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUM7WUFDckQsV0FBVyxDQUFDLFNBQVMsR0FBRyxVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVc7Z0JBQzdELE1BQU0sTUFBTSxHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNuRixJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFDekIsT0FBTyxNQUFNLENBQUM7Z0JBQ2hCLENBQUM7Z0JBQ0QsK0JBQStCO2dCQUMvQixPQUFPLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ3pGLENBQUMsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sV0FBVyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUM1RCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMvQixDQUFDIn0=
@@ -1,2 +1,4 @@
1
- import { escapeJavaScript } from "../../sjs-QZIJYS71.js";
2
- export { escapeJavaScript as default };
1
+ /**
2
+ * Escape JavaScript to \xHH format
3
+ */
4
+ export default function escapeJavaScript(text: string): string;
@@ -1,3 +1,49 @@
1
- import { escapeJavaScript } from "../../sjs-Cbmkk5xS.js";
2
-
3
- export { escapeJavaScript as default };
1
+ /**
2
+ * Escape JavaScript to \xHH format
3
+ */
4
+ // escape \x00-\x7f
5
+ // except 0-9,A-Z,a-z(\x2f-\x3a \x40-\x5b \x60-\x7b)
6
+ // eslint-disable-next-line
7
+ const MATCH_VULNERABLE_REGEXP = /[\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]/;
8
+ // eslint-enable-next-line
9
+ const BASIC_ALPHABETS = new Set('abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split(''));
10
+ const map = {
11
+ '\t': '\\t',
12
+ '\n': '\\n',
13
+ '\r': '\\r',
14
+ };
15
+ export default function escapeJavaScript(text) {
16
+ const str = '' + text;
17
+ const match = MATCH_VULNERABLE_REGEXP.exec(str);
18
+ if (!match) {
19
+ return str;
20
+ }
21
+ let res = '';
22
+ let index = 0;
23
+ let lastIndex = 0;
24
+ let ascii;
25
+ for (index = match.index; index < str.length; index++) {
26
+ ascii = str[index];
27
+ if (BASIC_ALPHABETS.has(ascii)) {
28
+ continue;
29
+ }
30
+ else {
31
+ if (map[ascii] === undefined) {
32
+ const code = ascii.charCodeAt(0);
33
+ if (code > 127) {
34
+ continue;
35
+ }
36
+ else {
37
+ map[ascii] = '\\x' + code.toString(16);
38
+ }
39
+ }
40
+ }
41
+ if (lastIndex !== index) {
42
+ res += str.substring(lastIndex, index);
43
+ }
44
+ lastIndex = index + 1;
45
+ res += map[ascii];
46
+ }
47
+ return lastIndex !== index ? res + str.substring(lastIndex, index) : res;
48
+ }
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2pzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9oZWxwZXIvc2pzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsbUJBQW1CO0FBQ25CLG9EQUFvRDtBQUVwRCwyQkFBMkI7QUFDM0IsTUFBTSx1QkFBdUIsR0FBRyx3Q0FBd0MsQ0FBQztBQUN6RSwwQkFBMEI7QUFFMUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUMsZ0VBQWdFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFNUcsTUFBTSxHQUFHLEdBQTJCO0lBQ2xDLElBQUksRUFBRSxLQUFLO0lBQ1gsSUFBSSxFQUFFLEtBQUs7SUFDWCxJQUFJLEVBQUUsS0FBSztDQUNaLENBQUM7QUFFRixNQUFNLENBQUMsT0FBTyxVQUFVLGdCQUFnQixDQUFDLElBQVk7SUFDbkQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztJQUN0QixNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFaEQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksS0FBSyxDQUFDO0lBRVYsS0FBSyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3RELEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0IsU0FBUztRQUNYLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLElBQUksSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO29CQUNmLFNBQVM7Z0JBQ1gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDekMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxTQUFTLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDeEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxTQUFTLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUN0QixHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxPQUFPLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzNFLENBQUMifQ==
@@ -1,2 +1 @@
1
- import { jsonEscape } from "../../sjson-O-vKJPws.js";
2
- export { jsonEscape as default };
1
+ export default function jsonEscape(obj: any): string;
@@ -1,4 +1,39 @@
1
- import "../../sjs-Cbmkk5xS.js";
2
- import { jsonEscape } from "../../sjson-BetFnVR6.js";
3
-
4
- export { jsonEscape as default };
1
+ import sjs from "./sjs.js";
2
+ /**
3
+ * escape json
4
+ * for output json in script
5
+ */
6
+ function sanitizeKey(obj) {
7
+ if (typeof obj !== 'object')
8
+ return obj;
9
+ if (Array.isArray(obj))
10
+ return obj;
11
+ if (obj === null)
12
+ return null;
13
+ if (typeof obj === 'boolean')
14
+ return obj;
15
+ if (typeof obj === 'number')
16
+ return obj;
17
+ if (Buffer.isBuffer(obj))
18
+ return obj.toString();
19
+ for (const k in obj) {
20
+ const escapedK = sjs(k);
21
+ if (escapedK !== k) {
22
+ obj[escapedK] = sanitizeKey(obj[k]);
23
+ obj[k] = undefined;
24
+ }
25
+ else {
26
+ obj[k] = sanitizeKey(obj[k]);
27
+ }
28
+ }
29
+ return obj;
30
+ }
31
+ export default function jsonEscape(obj) {
32
+ return JSON.stringify(sanitizeKey(obj), (_k, v) => {
33
+ if (typeof v === 'string') {
34
+ return sjs(v);
35
+ }
36
+ return v;
37
+ });
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2pzb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2hlbHBlci9zanNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUM7QUFFM0I7OztHQUdHO0FBRUgsU0FBUyxXQUFXLENBQUMsR0FBUTtJQUMzQixJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUN4QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDbkMsSUFBSSxHQUFHLEtBQUssSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlCLElBQUksT0FBTyxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3pDLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3hDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUVoRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLFFBQVEsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQixHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDckIsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE9BQU8sVUFBVSxVQUFVLENBQUMsR0FBUTtJQUN6QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2hELElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDMUIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIn0=
@@ -1,2 +1,5 @@
1
- import { pathFilter } from "../../spath-DseDPHxf.js";
2
- export { pathFilter as default };
1
+ /**
2
+ * File Inclusion
3
+ */
4
+ import type { BaseContextClass } from 'egg';
5
+ export default function pathFilter(this: BaseContextClass, path: string): string | null;
@@ -1,3 +1,25 @@
1
- import { pathFilter } from "../../spath-Bu9sy6Kz.js";
2
-
3
- export { pathFilter as default };
1
+ /**
2
+ * File Inclusion
3
+ */
4
+ export default function pathFilter(path) {
5
+ if (typeof path !== 'string')
6
+ return path;
7
+ const pathSource = path;
8
+ while (path.indexOf('%') !== -1) {
9
+ try {
10
+ path = decodeURIComponent(path);
11
+ }
12
+ catch {
13
+ if (process.env.NODE_ENV !== 'production') {
14
+ // Not a PROD env, logging with a warning.
15
+ this.ctx.coreLogger.warn('[@eggjs/security/lib/helper/spath] : decode file path %j failed.', path);
16
+ }
17
+ break;
18
+ }
19
+ }
20
+ if (path.indexOf('..') !== -1 || path[0] === '/') {
21
+ return null;
22
+ }
23
+ return pathSource;
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2hlbHBlci9zcGF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUlILE1BQU0sQ0FBQyxPQUFPLFVBQVUsVUFBVSxDQUF5QixJQUFZO0lBQ3JFLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRTFDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQztJQUV4QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUM7WUFDSCxJQUFJLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssWUFBWSxFQUFFLENBQUM7Z0JBQzFDLDBDQUEwQztnQkFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3JHLENBQUM7WUFDRCxNQUFNO1FBQ1IsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2pELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMifQ==
@@ -1,2 +1,2 @@
1
- import { surl } from "../../surl-JV70X_RZ.js";
2
- export { surl as default };
1
+ import type { BaseContextClass } from 'egg';
2
+ export default function surl(this: BaseContextClass, val: string): string;
@@ -1,3 +1,30 @@
1
- import { surl } from "../../surl-ClleTea7.js";
2
-
3
- export { surl as default };
1
+ const escapeMap = {
2
+ '"': '&quot;',
3
+ '<': '&lt;',
4
+ '>': '&gt;',
5
+ "'": '&#x27;',
6
+ };
7
+ export default function surl(val) {
8
+ // Just get the converted the protocolWhiteList in `Set` mode,
9
+ // Avoid conversions in `foreach`
10
+ const protocolWhiteListSet = this.app.config.security.__protocolWhiteListSet;
11
+ if (typeof val !== 'string') {
12
+ return val;
13
+ }
14
+ // only test on absolute path
15
+ if (val[0] !== '/') {
16
+ const arr = val.split('://', 2);
17
+ const protocol = arr.length > 1 ? arr[0].toLowerCase() : '';
18
+ if (protocol === '' || !protocolWhiteListSet.has(protocol)) {
19
+ if (this.app.config.env === 'local') {
20
+ this.ctx.coreLogger.warn('[@eggjs/security/surl] url: %j, protocol: %j, ' +
21
+ 'protocol is empty or not in white list, convert to empty string', val, protocol);
22
+ }
23
+ return '';
24
+ }
25
+ }
26
+ return val.replace(/["'<>]/g, ch => {
27
+ return escapeMap[ch];
28
+ });
29
+ }
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VybC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvaGVscGVyL3N1cmwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxTQUFTLEdBQTJCO0lBQ3hDLEdBQUcsRUFBRSxRQUFRO0lBQ2IsR0FBRyxFQUFFLE1BQU07SUFDWCxHQUFHLEVBQUUsTUFBTTtJQUNYLEdBQUcsRUFBRSxRQUFRO0NBQ2QsQ0FBQztBQUVGLE1BQU0sQ0FBQyxPQUFPLFVBQVUsSUFBSSxDQUF5QixHQUFXO0lBQzlELDhEQUE4RDtJQUM5RCxpQ0FBaUM7SUFDakMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsc0JBQXVCLENBQUM7SUFFOUUsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCw2QkFBNkI7SUFDN0IsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDbkIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzVELElBQUksUUFBUSxLQUFLLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzNELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ3RCLGdEQUFnRDtvQkFDOUMsaUVBQWlFLEVBQ25FLEdBQUcsRUFDSCxRQUFRLENBQ1QsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNqQyxPQUFPLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
@@ -1,7 +1,4 @@
1
- import { SecurityConfig } from "../../config.default-D8v08Vox.js";
2
- import { MiddlewareFunc } from "egg";
3
-
4
- //#region src/lib/middlewares/csp.d.ts
1
+ import type { MiddlewareFunc } from 'egg';
2
+ import type { SecurityConfig } from '../../config/config.default.ts';
5
3
  declare const _default: (options: SecurityConfig["csp"]) => MiddlewareFunc;
6
- //#endregion
7
- export { _default as default };
4
+ export default _default;
@@ -1,4 +1,57 @@
1
- import "../../utils-Cajs5P8M.js";
2
- import { csp_default } from "../../csp-BW5AJd_f.js";
3
-
4
- export { csp_default as default };
1
+ import extend from 'extend';
2
+ import { checkIfIgnore } from "../utils.js";
3
+ const HEADER = ['x-content-security-policy', 'content-security-policy'];
4
+ const REPORT_ONLY_HEADER = ['x-content-security-policy-report-only', 'content-security-policy-report-only'];
5
+ // Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
6
+ const MSIE_REGEXP = / MSIE /i;
7
+ export default (options) => {
8
+ return async function csp(ctx, next) {
9
+ await next();
10
+ const opts = {
11
+ ...options,
12
+ ...ctx.securityOptions.csp,
13
+ };
14
+ if (checkIfIgnore(opts, ctx))
15
+ return;
16
+ let finalHeader;
17
+ const matchedOption = extend(true, {}, opts.policy);
18
+ const bufArray = [];
19
+ const headers = opts.reportOnly ? REPORT_ONLY_HEADER : HEADER;
20
+ if (opts.supportIE && MSIE_REGEXP.test(ctx.get('user-agent'))) {
21
+ finalHeader = headers[0];
22
+ }
23
+ else {
24
+ finalHeader = headers[1];
25
+ }
26
+ for (const key in matchedOption) {
27
+ const value = matchedOption[key];
28
+ // Other arrays are splitted into strings EXCEPT `sandbox`
29
+ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/sandbox
30
+ if (key === 'sandbox' && value === true) {
31
+ bufArray.push(key);
32
+ }
33
+ else {
34
+ let values = (Array.isArray(value) ? value : [value]);
35
+ if (key === 'script-src') {
36
+ const hasNonce = values.some(function (val) {
37
+ return val.indexOf('nonce-') !== -1;
38
+ });
39
+ if (!hasNonce) {
40
+ values.push("'nonce-" + ctx.nonce + "'");
41
+ }
42
+ }
43
+ values = values.map(function (d) {
44
+ if (d.startsWith('.')) {
45
+ d = '*' + d;
46
+ }
47
+ return d;
48
+ });
49
+ bufArray.push(key + ' ' + values.join(' '));
50
+ }
51
+ }
52
+ const headerString = bufArray.join(';');
53
+ ctx.set(finalHeader, headerString);
54
+ ctx.set('x-csp-nonce', ctx.nonce);
55
+ };
56
+ };
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9taWRkbGV3YXJlcy9jc3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHNUMsTUFBTSxNQUFNLEdBQUcsQ0FBQywyQkFBMkIsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO0FBQ3hFLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyx1Q0FBdUMsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO0FBRTVHLHFEQUFxRDtBQUNyRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUM7QUFFOUIsZUFBZSxDQUFDLE9BQThCLEVBQWtCLEVBQUU7SUFDaEUsT0FBTyxLQUFLLFVBQVUsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJO1FBQ2pDLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFFYixNQUFNLElBQUksR0FBRztZQUNYLEdBQUcsT0FBTztZQUNWLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHO1NBQzNCLENBQUM7UUFDRixJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUVyQyxJQUFJLFdBQVcsQ0FBQztRQUNoQixNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBRXBCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDOUQsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUQsV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELEtBQUssTUFBTSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEMsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLDBEQUEwRDtZQUMxRCw0RkFBNEY7WUFDNUYsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDeEMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQWEsQ0FBQztnQkFDbEUsSUFBSSxHQUFHLEtBQUssWUFBWSxFQUFFLENBQUM7b0JBQ3pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO3dCQUN4QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQ3RDLENBQUMsQ0FBQyxDQUFDO29CQUVILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO29CQUMzQyxDQUFDO2dCQUNILENBQUM7Z0JBRUQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO29CQUM3QixJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDdEIsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7b0JBQ2QsQ0FBQztvQkFDRCxPQUFPLENBQUMsQ0FBQztnQkFDWCxDQUFDLENBQUMsQ0FBQztnQkFDSCxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzlDLENBQUM7UUFDSCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNuQyxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
@@ -1,7 +1,4 @@
1
- import { SecurityConfig } from "../../config.default-D8v08Vox.js";
2
- import { MiddlewareFunc } from "egg";
3
-
4
- //#region src/lib/middlewares/csrf.d.ts
1
+ import type { MiddlewareFunc } from 'egg';
2
+ import type { SecurityConfig } from '../../config/config.default.ts';
5
3
  declare const _default: (options: SecurityConfig["csrf"]) => MiddlewareFunc;
6
- //#endregion
7
- export { _default as default };
4
+ export default _default;
@@ -1,4 +1,37 @@
1
- import "../../utils-Cajs5P8M.js";
2
- import { csrf_default } from "../../csrf-9aSLHiby.js";
3
-
4
- export { csrf_default as default };
1
+ import { debuglog } from 'node:util';
2
+ import typeis from 'type-is';
3
+ import { checkIfIgnore } from "../utils.js";
4
+ const debug = debuglog('egg/security/lib/middlewares/csrf');
5
+ export default (options) => {
6
+ return function csrf(ctx, next) {
7
+ if (checkIfIgnore(options, ctx)) {
8
+ return next();
9
+ }
10
+ // ensure csrf token exists
11
+ if (['any', 'all', 'ctoken'].includes(options.type)) {
12
+ ctx.ensureCsrfSecret();
13
+ }
14
+ // supported requests
15
+ const method = ctx.method;
16
+ let isSupported = false;
17
+ for (const eachRule of options.supportedRequests) {
18
+ if (eachRule.path.test(ctx.path)) {
19
+ if (eachRule.methods.includes(method)) {
20
+ isSupported = true;
21
+ break;
22
+ }
23
+ }
24
+ }
25
+ if (!isSupported) {
26
+ return next();
27
+ }
28
+ if (options.ignoreJSON && typeis.is(ctx.get('content-type'), 'json')) {
29
+ return next();
30
+ }
31
+ const body = ctx.request.body;
32
+ debug('%s %s, got %j', ctx.method, ctx.url, body);
33
+ ctx.assertCsrf();
34
+ return next();
35
+ };
36
+ };
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NyZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvY3NyZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR3JDLE9BQU8sTUFBTSxNQUFNLFNBQVMsQ0FBQztBQUU3QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzVDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0FBRTVELGVBQWUsQ0FBQyxPQUErQixFQUFrQixFQUFFO0lBQ2pFLE9BQU8sU0FBUyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUk7UUFDNUIsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNoQixDQUFDO1FBRUQsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNwRCxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBRUQscUJBQXFCO1FBQ3JCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDMUIsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLEtBQUssTUFBTSxRQUFRLElBQUksT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDakQsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUN0QyxXQUFXLEdBQUcsSUFBSSxDQUFDO29CQUNuQixNQUFNO2dCQUNSLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFFRCxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckUsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNoQixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDOUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEQsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
@@ -1,6 +1,3 @@
1
- import { MiddlewareFunc } from "egg";
2
-
3
- //#region src/lib/middlewares/dta.d.ts
1
+ import type { MiddlewareFunc } from 'egg';
4
2
  declare const _default: () => MiddlewareFunc;
5
- //#endregion
6
- export { _default as default };
3
+ export default _default;
@@ -1,4 +1,12 @@
1
- import "../../utils-Cajs5P8M.js";
2
- import { dta_default } from "../../dta-DVAKEpJ3.js";
3
-
4
- export { dta_default as default };
1
+ import { isSafePath } from "../utils.js";
2
+ // https://en.wikipedia.org/wiki/Directory_traversal_attack
3
+ export default () => {
4
+ return function dta(ctx, next) {
5
+ const path = ctx.path;
6
+ if (!isSafePath(path, ctx)) {
7
+ ctx.throw(400);
8
+ }
9
+ return next();
10
+ };
11
+ };
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9taWRkbGV3YXJlcy9kdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV6QywyREFBMkQ7QUFDM0QsZUFBZSxHQUFtQixFQUFFO0lBQ2xDLE9BQU8sU0FBUyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUk7UUFDM0IsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNCLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
@@ -1,7 +1,4 @@
1
- import { SecurityConfig } from "../../config.default-D8v08Vox.js";
2
- import { MiddlewareFunc } from "egg";
3
-
4
- //#region src/lib/middlewares/hsts.d.ts
1
+ import type { MiddlewareFunc } from 'egg';
2
+ import type { SecurityConfig } from '../../config/config.default.ts';
5
3
  declare const _default: (options: SecurityConfig["hsts"]) => MiddlewareFunc;
6
- //#endregion
7
- export { _default as default };
4
+ export default _default;
@@ -1,4 +1,21 @@
1
- import "../../utils-Cajs5P8M.js";
2
- import { hsts_default } from "../../hsts-CWMKNTEh.js";
3
-
4
- export { hsts_default as default };
1
+ import { checkIfIgnore } from "../utils.js";
2
+ // Set Strict-Transport-Security header
3
+ export default (options) => {
4
+ return async function hsts(ctx, next) {
5
+ await next();
6
+ const opts = {
7
+ ...options,
8
+ ...ctx.securityOptions.hsts,
9
+ };
10
+ if (checkIfIgnore(opts, ctx))
11
+ return;
12
+ let val = `max-age=${opts.maxAge}`;
13
+ // If opts.includeSubdomains is defined,
14
+ // the rule is also valid for all the sub domains of the website
15
+ if (opts.includeSubdomains) {
16
+ val = `${val}; includeSubdomains`;
17
+ }
18
+ ctx.set('strict-transport-security', val);
19
+ };
20
+ };
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvaHN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzVDLHVDQUF1QztBQUN2QyxlQUFlLENBQUMsT0FBK0IsRUFBa0IsRUFBRTtJQUNqRSxPQUFPLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUk7UUFDbEMsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUViLE1BQU0sSUFBSSxHQUFHO1lBQ1gsR0FBRyxPQUFPO1lBQ1YsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUk7U0FDNUIsQ0FBQztRQUNGLElBQUksYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7WUFBRSxPQUFPO1FBRXJDLElBQUksR0FBRyxHQUFHLFdBQVcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25DLHdDQUF3QztRQUN4QyxnRUFBZ0U7UUFDaEUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUMzQixHQUFHLEdBQUcsR0FBRyxHQUFHLHFCQUFxQixDQUFDO1FBQ3BDLENBQUM7UUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -1,18 +1,13 @@
1
- import { SecurityConfig } from "../../config.default-D8v08Vox.js";
2
- import * as egg1 from "egg";
3
-
4
- //#region src/lib/middlewares/index.d.ts
5
1
  declare const _default: {
6
- csp: (options: SecurityConfig["csp"]) => egg1.MiddlewareFunc;
7
- csrf: (options: SecurityConfig["csrf"]) => egg1.MiddlewareFunc;
8
- dta: () => egg1.MiddlewareFunc;
9
- hsts: (options: SecurityConfig["hsts"]) => egg1.MiddlewareFunc;
10
- methodnoallow: () => egg1.MiddlewareFunc;
11
- noopen: (options: SecurityConfig["noopen"]) => egg1.MiddlewareFunc;
12
- nosniff: (options: SecurityConfig["nosniff"]) => egg1.MiddlewareFunc;
13
- referrerPolicy: (options: SecurityConfig["referrerPolicy"]) => egg1.MiddlewareFunc;
14
- xframe: (options: SecurityConfig["xframe"]) => egg1.MiddlewareFunc;
15
- xssProtection: (options: SecurityConfig["xssProtection"]) => egg1.MiddlewareFunc;
2
+ csp: (options: import("../../config/config.default.ts").SecurityConfig["csp"]) => import("egg").MiddlewareFunc;
3
+ csrf: (options: import("../../config/config.default.ts").SecurityConfig["csrf"]) => import("egg").MiddlewareFunc;
4
+ dta: () => import("egg").MiddlewareFunc;
5
+ hsts: (options: import("../../config/config.default.ts").SecurityConfig["hsts"]) => import("egg").MiddlewareFunc;
6
+ methodnoallow: () => import("egg").MiddlewareFunc;
7
+ noopen: (options: import("../../config/config.default.ts").SecurityConfig["noopen"]) => import("egg").MiddlewareFunc;
8
+ nosniff: (options: import("../../config/config.default.ts").SecurityConfig["nosniff"]) => import("egg").MiddlewareFunc;
9
+ referrerPolicy: (options: import("../../config/config.default.ts").SecurityConfig["referrerPolicy"]) => import("egg").MiddlewareFunc;
10
+ xframe: (options: import("../../config/config.default.ts").SecurityConfig["xframe"]) => import("egg").MiddlewareFunc;
11
+ xssProtection: (options: import("../../config/config.default.ts").SecurityConfig["xssProtection"]) => import("egg").MiddlewareFunc;
16
12
  };
17
- //#endregion
18
- export { _default as default };
13
+ export default _default;
@@ -1,14 +1,23 @@
1
- import "../../utils-Cajs5P8M.js";
2
- import "../../csp-BW5AJd_f.js";
3
- import "../../csrf-9aSLHiby.js";
4
- import "../../dta-DVAKEpJ3.js";
5
- import "../../hsts-CWMKNTEh.js";
6
- import "../../methodnoallow-BAZONArS.js";
7
- import "../../noopen-C3jUBwoH.js";
8
- import "../../nosniff-CcLkhX2I.js";
9
- import "../../referrerPolicy-D4Uafq6c.js";
10
- import "../../xframe-q9fEZkVI.js";
11
- import "../../xssProtection-D5QsHX-e.js";
12
- import { middlewares_default } from "../../middlewares-CkQjv8t0.js";
13
-
14
- export { middlewares_default as default };
1
+ import csp from "./csp.js";
2
+ import csrf from "./csrf.js";
3
+ import dta from "./dta.js";
4
+ import hsts from "./hsts.js";
5
+ import methodnoallow from "./methodnoallow.js";
6
+ import noopen from "./noopen.js";
7
+ import nosniff from "./nosniff.js";
8
+ import referrerPolicy from "./referrerPolicy.js";
9
+ import xframe from "./xframe.js";
10
+ import xssProtection from "./xssProtection.js";
11
+ export default {
12
+ csp,
13
+ csrf,
14
+ dta,
15
+ hsts,
16
+ methodnoallow,
17
+ noopen,
18
+ nosniff,
19
+ referrerPolicy,
20
+ xframe,
21
+ xssProtection,
22
+ };
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21pZGRsZXdhcmVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQztBQUMzQixPQUFPLElBQUksTUFBTSxXQUFXLENBQUM7QUFDN0IsT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBQzNCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLGFBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sY0FBYyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sTUFBTSxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLGFBQWEsTUFBTSxvQkFBb0IsQ0FBQztBQUUvQyxlQUFlO0lBQ2IsR0FBRztJQUNILElBQUk7SUFDSixHQUFHO0lBQ0gsSUFBSTtJQUNKLGFBQWE7SUFDYixNQUFNO0lBQ04sT0FBTztJQUNQLGNBQWM7SUFDZCxNQUFNO0lBQ04sYUFBYTtDQUNkLENBQUMifQ==
@@ -1,6 +1,3 @@
1
- import { MiddlewareFunc } from "egg";
2
-
3
- //#region src/lib/middlewares/methodnoallow.d.ts
1
+ import type { MiddlewareFunc } from 'egg';
4
2
  declare const _default: () => MiddlewareFunc;
5
- //#endregion
6
- export { _default as default };
3
+ export default _default;
@@ -1,3 +1,20 @@
1
- import { methodnoallow_default } from "../../methodnoallow-BAZONArS.js";
2
-
3
- export { methodnoallow_default as default };
1
+ import { METHODS } from 'node:http';
2
+ const METHODS_NOT_ALLOWED = ['TRACE', 'TRACK'];
3
+ const safeHttpMethodsMap = {};
4
+ for (const method of METHODS) {
5
+ if (!METHODS_NOT_ALLOWED.includes(method)) {
6
+ safeHttpMethodsMap[method.toUpperCase()] = true;
7
+ }
8
+ }
9
+ // https://www.owasp.org/index.php/Cross_Site_Tracing
10
+ // http://jsperf.com/find-by-map-with-find-by-array
11
+ export default () => {
12
+ return function notAllow(ctx, next) {
13
+ // ctx.method is upper case
14
+ if (!safeHttpMethodsMap[ctx.method]) {
15
+ ctx.throw(405);
16
+ }
17
+ return next();
18
+ };
19
+ };
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0aG9kbm9hbGxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbWlkZGxld2FyZXMvbWV0aG9kbm9hbGxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBSXBDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDL0MsTUFBTSxrQkFBa0IsR0FBNEIsRUFBRSxDQUFDO0FBRXZELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFLENBQUM7SUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQzFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNsRCxDQUFDO0FBQ0gsQ0FBQztBQUVELHFEQUFxRDtBQUNyRCxtREFBbUQ7QUFDbkQsZUFBZSxHQUFtQixFQUFFO0lBQ2xDLE9BQU8sU0FBUyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUk7UUFDaEMsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNwQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -1,7 +1,4 @@
1
- import { SecurityConfig } from "../../config.default-D8v08Vox.js";
2
- import { MiddlewareFunc } from "egg";
3
-
4
- //#region src/lib/middlewares/noopen.d.ts
1
+ import type { MiddlewareFunc } from 'egg';
2
+ import type { SecurityConfig } from '../../config/config.default.ts';
5
3
  declare const _default: (options: SecurityConfig["noopen"]) => MiddlewareFunc;
6
- //#endregion
7
- export { _default as default };
4
+ export default _default;
@@ -1,4 +1,15 @@
1
- import "../../utils-Cajs5P8M.js";
2
- import { noopen_default } from "../../noopen-C3jUBwoH.js";
3
-
4
- export { noopen_default as default };
1
+ import { checkIfIgnore } from "../utils.js";
2
+ // @see http://blogs.msdn.com/b/ieinternals/archive/2009/06/30/internet-explorer-custom-http-headers.aspx
3
+ export default (options) => {
4
+ return async function noopen(ctx, next) {
5
+ await next();
6
+ const opts = {
7
+ ...options,
8
+ ...ctx.securityOptions.noopen,
9
+ };
10
+ if (checkIfIgnore(opts, ctx))
11
+ return;
12
+ ctx.set('x-download-options', 'noopen');
13
+ };
14
+ };
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9vcGVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9taWRkbGV3YXJlcy9ub29wZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUc1Qyx5R0FBeUc7QUFDekcsZUFBZSxDQUFDLE9BQWlDLEVBQWtCLEVBQUU7SUFDbkUsT0FBTyxLQUFLLFVBQVUsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJO1FBQ3BDLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFFYixNQUFNLElBQUksR0FBRztZQUNYLEdBQUcsT0FBTztZQUNWLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNO1NBQzlCLENBQUM7UUFDRixJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTztRQUVyQyxHQUFHLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9