commit
79caca130b
16 changed files with 389 additions and 368 deletions
|
@ -166,11 +166,6 @@ server {
|
||||||
# We've applied other sandboxing techniques to mitigate the risk of running WebAssembly in this privileged scope
|
# We've applied other sandboxing techniques to mitigate the risk of running WebAssembly in this privileged scope
|
||||||
if ($uri ~ ^\/unsafeiframe\/inner\.html.*$) { set $unsafe 1; }
|
if ($uri ~ ^\/unsafeiframe\/inner\.html.*$) { set $unsafe 1; }
|
||||||
|
|
||||||
# draw.io uses inline script tags in it's index.html. The hashes are added here.
|
|
||||||
if ($uri ~ ^\/components\/drawio\/src\/main\/webapp\/index.html.*$) {
|
|
||||||
set $scriptSrc "'self' 'sha256-dLMFD7ijAw6AVaqecS7kbPcFFzkxQ+yeZSsKpOdLxps=' 'sha256-6g514VrT/cZFZltSaKxIVNFF46+MFaTSDTPB8WfYK+c=' resource: https://${main_domain}";
|
|
||||||
}
|
|
||||||
|
|
||||||
# privileged contexts allow a few more rights than unprivileged contexts, though limits are still applied
|
# privileged contexts allow a few more rights than unprivileged contexts, though limits are still applied
|
||||||
if ($unsafe) {
|
if ($unsafe) {
|
||||||
set $scriptSrc "'self' 'unsafe-eval' 'unsafe-inline' resource: https://${main_domain}";
|
set $scriptSrc "'self' 'unsafe-eval' 'unsafe-inline' resource: https://${main_domain}";
|
||||||
|
|
|
@ -52,10 +52,6 @@ Default.padContentSecurity = function (Env) {
|
||||||
return (Default.commonCSP(Env).join('; ') + "script-src 'self' 'unsafe-eval' 'unsafe-inline' resource: " + Env.httpUnsafeOrigin).replace(/\s+/g, ' ');
|
return (Default.commonCSP(Env).join('; ') + "script-src 'self' 'unsafe-eval' 'unsafe-inline' resource: " + Env.httpUnsafeOrigin).replace(/\s+/g, ' ');
|
||||||
};
|
};
|
||||||
|
|
||||||
Default.diagramContentSecurity = function (Env) {
|
|
||||||
return (Default.commonCSP(Env).join('; ') + "script-src 'self' 'sha256-dLMFD7ijAw6AVaqecS7kbPcFFzkxQ+yeZSsKpOdLxps=' 'sha256-6g514VrT/cZFZltSaKxIVNFF46+MFaTSDTPB8WfYK+c=' resource: " + Env.httpUnsafeOrigin).replace(/\s+/g, ' ');
|
|
||||||
};
|
|
||||||
|
|
||||||
Default.httpHeaders = function (Env) {
|
Default.httpHeaders = function (Env) {
|
||||||
return {
|
return {
|
||||||
"X-XSS-Protection": "1; mode=block",
|
"X-XSS-Protection": "1; mode=block",
|
||||||
|
|
|
@ -134,8 +134,6 @@ var getHeaders = function (Env, type) {
|
||||||
var csp;
|
var csp;
|
||||||
if (type === 'office') {
|
if (type === 'office') {
|
||||||
csp = Default.padContentSecurity(Env);
|
csp = Default.padContentSecurity(Env);
|
||||||
} else if (type === 'diagram') {
|
|
||||||
csp = Default.diagramContentSecurity(Env);
|
|
||||||
} else {
|
} else {
|
||||||
csp = Default.contentSecurity(Env);
|
csp = Default.contentSecurity(Env);
|
||||||
}
|
}
|
||||||
|
@ -158,8 +156,6 @@ var setHeaders = function (req, res) {
|
||||||
type = 'office';
|
type = 'office';
|
||||||
} else if (/^\/api\/(broadcast|config)/.test(req.url)) {
|
} else if (/^\/api\/(broadcast|config)/.test(req.url)) {
|
||||||
type = 'api';
|
type = 'api';
|
||||||
} else if (/^\/components\/drawio\/src\/main\/webapp\/index.html.*$/.test(req.url)) {
|
|
||||||
type = 'diagram';
|
|
||||||
} else {
|
} else {
|
||||||
type = 'standard';
|
type = 'standard';
|
||||||
}
|
}
|
||||||
|
|
489
package-lock.json
generated
489
package-lock.json
generated
|
@ -26,7 +26,7 @@
|
||||||
"cookie-parser": "^1.4.6",
|
"cookie-parser": "^1.4.6",
|
||||||
"croppie": "^2.5.0",
|
"croppie": "^2.5.0",
|
||||||
"dragula": "3.7.2",
|
"dragula": "3.7.2",
|
||||||
"drawio": "cryptpad/drawio-npm#npm",
|
"drawio": "github:cryptpad/drawio-npm#npm-21.8.2+4",
|
||||||
"express": "~4.18.2",
|
"express": "~4.18.2",
|
||||||
"file-saver": "1.3.1",
|
"file-saver": "1.3.1",
|
||||||
"fs-extra": "^7.0.0",
|
"fs-extra": "^7.0.0",
|
||||||
|
@ -204,9 +204,9 @@
|
||||||
"integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA=="
|
"integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA=="
|
||||||
},
|
},
|
||||||
"node_modules/@types/http-proxy": {
|
"node_modules/@types/http-proxy": {
|
||||||
"version": "1.17.12",
|
"version": "1.17.14",
|
||||||
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.12.tgz",
|
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz",
|
||||||
"integrity": "sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw==",
|
"integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/node": "*"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
|
@ -228,9 +228,12 @@
|
||||||
"integrity": "sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ=="
|
"integrity": "sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ=="
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "20.6.3",
|
"version": "20.10.5",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.3.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz",
|
||||||
"integrity": "sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA=="
|
"integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==",
|
||||||
|
"dependencies": {
|
||||||
|
"undici-types": "~5.26.4"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/passport": {
|
"node_modules/@types/passport": {
|
||||||
"version": "1.0.14",
|
"version": "1.0.14",
|
||||||
|
@ -962,12 +965,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/call-bind": {
|
"node_modules/call-bind": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
|
||||||
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
|
"integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"function-bind": "^1.1.1",
|
"function-bind": "^1.1.2",
|
||||||
"get-intrinsic": "^1.0.2"
|
"get-intrinsic": "^1.2.1",
|
||||||
|
"set-function-length": "^1.1.1"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
@ -1115,66 +1119,17 @@
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/class-utils/node_modules/is-accessor-descriptor": {
|
|
||||||
"version": "0.1.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
|
||||||
"integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"kind-of": "^3.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": {
|
|
||||||
"version": "3.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
|
||||||
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"is-buffer": "^1.1.5"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/class-utils/node_modules/is-data-descriptor": {
|
|
||||||
"version": "0.1.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
|
||||||
"integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"kind-of": "^3.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": {
|
|
||||||
"version": "3.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
|
||||||
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"is-buffer": "^1.1.5"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/class-utils/node_modules/is-descriptor": {
|
"node_modules/class-utils/node_modules/is-descriptor": {
|
||||||
"version": "0.1.6",
|
"version": "0.1.7",
|
||||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
|
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
|
||||||
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
|
"integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"is-accessor-descriptor": "^0.1.6",
|
"is-accessor-descriptor": "^1.0.1",
|
||||||
"is-data-descriptor": "^0.1.4",
|
"is-data-descriptor": "^1.0.1"
|
||||||
"kind-of": "^5.0.0"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">= 0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/cli": {
|
"node_modules/cli": {
|
||||||
|
@ -1205,9 +1160,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/codemirror": {
|
"node_modules/codemirror": {
|
||||||
"version": "5.65.15",
|
"version": "5.65.16",
|
||||||
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.15.tgz",
|
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz",
|
||||||
"integrity": "sha512-YC4EHbbwQeubZzxLl5G4nlbLc1T21QTrKGaOal/Pkm9dVDMZXMH7+ieSPEOZCtO9I68i8/oteJKOxzHC2zR+0g=="
|
"integrity": "sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg=="
|
||||||
},
|
},
|
||||||
"node_modules/collection-visit": {
|
"node_modules/collection-visit": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
|
@ -1228,9 +1183,12 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/component-emitter": {
|
"node_modules/component-emitter": {
|
||||||
"version": "1.3.0",
|
"version": "1.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz",
|
||||||
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
|
"integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==",
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"node_modules/components-font-awesome": {
|
"node_modules/components-font-awesome": {
|
||||||
"version": "4.7.0",
|
"version": "4.7.0",
|
||||||
|
@ -1411,6 +1369,19 @@
|
||||||
"node": ">=0.10"
|
"node": ">=0.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/define-data-property": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"get-intrinsic": "^1.2.1",
|
||||||
|
"gopd": "^1.0.1",
|
||||||
|
"has-property-descriptors": "^1.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/define-property": {
|
"node_modules/define-property": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
|
||||||
|
@ -1534,9 +1505,8 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/drawio": {
|
"node_modules/drawio": {
|
||||||
"name": "drawio-cp",
|
"version": "21.8.2+4",
|
||||||
"version": "21.7.5",
|
"resolved": "git+ssh://git@github.com/cryptpad/drawio-npm.git#5555df31ce3a1c6220cefa3aaa16b9a7880bf8b8"
|
||||||
"resolved": "git+ssh://git@github.com/cryptpad/drawio-npm.git#b430ab78be9944f19721c3489c9ce95bc1abe2ca"
|
|
||||||
},
|
},
|
||||||
"node_modules/ecdsa-sig-formatter": {
|
"node_modules/ecdsa-sig-formatter": {
|
||||||
"version": "1.0.11",
|
"version": "1.0.11",
|
||||||
|
@ -1651,66 +1621,17 @@
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/expand-brackets/node_modules/is-accessor-descriptor": {
|
|
||||||
"version": "0.1.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
|
||||||
"integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"kind-of": "^3.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": {
|
|
||||||
"version": "3.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
|
||||||
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"is-buffer": "^1.1.5"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/expand-brackets/node_modules/is-data-descriptor": {
|
|
||||||
"version": "0.1.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
|
||||||
"integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"kind-of": "^3.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": {
|
|
||||||
"version": "3.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
|
||||||
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"is-buffer": "^1.1.5"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/expand-brackets/node_modules/is-descriptor": {
|
"node_modules/expand-brackets/node_modules/is-descriptor": {
|
||||||
"version": "0.1.6",
|
"version": "0.1.7",
|
||||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
|
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
|
||||||
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
|
"integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"is-accessor-descriptor": "^0.1.6",
|
"is-accessor-descriptor": "^1.0.1",
|
||||||
"is-data-descriptor": "^0.1.4",
|
"is-data-descriptor": "^1.0.1"
|
||||||
"kind-of": "^5.0.0"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">= 0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/express": {
|
"node_modules/express": {
|
||||||
|
@ -2113,9 +2034,12 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/function-bind": {
|
"node_modules/function-bind": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
|
||||||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
|
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"node_modules/gar": {
|
"node_modules/gar": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.4",
|
||||||
|
@ -2135,14 +2059,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/get-intrinsic": {
|
"node_modules/get-intrinsic": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
|
||||||
"integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
|
"integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"function-bind": "^1.1.1",
|
"function-bind": "^1.1.2",
|
||||||
"has": "^1.0.3",
|
|
||||||
"has-proto": "^1.0.1",
|
"has-proto": "^1.0.1",
|
||||||
"has-symbols": "^1.0.3"
|
"has-symbols": "^1.0.3",
|
||||||
|
"hasown": "^2.0.0"
|
||||||
},
|
},
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
@ -2241,20 +2165,31 @@
|
||||||
"resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz",
|
||||||
"integrity": "sha512-zGRpnr2l5w/s8PxkrquUJoVeR06KvqPelrYqiSyQV7QEBqCYivpb6UzXYWC6JDBVtNFOT0rzJRFhkfJgxzmILA=="
|
"integrity": "sha512-zGRpnr2l5w/s8PxkrquUJoVeR06KvqPelrYqiSyQV7QEBqCYivpb6UzXYWC6JDBVtNFOT0rzJRFhkfJgxzmILA=="
|
||||||
},
|
},
|
||||||
|
"node_modules/gopd": {
|
||||||
|
"version": "1.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
||||||
|
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
|
||||||
|
"dependencies": {
|
||||||
|
"get-intrinsic": "^1.1.3"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/graceful-fs": {
|
"node_modules/graceful-fs": {
|
||||||
"version": "4.2.11",
|
"version": "4.2.11",
|
||||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
|
||||||
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
|
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
|
||||||
},
|
},
|
||||||
"node_modules/has": {
|
"node_modules/has-property-descriptors": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
|
||||||
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
|
"integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"function-bind": "^1.1.1"
|
"get-intrinsic": "^1.2.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"funding": {
|
||||||
"node": ">= 0.4.0"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/has-proto": {
|
"node_modules/has-proto": {
|
||||||
|
@ -2342,6 +2277,17 @@
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/hasown": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
|
||||||
|
"dependencies": {
|
||||||
|
"function-bind": "^1.1.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/html2canvas": {
|
"node_modules/html2canvas": {
|
||||||
"version": "1.4.1",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz",
|
||||||
|
@ -2499,22 +2445,14 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/is-accessor-descriptor": {
|
"node_modules/is-accessor-descriptor": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
|
||||||
"integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
|
"integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"kind-of": "^6.0.0"
|
"hasown": "^2.0.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">= 0.10"
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/is-accessor-descriptor/node_modules/kind-of": {
|
|
||||||
"version": "6.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
|
||||||
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/is-arrayish": {
|
"node_modules/is-arrayish": {
|
||||||
|
@ -2529,43 +2467,26 @@
|
||||||
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
||||||
},
|
},
|
||||||
"node_modules/is-data-descriptor": {
|
"node_modules/is-data-descriptor": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
|
||||||
"integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
|
"integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"kind-of": "^6.0.0"
|
"hasown": "^2.0.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">= 0.4"
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/is-data-descriptor/node_modules/kind-of": {
|
|
||||||
"version": "6.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
|
||||||
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/is-descriptor": {
|
"node_modules/is-descriptor": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
|
||||||
"integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
|
"integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"is-accessor-descriptor": "^1.0.0",
|
"is-accessor-descriptor": "^1.0.1",
|
||||||
"is-data-descriptor": "^1.0.0",
|
"is-data-descriptor": "^1.0.1"
|
||||||
"kind-of": "^6.0.2"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">= 0.4"
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/is-descriptor/node_modules/kind-of": {
|
|
||||||
"version": "6.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
|
|
||||||
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/is-directory": {
|
"node_modules/is-directory": {
|
||||||
|
@ -3363,47 +3284,16 @@
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/object-copy/node_modules/is-accessor-descriptor": {
|
|
||||||
"version": "0.1.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
|
||||||
"integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
|
|
||||||
"dependencies": {
|
|
||||||
"kind-of": "^3.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/object-copy/node_modules/is-data-descriptor": {
|
|
||||||
"version": "0.1.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
|
||||||
"integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
|
|
||||||
"dependencies": {
|
|
||||||
"kind-of": "^3.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/object-copy/node_modules/is-descriptor": {
|
"node_modules/object-copy/node_modules/is-descriptor": {
|
||||||
"version": "0.1.6",
|
"version": "0.1.7",
|
||||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
|
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
|
||||||
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
|
"integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"is-accessor-descriptor": "^0.1.6",
|
"is-accessor-descriptor": "^1.0.1",
|
||||||
"is-data-descriptor": "^0.1.4",
|
"is-data-descriptor": "^1.0.1"
|
||||||
"kind-of": "^5.0.0"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">= 0.4"
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": {
|
|
||||||
"version": "5.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
|
|
||||||
"integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/object-copy/node_modules/kind-of": {
|
"node_modules/object-copy/node_modules/kind-of": {
|
||||||
|
@ -3426,9 +3316,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/object-inspect": {
|
"node_modules/object-inspect": {
|
||||||
"version": "1.12.3",
|
"version": "1.13.1",
|
||||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
|
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
|
||||||
"integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
|
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
|
@ -4210,6 +4100,20 @@
|
||||||
"node": ">= 0.8.0"
|
"node": ">= 0.8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/set-function-length": {
|
||||||
|
"version": "1.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
|
||||||
|
"integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"define-data-property": "^1.1.1",
|
||||||
|
"get-intrinsic": "^1.2.1",
|
||||||
|
"gopd": "^1.0.1",
|
||||||
|
"has-property-descriptors": "^1.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/set-getter": {
|
"node_modules/set-getter": {
|
||||||
"version": "0.1.1",
|
"version": "0.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz",
|
||||||
|
@ -4351,66 +4255,17 @@
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/snapdragon/node_modules/is-accessor-descriptor": {
|
|
||||||
"version": "0.1.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
|
||||||
"integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"kind-of": "^3.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": {
|
|
||||||
"version": "3.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
|
||||||
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"is-buffer": "^1.1.5"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/snapdragon/node_modules/is-data-descriptor": {
|
|
||||||
"version": "0.1.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
|
||||||
"integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"kind-of": "^3.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": {
|
|
||||||
"version": "3.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
|
||||||
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"is-buffer": "^1.1.5"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/snapdragon/node_modules/is-descriptor": {
|
"node_modules/snapdragon/node_modules/is-descriptor": {
|
||||||
"version": "0.1.6",
|
"version": "0.1.7",
|
||||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
|
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
|
||||||
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
|
"integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"is-accessor-descriptor": "^0.1.6",
|
"is-accessor-descriptor": "^1.0.1",
|
||||||
"is-data-descriptor": "^0.1.4",
|
"is-data-descriptor": "^1.0.1"
|
||||||
"kind-of": "^5.0.0"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">= 0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/snapdragon/node_modules/source-map": {
|
"node_modules/snapdragon/node_modules/source-map": {
|
||||||
|
@ -4423,9 +4278,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/sortablejs": {
|
"node_modules/sortablejs": {
|
||||||
"version": "1.15.0",
|
"version": "1.15.1",
|
||||||
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.0.tgz",
|
"resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.1.tgz",
|
||||||
"integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w=="
|
"integrity": "sha512-P5Cjvb0UG1ZVNiDPj/n4V+DinttXG6K8n7vM/HQf0C25K3YKQTQY6fsr/sEGsJGpQ9exmPxluHxKBc0mLKU1lQ=="
|
||||||
},
|
},
|
||||||
"node_modules/sortify": {
|
"node_modules/sortify": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.4",
|
||||||
|
@ -4531,61 +4386,16 @@
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/static-extend/node_modules/is-accessor-descriptor": {
|
|
||||||
"version": "0.1.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
|
|
||||||
"integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==",
|
|
||||||
"dependencies": {
|
|
||||||
"kind-of": "^3.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": {
|
|
||||||
"version": "3.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
|
||||||
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
|
|
||||||
"dependencies": {
|
|
||||||
"is-buffer": "^1.1.5"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/static-extend/node_modules/is-data-descriptor": {
|
|
||||||
"version": "0.1.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
|
|
||||||
"integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==",
|
|
||||||
"dependencies": {
|
|
||||||
"kind-of": "^3.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": {
|
|
||||||
"version": "3.2.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
|
|
||||||
"integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
|
|
||||||
"dependencies": {
|
|
||||||
"is-buffer": "^1.1.5"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/static-extend/node_modules/is-descriptor": {
|
"node_modules/static-extend/node_modules/is-descriptor": {
|
||||||
"version": "0.1.6",
|
"version": "0.1.7",
|
||||||
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
|
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
|
||||||
"integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
|
"integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"is-accessor-descriptor": "^0.1.6",
|
"is-accessor-descriptor": "^1.0.1",
|
||||||
"is-data-descriptor": "^0.1.4",
|
"is-data-descriptor": "^1.0.1"
|
||||||
"kind-of": "^5.0.0"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">= 0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/statuses": {
|
"node_modules/statuses": {
|
||||||
|
@ -4859,6 +4669,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
|
||||||
"integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
|
"integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
|
||||||
},
|
},
|
||||||
|
"node_modules/undici-types": {
|
||||||
|
"version": "5.26.5",
|
||||||
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
|
||||||
|
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
|
||||||
|
},
|
||||||
"node_modules/union-value": {
|
"node_modules/union-value": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
|
||||||
|
|
|
@ -63,7 +63,7 @@
|
||||||
"requirejs-plugins": "^1.0.2",
|
"requirejs-plugins": "^1.0.2",
|
||||||
"scrypt-async": "1.2.0",
|
"scrypt-async": "1.2.0",
|
||||||
"sortablejs": "^1.6.0",
|
"sortablejs": "^1.6.0",
|
||||||
"drawio": "cryptpad/drawio-npm#npm",
|
"drawio": "github:cryptpad/drawio-npm#npm-21.8.2+4",
|
||||||
"pako": "^2.1.0",
|
"pako": "^2.1.0",
|
||||||
"x2js": "^3.4.4"
|
"x2js": "^3.4.4"
|
||||||
},
|
},
|
||||||
|
|
|
@ -50,5 +50,6 @@ Fse.rmSync(oldComponentsPath, { recursive: true, force: true });
|
||||||
].forEach(l => {
|
].forEach(l => {
|
||||||
const source = Path.join("node_modules", l);
|
const source = Path.join("node_modules", l);
|
||||||
const destination = Path.join(componentsPath, l);
|
const destination = Path.join(componentsPath, l);
|
||||||
|
Fs.rmSync(destination, { recursive: true, force: true });
|
||||||
Fs.cpSync(source, destination, { recursive: true });
|
Fs.cpSync(source, destination, { recursive: true });
|
||||||
});
|
});
|
||||||
|
|
23
www/common/inner/image-dialog.js
Normal file
23
www/common/inner/image-dialog.js
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
define([], function() {
|
||||||
|
|
||||||
|
const openImageDialog = function(common, integrationChannel, data, cb) {
|
||||||
|
if (integrationChannel) {
|
||||||
|
const handleImage = (_, image) => {
|
||||||
|
cb(image);
|
||||||
|
};
|
||||||
|
integrationChannel.query('Q_INTEGRATION_ON_INSERT_IMAGE', data, handleImage, {raw: true});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
common.openFilePicker({
|
||||||
|
types: ['file'],
|
||||||
|
where: ['root'],
|
||||||
|
filter: {
|
||||||
|
fileType: ['image/']
|
||||||
|
}
|
||||||
|
}, cb);
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
openImageDialog,
|
||||||
|
};
|
||||||
|
});
|
|
@ -88,6 +88,7 @@ define([
|
||||||
var state = STATE.DISCONNECTED;
|
var state = STATE.DISCONNECTED;
|
||||||
var firstConnection = true;
|
var firstConnection = true;
|
||||||
var integration;
|
var integration;
|
||||||
|
let integrationChannel;
|
||||||
|
|
||||||
var toolbarContainer = options.toolbarContainer ||
|
var toolbarContainer = options.toolbarContainer ||
|
||||||
(function () { throw new Error("toolbarContainer must be specified"); }());
|
(function () { throw new Error("toolbarContainer must be specified"); }());
|
||||||
|
@ -623,12 +624,12 @@ define([
|
||||||
|
|
||||||
if (privateDat.integration) {
|
if (privateDat.integration) {
|
||||||
common.openIntegrationChannel(onLocal);
|
common.openIntegrationChannel(onLocal);
|
||||||
var sframeChan = common.getSframeChannel();
|
integrationChannel = common.getSframeChannel();
|
||||||
var integrationSave = function (cb) {
|
var integrationSave = function (cb) {
|
||||||
var ext = privateDat.integrationConfig.fileType;
|
var ext = privateDat.integrationConfig.fileType;
|
||||||
|
|
||||||
var upload = Util.once(function (_blob) {
|
var upload = Util.once(function (_blob) {
|
||||||
sframeChan.query('Q_INTEGRATION_SAVE', {
|
integrationChannel.query('Q_INTEGRATION_SAVE', {
|
||||||
blob: _blob
|
blob: _blob
|
||||||
}, cb, {
|
}, cb, {
|
||||||
raw: true
|
raw: true
|
||||||
|
@ -645,7 +646,7 @@ define([
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const integrationHasUnsavedChanges = function(unsavedChanges, cb) {
|
const integrationHasUnsavedChanges = function(unsavedChanges, cb) {
|
||||||
sframeChan.query('Q_INTEGRATION_HAS_UNSAVED_CHANGES', unsavedChanges, cb);
|
integrationChannel.query('Q_INTEGRATION_HAS_UNSAVED_CHANGES', unsavedChanges, cb);
|
||||||
};
|
};
|
||||||
var inte = common.createIntegration(onLocal, cpNfInner.chainpad,
|
var inte = common.createIntegration(onLocal, cpNfInner.chainpad,
|
||||||
integrationSave, integrationHasUnsavedChanges);
|
integrationSave, integrationHasUnsavedChanges);
|
||||||
|
@ -656,7 +657,7 @@ define([
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (firstConnection) {
|
if (firstConnection) {
|
||||||
sframeChan.on('Q_INTEGRATION_NEEDSAVE', function (data, cb) {
|
integrationChannel.on('Q_INTEGRATION_NEEDSAVE', function (data, cb) {
|
||||||
integrationSave(function (obj) {
|
integrationSave(function (obj) {
|
||||||
if (obj && obj.error) { console.error(obj.error); }
|
if (obj && obj.error) { console.error(obj.error); }
|
||||||
cb();
|
cb();
|
||||||
|
@ -1124,9 +1125,18 @@ define([
|
||||||
// Call this after all of the handlers are setup.
|
// Call this after all of the handlers are setup.
|
||||||
start: evStart.fire,
|
start: evStart.fire,
|
||||||
|
|
||||||
|
// Call this, when the user wants to add an image from drive.
|
||||||
|
insertImage: function(data, cb) {
|
||||||
|
require(['/common/inner/image-dialog.js'], function(imageDialog) {
|
||||||
|
imageDialog.openImageDialog(common, integrationChannel, data, cb);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
// Determine the internal state of the framework.
|
// Determine the internal state of the framework.
|
||||||
getState: function () { return state; },
|
getState: function () { return state; },
|
||||||
|
|
||||||
|
isIntegrated: function() { return cpNfInner.metadataMgr.getPrivateData().integration; },
|
||||||
|
|
||||||
// Internals
|
// Internals
|
||||||
_: {
|
_: {
|
||||||
sfCommon: common,
|
sfCommon: common,
|
||||||
|
|
|
@ -96,6 +96,7 @@ define([
|
||||||
var data = {};
|
var data = {};
|
||||||
|
|
||||||
data.name = file.metadata.name;
|
data.name = file.metadata.name;
|
||||||
|
data.fileType = file.metadata.type;
|
||||||
data.url = href;
|
data.url = href;
|
||||||
data.password = file.password;
|
data.password = file.password;
|
||||||
if (file.metadata.type.slice(0,6) === 'image/') {
|
if (file.metadata.type.slice(0,6) === 'image/') {
|
||||||
|
|
|
@ -2081,6 +2081,11 @@ define([
|
||||||
cfg.integrationUtils.onHasUnsavedChanges(obj, cb);
|
cfg.integrationUtils.onHasUnsavedChanges(obj, cb);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
sframeChan.on('Q_INTEGRATION_ON_INSERT_IMAGE', function (data, cb) {
|
||||||
|
if (cfg.integrationUtils && cfg.integrationUtils.onInsertImage) {
|
||||||
|
cfg.integrationUtils.onInsertImage(data, cb);
|
||||||
|
}
|
||||||
|
});
|
||||||
integrationSave = function (cb) {
|
integrationSave = function (cb) {
|
||||||
sframeChan.query('Q_INTEGRATION_NEEDSAVE', null, cb);
|
sframeChan.query('Q_INTEGRATION_NEEDSAVE', null, cb);
|
||||||
};
|
};
|
||||||
|
|
|
@ -166,6 +166,9 @@
|
||||||
config.events.onHasUnsavedChanges(unsavedChanges);
|
config.events.onHasUnsavedChanges(unsavedChanges);
|
||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
|
chan.on('ON_INSERT_IMAGE', function(data, cb) {
|
||||||
|
config.events.onInsertImage(data, cb);
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -184,6 +187,7 @@
|
||||||
* @param {object} config.events Event handlers.
|
* @param {object} config.events Event handlers.
|
||||||
* @param {function} events.onSave (blob, callback) The save function to store the document when edited.
|
* @param {function} events.onSave (blob, callback) The save function to store the document when edited.
|
||||||
* @param {function} events.onNewKey (data, callback) The function called when a new key is used.
|
* @param {function} events.onNewKey (data, callback) The function called when a new key is used.
|
||||||
|
* @param {function} events.onInsertImage (data, callback) The function called the user wants to add an image.
|
||||||
* @param {string} config.documentType The editor to load in CryptPad.
|
* @param {string} config.documentType The editor to load in CryptPad.
|
||||||
* @return {promise}
|
* @return {promise}
|
||||||
*/
|
*/
|
||||||
|
@ -206,7 +210,7 @@
|
||||||
if (!config) { return reject('Missing args: no data provided'); }
|
if (!config) { return reject('Missing args: no data provided'); }
|
||||||
if(['document.url', 'document.fileType', 'documentType',
|
if(['document.url', 'document.fileType', 'documentType',
|
||||||
'events.onSave', 'events.onHasUnsavedChanges',
|
'events.onSave', 'events.onHasUnsavedChanges',
|
||||||
'events.onNewKey'].some(function (k) {
|
'events.onNewKey', 'events.onInsertImage'].some(function (k) {
|
||||||
var s = k.split('.');
|
var s = k.split('.');
|
||||||
var c = config;
|
var c = config;
|
||||||
return s.some(function (key) {
|
return s.some(function (key) {
|
||||||
|
|
|
@ -4,15 +4,92 @@
|
||||||
|
|
||||||
define([
|
define([
|
||||||
'/components/x2js/x2js.js',
|
'/components/x2js/x2js.js',
|
||||||
|
'/diagram/util.js',
|
||||||
], function (
|
], function (
|
||||||
X2JS) {
|
X2JS,
|
||||||
|
DiagramUtil
|
||||||
|
) {
|
||||||
const x2js = new X2JS();
|
const x2js = new X2JS();
|
||||||
const jsonContentAsXML = (content) => x2js.js2xml(content);
|
const jsonContentAsXML = (content) => x2js.js2xml(content);
|
||||||
|
|
||||||
|
const parseDrawioStyle = (styleAttrValue) => {
|
||||||
|
if (!styleAttrValue) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = {};
|
||||||
|
for (const part of styleAttrValue.split(';')) {
|
||||||
|
const s = part.split(/=(.*)/);
|
||||||
|
result[s[0]] = s[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
const stringifyDrawioStyle = (styleAttrValue) => {
|
||||||
|
const parts = [];
|
||||||
|
for (const [key, value] of Object.entries(styleAttrValue)) {
|
||||||
|
parts.push(`${key}=${value}`);
|
||||||
|
}
|
||||||
|
return parts.join(';');
|
||||||
|
};
|
||||||
|
|
||||||
|
const blobToImage = (blob) => {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onloadend = function() {
|
||||||
|
resolve(reader.result);
|
||||||
|
};
|
||||||
|
reader.readAsDataURL(blob);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const loadImage = (url) => {
|
||||||
|
return DiagramUtil.loadImage(url).then((blob) => blobToImage(blob));
|
||||||
|
};
|
||||||
|
|
||||||
|
const loadCryptPadImages = (doc) => {
|
||||||
|
return Array.from(doc .querySelectorAll('mxCell'))
|
||||||
|
.map((element) => [element, parseDrawioStyle(element.getAttribute('style'))])
|
||||||
|
.filter(([element, style]) => style && style.image && style.image.startsWith('cryptpad://'))
|
||||||
|
.map(([element, style]) => {
|
||||||
|
return loadImage(style.image)
|
||||||
|
.then((dataUrl) => {
|
||||||
|
style.image = dataUrl.replace(';base64', ''); // ';' breaks draw.ios style format
|
||||||
|
element.setAttribute('style', stringifyDrawioStyle(style));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const parseXML = (xmlStr) => {
|
||||||
|
const parser = new DOMParser();
|
||||||
|
const doc = parser.parseFromString(xmlStr, "application/xml");
|
||||||
|
const errorNode = doc.querySelector("parsererror");
|
||||||
|
if (errorNode) {
|
||||||
|
throw Error("error while parsing " + errorNode);
|
||||||
|
}
|
||||||
|
return doc;
|
||||||
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
main: function(userDoc, cb) {
|
main: function(userDoc, cb) {
|
||||||
delete userDoc.metadata;
|
delete userDoc.metadata;
|
||||||
cb(jsonContentAsXML(userDoc), '.drawio');
|
|
||||||
|
const xml = jsonContentAsXML(userDoc);
|
||||||
|
|
||||||
|
let doc;
|
||||||
|
try {
|
||||||
|
doc = parseXML(xml);
|
||||||
|
} catch(e) {
|
||||||
|
console.error(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const promises = loadCryptPadImages(doc);
|
||||||
|
|
||||||
|
Promise.all(promises).then(() => {
|
||||||
|
cb(new XMLSerializer().serializeToString(doc), '.drawio');
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
|
@ -8,6 +8,7 @@ define([
|
||||||
'/customize/messages.js', // translation keys
|
'/customize/messages.js', // translation keys
|
||||||
'/components/pako/dist/pako.min.js',
|
'/components/pako/dist/pako.min.js',
|
||||||
'/components/x2js/x2js.js',
|
'/components/x2js/x2js.js',
|
||||||
|
'/diagram/util.js',
|
||||||
'/components/tweetnacl/nacl-fast.min.js',
|
'/components/tweetnacl/nacl-fast.min.js',
|
||||||
'less!/diagram/app-diagram.less',
|
'less!/diagram/app-diagram.less',
|
||||||
'css!/diagram/drawio.css',
|
'css!/diagram/drawio.css',
|
||||||
|
@ -15,8 +16,11 @@ define([
|
||||||
Framework,
|
Framework,
|
||||||
Messages,
|
Messages,
|
||||||
pako,
|
pako,
|
||||||
X2JS) {
|
X2JS,
|
||||||
|
DiagramUtil
|
||||||
|
) {
|
||||||
const Nacl = window.nacl;
|
const Nacl = window.nacl;
|
||||||
|
const APP = window.APP = {};
|
||||||
|
|
||||||
// As described here: https://drawio-app.com/extracting-the-xml-from-mxfiles/
|
// As described here: https://drawio-app.com/extracting-the-xml-from-mxfiles/
|
||||||
const decompressDrawioXml = function(xmlDocStr) {
|
const decompressDrawioXml = function(xmlDocStr) {
|
||||||
|
@ -125,6 +129,21 @@ define([
|
||||||
autosave: onDrawioAutosave,
|
autosave: onDrawioAutosave,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
APP.loadImage = DiagramUtil.loadImage;
|
||||||
|
APP.addImage = function() {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
framework.insertImage({}, (imageData) => {
|
||||||
|
if (imageData.blob) {
|
||||||
|
resolve(imageData.blob);
|
||||||
|
} else if (imageData.url) {
|
||||||
|
resolve(imageData.url);
|
||||||
|
} else {
|
||||||
|
resolve(DiagramUtil.getCryptPadUrl(imageData.src, imageData.key, imageData.fileType));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
// This is the function from which you will receive updates from CryptPad
|
// This is the function from which you will receive updates from CryptPad
|
||||||
framework.onContentUpdate(function (newContent) {
|
framework.onContentUpdate(function (newContent) {
|
||||||
lastContent = newContent;
|
lastContent = newContent;
|
||||||
|
@ -151,9 +170,13 @@ define([
|
||||||
|
|
||||||
framework.setFileExporter(
|
framework.setFileExporter(
|
||||||
'.drawio',
|
'.drawio',
|
||||||
() => {
|
(cb) => {
|
||||||
return new Blob([jsonContentAsXML(lastContent)], {type: 'application/x-drawio'});
|
require(['/diagram/export.js'], (exporter) => {
|
||||||
}
|
exporter.main(lastContent, (xml) => {
|
||||||
|
cb(new Blob([xml], {type: 'application/x-drawio'}));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}, true
|
||||||
);
|
);
|
||||||
|
|
||||||
framework.onEditableChange(function () {
|
framework.onEditableChange(function () {
|
||||||
|
@ -170,13 +193,12 @@ define([
|
||||||
|
|
||||||
drawioFrame.src = '/components/drawio/src/main/webapp/index.html?'
|
drawioFrame.src = '/components/drawio/src/main/webapp/index.html?'
|
||||||
+ new URLSearchParams({
|
+ new URLSearchParams({
|
||||||
// pages: 0,
|
|
||||||
// dev: 1,
|
|
||||||
test: 1,
|
test: 1,
|
||||||
stealth: 1,
|
stealth: 1,
|
||||||
embed: 1,
|
embed: 1,
|
||||||
drafts: 0,
|
drafts: 0,
|
||||||
plugins: 0,
|
p: 'cryptpad',
|
||||||
|
integrated: framework.isIntegrated() ? 'true' : 'false',
|
||||||
|
|
||||||
chrome: framework.isReadOnly() ? 0 : 1,
|
chrome: framework.isReadOnly() ? 0 : 1,
|
||||||
dark: window.CryptPad_theme === "dark" ? 1 : 0,
|
dark: window.CryptPad_theme === "dark" ? 1 : 0,
|
||||||
|
@ -185,6 +207,10 @@ define([
|
||||||
noSaveBtn: 1,
|
noSaveBtn: 1,
|
||||||
saveAndExit: 0,
|
saveAndExit: 0,
|
||||||
noExitBtn: 1,
|
noExitBtn: 1,
|
||||||
|
browser: 0,
|
||||||
|
|
||||||
|
noDevice: 1,
|
||||||
|
filesupport: 0,
|
||||||
|
|
||||||
modified: 'unsavedChanges',
|
modified: 'unsavedChanges',
|
||||||
proto: 'json',
|
proto: 'json',
|
||||||
|
|
66
www/diagram/util.js
Normal file
66
www/diagram/util.js
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
define([
|
||||||
|
'/common/common-util.js',
|
||||||
|
'/file/file-crypto.js',
|
||||||
|
'/common/outer/cache-store.js',
|
||||||
|
], function (
|
||||||
|
Util,
|
||||||
|
FileCrypto,
|
||||||
|
Cache
|
||||||
|
) {
|
||||||
|
const Nacl = window.nacl;
|
||||||
|
|
||||||
|
const parseCryptPadUrl = function(href) {
|
||||||
|
const url = new URL(href);
|
||||||
|
const protocol = url.searchParams.get('protocol');
|
||||||
|
const key = url.hash.substring(1); // remove leading '#'
|
||||||
|
const type = url.searchParams.get('type');
|
||||||
|
url.search = '';
|
||||||
|
url.hash = '';
|
||||||
|
return { src: url.href.replace(/cryptpad?:\/\//, `${protocol}//`), key, type };
|
||||||
|
};
|
||||||
|
|
||||||
|
const getCryptPadUrl = function(src, key, type) {
|
||||||
|
const url = new URL(src);
|
||||||
|
const params = new URLSearchParams();
|
||||||
|
params.set('type', type);
|
||||||
|
params.set('protocol', url.protocol);
|
||||||
|
url.search = params.toString();
|
||||||
|
url.hash = key;
|
||||||
|
return url.href.replace(/https?:\/\//, 'cryptpad://');
|
||||||
|
};
|
||||||
|
|
||||||
|
const setBlobType = (blob, mimeType) => {
|
||||||
|
const fixedBlob = new Blob([blob], {type: mimeType});
|
||||||
|
return fixedBlob;
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
parseCryptPadUrl,
|
||||||
|
getCryptPadUrl,
|
||||||
|
|
||||||
|
loadImage: function(href) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const { src, key, type } = parseCryptPadUrl(href);
|
||||||
|
Util.fetch(src, function (err, u8) {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
return void reject(err);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
FileCrypto.decrypt(u8, Nacl.util.decodeBase64(key), (err, res) => {
|
||||||
|
if (err || !res.content) {
|
||||||
|
console.error("Decrypting failed");
|
||||||
|
return void reject(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve(setBlobType(res.content, type));
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
}, void 0, Cache);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
|
@ -14,7 +14,7 @@ define([
|
||||||
console.warn('INIT');
|
console.warn('INIT');
|
||||||
var p = window.parent;
|
var p = window.parent;
|
||||||
var txid = getTxid();
|
var txid = getTxid();
|
||||||
p.postMessage(JSON.stringify({ q: 'INTEGRATION_READY', txid: txid }), '*');
|
p.postMessage({ q: 'INTEGRATION_READY', txid: txid }, '*');
|
||||||
|
|
||||||
var makeChan = function () {
|
var makeChan = function () {
|
||||||
var handlers = {};
|
var handlers = {};
|
||||||
|
@ -38,6 +38,7 @@ define([
|
||||||
|
|
||||||
// On new command
|
// On new command
|
||||||
var msg = data.msg;
|
var msg = data.msg;
|
||||||
|
if (!msg) { return; }
|
||||||
var txid = data.txid;
|
var txid = data.txid;
|
||||||
if (commands[msg.q]) {
|
if (commands[msg.q]) {
|
||||||
commands[msg.q](msg.data, function (args) {
|
commands[msg.q](msg.data, function (args) {
|
||||||
|
@ -122,6 +123,9 @@ define([
|
||||||
var onHasUnsavedChanges = function (unsavedChanges, cb) {
|
var onHasUnsavedChanges = function (unsavedChanges, cb) {
|
||||||
chan.send('HAS_UNSAVED_CHANGES', unsavedChanges, cb);
|
chan.send('HAS_UNSAVED_CHANGES', unsavedChanges, cb);
|
||||||
};
|
};
|
||||||
|
var onInsertImage = function (data, cb) {
|
||||||
|
chan.send('ON_INSERT_IMAGE', data, cb);
|
||||||
|
};
|
||||||
|
|
||||||
chan.on('START', function (data) {
|
chan.on('START', function (data) {
|
||||||
console.warn('INNER START', data);
|
console.warn('INNER START', data);
|
||||||
|
@ -139,7 +143,8 @@ define([
|
||||||
utils: {
|
utils: {
|
||||||
save: save,
|
save: save,
|
||||||
reload: reload,
|
reload: reload,
|
||||||
onHasUnsavedChanges: onHasUnsavedChanges
|
onHasUnsavedChanges: onHasUnsavedChanges,
|
||||||
|
onInsertImage: onInsertImage
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
require(['/common/sframe-app-outer.js'], function () {
|
require(['/common/sframe-app-outer.js'], function () {
|
||||||
|
|
|
@ -121,6 +121,7 @@ define([
|
||||||
var key = Hash.encodeBase64(secret.keys.cryptKey);
|
var key = Hash.encodeBase64(secret.keys.cryptKey);
|
||||||
sframeChan.event("EV_SECURE_ACTION", {
|
sframeChan.event("EV_SECURE_ACTION", {
|
||||||
type: parsed.type,
|
type: parsed.type,
|
||||||
|
fileType: data.fileType,
|
||||||
href: data.url,
|
href: data.url,
|
||||||
src: src,
|
src: src,
|
||||||
name: data.name,
|
name: data.name,
|
||||||
|
@ -234,7 +235,7 @@ define([
|
||||||
if (data.static) { $span.attr('title', Util.fixHTML(data.href)); }
|
if (data.static) { $span.attr('title', Util.fixHTML(data.href)); }
|
||||||
$span.click(function () {
|
$span.click(function () {
|
||||||
if (typeof onFilePicked === "function") {
|
if (typeof onFilePicked === "function") {
|
||||||
onFilePicked({url: data.href, name: name, static: data.static, password: data.password});
|
onFilePicked({url: data.href, name: name, static: data.static, password: data.password, fileType: data.fileType});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue