Update to SVR.JS 3.14.4
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 9.4 KiB |
Before Width: | Height: | Size: 6.8 KiB After Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 8 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 4 KiB After Width: | Height: | Size: 9.8 KiB |
Before Width: | Height: | Size: 8.9 KiB After Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 7 KiB After Width: | Height: | Size: 7 KiB |
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 9.8 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 6.5 KiB |
|
@ -3,7 +3,7 @@
|
||||||
"port": 80,
|
"port": 80,
|
||||||
"pubport": 80,
|
"pubport": 80,
|
||||||
"page404": "404.html",
|
"page404": "404.html",
|
||||||
"timestamp": 1701600932028,
|
"timestamp": 1709477722479,
|
||||||
"blacklist": [],
|
"blacklist": [],
|
||||||
"nonStandardCodes": [],
|
"nonStandardCodes": [],
|
||||||
"enableCompression": true,
|
"enableCompression": true,
|
||||||
|
@ -58,5 +58,6 @@
|
||||||
"useWebRootServerSideScript": true,
|
"useWebRootServerSideScript": true,
|
||||||
"exposeModsInErrorPages": true,
|
"exposeModsInErrorPages": true,
|
||||||
"disableTrailingSlashRedirects": false,
|
"disableTrailingSlashRedirects": false,
|
||||||
"environmentVariables": {}
|
"environmentVariables": {},
|
||||||
|
"allowDoubleSlashes": false
|
||||||
}
|
}
|
||||||
|
|
155
index.html
|
@ -1,7 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>SVR.JS 3.14.3</title>
|
<title>SVR.JS 3.14.4</title>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<style>
|
<style>
|
||||||
|
@ -12,89 +12,90 @@
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>Welcome to SVR.JS 3.14.3</h1>
|
<h1>Welcome to SVR.JS 3.14.4</h1>
|
||||||
<br/>
|
<br/>
|
||||||
<img src="/logo.png" style="width: 256px;" />
|
<img src="/logo.png" style="width: 256px; max-width: 100%;" />
|
||||||
<br/>
|
<br/>
|
||||||
<p>If you see this page that means that the server is working properly. You can further configure the server and replace <i>index.html</i> and <i>tests.html</i> pages with custom ones.</p>
|
<p>If you see this page that means that the server is working properly. You can further configure the server and replace <i>index.html</i> and <i>tests.html</i> pages with custom ones.</p>
|
||||||
<p>Default <i>config.json</i> looks like this:</p>
|
<p>Default <i>config.json</i> looks like this:</p>
|
||||||
<div style="background-color: #e0e0e0; padding: 5px; text-align: left; display: inline-block;">
|
<code style="background-color: #e0e0e0; padding: 5px; text-align: left; display: block; display: inline-block;">
|
||||||
<code>
|
<pre style="margin: 0.2em; white-space: pre-wrap; overflow-wrap: break-word; word-wrap: break-word; word-break: break-all; word-break: break-word">{
|
||||||
{<br/>
|
"users": [],
|
||||||
"users": [],<br/>
|
"port": 80,
|
||||||
"port": 80,<br/>
|
"pubport": 80,
|
||||||
"pubport": 80,<br/>
|
"page404": "404.html",
|
||||||
"page404": "404.html",<br/>
|
"timestamp": 1709477722479,
|
||||||
"timestamp": 1701600932028,<br/>
|
"blacklist": [],
|
||||||
"blacklist": [],<br/>
|
"nonStandardCodes": [],
|
||||||
"nonStandardCodes": [],<br/>
|
"enableCompression": true,
|
||||||
"enableCompression": true,<br/>
|
"customHeaders": {},
|
||||||
"customHeaders": {},<br/>
|
"enableHTTP2": false,
|
||||||
"enableHTTP2": false,<br/>
|
"enableLogging": true,
|
||||||
"enableLogging": true,<br/>
|
"enableDirectoryListing": true,
|
||||||
"enableDirectoryListing": true,<br/>
|
"enableDirectoryListingWithDefaultHead": false,
|
||||||
"enableDirectoryListingWithDefaultHead": false,<br/>
|
"serverAdministratorEmail": "[no contact information]",
|
||||||
"serverAdministratorEmail": "[no contact information]",<br/>
|
"stackHidden": false,
|
||||||
"stackHidden": false,<br/>
|
"enableRemoteLogBrowsing": false,
|
||||||
"enableRemoteLogBrowsing": false,<br/>
|
"exposeServerVersion": true,
|
||||||
"exposeServerVersion": true,<br/>
|
"disableServerSideScriptExpose": true,
|
||||||
"disableServerSideScriptExpose": true,<br/>
|
"rewriteMap": [
|
||||||
"rewriteMap": [<br/>
|
{
|
||||||
{<br/>
|
"definingRegex": "/^\\/serverSideScript\\.js(?:$|[#?])/",
|
||||||
"definingRegex": "/^\\/serverSideScript\\.js(?:$|[#?])/",<br/>
|
"replacements": [
|
||||||
"replacements": [<br/>
|
{
|
||||||
{<br/>
|
"regex": "/^\\/serverSideScript\\.js($|[#?])/",
|
||||||
"regex": "/^\\/serverSideScript\\.js($|[#?])/",<br/>
|
"replacement": "/NONEXISTENT_PAGE$1"
|
||||||
"replacement": "/NONEXISTENT_PAGE$1"<br/>
|
|
||||||
}<br/>
|
|
||||||
]<br/>
|
|
||||||
},<br/>
|
|
||||||
{<br/>
|
|
||||||
"definingRegex": "/^\\/testdir_rewritten(?:$|[\\/?#])/",<br/>
|
|
||||||
"replacements": [<br/>
|
|
||||||
{<br/>
|
|
||||||
"regex": "/^\\/testdir_rewritten($|[\\/?#])/",<br/>
|
|
||||||
"replacement": "/testdir$1"<br/>
|
|
||||||
}<br/>
|
|
||||||
]<br/>
|
|
||||||
}<br/>
|
|
||||||
],<br/>
|
|
||||||
"allowStatus": true,<br/>
|
|
||||||
"dontCompress": [<br/>
|
|
||||||
"/.*\\.ipxe$/",<br/>
|
|
||||||
"/.*\\.img$/",<br/>
|
|
||||||
"/.*\\.iso$/",<br/>
|
|
||||||
"/.*\\.png$/",<br/>
|
|
||||||
"/.*\\.jpg$/",<br/>
|
|
||||||
"/.*\\.webp$/"<br/>
|
|
||||||
],<br/>
|
|
||||||
"enableIPSpoofing": false,<br/>
|
|
||||||
"secure": false,<br/>
|
|
||||||
"sni": {},<br/>
|
|
||||||
"disableNonEncryptedServer": false,<br/>
|
|
||||||
"disableToHTTPSRedirect": false,<br/>
|
|
||||||
"enableETag": true,<br/>
|
|
||||||
"disableUnusedWorkerTermination": false,<br/>
|
|
||||||
"rewriteDirtyURLs": true,<br/>
|
|
||||||
"errorPages": [],<br/>
|
|
||||||
"useWebRootServerSideScript": true,<br/>
|
|
||||||
"exposeModsInErrorPages": true,<br/>
|
|
||||||
"disableTrailingSlashRedirects": false,<br/>
|
|
||||||
"environmentVariables": {}<br/>
|
|
||||||
}
|
}
|
||||||
</code>
|
]
|
||||||
</div>
|
},
|
||||||
|
{
|
||||||
|
"definingRegex": "/^\\/testdir_rewritten(?:$|[\\/?#])/",
|
||||||
|
"replacements": [
|
||||||
|
{
|
||||||
|
"regex": "/^\\/testdir_rewritten($|[\\/?#])/",
|
||||||
|
"replacement": "/testdir$1"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"allowStatus": true,
|
||||||
|
"dontCompress": [
|
||||||
|
"/.*\\.ipxe$/",
|
||||||
|
"/.*\\.img$/",
|
||||||
|
"/.*\\.iso$/",
|
||||||
|
"/.*\\.png$/",
|
||||||
|
"/.*\\.jpg$/",
|
||||||
|
"/.*\\.webp$/"
|
||||||
|
],
|
||||||
|
"enableIPSpoofing": false,
|
||||||
|
"secure": false,
|
||||||
|
"sni": {},
|
||||||
|
"disableNonEncryptedServer": false,
|
||||||
|
"disableToHTTPSRedirect": false,
|
||||||
|
"enableETag": true,
|
||||||
|
"disableUnusedWorkerTermination": false,
|
||||||
|
"rewriteDirtyURLs": true,
|
||||||
|
"errorPages": [],
|
||||||
|
"useWebRootServerSideScript": true,
|
||||||
|
"exposeModsInErrorPages": true,
|
||||||
|
"disableTrailingSlashRedirects": false,
|
||||||
|
"environmentVariables": {},
|
||||||
|
"allowDoubleSlashes": false
|
||||||
|
}</pre>
|
||||||
|
</code>
|
||||||
<p>Changes:</p>
|
<p>Changes:</p>
|
||||||
<ul>
|
<ul style="display: inline-block; margin: 0;">
|
||||||
<li>Fixed bug with URLs beginning with multiple slashes being rewritten incorrectly.</li>
|
<li>Updated <i>tar</i> and <i>graceful-fs</i> libraries.</li>
|
||||||
|
<li>Added support for URLs with double slashes.</li>
|
||||||
|
<li>Rewritten HTTP to HTTPS redirect functionality.</li>
|
||||||
|
<li>Changed default directory listing icons.</li>
|
||||||
</ul>
|
</ul>
|
||||||
<br/>
|
<p>
|
||||||
<a href="/tests.html">Tests</a><br/>
|
<a href="/tests.html">Tests</a><br/>
|
||||||
<a href="/licenses">Licenses</a><br/>
|
<a href="/licenses/">Licenses</a><br/>
|
||||||
<a href="/svrjsstatus.svr">SVR.JS status page</a><br/>
|
<a href="/svrjsstatus.svr">SVR.JS status page</a><br/>
|
||||||
<a href="https://svrjs.org/docs">More Information</a>
|
<a href="https://svrjs.org/docs">SVR.JS documentation</a>
|
||||||
<br/>
|
</p>
|
||||||
<br/>
|
|
||||||
<img src="/powered.png" />
|
<img src="/powered.png" />
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,347 +1,349 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>SVR.JS 3.14.3 Licenses</title>
|
<title>SVR.JS 3.14.4 Licenses</title>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<style>
|
<style>
|
||||||
body {
|
body {
|
||||||
font-family: FreeSans, Helvetica, Tahoma, Arial, sans-serif;
|
font-family: FreeSans, Helvetica, Tahoma, Arial, sans-serif;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>SVR.JS 3.14.3 Licenses</h1>
|
<h1>SVR.JS 3.14.4 Licenses</h1>
|
||||||
<h2>SVR.JS 3.14.3</h2>
|
<h2>SVR.JS 3.14.4</h2>
|
||||||
<div style="display: inline-block; text-align: left; border-width: 2px; border-style: solid; border-color: gray; padding: 8px;">
|
<div style="display: inline-block; text-align: left; border-width: 2px; border-style: solid; border-color: gray; padding: 8px;">
|
||||||
MIT License<br/>
|
MIT License<br/>
|
||||||
<br/>
|
<br/>
|
||||||
Copyright (c) 2018-2024 SVR.JS<br/>
|
Copyright (c) 2018-2024 SVR.JS<br/>
|
||||||
<br/>
|
<br/>
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy<br/>
|
Permission is hereby granted, free of charge, to any person obtaining a copy<br/>
|
||||||
of this software and associated documentation files (the "Software"), to deal<br/>
|
of this software and associated documentation files (the "Software"), to deal<br/>
|
||||||
in the Software without restriction, including without limitation the rights<br/>
|
in the Software without restriction, including without limitation the rights<br/>
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br/>
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br/>
|
||||||
copies of the Software, and to permit persons to whom the Software is<br/>
|
copies of the Software, and to permit persons to whom the Software is<br/>
|
||||||
furnished to do so, subject to the following conditions:<br/>
|
furnished to do so, subject to the following conditions:<br/>
|
||||||
<br/>
|
<br/>
|
||||||
The above copyright notice and this permission notice shall be included in all<br/>
|
The above copyright notice and this permission notice shall be included in all<br/>
|
||||||
copies or substantial portions of the Software.<br/>
|
copies or substantial portions of the Software.<br/>
|
||||||
<br/>
|
<br/>
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br/>
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br/>
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br/>
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br/>
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br/>
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br/>
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br/>
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br/>
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br/>
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br/>
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<br/>
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE<br/>
|
||||||
SOFTWARE.<br/>
|
SOFTWARE.<br/>
|
||||||
</div>
|
</div>
|
||||||
<h2>Packages used by SVR.JS 3.14.3</h2>
|
<h2>Packages used by SVR.JS 3.14.4</h2>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
<div style="width: 100%; max-width: 1280px; margin: auto">
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/asap.txt"><b>asap</b></a>
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/asap.txt"><b>asap</b></a>
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
High-priority task queue for Node.js and browsers
|
<div style="font-size: 12px;">
|
||||||
</div>
|
High-priority task queue for Node.js and browsers
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/asn1.js.txt"><b>asn1.js</b></a> (by Fedor Indutny)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/asn1.js.txt"><b>asn1.js</b></a> (by Fedor Indutny)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
ASN.1 encoder and decoder
|
<div style="font-size: 12px;">
|
||||||
</div>
|
ASN.1 encoder and decoder
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/asn1.js-rfc2560.txt"><b>asn1.js-rfc2560</b></a> (by Fedor Indutny)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/asn1.js-rfc2560.txt"><b>asn1.js-rfc2560</b></a> (by Fedor Indutny)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
RFC2560 structures for asn1.js
|
<div style="font-size: 12px;">
|
||||||
</div>
|
RFC2560 structures for asn1.js
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/asn1.js-rfc5280.txt"><b>asn1.js-rfc5280</b></a> (by Felix Hanley)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/asn1.js-rfc5280.txt"><b>asn1.js-rfc5280</b></a> (by Felix Hanley)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
RFC5280 extension structures for asn1.js
|
<div style="font-size: 12px;">
|
||||||
</div>
|
RFC5280 extension structures for asn1.js
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/async.txt"><b>async</b></a> (by Caolan McMahon)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/async.txt"><b>async</b></a> (by Caolan McMahon)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Higher-order functions and common patterns for asynchronous code
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Higher-order functions and common patterns for asynchronous code
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/bn.js.txt"><b>bn.js</b></a> (by Fedor Indutny)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/bn.js.txt"><b>bn.js</b></a> (by Fedor Indutny)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Big number implementation in pure javascript
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Big number implementation in pure javascript
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/call-bind.txt"><b>call-bind</b></a> (by Jordan Harband)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/call-bind.txt"><b>call-bind</b></a> (by Jordan Harband)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Robustly `.call.bind()` a function
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Robustly `.call.bind()` a function
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: ISC</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: ISC</div>
|
||||||
<a href="/licenses/chownr.txt"><b>chownr</b></a> (by Isaac Z. Schlueter)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/chownr.txt"><b>chownr</b></a> (by Isaac Z. Schlueter)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
like `chown -R`
|
<div style="font-size: 12px;">
|
||||||
</div>
|
like `chown -R`
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: ISC</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: ISC</div>
|
||||||
<a href="/licenses/dezalgo.txt"><b>dezalgo</b></a> (by Isaac Z. Schlueter)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/dezalgo.txt"><b>dezalgo</b></a> (by Isaac Z. Schlueter)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Contain async insanity so that the dark pony lord doesn't eat souls
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Contain async insanity so that the dark pony lord doesn't eat souls
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/formidable.txt"><b>formidable</b></a>
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/formidable.txt"><b>formidable</b></a>
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
A node.js module for parsing form data, especially file uploads.<br/>
|
<div style="font-size: 12px;">
|
||||||
<b>Required by SVR.JS</b>
|
A node.js module for parsing form data, especially file uploads.<br/>
|
||||||
</div>
|
<b>Required by SVR.JS</b>
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: ISC</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: ISC</div>
|
||||||
<a href="/licenses/fs-minipass.txt"><b>fs-minipass</b></a> (by Isaac Z. Schlueter)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/fs-minipass.txt"><b>fs-minipass</b></a> (by Isaac Z. Schlueter)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
fs read and write streams based on minipass<br/>
|
<div style="font-size: 12px;">
|
||||||
<b>Patched to work with Bun</b>
|
fs read and write streams based on minipass<br/>
|
||||||
</div>
|
<b>Patched to work with Bun</b>
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/function-bind.txt"><b>function-bind</b></a> (by Raynos)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/function-bind.txt"><b>function-bind</b></a> (by Raynos)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Implementation of Function.prototype.bind
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Implementation of Function.prototype.bind
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/get-intrinsic.txt"><b>get-intrinsic</b></a> (by Jordan Harband)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/get-intrinsic.txt"><b>get-intrinsic</b></a> (by Jordan Harband)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Get and robustly cache all JS language-level intrinsics at first require time
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Get and robustly cache all JS language-level intrinsics at first require time
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: ISC</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: ISC</div>
|
||||||
<a href="/licenses/graceful-fs.txt"><b>graceful-fs</b></a>
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/graceful-fs.txt"><b>graceful-fs</b></a>
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
A drop-in replacement for fs, making various improvements.<br/>
|
<div style="font-size: 12px;">
|
||||||
<b>Required by SVR.JS.</b>
|
A drop-in replacement for fs, making various improvements.<br/>
|
||||||
</div>
|
<b>Required by SVR.JS.</b>
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/has.txt"><b>has</b></a> (by Thiago de Arruda)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/has.txt"><b>has</b></a> (by Thiago de Arruda)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Object.prototype.hasOwnProperty.call shortcut
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Object.prototype.hasOwnProperty.call shortcut
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/has-symbols.txt"><b>has-symbols</b></a> (by Jordan Harband)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/has-symbols.txt"><b>has-symbols</b></a> (by Jordan Harband)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Determine if the JS environment has Symbol support. Supports spec, or shams.
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Determine if the JS environment has Symbol support. Supports spec, or shams.
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/hexoid.txt"><b>hexoid</b></a> (by Luke Edwards)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/hexoid.txt"><b>hexoid</b></a> (by Luke Edwards)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
A tiny (190B) and extremely fast utility to generate random IDs of fixed length
|
<div style="font-size: 12px;">
|
||||||
</div>
|
A tiny (190B) and extremely fast utility to generate random IDs of fixed length
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: ISC</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: ISC</div>
|
||||||
<a href="/licenses/inherits.txt"><b>inherits</b></a>
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/inherits.txt"><b>inherits</b></a>
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Browser-friendly inheritance fully compatible with standard node.js inherits()
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Browser-friendly inheritance fully compatible with standard node.js inherits()
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/mime-db.txt"><b>mime-db</b></a>
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/mime-db.txt"><b>mime-db</b></a>
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Media Type Database
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Media Type Database
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/mime-types.txt"><b>mime-types</b></a>
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/mime-types.txt"><b>mime-types</b></a>
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
The ultimate javascript content-type utility.<br/>
|
<div style="font-size: 12px;">
|
||||||
<b>Required by SVR.JS.</b>
|
The ultimate javascript content-type utility.<br/>
|
||||||
</div>
|
<b>Required by SVR.JS.</b>
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: ISC</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: ISC</div>
|
||||||
<a href="/licenses/minimalistic-assert.txt"><b>minimalistic-assert</b></a>
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/minimalistic-assert.txt"><b>minimalistic-assert</b></a>
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
minimalistic-assert ===
|
<div style="font-size: 12px;">
|
||||||
</div>
|
minimalistic-assert ===
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: ISC</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: ISC</div>
|
||||||
<a href="/licenses/minipass.txt"><b>minipass</b></a> (by Isaac Z. Schlueter)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/minipass.txt"><b>minipass</b></a> (by Isaac Z. Schlueter)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
minimal implementation of a PassThrough stream
|
<div style="font-size: 12px;">
|
||||||
</div>
|
minimal implementation of a PassThrough stream
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/minizlib.txt"><b>minizlib</b></a> (by Isaac Z. Schlueter)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/minizlib.txt"><b>minizlib</b></a> (by Isaac Z. Schlueter)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
A small fast zlib stream built on <a href="http://npm.im/minipass">minipass</a> and Node.js's zlib binding.
|
<div style="font-size: 12px;">
|
||||||
</div>
|
A small fast zlib stream built on <a href="http://npm.im/minipass">minipass</a> and Node.js's zlib binding.
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/mkdirp.txt"><b>mkdirp</b></a>
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/mkdirp.txt"><b>mkdirp</b></a>
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Recursively mkdir, like `mkdir -p`
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Recursively mkdir, like `mkdir -p`
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/object-inspect.txt"><b>object-inspect</b></a> (by James Halliday)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/object-inspect.txt"><b>object-inspect</b></a> (by James Halliday)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
string representations of objects in node and the browser
|
<div style="font-size: 12px;">
|
||||||
</div>
|
string representations of objects in node and the browser
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/ocsp.txt"><b>ocsp</b></a> (by Fedor Indutny)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/ocsp.txt"><b>ocsp</b></a> (by Fedor Indutny)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
OCSP Stapling implementation<br/>
|
<div style="font-size: 12px;">
|
||||||
<b>Required by SVR.JS.</b>
|
OCSP Stapling implementation<br/>
|
||||||
</div>
|
<b>Required by SVR.JS.</b>
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: ISC</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: ISC</div>
|
||||||
<a href="/licenses/once.txt"><b>once</b></a> (by Isaac Z. Schlueter)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/once.txt"><b>once</b></a> (by Isaac Z. Schlueter)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Run a function exactly one time
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Run a function exactly one time
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: BSD-3</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: BSD-3</div>
|
||||||
<a href="/licenses/qs.txt"><b>qs</b></a>
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/qs.txt"><b>qs</b></a>
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
A querystring parser that supports nesting and arrays, with a depth limit
|
<div style="font-size: 12px;">
|
||||||
</div>
|
A querystring parser that supports nesting and arrays, with a depth limit
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/side-channel.txt"><b>side-channel</b></a> (by Jordan Harband)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/side-channel.txt"><b>side-channel</b></a> (by Jordan Harband)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Store information about any JS value in a side channel. Uses WeakMap if available.
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Store information about any JS value in a side channel. Uses WeakMap if available.
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: MIT</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: MIT</div>
|
||||||
<a href="/licenses/simple-lru-cache.txt"><b>simple-lru-cache</b></a> (by Gabriel Eisbruch)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/simple-lru-cache.txt"><b>simple-lru-cache</b></a> (by Gabriel Eisbruch)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
node-simple-lru-cache =====================
|
<div style="font-size: 12px;">
|
||||||
</div>
|
node-simple-lru-cache =====================
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: ISC</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: ISC</div>
|
||||||
<a href="/licenses/tar.txt"><b>tar</b></a> (by Isaac Z. Schlueter)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/tar.txt"><b>tar</b></a> (by Isaac Z. Schlueter)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
tar for node<br/>
|
<div style="font-size: 12px;">
|
||||||
<b>Required by SVR.JS.</b>
|
tar for node<br/>
|
||||||
</div>
|
<b>Required by SVR.JS.</b>
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: ISC</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: ISC</div>
|
||||||
<a href="/licenses/wrappy.txt"><b>wrappy</b></a> (by Isaac Z. Schlueter)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/wrappy.txt"><b>wrappy</b></a> (by Isaac Z. Schlueter)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Callback wrapping utility
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Callback wrapping utility
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
</div>
|
||||||
<div style="float: right;">License: ISC</div>
|
<div style="width: 100%; background-color: #ccc; border: 1px solid green; text-align: left; margin: 10px 0;">
|
||||||
<div style="font-size: 20px;">
|
<div style="float: right;">License: ISC</div>
|
||||||
<a href="/licenses/yallist.txt"><b>yallist</b></a> (by Isaac Z. Schlueter)
|
<div style="font-size: 20px;">
|
||||||
</div>
|
<a href="/licenses/yallist.txt"><b>yallist</b></a> (by Isaac Z. Schlueter)
|
||||||
<div style="font-size: 12px;">
|
</div>
|
||||||
Yet Another Linked List
|
<div style="font-size: 12px;">
|
||||||
</div>
|
Yet Another Linked List
|
||||||
</div>
|
</div>
|
||||||
<br/>
|
</div>
|
||||||
<img src="/powered.png" />
|
</div>
|
||||||
</body>
|
<br/>
|
||||||
</html>
|
<img src="/powered.png" />
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
110
node_modules/formidable/package.json
generated
vendored
|
@ -1,36 +1,33 @@
|
||||||
{
|
{
|
||||||
"_from": "formidable@2",
|
"name": "formidable",
|
||||||
"_id": "formidable@2.1.2",
|
"version": "2.1.2",
|
||||||
"_inBundle": false,
|
"license": "MIT",
|
||||||
"_integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==",
|
"description": "A node.js module for parsing form data, especially file uploads.",
|
||||||
"_location": "/formidable",
|
"homepage": "https://github.com/node-formidable/formidable",
|
||||||
"_phantomChildren": {},
|
"funding": "https://ko-fi.com/tunnckoCore/commissions",
|
||||||
"_requested": {
|
"repository": "node-formidable/formidable",
|
||||||
"type": "range",
|
"main": "./src/index.js",
|
||||||
"registry": true,
|
"files": [
|
||||||
"raw": "formidable@2",
|
"src"
|
||||||
"name": "formidable",
|
|
||||||
"escapedName": "formidable",
|
|
||||||
"rawSpec": "2",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "2"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"#USER",
|
|
||||||
"/"
|
|
||||||
],
|
],
|
||||||
"_resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz",
|
"publishConfig": {
|
||||||
"_shasum": "fa973a2bec150e4ce7cac15589d7a25fc30ebd89",
|
"access": "public",
|
||||||
"_spec": "formidable@2",
|
"tag": "v2-latest"
|
||||||
"_where": "/home/ubuntu/forbidden",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/node-formidable/formidable/issues"
|
|
||||||
},
|
},
|
||||||
"bundleDependencies": false,
|
"scripts": {
|
||||||
"commitlint": {
|
"bench": "node benchmark",
|
||||||
"extends": [
|
"fmt": "yarn run fmt:prepare '**/*'",
|
||||||
"@commitlint/config-conventional"
|
"fmt:prepare": "prettier --write",
|
||||||
]
|
"lint": "yarn run lint:prepare .",
|
||||||
|
"lint:prepare": "eslint --cache --fix --quiet --format codeframe",
|
||||||
|
"reinstall": "del-cli ./node_modules ./yarn.lock",
|
||||||
|
"postreinstall": "yarn setup",
|
||||||
|
"setup": "yarn",
|
||||||
|
"pretest": "del-cli ./test/tmp && make-dir ./test/tmp",
|
||||||
|
"test": "jest --coverage",
|
||||||
|
"pretest:ci": "yarn run pretest",
|
||||||
|
"test:ci": "nyc jest --coverage",
|
||||||
|
"test:jest": "jest --coverage"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dezalgo": "^1.0.4",
|
"dezalgo": "^1.0.4",
|
||||||
|
@ -38,8 +35,6 @@
|
||||||
"once": "^1.4.0",
|
"once": "^1.4.0",
|
||||||
"qs": "^6.11.0"
|
"qs": "^6.11.0"
|
||||||
},
|
},
|
||||||
"deprecated": false,
|
|
||||||
"description": "A node.js module for parsing form data, especially file uploads.",
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "8.3.5",
|
"@commitlint/cli": "8.3.5",
|
||||||
"@commitlint/config-conventional": "8.3.4",
|
"@commitlint/config-conventional": "8.3.4",
|
||||||
|
@ -62,17 +57,6 @@
|
||||||
"request": "2.88.2",
|
"request": "2.88.2",
|
||||||
"supertest": "4.0.2"
|
"supertest": "4.0.2"
|
||||||
},
|
},
|
||||||
"files": [
|
|
||||||
"src"
|
|
||||||
],
|
|
||||||
"funding": "https://ko-fi.com/tunnckoCore/commissions",
|
|
||||||
"homepage": "https://github.com/node-formidable/formidable",
|
|
||||||
"husky": {
|
|
||||||
"hooks": {
|
|
||||||
"pre-commit": "git status --porcelain && yarn lint-staged",
|
|
||||||
"commit-msg": "yarn commitlint -E HUSKY_GIT_PARAMS"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"jest": {
|
"jest": {
|
||||||
"verbose": true
|
"verbose": true
|
||||||
},
|
},
|
||||||
|
@ -86,7 +70,17 @@
|
||||||
"ulpoad",
|
"ulpoad",
|
||||||
"file"
|
"file"
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"husky": {
|
||||||
|
"hooks": {
|
||||||
|
"pre-commit": "git status --porcelain && yarn lint-staged",
|
||||||
|
"commit-msg": "yarn commitlint -E HUSKY_GIT_PARAMS"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commitlint": {
|
||||||
|
"extends": [
|
||||||
|
"@commitlint/config-conventional"
|
||||||
|
]
|
||||||
|
},
|
||||||
"lint-staged": {
|
"lint-staged": {
|
||||||
"!*.{js,jsx,ts,tsx}": [
|
"!*.{js,jsx,ts,tsx}": [
|
||||||
"yarn run fmt:prepare"
|
"yarn run fmt:prepare"
|
||||||
|
@ -95,36 +89,10 @@
|
||||||
"yarn run lint"
|
"yarn run lint"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"main": "./src/index.js",
|
|
||||||
"name": "formidable",
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public",
|
|
||||||
"tag": "v2-latest"
|
|
||||||
},
|
|
||||||
"renovate": {
|
"renovate": {
|
||||||
"extends": [
|
"extends": [
|
||||||
"@tunnckocore",
|
"@tunnckocore",
|
||||||
":pinAllExceptPeerDependencies"
|
":pinAllExceptPeerDependencies"
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/node-formidable/formidable.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"bench": "node benchmark",
|
|
||||||
"fmt": "yarn run fmt:prepare '**/*'",
|
|
||||||
"fmt:prepare": "prettier --write",
|
|
||||||
"lint": "yarn run lint:prepare .",
|
|
||||||
"lint:prepare": "eslint --cache --fix --quiet --format codeframe",
|
|
||||||
"postreinstall": "yarn setup",
|
|
||||||
"pretest": "del-cli ./test/tmp && make-dir ./test/tmp",
|
|
||||||
"pretest:ci": "yarn run pretest",
|
|
||||||
"reinstall": "del-cli ./node_modules ./yarn.lock",
|
|
||||||
"setup": "yarn",
|
|
||||||
"test": "jest --coverage",
|
|
||||||
"test:ci": "nyc jest --coverage",
|
|
||||||
"test:jest": "jest --coverage"
|
|
||||||
},
|
|
||||||
"version": "2.1.2"
|
|
||||||
}
|
}
|
||||||
|
|
2
node_modules/graceful-fs/LICENSE
generated
vendored
Executable file → Normal file
|
@ -1,6 +1,6 @@
|
||||||
The ISC License
|
The ISC License
|
||||||
|
|
||||||
Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors
|
Copyright (c) 2011-2022 Isaac Z. Schlueter, Ben Noordhuis, and Contributors
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
|
12
node_modules/graceful-fs/README.md
generated
vendored
Executable file → Normal file
|
@ -30,9 +30,19 @@ the directory.
|
||||||
var fs = require('graceful-fs')
|
var fs = require('graceful-fs')
|
||||||
|
|
||||||
// now go and do stuff with it...
|
// now go and do stuff with it...
|
||||||
fs.readFileSync('some-file-or-whatever')
|
fs.readFile('some-file-or-whatever', (err, data) => {
|
||||||
|
// Do stuff here.
|
||||||
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Sync methods
|
||||||
|
|
||||||
|
This module cannot intercept or handle `EMFILE` or `ENFILE` errors from sync
|
||||||
|
methods. If you use sync methods which open file descriptors then you are
|
||||||
|
responsible for dealing with any errors.
|
||||||
|
|
||||||
|
This is a known limitation, not a bug.
|
||||||
|
|
||||||
## Global Patching
|
## Global Patching
|
||||||
|
|
||||||
If you want to patch the global fs module (or any other fs-like
|
If you want to patch the global fs module (or any other fs-like
|
||||||
|
|
6
node_modules/graceful-fs/clone.js
generated
vendored
Executable file → Normal file
|
@ -2,12 +2,16 @@
|
||||||
|
|
||||||
module.exports = clone
|
module.exports = clone
|
||||||
|
|
||||||
|
var getPrototypeOf = Object.getPrototypeOf || function (obj) {
|
||||||
|
return obj.__proto__
|
||||||
|
}
|
||||||
|
|
||||||
function clone (obj) {
|
function clone (obj) {
|
||||||
if (obj === null || typeof obj !== 'object')
|
if (obj === null || typeof obj !== 'object')
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
if (obj instanceof Object)
|
if (obj instanceof Object)
|
||||||
var copy = { __proto__: obj.__proto__ }
|
var copy = { __proto__: getPrototypeOf(obj) }
|
||||||
else
|
else
|
||||||
var copy = Object.create(null)
|
var copy = Object.create(null)
|
||||||
|
|
||||||
|
|
170
node_modules/graceful-fs/graceful-fs.js
generated
vendored
Executable file → Normal file
|
@ -54,7 +54,7 @@ if (!fs[gracefulQueue]) {
|
||||||
return fs$close.call(fs, fd, function (err) {
|
return fs$close.call(fs, fd, function (err) {
|
||||||
// This function uses the graceful-fs shared queue
|
// This function uses the graceful-fs shared queue
|
||||||
if (!err) {
|
if (!err) {
|
||||||
retry()
|
resetQueue()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeof cb === 'function')
|
if (typeof cb === 'function')
|
||||||
|
@ -72,7 +72,7 @@ if (!fs[gracefulQueue]) {
|
||||||
function closeSync (fd) {
|
function closeSync (fd) {
|
||||||
// This function uses the graceful-fs shared queue
|
// This function uses the graceful-fs shared queue
|
||||||
fs$closeSync.apply(fs, arguments)
|
fs$closeSync.apply(fs, arguments)
|
||||||
retry()
|
resetQueue()
|
||||||
}
|
}
|
||||||
|
|
||||||
Object.defineProperty(closeSync, previousSymbol, {
|
Object.defineProperty(closeSync, previousSymbol, {
|
||||||
|
@ -114,14 +114,13 @@ function patch (fs) {
|
||||||
|
|
||||||
return go$readFile(path, options, cb)
|
return go$readFile(path, options, cb)
|
||||||
|
|
||||||
function go$readFile (path, options, cb) {
|
function go$readFile (path, options, cb, startTime) {
|
||||||
return fs$readFile(path, options, function (err) {
|
return fs$readFile(path, options, function (err) {
|
||||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||||
enqueue([go$readFile, [path, options, cb]])
|
enqueue([go$readFile, [path, options, cb], err, startTime || Date.now(), Date.now()])
|
||||||
else {
|
else {
|
||||||
if (typeof cb === 'function')
|
if (typeof cb === 'function')
|
||||||
cb.apply(this, arguments)
|
cb.apply(this, arguments)
|
||||||
retry()
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -135,14 +134,13 @@ function patch (fs) {
|
||||||
|
|
||||||
return go$writeFile(path, data, options, cb)
|
return go$writeFile(path, data, options, cb)
|
||||||
|
|
||||||
function go$writeFile (path, data, options, cb) {
|
function go$writeFile (path, data, options, cb, startTime) {
|
||||||
return fs$writeFile(path, data, options, function (err) {
|
return fs$writeFile(path, data, options, function (err) {
|
||||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||||
enqueue([go$writeFile, [path, data, options, cb]])
|
enqueue([go$writeFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])
|
||||||
else {
|
else {
|
||||||
if (typeof cb === 'function')
|
if (typeof cb === 'function')
|
||||||
cb.apply(this, arguments)
|
cb.apply(this, arguments)
|
||||||
retry()
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -157,14 +155,35 @@ function patch (fs) {
|
||||||
|
|
||||||
return go$appendFile(path, data, options, cb)
|
return go$appendFile(path, data, options, cb)
|
||||||
|
|
||||||
function go$appendFile (path, data, options, cb) {
|
function go$appendFile (path, data, options, cb, startTime) {
|
||||||
return fs$appendFile(path, data, options, function (err) {
|
return fs$appendFile(path, data, options, function (err) {
|
||||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||||
enqueue([go$appendFile, [path, data, options, cb]])
|
enqueue([go$appendFile, [path, data, options, cb], err, startTime || Date.now(), Date.now()])
|
||||||
|
else {
|
||||||
|
if (typeof cb === 'function')
|
||||||
|
cb.apply(this, arguments)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var fs$copyFile = fs.copyFile
|
||||||
|
if (fs$copyFile)
|
||||||
|
fs.copyFile = copyFile
|
||||||
|
function copyFile (src, dest, flags, cb) {
|
||||||
|
if (typeof flags === 'function') {
|
||||||
|
cb = flags
|
||||||
|
flags = 0
|
||||||
|
}
|
||||||
|
return go$copyFile(src, dest, flags, cb)
|
||||||
|
|
||||||
|
function go$copyFile (src, dest, flags, cb, startTime) {
|
||||||
|
return fs$copyFile(src, dest, flags, function (err) {
|
||||||
|
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||||
|
enqueue([go$copyFile, [src, dest, flags, cb], err, startTime || Date.now(), Date.now()])
|
||||||
else {
|
else {
|
||||||
if (typeof cb === 'function')
|
if (typeof cb === 'function')
|
||||||
cb.apply(this, arguments)
|
cb.apply(this, arguments)
|
||||||
retry()
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -172,36 +191,46 @@ function patch (fs) {
|
||||||
|
|
||||||
var fs$readdir = fs.readdir
|
var fs$readdir = fs.readdir
|
||||||
fs.readdir = readdir
|
fs.readdir = readdir
|
||||||
|
var noReaddirOptionVersions = /^v[0-5]\./
|
||||||
function readdir (path, options, cb) {
|
function readdir (path, options, cb) {
|
||||||
var args = [path]
|
if (typeof options === 'function')
|
||||||
if (typeof options !== 'function') {
|
cb = options, options = null
|
||||||
args.push(options)
|
|
||||||
} else {
|
|
||||||
cb = options
|
|
||||||
}
|
|
||||||
args.push(go$readdir$cb)
|
|
||||||
|
|
||||||
return go$readdir(args)
|
var go$readdir = noReaddirOptionVersions.test(process.version)
|
||||||
|
? function go$readdir (path, options, cb, startTime) {
|
||||||
|
return fs$readdir(path, fs$readdirCallback(
|
||||||
|
path, options, cb, startTime
|
||||||
|
))
|
||||||
|
}
|
||||||
|
: function go$readdir (path, options, cb, startTime) {
|
||||||
|
return fs$readdir(path, options, fs$readdirCallback(
|
||||||
|
path, options, cb, startTime
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
function go$readdir$cb (err, files) {
|
return go$readdir(path, options, cb)
|
||||||
if (files && files.sort)
|
|
||||||
files.sort()
|
|
||||||
|
|
||||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
function fs$readdirCallback (path, options, cb, startTime) {
|
||||||
enqueue([go$readdir, [args]])
|
return function (err, files) {
|
||||||
|
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||||
|
enqueue([
|
||||||
|
go$readdir,
|
||||||
|
[path, options, cb],
|
||||||
|
err,
|
||||||
|
startTime || Date.now(),
|
||||||
|
Date.now()
|
||||||
|
])
|
||||||
|
else {
|
||||||
|
if (files && files.sort)
|
||||||
|
files.sort()
|
||||||
|
|
||||||
else {
|
if (typeof cb === 'function')
|
||||||
if (typeof cb === 'function')
|
cb.call(this, err, files)
|
||||||
cb.apply(this, arguments)
|
}
|
||||||
retry()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function go$readdir (args) {
|
|
||||||
return fs$readdir.apply(fs, args)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (process.version.substr(0, 4) === 'v0.8') {
|
if (process.version.substr(0, 4) === 'v0.8') {
|
||||||
var legStreams = legacy(fs)
|
var legStreams = legacy(fs)
|
||||||
ReadStream = legStreams.ReadStream
|
ReadStream = legStreams.ReadStream
|
||||||
|
@ -324,14 +353,13 @@ function patch (fs) {
|
||||||
|
|
||||||
return go$open(path, flags, mode, cb)
|
return go$open(path, flags, mode, cb)
|
||||||
|
|
||||||
function go$open (path, flags, mode, cb) {
|
function go$open (path, flags, mode, cb, startTime) {
|
||||||
return fs$open(path, flags, mode, function (err, fd) {
|
return fs$open(path, flags, mode, function (err, fd) {
|
||||||
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
|
||||||
enqueue([go$open, [path, flags, mode, cb]])
|
enqueue([go$open, [path, flags, mode, cb], err, startTime || Date.now(), Date.now()])
|
||||||
else {
|
else {
|
||||||
if (typeof cb === 'function')
|
if (typeof cb === 'function')
|
||||||
cb.apply(this, arguments)
|
cb.apply(this, arguments)
|
||||||
retry()
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -343,12 +371,78 @@ function patch (fs) {
|
||||||
function enqueue (elem) {
|
function enqueue (elem) {
|
||||||
debug('ENQUEUE', elem[0].name, elem[1])
|
debug('ENQUEUE', elem[0].name, elem[1])
|
||||||
fs[gracefulQueue].push(elem)
|
fs[gracefulQueue].push(elem)
|
||||||
|
retry()
|
||||||
|
}
|
||||||
|
|
||||||
|
// keep track of the timeout between retry() calls
|
||||||
|
var retryTimer
|
||||||
|
|
||||||
|
// reset the startTime and lastTime to now
|
||||||
|
// this resets the start of the 60 second overall timeout as well as the
|
||||||
|
// delay between attempts so that we'll retry these jobs sooner
|
||||||
|
function resetQueue () {
|
||||||
|
var now = Date.now()
|
||||||
|
for (var i = 0; i < fs[gracefulQueue].length; ++i) {
|
||||||
|
// entries that are only a length of 2 are from an older version, don't
|
||||||
|
// bother modifying those since they'll be retried anyway.
|
||||||
|
if (fs[gracefulQueue][i].length > 2) {
|
||||||
|
fs[gracefulQueue][i][3] = now // startTime
|
||||||
|
fs[gracefulQueue][i][4] = now // lastTime
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// call retry to make sure we're actively processing the queue
|
||||||
|
retry()
|
||||||
}
|
}
|
||||||
|
|
||||||
function retry () {
|
function retry () {
|
||||||
|
// clear the timer and remove it to help prevent unintended concurrency
|
||||||
|
clearTimeout(retryTimer)
|
||||||
|
retryTimer = undefined
|
||||||
|
|
||||||
|
if (fs[gracefulQueue].length === 0)
|
||||||
|
return
|
||||||
|
|
||||||
var elem = fs[gracefulQueue].shift()
|
var elem = fs[gracefulQueue].shift()
|
||||||
if (elem) {
|
var fn = elem[0]
|
||||||
debug('RETRY', elem[0].name, elem[1])
|
var args = elem[1]
|
||||||
elem[0].apply(null, elem[1])
|
// these items may be unset if they were added by an older graceful-fs
|
||||||
|
var err = elem[2]
|
||||||
|
var startTime = elem[3]
|
||||||
|
var lastTime = elem[4]
|
||||||
|
|
||||||
|
// if we don't have a startTime we have no way of knowing if we've waited
|
||||||
|
// long enough, so go ahead and retry this item now
|
||||||
|
if (startTime === undefined) {
|
||||||
|
debug('RETRY', fn.name, args)
|
||||||
|
fn.apply(null, args)
|
||||||
|
} else if (Date.now() - startTime >= 60000) {
|
||||||
|
// it's been more than 60 seconds total, bail now
|
||||||
|
debug('TIMEOUT', fn.name, args)
|
||||||
|
var cb = args.pop()
|
||||||
|
if (typeof cb === 'function')
|
||||||
|
cb.call(null, err)
|
||||||
|
} else {
|
||||||
|
// the amount of time between the last attempt and right now
|
||||||
|
var sinceAttempt = Date.now() - lastTime
|
||||||
|
// the amount of time between when we first tried, and when we last tried
|
||||||
|
// rounded up to at least 1
|
||||||
|
var sinceStart = Math.max(lastTime - startTime, 1)
|
||||||
|
// backoff. wait longer than the total time we've been retrying, but only
|
||||||
|
// up to a maximum of 100ms
|
||||||
|
var desiredDelay = Math.min(sinceStart * 1.2, 100)
|
||||||
|
// it's been long enough since the last retry, do it again
|
||||||
|
if (sinceAttempt >= desiredDelay) {
|
||||||
|
debug('RETRY', fn.name, args)
|
||||||
|
fn.apply(null, args.concat([startTime]))
|
||||||
|
} else {
|
||||||
|
// if we can't do this job yet, push it to the end of the queue
|
||||||
|
// and let the next iteration check again
|
||||||
|
fs[gracefulQueue].push(elem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// schedule our next run if one isn't already scheduled
|
||||||
|
if (retryTimer === undefined) {
|
||||||
|
retryTimer = setTimeout(retry, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
0
node_modules/graceful-fs/legacy-streams.js
generated
vendored
Executable file → Normal file
83
node_modules/graceful-fs/package.json
generated
vendored
Executable file → Normal file
|
@ -1,52 +1,22 @@
|
||||||
{
|
{
|
||||||
"_from": "graceful-fs",
|
"name": "graceful-fs",
|
||||||
"_id": "graceful-fs@4.2.4",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
|
|
||||||
"_location": "/graceful-fs",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "tag",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "graceful-fs",
|
|
||||||
"name": "graceful-fs",
|
|
||||||
"escapedName": "graceful-fs",
|
|
||||||
"rawSpec": "",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "latest"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"#USER",
|
|
||||||
"/"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
|
|
||||||
"_shasum": "2256bde14d3632958c465ebc96dc467ca07a29fb",
|
|
||||||
"_spec": "graceful-fs",
|
|
||||||
"_where": "/media/serveradmin/Server/developement",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/isaacs/node-graceful-fs/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "A drop-in replacement for fs, making various improvements.",
|
"description": "A drop-in replacement for fs, making various improvements.",
|
||||||
"devDependencies": {
|
"version": "4.2.11",
|
||||||
"import-fresh": "^2.0.0",
|
"repository": {
|
||||||
"mkdirp": "^0.5.0",
|
"type": "git",
|
||||||
"rimraf": "^2.2.8",
|
"url": "https://github.com/isaacs/node-graceful-fs"
|
||||||
"tap": "^12.7.0"
|
|
||||||
},
|
},
|
||||||
|
"main": "graceful-fs.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
"test": "test"
|
"test": "test"
|
||||||
},
|
},
|
||||||
"files": [
|
"scripts": {
|
||||||
"fs.js",
|
"preversion": "npm test",
|
||||||
"graceful-fs.js",
|
"postversion": "npm publish",
|
||||||
"legacy-streams.js",
|
"postpublish": "git push origin --follow-tags",
|
||||||
"polyfills.js",
|
"test": "nyc --silent node test.js | tap -c -",
|
||||||
"clone.js"
|
"posttest": "nyc report"
|
||||||
],
|
},
|
||||||
"homepage": "https://github.com/isaacs/node-graceful-fs#readme",
|
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"fs",
|
"fs",
|
||||||
"module",
|
"module",
|
||||||
|
@ -64,17 +34,20 @@
|
||||||
"EACCESS"
|
"EACCESS"
|
||||||
],
|
],
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"main": "graceful-fs.js",
|
"devDependencies": {
|
||||||
"name": "graceful-fs",
|
"import-fresh": "^2.0.0",
|
||||||
"repository": {
|
"mkdirp": "^0.5.0",
|
||||||
"type": "git",
|
"rimraf": "^2.2.8",
|
||||||
"url": "git+https://github.com/isaacs/node-graceful-fs.git"
|
"tap": "^16.3.4"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"files": [
|
||||||
"postpublish": "git push origin --follow-tags",
|
"fs.js",
|
||||||
"postversion": "npm publish",
|
"graceful-fs.js",
|
||||||
"preversion": "npm test",
|
"legacy-streams.js",
|
||||||
"test": "node test.js | tap -"
|
"polyfills.js",
|
||||||
},
|
"clone.js"
|
||||||
"version": "4.2.4"
|
],
|
||||||
|
"tap": {
|
||||||
|
"reporter": "classic"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
83
node_modules/graceful-fs/polyfills.js
generated
vendored
Executable file → Normal file
|
@ -14,10 +14,14 @@ try {
|
||||||
process.cwd()
|
process.cwd()
|
||||||
} catch (er) {}
|
} catch (er) {}
|
||||||
|
|
||||||
var chdir = process.chdir
|
// This check is needed until node.js 12 is required
|
||||||
process.chdir = function(d) {
|
if (typeof process.chdir === 'function') {
|
||||||
cwd = null
|
var chdir = process.chdir
|
||||||
chdir.call(process, d)
|
process.chdir = function (d) {
|
||||||
|
cwd = null
|
||||||
|
chdir.call(process, d)
|
||||||
|
}
|
||||||
|
if (Object.setPrototypeOf) Object.setPrototypeOf(process.chdir, chdir)
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = patch
|
module.exports = patch
|
||||||
|
@ -67,13 +71,13 @@ function patch (fs) {
|
||||||
fs.lstatSync = statFixSync(fs.lstatSync)
|
fs.lstatSync = statFixSync(fs.lstatSync)
|
||||||
|
|
||||||
// if lchmod/lchown do not exist, then make them no-ops
|
// if lchmod/lchown do not exist, then make them no-ops
|
||||||
if (!fs.lchmod) {
|
if (fs.chmod && !fs.lchmod) {
|
||||||
fs.lchmod = function (path, mode, cb) {
|
fs.lchmod = function (path, mode, cb) {
|
||||||
if (cb) process.nextTick(cb)
|
if (cb) process.nextTick(cb)
|
||||||
}
|
}
|
||||||
fs.lchmodSync = function () {}
|
fs.lchmodSync = function () {}
|
||||||
}
|
}
|
||||||
if (!fs.lchown) {
|
if (fs.chown && !fs.lchown) {
|
||||||
fs.lchown = function (path, uid, gid, cb) {
|
fs.lchown = function (path, uid, gid, cb) {
|
||||||
if (cb) process.nextTick(cb)
|
if (cb) process.nextTick(cb)
|
||||||
}
|
}
|
||||||
|
@ -90,32 +94,38 @@ function patch (fs) {
|
||||||
// CPU to a busy looping process, which can cause the program causing the lock
|
// CPU to a busy looping process, which can cause the program causing the lock
|
||||||
// contention to be starved of CPU by node, so the contention doesn't resolve.
|
// contention to be starved of CPU by node, so the contention doesn't resolve.
|
||||||
if (platform === "win32") {
|
if (platform === "win32") {
|
||||||
fs.rename = (function (fs$rename) { return function (from, to, cb) {
|
fs.rename = typeof fs.rename !== 'function' ? fs.rename
|
||||||
var start = Date.now()
|
: (function (fs$rename) {
|
||||||
var backoff = 0;
|
function rename (from, to, cb) {
|
||||||
fs$rename(from, to, function CB (er) {
|
var start = Date.now()
|
||||||
if (er
|
var backoff = 0;
|
||||||
&& (er.code === "EACCES" || er.code === "EPERM")
|
fs$rename(from, to, function CB (er) {
|
||||||
&& Date.now() - start < 60000) {
|
if (er
|
||||||
setTimeout(function() {
|
&& (er.code === "EACCES" || er.code === "EPERM" || er.code === "EBUSY")
|
||||||
fs.stat(to, function (stater, st) {
|
&& Date.now() - start < 60000) {
|
||||||
if (stater && stater.code === "ENOENT")
|
setTimeout(function() {
|
||||||
fs$rename(from, to, CB);
|
fs.stat(to, function (stater, st) {
|
||||||
else
|
if (stater && stater.code === "ENOENT")
|
||||||
cb(er)
|
fs$rename(from, to, CB);
|
||||||
})
|
else
|
||||||
}, backoff)
|
cb(er)
|
||||||
if (backoff < 100)
|
})
|
||||||
backoff += 10;
|
}, backoff)
|
||||||
return;
|
if (backoff < 100)
|
||||||
}
|
backoff += 10;
|
||||||
if (cb) cb(er)
|
return;
|
||||||
})
|
}
|
||||||
}})(fs.rename)
|
if (cb) cb(er)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if (Object.setPrototypeOf) Object.setPrototypeOf(rename, fs$rename)
|
||||||
|
return rename
|
||||||
|
})(fs.rename)
|
||||||
}
|
}
|
||||||
|
|
||||||
// if read() returns EAGAIN, then just try it again.
|
// if read() returns EAGAIN, then just try it again.
|
||||||
fs.read = (function (fs$read) {
|
fs.read = typeof fs.read !== 'function' ? fs.read
|
||||||
|
: (function (fs$read) {
|
||||||
function read (fd, buffer, offset, length, position, callback_) {
|
function read (fd, buffer, offset, length, position, callback_) {
|
||||||
var callback
|
var callback
|
||||||
if (callback_ && typeof callback_ === 'function') {
|
if (callback_ && typeof callback_ === 'function') {
|
||||||
|
@ -132,11 +142,12 @@ function patch (fs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// This ensures `util.promisify` works as it does for native `fs.read`.
|
// This ensures `util.promisify` works as it does for native `fs.read`.
|
||||||
read.__proto__ = fs$read
|
if (Object.setPrototypeOf) Object.setPrototypeOf(read, fs$read)
|
||||||
return read
|
return read
|
||||||
})(fs.read)
|
})(fs.read)
|
||||||
|
|
||||||
fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) {
|
fs.readSync = typeof fs.readSync !== 'function' ? fs.readSync
|
||||||
|
: (function (fs$readSync) { return function (fd, buffer, offset, length, position) {
|
||||||
var eagCounter = 0
|
var eagCounter = 0
|
||||||
while (true) {
|
while (true) {
|
||||||
try {
|
try {
|
||||||
|
@ -195,7 +206,7 @@ function patch (fs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function patchLutimes (fs) {
|
function patchLutimes (fs) {
|
||||||
if (constants.hasOwnProperty("O_SYMLINK")) {
|
if (constants.hasOwnProperty("O_SYMLINK") && fs.futimes) {
|
||||||
fs.lutimes = function (path, at, mt, cb) {
|
fs.lutimes = function (path, at, mt, cb) {
|
||||||
fs.open(path, constants.O_SYMLINK, function (er, fd) {
|
fs.open(path, constants.O_SYMLINK, function (er, fd) {
|
||||||
if (er) {
|
if (er) {
|
||||||
|
@ -229,7 +240,7 @@ function patch (fs) {
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else if (fs.futimes) {
|
||||||
fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) }
|
fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) }
|
||||||
fs.lutimesSync = function () {}
|
fs.lutimesSync = function () {}
|
||||||
}
|
}
|
||||||
|
@ -306,8 +317,10 @@ function patch (fs) {
|
||||||
return function (target, options) {
|
return function (target, options) {
|
||||||
var stats = options ? orig.call(fs, target, options)
|
var stats = options ? orig.call(fs, target, options)
|
||||||
: orig.call(fs, target)
|
: orig.call(fs, target)
|
||||||
if (stats.uid < 0) stats.uid += 0x100000000
|
if (stats) {
|
||||||
if (stats.gid < 0) stats.gid += 0x100000000
|
if (stats.uid < 0) stats.uid += 0x100000000
|
||||||
|
if (stats.gid < 0) stats.gid += 0x100000000
|
||||||
|
}
|
||||||
return stats;
|
return stats;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
85
node_modules/mime-db/package.json
generated
vendored
|
@ -1,49 +1,23 @@
|
||||||
{
|
{
|
||||||
"_from": "mime-db@1.52.0",
|
"name": "mime-db",
|
||||||
"_id": "mime-db@1.52.0",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
|
||||||
"_location": "/mime-db",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "version",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "mime-db@1.52.0",
|
|
||||||
"name": "mime-db",
|
|
||||||
"escapedName": "mime-db",
|
|
||||||
"rawSpec": "1.52.0",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "1.52.0"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/mime-types"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
|
||||||
"_shasum": "bbabcdc02859f4987301c856e3387ce5ec43bf70",
|
|
||||||
"_spec": "mime-db@1.52.0",
|
|
||||||
"_where": "/home/ubuntu/formidable/node_modules/mime-types",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/jshttp/mime-db/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"contributors": [
|
|
||||||
{
|
|
||||||
"name": "Douglas Christopher Wilson",
|
|
||||||
"email": "doug@somethingdoug.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Jonathan Ong",
|
|
||||||
"email": "me@jongleberry.com",
|
|
||||||
"url": "http://jongleberry.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Robert Kieffer",
|
|
||||||
"email": "robert@broofa.com",
|
|
||||||
"url": "http://github.com/broofa"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Media Type Database",
|
"description": "Media Type Database",
|
||||||
|
"version": "1.52.0",
|
||||||
|
"contributors": [
|
||||||
|
"Douglas Christopher Wilson <doug@somethingdoug.com>",
|
||||||
|
"Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)",
|
||||||
|
"Robert Kieffer <robert@broofa.com> (http://github.com/broofa)"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"keywords": [
|
||||||
|
"mime",
|
||||||
|
"db",
|
||||||
|
"type",
|
||||||
|
"types",
|
||||||
|
"database",
|
||||||
|
"charset",
|
||||||
|
"charsets"
|
||||||
|
],
|
||||||
|
"repository": "jshttp/mime-db",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"bluebird": "3.7.2",
|
"bluebird": "3.7.2",
|
||||||
"co": "4.6.0",
|
"co": "4.6.0",
|
||||||
|
@ -63,9 +37,6 @@
|
||||||
"raw-body": "2.5.0",
|
"raw-body": "2.5.0",
|
||||||
"stream-to-array": "2.3.0"
|
"stream-to-array": "2.3.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
},
|
|
||||||
"files": [
|
"files": [
|
||||||
"HISTORY.md",
|
"HISTORY.md",
|
||||||
"LICENSE",
|
"LICENSE",
|
||||||
|
@ -73,21 +44,8 @@
|
||||||
"db.json",
|
"db.json",
|
||||||
"index.js"
|
"index.js"
|
||||||
],
|
],
|
||||||
"homepage": "https://github.com/jshttp/mime-db#readme",
|
"engines": {
|
||||||
"keywords": [
|
"node": ">= 0.6"
|
||||||
"mime",
|
|
||||||
"db",
|
|
||||||
"type",
|
|
||||||
"types",
|
|
||||||
"database",
|
|
||||||
"charset",
|
|
||||||
"charsets"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"name": "mime-db",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/jshttp/mime-db.git"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "node scripts/build",
|
"build": "node scripts/build",
|
||||||
|
@ -98,6 +56,5 @@
|
||||||
"test-cov": "nyc --reporter=html --reporter=text npm test",
|
"test-cov": "nyc --reporter=html --reporter=text npm test",
|
||||||
"update": "npm run fetch && npm run build",
|
"update": "npm run fetch && npm run build",
|
||||||
"version": "node scripts/version-history.js && git add HISTORY.md"
|
"version": "node scripts/version-history.js && git add HISTORY.md"
|
||||||
},
|
}
|
||||||
"version": "1.52.0"
|
|
||||||
}
|
}
|
||||||
|
|
74
node_modules/mime-types/package.json
generated
vendored
|
@ -1,53 +1,21 @@
|
||||||
{
|
{
|
||||||
"_from": "mime-types",
|
"name": "mime-types",
|
||||||
"_id": "mime-types@2.1.35",
|
"description": "The ultimate javascript content-type utility.",
|
||||||
"_inBundle": false,
|
"version": "2.1.35",
|
||||||
"_integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
|
||||||
"_location": "/mime-types",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "tag",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "mime-types",
|
|
||||||
"name": "mime-types",
|
|
||||||
"escapedName": "mime-types",
|
|
||||||
"rawSpec": "",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "latest"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"#USER",
|
|
||||||
"/"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
|
||||||
"_shasum": "381a871b62a734450660ae3deee44813f70d959a",
|
|
||||||
"_spec": "mime-types",
|
|
||||||
"_where": "/home/ubuntu/formidable/a",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/jshttp/mime-types/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"contributors": [
|
"contributors": [
|
||||||
{
|
"Douglas Christopher Wilson <doug@somethingdoug.com>",
|
||||||
"name": "Douglas Christopher Wilson",
|
"Jeremiah Senkpiel <fishrock123@rocketmail.com> (https://searchbeam.jit.su)",
|
||||||
"email": "doug@somethingdoug.com"
|
"Jonathan Ong <me@jongleberry.com> (http://jongleberry.com)"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Jeremiah Senkpiel",
|
|
||||||
"email": "fishrock123@rocketmail.com",
|
|
||||||
"url": "https://searchbeam.jit.su"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Jonathan Ong",
|
|
||||||
"email": "me@jongleberry.com",
|
|
||||||
"url": "http://jongleberry.com"
|
|
||||||
}
|
|
||||||
],
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"keywords": [
|
||||||
|
"mime",
|
||||||
|
"types"
|
||||||
|
],
|
||||||
|
"repository": "jshttp/mime-types",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"mime-db": "1.52.0"
|
"mime-db": "1.52.0"
|
||||||
},
|
},
|
||||||
"deprecated": false,
|
|
||||||
"description": "The ultimate javascript content-type utility.",
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"eslint": "7.32.0",
|
"eslint": "7.32.0",
|
||||||
"eslint-config-standard": "14.1.1",
|
"eslint-config-standard": "14.1.1",
|
||||||
|
@ -59,30 +27,18 @@
|
||||||
"mocha": "9.2.2",
|
"mocha": "9.2.2",
|
||||||
"nyc": "15.1.0"
|
"nyc": "15.1.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
},
|
|
||||||
"files": [
|
"files": [
|
||||||
"HISTORY.md",
|
"HISTORY.md",
|
||||||
"LICENSE",
|
"LICENSE",
|
||||||
"index.js"
|
"index.js"
|
||||||
],
|
],
|
||||||
"homepage": "https://github.com/jshttp/mime-types#readme",
|
"engines": {
|
||||||
"keywords": [
|
"node": ">= 0.6"
|
||||||
"mime",
|
|
||||||
"types"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"name": "mime-types",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/jshttp/mime-types.git"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "eslint .",
|
"lint": "eslint .",
|
||||||
"test": "mocha --reporter spec test/test.js",
|
"test": "mocha --reporter spec test/test.js",
|
||||||
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
|
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
|
||||||
"test-cov": "nyc --reporter=html --reporter=text npm test"
|
"test-cov": "nyc --reporter=html --reporter=text npm test"
|
||||||
},
|
}
|
||||||
"version": "2.1.35"
|
|
||||||
}
|
}
|
||||||
|
|
68
node_modules/tar/CHANGELOG.md
generated
vendored
|
@ -1,68 +0,0 @@
|
||||||
# Changelog
|
|
||||||
|
|
||||||
## 6.0
|
|
||||||
|
|
||||||
- Drop support for node 6 and 8
|
|
||||||
- fix symlinks and hardlinks on windows being packed with `\`-style path
|
|
||||||
targets
|
|
||||||
|
|
||||||
## 5.0
|
|
||||||
|
|
||||||
- Address unpack race conditions using path reservations
|
|
||||||
- Change large-numbers errors from TypeError to Error
|
|
||||||
- Add `TAR_*` error codes
|
|
||||||
- Raise `TAR_BAD_ARCHIVE` warning/error when there are no valid entries
|
|
||||||
found in an archive
|
|
||||||
- do not treat ignored entries as an invalid archive
|
|
||||||
- drop support for node v4
|
|
||||||
- unpack: conditionally use a file mapping to write files on Windows
|
|
||||||
- Set more portable 'mode' value in portable mode
|
|
||||||
- Set `portable` gzip option in portable mode
|
|
||||||
|
|
||||||
## 4.4
|
|
||||||
|
|
||||||
- Add 'mtime' option to tar creation to force mtime
|
|
||||||
- unpack: only reuse file fs entries if nlink = 1
|
|
||||||
- unpack: rename before unlinking files on Windows
|
|
||||||
- Fix encoding/decoding of base-256 numbers
|
|
||||||
- Use `stat` instead of `lstat` when checking CWD
|
|
||||||
- Always provide a callback to fs.close()
|
|
||||||
|
|
||||||
## 4.3
|
|
||||||
|
|
||||||
- Add 'transform' unpack option
|
|
||||||
|
|
||||||
## 4.2
|
|
||||||
|
|
||||||
- Fail when zlib fails
|
|
||||||
|
|
||||||
## 4.1
|
|
||||||
|
|
||||||
- Add noMtime flag for tar creation
|
|
||||||
|
|
||||||
## 4.0
|
|
||||||
|
|
||||||
- unpack: raise error if cwd is missing or not a dir
|
|
||||||
- pack: don't drop dots from dotfiles when prefixing
|
|
||||||
|
|
||||||
## 3.1
|
|
||||||
|
|
||||||
- Support `@file.tar` as an entry argument to copy entries from one tar
|
|
||||||
file to another.
|
|
||||||
- Add `noPax` option
|
|
||||||
- `noResume` option for tar.t
|
|
||||||
- win32: convert `>|<?:` chars to windows-friendly form
|
|
||||||
- Exclude mtime for dirs in portable mode
|
|
||||||
|
|
||||||
## 3.0
|
|
||||||
|
|
||||||
- Minipass-based implementation
|
|
||||||
- Entirely new API surface, `tar.c()`, `tar.x()` etc., much closer to
|
|
||||||
system tar semantics
|
|
||||||
- Massive performance improvement
|
|
||||||
- Require node 4.x and higher
|
|
||||||
|
|
||||||
## 0.x, 1.x, 2.x - 2011-2014
|
|
||||||
|
|
||||||
- fstream-based implementation
|
|
||||||
- slow and kinda bad, but better than npm shelling out to the system `tar`
|
|
24
node_modules/tar/lib/pack.js
generated
vendored
|
@ -79,14 +79,26 @@ const Pack = warner(class Pack extends Minipass {
|
||||||
|
|
||||||
this.portable = !!opt.portable
|
this.portable = !!opt.portable
|
||||||
this.zip = null
|
this.zip = null
|
||||||
if (opt.gzip) {
|
|
||||||
if (typeof opt.gzip !== 'object') {
|
if (opt.gzip || opt.brotli) {
|
||||||
opt.gzip = {}
|
if (opt.gzip && opt.brotli) {
|
||||||
|
throw new TypeError('gzip and brotli are mutually exclusive')
|
||||||
}
|
}
|
||||||
if (this.portable) {
|
if (opt.gzip) {
|
||||||
opt.gzip.portable = true
|
if (typeof opt.gzip !== 'object') {
|
||||||
|
opt.gzip = {}
|
||||||
|
}
|
||||||
|
if (this.portable) {
|
||||||
|
opt.gzip.portable = true
|
||||||
|
}
|
||||||
|
this.zip = new zlib.Gzip(opt.gzip)
|
||||||
|
}
|
||||||
|
if (opt.brotli) {
|
||||||
|
if (typeof opt.brotli !== 'object') {
|
||||||
|
opt.brotli = {}
|
||||||
|
}
|
||||||
|
this.zip = new zlib.BrotliCompress(opt.brotli)
|
||||||
}
|
}
|
||||||
this.zip = new zlib.Gzip(opt.gzip)
|
|
||||||
this.zip.on('data', chunk => super.write(chunk))
|
this.zip.on('data', chunk => super.write(chunk))
|
||||||
this.zip.on('end', _ => super.end())
|
this.zip.on('end', _ => super.end())
|
||||||
this.zip.on('drain', _ => this[ONDRAIN]())
|
this.zip.on('drain', _ => this[ONDRAIN]())
|
||||||
|
|
49
node_modules/tar/lib/parse.js
generated
vendored
|
@ -97,6 +97,16 @@ module.exports = warner(class Parser extends EE {
|
||||||
this.strict = !!opt.strict
|
this.strict = !!opt.strict
|
||||||
this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize
|
this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize
|
||||||
this.filter = typeof opt.filter === 'function' ? opt.filter : noop
|
this.filter = typeof opt.filter === 'function' ? opt.filter : noop
|
||||||
|
// Unlike gzip, brotli doesn't have any magic bytes to identify it
|
||||||
|
// Users need to explicitly tell us they're extracting a brotli file
|
||||||
|
// Or we infer from the file extension
|
||||||
|
const isTBR = (opt.file && (
|
||||||
|
opt.file.endsWith('.tar.br') || opt.file.endsWith('.tbr')))
|
||||||
|
// if it's a tbr file it MIGHT be brotli, but we don't know until
|
||||||
|
// we look at it and verify it's not a valid tar file.
|
||||||
|
this.brotli = !opt.gzip && opt.brotli !== undefined ? opt.brotli
|
||||||
|
: isTBR ? undefined
|
||||||
|
: false
|
||||||
|
|
||||||
// have to set this so that streams are ok piping into it
|
// have to set this so that streams are ok piping into it
|
||||||
this.writable = true
|
this.writable = true
|
||||||
|
@ -347,7 +357,9 @@ module.exports = warner(class Parser extends EE {
|
||||||
}
|
}
|
||||||
|
|
||||||
// first write, might be gzipped
|
// first write, might be gzipped
|
||||||
if (this[UNZIP] === null && chunk) {
|
const needSniff = this[UNZIP] === null ||
|
||||||
|
this.brotli === undefined && this[UNZIP] === false
|
||||||
|
if (needSniff && chunk) {
|
||||||
if (this[BUFFER]) {
|
if (this[BUFFER]) {
|
||||||
chunk = Buffer.concat([this[BUFFER], chunk])
|
chunk = Buffer.concat([this[BUFFER], chunk])
|
||||||
this[BUFFER] = null
|
this[BUFFER] = null
|
||||||
|
@ -356,15 +368,45 @@ module.exports = warner(class Parser extends EE {
|
||||||
this[BUFFER] = chunk
|
this[BUFFER] = chunk
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// look for gzip header
|
||||||
for (let i = 0; this[UNZIP] === null && i < gzipHeader.length; i++) {
|
for (let i = 0; this[UNZIP] === null && i < gzipHeader.length; i++) {
|
||||||
if (chunk[i] !== gzipHeader[i]) {
|
if (chunk[i] !== gzipHeader[i]) {
|
||||||
this[UNZIP] = false
|
this[UNZIP] = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this[UNZIP] === null) {
|
|
||||||
|
const maybeBrotli = this.brotli === undefined
|
||||||
|
if (this[UNZIP] === false && maybeBrotli) {
|
||||||
|
// read the first header to see if it's a valid tar file. If so,
|
||||||
|
// we can safely assume that it's not actually brotli, despite the
|
||||||
|
// .tbr or .tar.br file extension.
|
||||||
|
// if we ended before getting a full chunk, yes, def brotli
|
||||||
|
if (chunk.length < 512) {
|
||||||
|
if (this[ENDED]) {
|
||||||
|
this.brotli = true
|
||||||
|
} else {
|
||||||
|
this[BUFFER] = chunk
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// if it's tar, it's pretty reliably not brotli, chances of
|
||||||
|
// that happening are astronomical.
|
||||||
|
try {
|
||||||
|
new Header(chunk.slice(0, 512))
|
||||||
|
this.brotli = false
|
||||||
|
} catch (_) {
|
||||||
|
this.brotli = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this[UNZIP] === null || (this[UNZIP] === false && this.brotli)) {
|
||||||
const ended = this[ENDED]
|
const ended = this[ENDED]
|
||||||
this[ENDED] = false
|
this[ENDED] = false
|
||||||
this[UNZIP] = new zlib.Unzip()
|
this[UNZIP] = this[UNZIP] === null
|
||||||
|
? new zlib.Unzip()
|
||||||
|
: new zlib.BrotliDecompress()
|
||||||
this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk))
|
this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk))
|
||||||
this[UNZIP].on('error', er => this.abort(er))
|
this[UNZIP].on('error', er => this.abort(er))
|
||||||
this[UNZIP].on('end', _ => {
|
this[UNZIP].on('end', _ => {
|
||||||
|
@ -502,6 +544,7 @@ module.exports = warner(class Parser extends EE {
|
||||||
this[UNZIP].end(chunk)
|
this[UNZIP].end(chunk)
|
||||||
} else {
|
} else {
|
||||||
this[ENDED] = true
|
this[ENDED] = true
|
||||||
|
if (this.brotli === undefined) chunk = chunk || Buffer.alloc(0)
|
||||||
this.write(chunk)
|
this.write(chunk)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
2
node_modules/tar/lib/replace.js
generated
vendored
|
@ -23,7 +23,7 @@ module.exports = (opt_, files, cb) => {
|
||||||
throw new TypeError('file is required')
|
throw new TypeError('file is required')
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt.gzip) {
|
if (opt.gzip || opt.brotli || opt.file.endsWith('.br') || opt.file.endsWith('.tbr')) {
|
||||||
throw new TypeError('cannot append to compressed archives')
|
throw new TypeError('cannot append to compressed archives')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
node_modules/tar/lib/update.js
generated
vendored
|
@ -13,7 +13,7 @@ module.exports = (opt_, files, cb) => {
|
||||||
throw new TypeError('file is required')
|
throw new TypeError('file is required')
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opt.gzip) {
|
if (opt.gzip || opt.brotli || opt.file.endsWith('.br') || opt.file.endsWith('.tbr')) {
|
||||||
throw new TypeError('cannot append to compressed archives')
|
throw new TypeError('cannot append to compressed archives')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
63
node_modules/tar/package.json
generated
vendored
|
@ -1,35 +1,17 @@
|
||||||
{
|
{
|
||||||
"_from": "tar",
|
"author": "GitHub Inc.",
|
||||||
"_id": "tar@6.1.15",
|
"name": "tar",
|
||||||
"_inBundle": false,
|
"description": "tar for node",
|
||||||
"_integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==",
|
"version": "6.2.0",
|
||||||
"_location": "/tar",
|
"repository": {
|
||||||
"_phantomChildren": {},
|
"type": "git",
|
||||||
"_requested": {
|
"url": "https://github.com/isaacs/node-tar.git"
|
||||||
"type": "tag",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "tar",
|
|
||||||
"name": "tar",
|
|
||||||
"escapedName": "tar",
|
|
||||||
"rawSpec": "",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "latest"
|
|
||||||
},
|
},
|
||||||
"_requiredBy": [
|
"scripts": {
|
||||||
"#USER",
|
"genparse": "node scripts/generate-parse-fixtures.js",
|
||||||
"/"
|
"snap": "tap",
|
||||||
],
|
"test": "tap"
|
||||||
"_resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz",
|
|
||||||
"_shasum": "c9738b0b98845a3b344d334b8fa3041aaba53a69",
|
|
||||||
"_spec": "tar",
|
|
||||||
"_where": "/home/ubuntu/fix",
|
|
||||||
"author": {
|
|
||||||
"name": "GitHub Inc."
|
|
||||||
},
|
},
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/isaacs/node-tar/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chownr": "^2.0.0",
|
"chownr": "^2.0.0",
|
||||||
"fs-minipass": "^2.0.0",
|
"fs-minipass": "^2.0.0",
|
||||||
|
@ -38,8 +20,6 @@
|
||||||
"mkdirp": "^1.0.3",
|
"mkdirp": "^1.0.3",
|
||||||
"yallist": "^4.0.0"
|
"yallist": "^4.0.0"
|
||||||
},
|
},
|
||||||
"deprecated": false,
|
|
||||||
"description": "tar for node",
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@npmcli/eslint-config": "^4.0.0",
|
"@npmcli/eslint-config": "^4.0.0",
|
||||||
"@npmcli/template-oss": "4.11.0",
|
"@npmcli/template-oss": "4.11.0",
|
||||||
|
@ -51,6 +31,7 @@
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"tap": "^16.0.1"
|
"tap": "^16.0.1"
|
||||||
},
|
},
|
||||||
|
"license": "ISC",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
},
|
},
|
||||||
|
@ -59,23 +40,6 @@
|
||||||
"lib/",
|
"lib/",
|
||||||
"index.js"
|
"index.js"
|
||||||
],
|
],
|
||||||
"homepage": "https://github.com/isaacs/node-tar#readme",
|
|
||||||
"license": "ISC",
|
|
||||||
"name": "tar",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/isaacs/node-tar.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"genparse": "node scripts/generate-parse-fixtures.js",
|
|
||||||
"lint": "eslint \"**/*.js\"",
|
|
||||||
"lintfix": "npm run lint -- --fix",
|
|
||||||
"postlint": "template-oss-check",
|
|
||||||
"posttest": "npm run lint",
|
|
||||||
"snap": "tap",
|
|
||||||
"template-oss-apply": "template-oss-apply --force",
|
|
||||||
"test": "tap"
|
|
||||||
},
|
|
||||||
"tap": {
|
"tap": {
|
||||||
"coverage-map": "map.js",
|
"coverage-map": "map.js",
|
||||||
"timeout": 0,
|
"timeout": 0,
|
||||||
|
@ -102,6 +66,5 @@
|
||||||
"16.x",
|
"16.x",
|
||||||
"18.x"
|
"18.x"
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
"version": "6.1.15"
|
|
||||||
}
|
}
|
||||||
|
|
184
svr.js
|
@ -69,7 +69,7 @@ function deleteFolderRecursive(path) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var os = require("os");
|
var os = require("os");
|
||||||
var version = "3.14.3";
|
var version = "3.14.4";
|
||||||
var singlethreaded = false;
|
var singlethreaded = false;
|
||||||
|
|
||||||
if (process.versions) process.versions.svrjs = version; // Inject SVR.JS into process.versions
|
if (process.versions) process.versions.svrjs = version; // Inject SVR.JS into process.versions
|
||||||
|
@ -873,8 +873,8 @@ function generateErrorStack(errorObject) {
|
||||||
|
|
||||||
// If the error stack starts with the error name, return the original stack (it is V8-style then).
|
// If the error stack starts with the error name, return the original stack (it is V8-style then).
|
||||||
if (errorStack.some(function (errorStackLine) {
|
if (errorStack.some(function (errorStackLine) {
|
||||||
return (errorStackLine.indexOf(errorObject.name) == 0);
|
return (errorStackLine.indexOf(errorObject.name) == 0);
|
||||||
})) {
|
})) {
|
||||||
return errorObject.stack;
|
return errorObject.stack;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1176,6 +1176,8 @@ var disableTrailingSlashRedirects = false;
|
||||||
var environmentVariables = {};
|
var environmentVariables = {};
|
||||||
var wwwrootPostfixesVHost = [];
|
var wwwrootPostfixesVHost = [];
|
||||||
var wwwrootPostfixPrefixesVHost = [];
|
var wwwrootPostfixPrefixesVHost = [];
|
||||||
|
var allowDoubleSlashes = false;
|
||||||
|
var allowPostfixDoubleSlashes = false;
|
||||||
|
|
||||||
// Get properties from config.json
|
// Get properties from config.json
|
||||||
if (configJSON.blacklist != undefined) rawBlackList = configJSON.blacklist;
|
if (configJSON.blacklist != undefined) rawBlackList = configJSON.blacklist;
|
||||||
|
@ -1231,6 +1233,8 @@ if (configJSON.disableTrailingSlashRedirects != undefined) disableTrailingSlashR
|
||||||
if (configJSON.environmentVariables != undefined) environmentVariables = configJSON.environmentVariables;
|
if (configJSON.environmentVariables != undefined) environmentVariables = configJSON.environmentVariables;
|
||||||
if (configJSON.wwwrootPostfixesVHost != undefined) wwwrootPostfixesVHost = configJSON.wwwrootPostfixesVHost;
|
if (configJSON.wwwrootPostfixesVHost != undefined) wwwrootPostfixesVHost = configJSON.wwwrootPostfixesVHost;
|
||||||
if (configJSON.wwwrootPostfixPrefixesVHost != undefined) wwwrootPostfixPrefixesVHost = configJSON.wwwrootPostfixPrefixesVHost;
|
if (configJSON.wwwrootPostfixPrefixesVHost != undefined) wwwrootPostfixPrefixesVHost = configJSON.wwwrootPostfixPrefixesVHost;
|
||||||
|
if (configJSON.allowDoubleSlashes != undefined) allowDoubleSlashes = configJSON.allowDoubleSlashes;
|
||||||
|
if (configJSON.allowPostfixDoubleSlashes != undefined) allowPostfixDoubleSlashes = configJSON.allowPostfixDoubleSlashes;
|
||||||
|
|
||||||
var wwwrootError = null;
|
var wwwrootError = null;
|
||||||
try {
|
try {
|
||||||
|
@ -1288,13 +1292,12 @@ if (vnum === undefined) vnum = 0;
|
||||||
if (process.isBun) vnum = 64;
|
if (process.isBun) vnum = 64;
|
||||||
|
|
||||||
// SVR.JS path sanitizer function
|
// SVR.JS path sanitizer function
|
||||||
function sanitizeURL(resource) {
|
function sanitizeURL(resource, allowDoubleSlashes) {
|
||||||
if (resource == "*") return "*";
|
if (resource == "*" || resource == "") return resource;
|
||||||
if (resource == "") return "";
|
|
||||||
// Remove null characters
|
// Remove null characters
|
||||||
resource = resource.replace(/%00/ig, "").replace(/\0/g, "");
|
resource = resource.replace(/%00|\0/g, "");
|
||||||
// Check if URL is malformed (e.g. %c0%af or %u002f or simply %as)
|
// Check if URL is malformed (e.g. %c0%af or %u002f or simply %as)
|
||||||
if (resource.match(/%(?:c[01]|f[ef]|(?![0-9a-f]{2}).{2}|.{0,1}$)/gi)) throw new URIError("URI malformed");
|
if (resource.match(/%(?:c[01]|f[ef]|(?![0-9a-f]{2}).{2}|.{0,1}$)/i)) throw new URIError("URI malformed");
|
||||||
// Decode URL-encoded characters while preserving certain characters
|
// Decode URL-encoded characters while preserving certain characters
|
||||||
resource = resource.replace(/%([0-9a-f]{2})/gi, function (match, hex) {
|
resource = resource.replace(/%([0-9a-f]{2})/gi, function (match, hex) {
|
||||||
var decodedChar = String.fromCharCode(parseInt(hex, 16));
|
var decodedChar = String.fromCharCode(parseInt(hex, 16));
|
||||||
|
@ -1308,14 +1311,14 @@ function sanitizeURL(resource) {
|
||||||
var sanitizedResource = resource;
|
var sanitizedResource = resource;
|
||||||
// Ensure the resource starts with a slash
|
// Ensure the resource starts with a slash
|
||||||
if (resource[0] != "/") sanitizedResource = "/" + sanitizedResource;
|
if (resource[0] != "/") sanitizedResource = "/" + sanitizedResource;
|
||||||
// Convert backslashes to slashes and remove duplicate slashes
|
// Convert backslashes to slashes and handle duplicate slashes
|
||||||
sanitizedResource = sanitizedResource.replace(/\\/g, "/").replace(/\/+/g, "/");
|
sanitizedResource = sanitizedResource.replace(/\\/g, "/").replace(allowDoubleSlashes ? /\/{3,}/g : /\/+/g, "/");
|
||||||
// Handle relative navigation (e.g., "/./", "/../", "../", "./"), also remove trailing dots in paths
|
// Handle relative navigation (e.g., "/./", "/../", "../", "./"), also remove trailing dots in paths
|
||||||
sanitizedResource = sanitizedResource.replace(/\/\.(?:\.{2,})?(?=($|\/))/g, "$1").replace(/([^.\/])\.+(?=($|\/))/g, "$1$2").replace(/\/+/g, "/");
|
sanitizedResource = sanitizedResource.replace(/\/\.(?:\.{2,})?(?=\/|$)/g, "").replace(/([^.\/])\.+(?=\/|$)/g, "$1");
|
||||||
while (sanitizedResource.match(/\/(?!\.\.\/)[^\/]+\/\.\.(?=(\/|$))/g)) {
|
while (sanitizedResource.match(/\/(?!\.\.\/)[^\/]+\/\.\.(?=\/|$)/)) {
|
||||||
sanitizedResource = sanitizedResource.replace(/\/(?!\.\.\/)[^\/]+\/\.\.(?=(\/|$))/g, "$1").replace(/\/+/g, "/");
|
sanitizedResource = sanitizedResource.replace(/\/(?!\.\.\/)[^\/]+\/\.\.(?=\/|$)/g, "");
|
||||||
}
|
}
|
||||||
sanitizedResource = sanitizedResource.replace(/\/\.\.(?=(\/|$))/g, "$1").replace(/\/+/g, "/");
|
sanitizedResource = sanitizedResource.replace(/\/\.\.(?=\/|$)/g, "");
|
||||||
if (sanitizedResource.length == 0) return "/";
|
if (sanitizedResource.length == 0) return "/";
|
||||||
else return sanitizedResource;
|
else return sanitizedResource;
|
||||||
}
|
}
|
||||||
|
@ -3328,17 +3331,19 @@ if (!cluster.isPrimary) {
|
||||||
|
|
||||||
// Function to parse a URL string into a URL object
|
// Function to parse a URL string into a URL object
|
||||||
function parseURL(uri) {
|
function parseURL(uri) {
|
||||||
|
// Prepare the path (remove multiple slashes)
|
||||||
|
var preparedURI = uri.replace(/^\/{2,}/,"/");
|
||||||
// Check if the URL API is available (Node.js version >= 10)
|
// Check if the URL API is available (Node.js version >= 10)
|
||||||
if (typeof URL !== "undefined" && url.Url) {
|
if (typeof URL !== "undefined" && url.Url) {
|
||||||
try {
|
try {
|
||||||
// Create a new URL object using the provided URI and base URL
|
// Create a new URL object using the provided URI and base URL
|
||||||
var uobject = new URL(uri.replace(/^\/{2,}/,"/"), "http" + (req.socket.encrypted ? "s" : "") + "://" + (req.headers.host ? req.headers.host : (domain ? domain : "unknown.invalid")));
|
var uobject = new URL(preparedURI, "http" + (req.socket.encrypted ? "s" : "") + "://" + (req.headers.host ? req.headers.host : (domain ? domain : "unknown.invalid")));
|
||||||
|
|
||||||
// Create a new URL object (similar to deprecated url.Url)
|
// Create a new URL object (similar to deprecated url.Url)
|
||||||
var nuobject = new url.Url();
|
var nuobject = new url.Url();
|
||||||
|
|
||||||
// Set properties of the new URL object from the provided URL
|
// Set properties of the new URL object from the provided URL
|
||||||
if (uri.indexOf("/") != -1) nuobject.slashes = true;
|
if (preparedURI.indexOf("/") != -1) nuobject.slashes = true;
|
||||||
if (uobject.protocol != "") nuobject.protocol = uobject.protocol;
|
if (uobject.protocol != "") nuobject.protocol = uobject.protocol;
|
||||||
if (uobject.username != "" && uobject.password != "") nuobject.auth = uobject.username + ":" + uobject.password;
|
if (uobject.username != "" && uobject.password != "") nuobject.auth = uobject.username + ":" + uobject.password;
|
||||||
if (uobject.host != "") nuobject.host = uobject.host;
|
if (uobject.host != "") nuobject.host = uobject.host;
|
||||||
|
@ -3350,7 +3355,7 @@ if (!cluster.isPrimary) {
|
||||||
if (uobject.href != "") nuobject.href = uobject.href;
|
if (uobject.href != "") nuobject.href = uobject.href;
|
||||||
|
|
||||||
// Adjust the pathname and href properties if the URI doesn't start with "/"
|
// Adjust the pathname and href properties if the URI doesn't start with "/"
|
||||||
if (uri.indexOf("/") != 0) {
|
if (preparedURI.indexOf("/") != 0) {
|
||||||
if (nuobject.pathname) {
|
if (nuobject.pathname) {
|
||||||
nuobject.pathname = nuobject.pathname.substr(1);
|
nuobject.pathname = nuobject.pathname.substr(1);
|
||||||
nuobject.href = nuobject.pathname + (nuobject.search ? nuobject.search : "");
|
nuobject.href = nuobject.pathname + (nuobject.search ? nuobject.search : "");
|
||||||
|
@ -3372,11 +3377,11 @@ if (!cluster.isPrimary) {
|
||||||
return nuobject;
|
return nuobject;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
// If there was an error using the URL API, fall back to deprecated url.parse
|
// If there was an error using the URL API, fall back to deprecated url.parse
|
||||||
return url.parse(uri, true);
|
return url.parse(preparedURI, true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// If the URL API is not available, fall back to deprecated url.parse
|
// If the URL API is not available, fall back to deprecated url.parse
|
||||||
return url.parse(uri, true);
|
return url.parse(preparedURI, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3618,23 +3623,23 @@ if (!cluster.isPrimary) {
|
||||||
var customDirListingHeader = fs.existsSync(("." + decodeURIComponent(href) + "/.dirhead").replace(/\/+/g, "/")) ?
|
var customDirListingHeader = fs.existsSync(("." + decodeURIComponent(href) + "/.dirhead").replace(/\/+/g, "/")) ?
|
||||||
fs.readFileSync(("." + decodeURIComponent(href) + "/.dirhead").replace(/\/+/g, "/")).toString() :
|
fs.readFileSync(("." + decodeURIComponent(href) + "/.dirhead").replace(/\/+/g, "/")).toString() :
|
||||||
(fs.existsSync(("." + decodeURIComponent(href) + "/HEAD.html").replace(/\/+/g, "/")) && (os.platform != "win32" || href != "/")) ?
|
(fs.existsSync(("." + decodeURIComponent(href) + "/HEAD.html").replace(/\/+/g, "/")) && (os.platform != "win32" || href != "/")) ?
|
||||||
fs.readFileSync(("." + decodeURIComponent(href) + "/HEAD.html").replace(/\/+/g, "/")).toString() :
|
fs.readFileSync(("." + decodeURIComponent(href) + "/HEAD.html").replace(/\/+/g, "/")).toString() :
|
||||||
"";
|
"";
|
||||||
var customDirListingFooter = fs.existsSync(("." + decodeURIComponent(href) + "/.dirfoot").replace(/\/+/g, "/")) ?
|
var customDirListingFooter = fs.existsSync(("." + decodeURIComponent(href) + "/.dirfoot").replace(/\/+/g, "/")) ?
|
||||||
fs.readFileSync(("." + decodeURIComponent(href) + "/.dirfoot").replace(/\/+/g, "/")).toString() :
|
fs.readFileSync(("." + decodeURIComponent(href) + "/.dirfoot").replace(/\/+/g, "/")).toString() :
|
||||||
(fs.existsSync(("." + decodeURIComponent(href) + "/FOOT.html").replace(/\/+/g, "/")) && (os.platform != "win32" || href != "/")) ?
|
(fs.existsSync(("." + decodeURIComponent(href) + "/FOOT.html").replace(/\/+/g, "/")) && (os.platform != "win32" || href != "/")) ?
|
||||||
fs.readFileSync(("." + decodeURIComponent(href) + "/FOOT.html").replace(/\/+/g, "/")).toString() :
|
fs.readFileSync(("." + decodeURIComponent(href) + "/FOOT.html").replace(/\/+/g, "/")).toString() :
|
||||||
"";
|
"";
|
||||||
|
|
||||||
// Check if custom header has HTML tag
|
// Check if custom header has HTML tag
|
||||||
var headerHasHTMLTag = customDirListingHeader.replace(/<!--(?:(?:(?!--\>)[\s\S])*|)(?:-->|$)/g, "").match(/<html(?![a-zA-Z0-9])(?:"(?:\\(?:[\s\S]|$)|[^\\"])*(?:"|$)|'(?:\\(?:[\s\S]|$)|[^\\'])*(?:'|$)|[^'">])*(?:>|$)/i);
|
var headerHasHTMLTag = customDirListingHeader.replace(/<!--(?:(?:(?!--\>)[\s\S])*|)(?:-->|$)/g, "").match(/<html(?![a-zA-Z0-9])(?:"(?:\\(?:[\s\S]|$)|[^\\"])*(?:"|$)|'(?:\\(?:[\s\S]|$)|[^\\'])*(?:'|$)|[^'">])*(?:>|$)/i);
|
||||||
|
|
||||||
// Generate HTML head and footer based on configuration and custom content
|
// Generate HTML head and footer based on configuration and custom content
|
||||||
var htmlHead = (!configJSON.enableDirectoryListingWithDefaultHead || head == "" ?
|
var htmlHead = (!configJSON.enableDirectoryListingWithDefaultHead || head == "" ?
|
||||||
(!headerHasHTMLTag ?
|
(!headerHasHTMLTag ?
|
||||||
"<!DOCTYPE html><html><head><title>Directory: " + decodeURIComponent(origHref).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">") + "</title><meta charset=\"UTF-8\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /></head><body>" :
|
"<!DOCTYPE html><html><head><title>Directory: " + decodeURIComponent(origHref).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">") + "</title><meta charset=\"UTF-8\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /></head><body>" :
|
||||||
customDirListingHeader.replace(/<head>/i, "<head><title>Directory: " + decodeURIComponent(origHref).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">") + "</title>")) :
|
customDirListingHeader.replace(/<head>/i, "<head><title>Directory: " + decodeURIComponent(origHref).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">") + "</title>")) :
|
||||||
head.replace(/<head>/i, "<head><title>Directory: " + decodeURIComponent(origHref).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">") + "</title>")) +
|
head.replace(/<head>/i, "<head><title>Directory: " + decodeURIComponent(origHref).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">") + "</title>")) +
|
||||||
(!headerHasHTMLTag ? customDirListingHeader : "") +
|
(!headerHasHTMLTag ? customDirListingHeader : "") +
|
||||||
"<h1>Directory: " + decodeURIComponent(origHref).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">") + "</h1><table id=\"directoryListing\"> <tr> <th></th> <th>Filename</th> <th>Size</th> <th>Date</th> </tr>" + (checkPathLevel(decodeURIComponent(origHref)) < 1 ? "" : "<tr><td style=\"width: 24px;\"><img src=\"/.dirimages/return.png\" width=\"24px\" height=\"24px\" alt=\"[RET]\" /></td><td style=\"word-wrap: break-word; word-break: break-word; overflow-wrap: break-word;\"><a href=\"" + (origHref).replace(/\/+/g, "/").replace(/\/[^\/]*\/?$/, "/") + "\">Return</a></td><td></td><td></td></tr>");
|
"<h1>Directory: " + decodeURIComponent(origHref).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">") + "</h1><table id=\"directoryListing\"> <tr> <th></th> <th>Filename</th> <th>Size</th> <th>Date</th> </tr>" + (checkPathLevel(decodeURIComponent(origHref)) < 1 ? "" : "<tr><td style=\"width: 24px;\"><img src=\"/.dirimages/return.png\" width=\"24px\" height=\"24px\" alt=\"[RET]\" /></td><td style=\"word-wrap: break-word; word-break: break-word; overflow-wrap: break-word;\"><a href=\"" + (origHref).replace(/\/+/g, "/").replace(/\/[^\/]*\/?$/, "/") + "\">Return</a></td><td></td><td></td></tr>");
|
||||||
|
|
||||||
|
@ -3770,7 +3775,7 @@ if (!cluster.isPrimary) {
|
||||||
} else if (estats.isSocket()) {
|
} else if (estats.isSocket()) {
|
||||||
entry = entry.replace("[img]", "/.dirimages/socket.png").replace("[alt]", "[SCK]");
|
entry = entry.replace("[img]", "/.dirimages/socket.png").replace("[alt]", "[SCK]");
|
||||||
}
|
}
|
||||||
} else if ((/README/ig).test(ename) || (/LICEN[SC]E/ig).test(ename)) {
|
} else if (ename.match(/README|LICEN[SC]E/i)) {
|
||||||
entry = entry.replace("[img]", "/.dirimages/important.png").replace("[alt]", "[IMP]");
|
entry = entry.replace("[img]", "/.dirimages/important.png").replace("[alt]", "[IMP]");
|
||||||
} else if (checkEXT(ename, ".html") || checkEXT(ename, ".htm") || checkEXT(ename, ".xml") || checkEXT(ename, ".xhtml") || checkEXT(ename, ".shtml")) {
|
} else if (checkEXT(ename, ".html") || checkEXT(ename, ".htm") || checkEXT(ename, ".xml") || checkEXT(ename, ".xhtml") || checkEXT(ename, ".shtml")) {
|
||||||
entry = entry.replace("[img]", "/.dirimages/html.png").replace("[alt]", (checkEXT(ename, ".xml") ? "[XML]" : "[HTM]"));
|
entry = entry.replace("[img]", "/.dirimages/html.png").replace("[alt]", (checkEXT(ename, ".xml") ? "[XML]" : "[HTM]"));
|
||||||
|
@ -4154,7 +4159,7 @@ if (!cluster.isPrimary) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sanitize URL
|
// Sanitize URL
|
||||||
var sanitizedHref = sanitizeURL(href);
|
var sanitizedHref = sanitizeURL(href, allowDoubleSlashes);
|
||||||
var preparedReqUrl = uobject.pathname + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "");
|
var preparedReqUrl = uobject.pathname + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "");
|
||||||
|
|
||||||
// Check if URL is "dirty"
|
// Check if URL is "dirty"
|
||||||
|
@ -4214,67 +4219,22 @@ if (!cluster.isPrimary) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var urlp = parseURL("http://" + hostx);
|
var isPublicServer = !(req.socket.realRemoteAddress ? req.socket.realRemoteAddress : req.socket.remoteAddress).match(/^(?:localhost$|::1$|f[c-d][0-9a-f]{2}:|(?:::ffff:)?(?:(?:127|10)\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|192\.168\.[0-9]{1,3}\.[0-9]{1,3}|172\.(?:1[6-9]|2[0-9]|3[0-1])\.[0-9]{1,3}\.[0-9]{1,3})$)/i);
|
||||||
try {
|
|
||||||
if (urlp.path.indexOf("//") == 0) {
|
|
||||||
urlp = parseURL("http:" + url.path);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
// URL parse error...
|
|
||||||
}
|
|
||||||
|
|
||||||
if (urlp.host == "localhost" || urlp.host == "localhost:" + port.toString() || urlp.host == "127.0.0.1" || urlp.host == "127.0.0.1:" + port.toString() || urlp.host == "::1" || urlp.host == "::1:" + port.toString()) {
|
var destinationPort = 0;
|
||||||
urlp.protocol = "https:";
|
|
||||||
if (sport == 443) {
|
var parsedHostx = hostx.match(/(\[[^\]]*\]|[^:]*)(?::([0-9]+))?/);
|
||||||
urlp.host = urlp.hostname;
|
var hostname = parsedHostx[1];
|
||||||
} else {
|
var hostPort = parsedHostx[2] ? parseInt(parsedHostx[2]) : 80;
|
||||||
urlp.host = urlp.hostname + ":" + sport.toString();
|
if (isNaN(hostPort)) hostPort = 80;
|
||||||
urlp.port = sport.toString();
|
|
||||||
}
|
if (hostPort == port || (port == pubport && !isPublicServer)) {
|
||||||
} else if (urlp.host == (listenAddress ? listenAddress : host) || urlp.host == (listenAddress ? listenAddress : host) + ":" + port.toString()) {
|
destinationPort = sport;
|
||||||
urlp.protocol = "https:";
|
|
||||||
if (sport == 443) {
|
|
||||||
urlp.host = urlp.hostname;
|
|
||||||
} else {
|
|
||||||
urlp.host = urlp.hostname + ":" + sport.toString();
|
|
||||||
urlp.port = sport.toString();
|
|
||||||
}
|
|
||||||
} else if (urlp.host == pubip || urlp.host == pubip + ":" + pubport.toString()) {
|
|
||||||
urlp.protocol = "https:";
|
|
||||||
if (spubport == 443) {
|
|
||||||
urlp.host = urlp.hostname;
|
|
||||||
} else {
|
|
||||||
urlp.host = urlp.hostname + ":" + spubport.toString();
|
|
||||||
urlp.port = spubport.toString();
|
|
||||||
}
|
|
||||||
} else if (urlp.hostname == domain || urlp.hostname.indexOf(domain) != -1) {
|
|
||||||
urlp.protocol = "https:";
|
|
||||||
if (spubport == 443) {
|
|
||||||
urlp.host = urlp.hostname;
|
|
||||||
} else {
|
|
||||||
urlp.host = urlp.hostname + ":" + spubport.toString();
|
|
||||||
urlp.port = spubport.toString();
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
urlp.protocol = "https:";
|
destinationPort = spubport;
|
||||||
}
|
|
||||||
urlp.path = null;
|
|
||||||
urlp.pathname = null;
|
|
||||||
var lloc = url.format(urlp);
|
|
||||||
var requestURL = req.url;
|
|
||||||
try {
|
|
||||||
if (requestURL.split("/")[1].indexOf(".onion") != -1) {
|
|
||||||
requestURL = requestURL.split("/");
|
|
||||||
requestURL.shift();
|
|
||||||
requestURL.shift();
|
|
||||||
requestURL.unshift("");
|
|
||||||
requestURL = requestURL.join("/");
|
|
||||||
}
|
|
||||||
} catch (err) {
|
|
||||||
// Leave URL as it is...
|
|
||||||
}
|
}
|
||||||
|
|
||||||
redirect(lloc + requestURL);
|
redirect("https://" + hostname + (destinationPort == 443 ? "" : (":" + destinationPort)) + req.url);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4313,7 +4273,13 @@ if (!cluster.isPrimary) {
|
||||||
doCallback = false;
|
doCallback = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
var tempRewrittenURL = rewrittenURL;
|
||||||
|
if (!mapEntry.allowDoubleSlashes) {
|
||||||
|
address = address.replace(/\/+/g,"/");
|
||||||
|
tempRewrittenURL = address;
|
||||||
|
}
|
||||||
if (matchHostname(mapEntry.host) && ipMatch(mapEntry.ip, req.socket ? req.socket.localAddress : undefined) && address.match(createRegex(mapEntry.definingRegex)) && !(mapEntry.isNotDirectory && _fileState == 2) && !(mapEntry.isNotFile && _fileState == 1)) {
|
if (matchHostname(mapEntry.host) && ipMatch(mapEntry.ip, req.socket ? req.socket.localAddress : undefined) && address.match(createRegex(mapEntry.definingRegex)) && !(mapEntry.isNotDirectory && _fileState == 2) && !(mapEntry.isNotFile && _fileState == 1)) {
|
||||||
|
rewrittenURL = tempRewrittenURL;
|
||||||
try {
|
try {
|
||||||
mapEntry.replacements.forEach(function (replacement) {
|
mapEntry.replacements.forEach(function (replacement) {
|
||||||
rewrittenURL = rewrittenURL.replace(createRegex(replacement.regex), replacement.replacement);
|
rewrittenURL = rewrittenURL.replace(createRegex(replacement.regex), replacement.replacement);
|
||||||
|
@ -4321,7 +4287,7 @@ if (!cluster.isPrimary) {
|
||||||
if (mapEntry.append) rewrittenURL += mapEntry.append;
|
if (mapEntry.append) rewrittenURL += mapEntry.append;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
doCallback = false;
|
doCallback = false;
|
||||||
callback(err, address);
|
callback(err, null);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -4363,10 +4329,11 @@ if (!cluster.isPrimary) {
|
||||||
|
|
||||||
// Add web root postfixes
|
// Add web root postfixes
|
||||||
if (!isProxy) {
|
if (!isProxy) {
|
||||||
var urlWithPostfix = req.url;
|
var preparedReqUrl3 = (allowPostfixDoubleSlashes ? (href.replace(/\/+/,"/") + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "")) : req.url);
|
||||||
|
var urlWithPostfix = preparedReqUrl3;
|
||||||
var postfixPrefix = "";
|
var postfixPrefix = "";
|
||||||
wwwrootPostfixPrefixesVHost.every(function (currentPostfixPrefix) {
|
wwwrootPostfixPrefixesVHost.every(function (currentPostfixPrefix) {
|
||||||
if (req.url.indexOf(currentPostfixPrefix) == 0) {
|
if (preparedReqUrl3.indexOf(currentPostfixPrefix) == 0) {
|
||||||
if (currentPostfixPrefix.match(/\/+$/)) postfixPrefix = currentPostfixPrefix.replace(/\/+$/, "");
|
if (currentPostfixPrefix.match(/\/+$/)) postfixPrefix = currentPostfixPrefix.replace(/\/+$/, "");
|
||||||
else if (urlWithPostfix.length == currentPostfixPrefix.length || urlWithPostfix[currentPostfixPrefix.length] == "?" || urlWithPostfix[currentPostfixPrefix.length] == "/" || urlWithPostfix[currentPostfixPrefix.length] == "#") postfixPrefix = currentPostfixPrefix;
|
else if (urlWithPostfix.length == currentPostfixPrefix.length || urlWithPostfix[currentPostfixPrefix.length] == "?" || urlWithPostfix[currentPostfixPrefix.length] == "/" || urlWithPostfix[currentPostfixPrefix.length] == "#") postfixPrefix = currentPostfixPrefix;
|
||||||
else return true;
|
else return true;
|
||||||
|
@ -4377,14 +4344,14 @@ if (!cluster.isPrimary) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
wwwrootPostfixesVHost.every(function (postfixEntry) {
|
wwwrootPostfixesVHost.every(function (postfixEntry) {
|
||||||
if (matchHostname(postfixEntry.host) && ipMatch(postfixEntry.ip, req.socket ? req.socket.localAddress : undefined) && !(postfixEntry.skipRegex && req.url.match(createRegex(postfixEntry.skipRegex)))) {
|
if (matchHostname(postfixEntry.host) && ipMatch(postfixEntry.ip, req.socket ? req.socket.localAddress : undefined) && !(postfixEntry.skipRegex && preparedReqUrl3.match(createRegex(postfixEntry.skipRegex)))) {
|
||||||
urlWithPostfix = postfixPrefix + "/" + postfixEntry.postfix + urlWithPostfix;
|
urlWithPostfix = postfixPrefix + "/" + postfixEntry.postfix + urlWithPostfix;
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (urlWithPostfix != req.url) {
|
if (urlWithPostfix != preparedReqUrl3) {
|
||||||
serverconsole.resmessage("Added web root postfix: " + req.url + " => " + urlWithPostfix);
|
serverconsole.resmessage("Added web root postfix: " + req.url + " => " + urlWithPostfix);
|
||||||
req.url = urlWithPostfix;
|
req.url = urlWithPostfix;
|
||||||
uobject = parseURL(req.url);
|
uobject = parseURL(req.url);
|
||||||
|
@ -4402,7 +4369,7 @@ if (!cluster.isPrimary) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var sHref = sanitizeURL(href);
|
var sHref = sanitizeURL(href, allowDoubleSlashes);
|
||||||
var preparedReqUrl2 = uobject.pathname + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "");
|
var preparedReqUrl2 = uobject.pathname + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "");
|
||||||
|
|
||||||
if (req.url != preparedReqUrl2 || sHref != href.replace(/\/\.(?=\/|$)/g, "/").replace(/\/+/g, "/")) {
|
if (req.url != preparedReqUrl2 || sHref != href.replace(/\/\.(?=\/|$)/g, "/").replace(/\/+/g, "/")) {
|
||||||
|
@ -4463,7 +4430,7 @@ if (!cluster.isPrimary) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var sHref = sanitizeURL(href);
|
var sHref = sanitizeURL(href, allowDoubleSlashes);
|
||||||
var preparedReqUrl2 = uobject.pathname + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "");
|
var preparedReqUrl2 = uobject.pathname + (uobject.search ? uobject.search : "") + (uobject.hash ? uobject.hash : "");
|
||||||
|
|
||||||
if (req.url != preparedReqUrl2 || sHref != href.replace(/\/\.(?=\/|$)/g, "/").replace(/\/+/g, "/")) {
|
if (req.url != preparedReqUrl2 || sHref != href.replace(/\/\.(?=\/|$)/g, "/").replace(/\/+/g, "/")) {
|
||||||
|
@ -4510,24 +4477,27 @@ if (!cluster.isPrimary) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Prepare the path (remove multiple slashes)
|
||||||
|
var decodedHrefWithoutDuplicateSlashes = decodedHref.replace(/\/+/g,"/");
|
||||||
|
|
||||||
// Check if path is forbidden
|
// Check if path is forbidden
|
||||||
if ((isForbiddenPath(decodedHref, "config") || isForbiddenPath(decodedHref, "certificates")) && !isProxy) {
|
if ((isForbiddenPath(decodedHrefWithoutDuplicateSlashes, "config") || isForbiddenPath(decodedHrefWithoutDuplicateSlashes, "certificates")) && !isProxy) {
|
||||||
callServerError(403);
|
callServerError(403);
|
||||||
serverconsole.errmessage("Access to configuration file/certificates is denied.");
|
serverconsole.errmessage("Access to configuration file/certificates is denied.");
|
||||||
return;
|
return;
|
||||||
} else if (isIndexOfForbiddenPath(decodedHref, "temp") && !isProxy) {
|
} else if (isIndexOfForbiddenPath(decodedHrefWithoutDuplicateSlashes, "temp") && !isProxy) {
|
||||||
callServerError(403);
|
callServerError(403);
|
||||||
serverconsole.errmessage("Access to temporary folder is denied.");
|
serverconsole.errmessage("Access to temporary folder is denied.");
|
||||||
return;
|
return;
|
||||||
} else if (isIndexOfForbiddenPath(decodedHref, "log") && !isProxy && (configJSON.enableLogging || configJSON.enableLogging == undefined) && !configJSON.enableRemoteLogBrowsing) {
|
} else if (isIndexOfForbiddenPath(decodedHrefWithoutDuplicateSlashes, "log") && !isProxy && (configJSON.enableLogging || configJSON.enableLogging == undefined) && !configJSON.enableRemoteLogBrowsing) {
|
||||||
callServerError(403);
|
callServerError(403);
|
||||||
serverconsole.errmessage("Access to log files is denied.");
|
serverconsole.errmessage("Access to log files is denied.");
|
||||||
return;
|
return;
|
||||||
} else if (isForbiddenPath(decodedHref, "svrjs") && !isProxy && !exposeServerVersion) {
|
} else if (isForbiddenPath(decodedHrefWithoutDuplicateSlashes, "svrjs") && !isProxy && !exposeServerVersion) {
|
||||||
callServerError(403);
|
callServerError(403);
|
||||||
serverconsole.errmessage("Access to SVR.JS script is denied.");
|
serverconsole.errmessage("Access to SVR.JS script is denied.");
|
||||||
return;
|
return;
|
||||||
} else if ((isForbiddenPath(decodedHref, "svrjs") || isForbiddenPath(decodedHref, "serverSideScripts") || isIndexOfForbiddenPath(decodedHref, "serverSideScriptDirectories")) && !isProxy && (configJSON.disableServerSideScriptExpose || configJSON.disableServerSideScriptExpose === undefined)) {
|
} else if ((isForbiddenPath(decodedHrefWithoutDuplicateSlashes, "svrjs") || isForbiddenPath(decodedHrefWithoutDuplicateSlashes, "serverSideScripts") || isIndexOfForbiddenPath(decodedHrefWithoutDuplicateSlashes, "serverSideScriptDirectories")) && !isProxy && (configJSON.disableServerSideScriptExpose || configJSON.disableServerSideScriptExpose === undefined)) {
|
||||||
callServerError(403);
|
callServerError(403);
|
||||||
serverconsole.errmessage("Access to sources is denied.");
|
serverconsole.errmessage("Access to sources is denied.");
|
||||||
return;
|
return;
|
||||||
|
@ -4541,14 +4511,15 @@ if (!cluster.isPrimary) {
|
||||||
for (var i = 0; i < nonStandardCodes.length; i++) {
|
for (var i = 0; i < nonStandardCodes.length; i++) {
|
||||||
if (matchHostname(nonStandardCodes[i].host) && ipMatch(nonStandardCodes[i].ip, req.socket ? req.socket.localAddress : undefined)) {
|
if (matchHostname(nonStandardCodes[i].host) && ipMatch(nonStandardCodes[i].ip, req.socket ? req.socket.localAddress : undefined)) {
|
||||||
var isMatch = false;
|
var isMatch = false;
|
||||||
|
var hrefWithoutDuplicateSlashes = href.replace(/\/+/g,"/");
|
||||||
if (nonStandardCodes[i].regex) {
|
if (nonStandardCodes[i].regex) {
|
||||||
// Regex match
|
// Regex match
|
||||||
var createdRegex = createRegex(nonStandardCodes[i].regex, true);
|
var createdRegex = createRegex(nonStandardCodes[i].regex, true);
|
||||||
isMatch = req.url.match(createdRegex) || href.match(createdRegex);
|
isMatch = req.url.match(createdRegex) || hrefWithoutDuplicateSlashes.match(createdRegex);
|
||||||
regexI[i] = createdRegex;
|
regexI[i] = createdRegex;
|
||||||
} else {
|
} else {
|
||||||
// Non-regex match
|
// Non-regex match
|
||||||
isMatch = nonStandardCodes[i].url == href || (os.platform() == "win32" && nonStandardCodes[i].url.toLowerCase() == href.toLowerCase());
|
isMatch = nonStandardCodes[i].url == hrefWithoutDuplicateSlashes || (os.platform() == "win32" && nonStandardCodes[i].url.toLowerCase() == hrefWithoutDuplicateSlashes.toLowerCase());
|
||||||
}
|
}
|
||||||
if (isMatch) {
|
if (isMatch) {
|
||||||
if (nonStandardCodes[i].scode == 401) {
|
if (nonStandardCodes[i].scode == 401) {
|
||||||
|
@ -4577,6 +4548,10 @@ if (!cluster.isPrimary) {
|
||||||
var location = "";
|
var location = "";
|
||||||
if (regexI[nonscodeIndex]) {
|
if (regexI[nonscodeIndex]) {
|
||||||
location = req.url.replace(regexI[nonscodeIndex], nonscode.location);
|
location = req.url.replace(regexI[nonscodeIndex], nonscode.location);
|
||||||
|
if(location == req.url) {
|
||||||
|
// Fallback replacement
|
||||||
|
location = hrefWithoutDuplicateSlashes.replace(regexI[nonscodeIndex], nonscode.location);
|
||||||
|
}
|
||||||
} else if (req.url.split("?")[1] == undefined || req.url.split("?")[1] == null || req.url.split("?")[1] == "" || req.url.split("?")[1] == " ") {
|
} else if (req.url.split("?")[1] == undefined || req.url.split("?")[1] == null || req.url.split("?")[1] == "" || req.url.split("?")[1] == " ") {
|
||||||
location = nonscode.location;
|
location = nonscode.location;
|
||||||
} else {
|
} else {
|
||||||
|
@ -5075,11 +5050,11 @@ function start(init) {
|
||||||
if (process.isBun) {
|
if (process.isBun) {
|
||||||
serverconsole.locwarnmessage("Bun support is experimental. Some features of SVR.JS, SVR.JS mods and SVR.JS server-side JavaScript may not work as expected.");
|
serverconsole.locwarnmessage("Bun support is experimental. Some features of SVR.JS, SVR.JS mods and SVR.JS server-side JavaScript may not work as expected.");
|
||||||
if (users.some(function (entry) {
|
if (users.some(function (entry) {
|
||||||
return entry.pbkdf2;
|
return entry.pbkdf2;
|
||||||
})) serverconsole.locwarnmessage("PBKDF2 password hashing function in Bun blocks the event loop, which may result in denial of service.");
|
})) serverconsole.locwarnmessage("PBKDF2 password hashing function in Bun blocks the event loop, which may result in denial of service.");
|
||||||
if (users.some(function (entry) {
|
if (users.some(function (entry) {
|
||||||
return entry.scrypt;
|
return entry.scrypt;
|
||||||
})) serverconsole.locwarnmessage("scrypt password hashing function in Bun blocks the event loop, which may result in denial of service.");
|
})) serverconsole.locwarnmessage("scrypt password hashing function in Bun blocks the event loop, which may result in denial of service.");
|
||||||
}
|
}
|
||||||
if (cluster.isPrimary === undefined) serverconsole.locwarnmessage("You're running SVR.JS on single thread. Reliability may suffer, as the server is stopped after crash.");
|
if (cluster.isPrimary === undefined) serverconsole.locwarnmessage("You're running SVR.JS on single thread. Reliability may suffer, as the server is stopped after crash.");
|
||||||
if (crypto.__disabled__ !== undefined) serverconsole.locwarnmessage("Your Node.JS version doesn't have crypto support! The 'crypto' module is essential for providing cryptographic functionality in Node.JS. Without crypto support, certain security features may be unavailable, and some functionality may not work as expected. It's recommended to use a Node.JS version that includes crypto support to ensure the security and proper functioning of your server.");
|
if (crypto.__disabled__ !== undefined) serverconsole.locwarnmessage("Your Node.JS version doesn't have crypto support! The 'crypto' module is essential for providing cryptographic functionality in Node.JS. Without crypto support, certain security features may be unavailable, and some functionality may not work as expected. It's recommended to use a Node.JS version that includes crypto support to ensure the security and proper functioning of your server.");
|
||||||
|
@ -5829,6 +5804,7 @@ function saveConfig() {
|
||||||
if (configJSONobj.exposeModsInErrorPages === undefined) configJSONobj.exposeModsInErrorPages = true;
|
if (configJSONobj.exposeModsInErrorPages === undefined) configJSONobj.exposeModsInErrorPages = true;
|
||||||
if (configJSONobj.disableTrailingSlashRedirects === undefined) configJSONobj.disableTrailingSlashRedirects = false;
|
if (configJSONobj.disableTrailingSlashRedirects === undefined) configJSONobj.disableTrailingSlashRedirects = false;
|
||||||
if (configJSONobj.environmentVariables === undefined) configJSONobj.environmentVariables = {};
|
if (configJSONobj.environmentVariables === undefined) configJSONobj.environmentVariables = {};
|
||||||
|
if (configJSONobj.allowDoubleSlashes === undefined) configJSONobj.allowDoubleSlashes = false;
|
||||||
|
|
||||||
var configString = JSON.stringify(configJSONobj, null, 2) + "\n";
|
var configString = JSON.stringify(configJSONobj, null, 2) + "\n";
|
||||||
fs.writeFileSync(__dirname + "/config.json", configString);
|
fs.writeFileSync(__dirname + "/config.json", configString);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>SVR.JS 3.14.3 Tests</title>
|
<title>SVR.JS 3.14.4 Tests</title>
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
<style>
|
<style>
|
||||||
|
@ -12,7 +12,7 @@
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1>SVR.JS 3.14.3 Tests</h1>
|
<h1>SVR.JS 3.14.4 Tests</h1>
|
||||||
<h2>Directory (without trailing slash)</h2>
|
<h2>Directory (without trailing slash)</h2>
|
||||||
<iframe src="/testdir" width="50%" height="300px"></iframe>
|
<iframe src="/testdir" width="50%" height="300px"></iframe>
|
||||||
<h2>Directory (with query)</h2>
|
<h2>Directory (with query)</h2>
|
||||||
|
|