Initial commit

This commit is contained in:
Dorian Niemiec 2024-03-15 21:53:12 +01:00
commit 35c411b6e4
105 changed files with 10328 additions and 0 deletions

2
.gitattributes vendored Normal file
View file

@ -0,0 +1,2 @@
*.ogv filter=lfs diff=lfs merge=lfs -text
*.mp4 filter=lfs diff=lfs merge=lfs -text

9
.gitignore vendored Normal file
View file

@ -0,0 +1,9 @@
.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
_multiconfig.yml
svrjs/

0
_config.landscape.yml Normal file
View file

122
_config.yml Normal file
View file

@ -0,0 +1,122 @@
# Hexo Configuration
## Docs: https://hexo.io/docs/configuration.html
## Source: https://github.com/hexojs/hexo/
# Site
title: SVR.JS
subtitle: 'a web server running on Node.JS'
description: "SVR.JS is a web server running on Node.JS. It's free as in freedom, scalable, secure and configurable. Download SVR.JS here."
keywords:
author: SVR.JS
language: en-US
timezone: ''
# URL
## Set your site url here. For example, if you use GitHub Page, set url as 'https://username.github.io/project'
url: https://svrjs.org
permalink: :year/:month/:day/:title/
permalink_defaults:
pretty_urls:
trailing_index: false # Set to false to remove trailing 'index.html' from permalinks
trailing_html: false # Set to false to remove trailing '.html' from permalinks
# Directory
source_dir: source
public_dir: public
tag_dir: tags
archive_dir: archives
category_dir: categories
code_dir: downloads/code
i18n_dir: :lang
skip_render:
# Writing
new_post_name: :title.md # File name of new posts
default_layout: page
titlecase: false # Transform title into titlecase
external_link:
enable: false # Open external links in new tab
field: site # Apply to the whole site
exclude: ''
filename_case: 0
render_drafts: false
post_asset_folder: false
relative_link: false
future: true
syntax_highlighter: highlight.js
highlight:
line_number: true
auto_detect: false
tab_replace: ''
wrap: true
hljs: false
prismjs:
preprocess: true
line_number: true
tab_replace: ''
# Home page setting
# path: Root path for your blogs index page. (default = '')
# per_page: Posts displayed per page. (0 = disable pagination)
# order_by: Posts order. (Order by date descending by default)
index_generator:
path: ''
per_page: 0
order_by: -date
# Category & Tag
default_category: uncategorized
category_map:
tag_map:
# Metadata elements
## https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta
meta_generator: false
# Date / Time format
## Hexo uses Moment.js to parse and display date
## You can customize the date format as defined in
## http://momentjs.com/docs/#/displaying/format/
date_format: YYYY-MM-DD
time_format: HH:mm:ss
## updated_option supports 'mtime', 'date', 'empty'
updated_option: 'mtime'
# Pagination
## Set per_page to 0 to disable pagination
per_page: 10
pagination_dir: page
# Include / Exclude file(s)
## include:/exclude: options only apply to the 'source/' folder
include:
exclude:
ignore:
# Extensions
## Plugins: https://hexo.io/plugins/
## Themes: https://hexo.io/themes/
theme: svrjswebsite
# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
type: ''
marked:
headerIds: true
anchorAlias: true
sitemap:
path:
- sitemap.xml
rel: true
robotstxt:
useragent: "*"
allow:
- /
disallow:
- /invoke500.svr?aprilfools
- /invoke500.svr
sitemap: https://svrjs.org/sitemap.xml

2609
package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

27
package.json Normal file
View file

@ -0,0 +1,27 @@
{
"name": "hexo-site",
"version": "0.0.0",
"private": true,
"scripts": {
"build": "hexo generate",
"clean": "hexo clean",
"deploy": "hexo deploy",
"server": "hexo server"
},
"hexo": {
"version": "7.1.1"
},
"dependencies": {
"hexo": "^7.0.0",
"hexo-generator-archive": "^2.0.0",
"hexo-generator-category": "^2.0.0",
"hexo-generator-robotstxt": "^0.2.0",
"hexo-generator-sitemap": "^3.0.1",
"hexo-generator-tag": "^2.0.0",
"hexo-renderer-ejs": "^2.0.0",
"hexo-renderer-marked": "^6.0.0",
"hexo-renderer-stylus": "^3.0.0",
"hexo-server": "^3.0.0",
"hexo-theme-landscape": "^1.0.0"
}
}

7
preparetest.sh Executable file
View file

@ -0,0 +1,7 @@
#!/bin/bash
git clone -b stable https://git.svrjs.org/git/svrjs.git
cp svrjs-config.json svrjs/config.json
echo "You can run the test server at http://localhost:3000 using:"
echo " cd svrjs"
echo " node svr.js"

5
scaffolds/docs-page.md Normal file
View file

@ -0,0 +1,5 @@
---
title: {{ title }}
date: {{ date }}
layout: docs-page
---

4
scaffolds/draft.md Normal file
View file

@ -0,0 +1,4 @@
---
title: {{ title }}
tags:
---

5
scaffolds/error-page.md Normal file
View file

@ -0,0 +1,5 @@
---
title: {{ title }}
date: {{ date }}
layout: error-page
---

5
scaffolds/index-page.md Normal file
View file

@ -0,0 +1,5 @@
---
title: {{ title }}
date: {{ date }}
layout: index-page
---

4
scaffolds/page.md Normal file
View file

@ -0,0 +1,4 @@
---
title: {{ title }}
date: {{ date }}
---

5
scaffolds/post.md Normal file
View file

@ -0,0 +1,5 @@
---
title: {{ title }}
date: {{ date }}
tags:
---

98
source/404.md Normal file
View file

@ -0,0 +1,98 @@
---
title: 404 Not Found
date: 2023-12-21 17:10:14
sitemap: false
layout: error-page
---
<div class="error404">
<div class="error-inner">
<h1>404 Not Found</h1>
<p>The requested file doesn't exist. If you have typed the URL manually, then please check the spelling.</p>
<p><b>Or maybe go back to <a href="/">main page</a>, read <a href="/zsoiebook.svr">The Book of ZSOiE</a> or browse our <a href="/docs">SVR.JS documentation</a>? You decide!</b></p>
<div class="error-button-container">
<a href="/" class="styled-button">Go back to the main page</a>
</div>
</div>
</div>
<div class="error-link-container">
<h2>Links</h2>
<div class="error-link-column-container">
<div class="error-link-column">
<h3>Main website</h3>
<ul>
<li><a href="/">Main page</a></li>
<li><a href="/docs">Documentation</a></li>
<li><a href="/mods">Official SVR.JS mods</a></li>
<li><a href="/otherdownloads">Download options</a></li>
<li><a href="/vulnerabilities">SVR.JS vulnerabilities</a></li>
<li><a href="/contribute">Contribute to SVR.JS</a></li>
<li><a href="/contact">Contact us</a></li>
<li><a href="/privacy">Privacy Policy</a></li>
<li><a href="/toc">Terms and Conditions</a></li>
</ul>
</div>
</div>
<div class="error-link-column-container">
<div class="error-link-column">
<h3>Downloads</h3>
<ul>
<li><a href="https://downloads.svrjs.org">SVR.JS downloads</a></li>
<li><a href="https://downloads.svrjs.org/beta/">SVR.JS Beta</a></li>
<li><a href="https://downloads.svrjs.org/installer/">SVR.JS installer</a></li>
<li><a href="https://downloads.svrjs.org/mods/">SVR.JS mods</a></li>
<li><a href="https://downloads.svrjs.org/nightly/">SVR.JS Nightly</a></li>
</ul>
<h3>Blog</h3>
<ul>
<li><a href="https://blog.svrjs.org">Blog main page</a></li>
<li><a href="https://blog.svrjs.org/archives">Archives</a></li>
<li><a href="https://blog.svrjs.org/atom.xml">Feed</a></li>
</ul>
</div>
</div>
<div class="error-link-column-container">
<div class="error-link-column">
<h3>Forum</h3>
<ul>
<li><a href="https://forum.svrjs.org">Forum main page</a></li>
<li><a href="https://forum.svrjs.org/feed">Feed</a></li>
<li><a href="https://forum.svrjs.org/help/faq">FAQ</a></li>
<li><a href="https://forum.svrjs.org/search">Search</a></li>
<li><a href="https://forum.svrjs.org/svr-js-problems">SVR.JS problems</a></li>
<li><a href="https://forum.svrjs.org/svr-js-bugreports">SVR.JS bug reports</a></li>
<li><a href="https://forum.svrjs.org/svr-js-mod-problems">SVR.JS mod problems</a></li>
<li><a href="https://forum.svrjs.org/svr-js-mod-bugs">SVR.JS mod bugs</a></li>
<li><a href="https://forum.svrjs.org/problems-with-server-side-javascript">Problems with server-side JavaScript</a></li>
<li><a href="https://forum.svrjs.org/svr-js-3-x-mods">SVR.JS 3.x mods</a></li>
<li><a href="https://forum.svrjs.org/cgi-ssi-scgi">CGI/SSI/SCGI/FastCGI</a></li>
<li><a href="https://forum.svrjs.org/non-svr-js-server-side-javascript">Non-SVR.JS server-side JavaScript</a></li>
<li><a href="https://forum.svrjs.org/php">PHP</a></li>
<li><a href="https://forum.svrjs.org/general-svrjs-discussions">General SVR.JS discussions</a></li>
<li><a href="https://forum.svrjs.org/feature-suggestions">Feature suggestions</a></li>
<li><a href="https://forum.svrjs.org/third-party-services">Third-party services</a></li>
<li><a href="https://forum.svrjs.org/general-webmaster-discussions">General webmaster discussions</a></li>
<li><a href="https://forum.svrjs.org/introductions">Introductions</a></li>
<li><a href="https://forum.svrjs.org/off-topic">Off-topic</a></li>
</ul>
</div>
</div>
<div class="error-link-column-container">
<div class="error-link-column">
<h3>Git server</h3>
<ul>
<li><a href="https://git.svrjs.org">Git main page</a></li>
<li><a href="https://git.svrjs.org/create-svrjs-server.git"><i>create-svrjs-server</i> utility</a></li>
<li><a href="https://git.svrjs.org/svrjs-installer-linux.git">SVR.JS installer</a></li>
<li><a href="https://git.svrjs.org/svrjs.git">SVR.JS</a></li>
<li><a href="https://git.svrjs.org/svrjs-build-tools.git">SVR.JS build tools</a></li>
<li><a href="https://git.svrjs.org/easywaf-integration.git">EasyWAF integration mod</a></li>
<li><a href="https://git.svrjs.org/greenrhombus.git">GreenRhombus</a></li>
<li><a href="https://git.svrjs.org/orangecircle.git">OrangeCircle</a></li>
<li><a href="https://git.svrjs.org/redbrick.git">RedBrick</a></li>
<li><a href="https://git.svrjs.org/reverse-proxy-mod.git">Reverse proxy mod</a></li>
<li><a href="https://git.svrjs.org/yellowsquare.git">YellowSquare</a></li>
</ul>
</div>
</div>
<div class="error-link-clearfix"></div>
</div>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

20
source/bimi-logo.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 27 KiB

42
source/branding.md Normal file
View file

@ -0,0 +1,42 @@
---
title: Branding
date: 2024-01-21 10:39:33
---
We're making our SVR.JS branding available for you to download. Please keep them though in their original format, shape and colors.
## SVR.JS icon
<div style="text-align: center">
<img src="/logo.png" alt="SVR.JS logo" style="width: 80px; background-color: white; display:inline; vertical-align: middle"> <a href="/logo.png" download>Download .png</a> <a href="/logo.svg" download>Download .svg</a><br/>
<img src="/logo-bw-onblack.png" alt="SVR.JS logo B&W on Black" style="width: 80px; background-color: black; display:inline; vertical-align: middle"> <a href="/logo-bw-onblack.png" download>Download .png</a> <a href="/logo-bw-onblack.svg" download>Download .svg</a><br/>
<img src="/logo-bw-onwhite.png" alt="SVR.JS logo B&W on White" style="width: 80px; background-color: white; display:inline; vertical-align: middle"> <a href="/logo-bw-onwhite.png" download>Download .png</a> <a href="/logo-bw-onwhite.svg" download>Download .svg</a><br/>
</div>
## SVR.JS logo with name (horizontal layout)
<div style="text-align: center">
<img src="/logo-wide.png" alt="SVR.JS logo with name" style="width: 180px; background-color: white; display:inline; vertical-align: middle"> <a href="/logo-wide.png" download>Download .png</a> <a href="/logo-wide.svg" download>Download .svg</a><br/>
<img src="/logo-wide-white.png" alt="SVR.JS logo with name White" style="width: 180px; background-color: black; display:inline; vertical-align: middle"> <a href="/logo-wide-white.png" download>Download .png</a> <a href="/logo-wide-white.svg" download>Download .svg</a><br/>
<img src="/logo-wide-bw-onblack.png" alt="SVR.JS logo with name B&W on Black" style="width: 180px; background-color: black; display:inline; vertical-align: middle"> <a href="/logo-wide-bw-onblack.png" download>Download .png</a> <a href="/logo-wide-bw-onblack.svg" download>Download .svg</a><br/>
<img src="/logo-wide-bw-onwhite.png" alt="SVR.JS logo with name B&W on White" style="width: 180px; background-color: white; display:inline; vertical-align: middle"> <a href="/logo-wide-bw-onwhite.png" download>Download .png</a> <a href="/logo-wide-bw-onwhite.svg" download>Download .svg</a><br/>
</div>
## Powered by SVR.JS badge
You can use it to indicate that your website is powered by the SVR.JS web server.
<div style="text-align: center">
<img src="/powered.png" alt="Powered by SVR.JS" style="width: 150px; display:inline; vertical-align: middle"> <a href="/powered.png" download>Download .png</a><br/>
</div>
## SVR.JS brand colors
<div style="width: 100%; max-width: 480px; margin: auto">
<div style="color: white; background-color: #007000; font-weight: bold; font-size: 1.2em; padding: 0.5em">#007000</div>
<div style="color: black; background-color: #00ff00; font-weight: bold; font-size: 1.2em; padding: 0.5em">#00FF00</div>
<div style="color: white; background-color: #00b000; font-weight: bold; font-size: 1.2em; padding: 0.5em">#00B000</div>
<div style="color: white; background-color: #00d000; font-weight: bold; font-size: 1.2em; padding: 0.5em">#00D000</div>
<div style="color: white; background-color: #002000; font-weight: bold; font-size: 1.2em; padding: 0.5em">#002000</div>
<div style="color: white; background-color: #004f00; font-weight: bold; font-size: 1.2em; padding: 0.5em">#004F00</div>
<div style="color: white; background-color: #000000; font-weight: bold; font-size: 1.2em; padding: 0.5em">#000000</div>
<div style="color: black; background-color: #dfffdf; font-weight: bold; font-size: 1.2em; padding: 0.5em">#DFFFDF</div>
<div style="color: black; background-color: #ffffff; font-weight: bold; font-size: 1.2em; padding: 0.5em">#FFFFFF</div>
</div>

761
source/changelog.md Normal file
View file

@ -0,0 +1,761 @@
---
title: SVR.JS change log
excerpt: Learn more about changes introduced in various SVR.JS versions.
date: 2023-12-21 17:10:14
---
## SVR.JS 3.14.5
* Fixed "www." URL redirect functionality.
* Improved HTTP/1.x API compatibility with HTTP/2.
## SVR.JS 3.14.4
* Updated _tar_ and _graceful-fs_ libraries.
* Added support for URLs with double slashes.
* Rewritten HTTP to HTTPS redirect functionality.
* Changed default directory listing icons.
## SVR.JS 3.14.3
* Fixed bug with URLs beginning with multiple slashes being rewritten incorrectly.
## SVR.JS 3.14.2
* Added new SVR.JS mod and server-side JavaScript property: _authUser_.
## SVR.JS 3.14.1
* Added support for IP-based virtual hosts.
* Fixed SVR.JS crashes with _X-SVR-JS-From-Main-Thread_ header and unknown client IPs.
## SVR.JS 3.4.42 LTS
* Custom head and foot inclusion is now returning 500 error in case of server error instead of crashing the server.
## SVR.JS 3.14.0
* Added new _config.json_ properties: _useClientCertificate_, _rejectUnauthorizedClientCertificates_, _cipherSuite_, _ecdhCurve_, _tlsMinVersion_, _tlsMaxVersion_, _signatureAlgorithms_ and _http2Settings_.
* Added support for web root postfixes (along with postfix prefixes).
* Custom head and foot inclusion is now returning 500 error in case of server error instead of crashing the server.
## SVR.JS 3.13.1
* Fixed error handling for invalid URL rewrite regexes.
* Fixed bug with non-working HTTP proxy handler (excluding CONNECT method).
## SVR.JS 3.4.41 LTS
* Removed all remnants of "DorianTech".
* Mitigated log file injection vulnerability for HTTP authentication.
* Mitigated log file injection vulnerability for SVR.JS mod file names.
* SVR.JS no longer crashes, when access to a log file is denied.
## SVR.JS 3.13.0
* Added support for skipping URL rewriting, when the URL refers to a file or a directory.
* Dropped support for svrmodpack.
* Added support for 307 and 308 redirects (both in config.json and in redirect() SVR.JS API method).
* Mitigated log file injection vulnerability for HTTP authentication.
* Mitigated log file injection vulnerability for SVR.JS mod file names.
* SVR.JS no longer crashes, when access to a log file is denied.
## SVR.JS 3.12.3
* Removed all remnants of "DorianTech".
* Fixed bug with wildcard in domain name selectors.
## SVR.JS 3.12.2
* SVR.JS now refuses to start with misconfigured SNI in order to prevent ReDoS vulnerabilities.
* Add _Host_ header pre-processing.
* Changed SNI regular expression generation function.
## SVR.JS 3.4.40 LTS
* SVR.JS now refuses to start with misconfigured SNI in order to prevent ReDoS vulnerabilities.
## SVR.JS 3.12.1
* Added client errors, server errors, and malformed HTTP request counts to SVR.JS status page.
* Fixed multiple XSS vulnerabilities.
## SVR.JS 3.4.39 LTS
* Invalid compression exclusion list regexes no longer crash SVR.JS.
* Fixed multiple XSS vulnerabilities.
## SVR.JS 3.12.0
* Added trailing slash redirect support.
* Added new _config.json_ property — _environmentVariables_.
* Replaces base 1000 size prefixes with base 1024 ones.
* Invalid compression exclusion list regexes no longer crash SVR.JS.
* Changed invalid regex error message.
* Corrected language errors — replaced _recieve_ with _receive_.
## SVR.JS 3.4.38 LTS
* SVR.JS now sends configuration file saving request to one random good worker instead of all workers to prevent configuration file corruption.
* Fixed crashes due to destroyed HTTP/2 stream (Node.JS bug: [https://github.com/nodejs/node/issues/24470](https://github.com/nodejs/node/issues/24470))
* Fixed crash while trying to report communication problem with workers.
## SVR.JS 3.11.0
* SVR.JS now sends configuration file saving request to one random good worker instead of all workers to prevent configuration file corruption.
* Fixed crashes due to destroyed HTTP/2 stream (Node.JS bug: [https://github.com/nodejs/node/issues/24470](https://github.com/nodejs/node/issues/24470))
* Fixed language errors in HTTP error code descriptions, error console messages and the index page.
* Updated the logo in the SVR.JS log viewer.
## SVR.JS 3.4.37 LTS
* Fixed bug with non-standard code regex replacements
## SVR.JS 3.10.3
* Fixed bug with non-standard code regex replacements
## SVR.JS 3.10.2
* Fixed bug with mods (and server-side JavaScript) executing in wrong order (bug was related with access control vulnerability fix; bug was not present in LTS versions)
## SVR.JS 3.4.36 LTS
* Removed undocumented and non-working code.
* Fixed bug: _.notindex_ files in directories now no longer cause server timeouts caused by non-working undocumented code.
## SVR.JS 3.10.1
* Dropped _pretty-bytes_ dependency.
* Removed undocumented and non-working code.
* Fixed bug: _.notindex_ files in directories now no longer cause server timeouts caused by non-working undocumented code.
* Replaced function converting byte count to human-readable representation with new one.
## SVR.JS 3.4.35 LTS
* Added warning about worker count being limited to one when using Bun 1.0 and newer with shimmed (not native) clustering module.
* Disabled server-side JavaScript bug workaround for Bun 1.0 and newer (it's not needed anymore for these Bun versions).
* Improved clustering shim for Bun.
## SVR.JS 3.10.0
* Added warning about worker count being limited to one when using Bun 1.0 and newer with shimmed (not native) clustering module.
* Disabled server-side JavaScript bug workaround for Bun 1.0 and newer (it's not needed anymore for these Bun versions).
* Improved clustering shim for Bun.
* Improved web root error handling.
## SVR.JS 3.4.34 LTS
* Changed _enableRemoteLogBrowsing_ property to be `false` by default.
* Mitigated security vulnerability: Sensitive data is no longer leaked from temp directory inside SVR.JS installation directory.
## SVR.JS 3.9.6
* Changed _enableRemoteLogBrowsing_ property to be `false` by default.
* Fixed log files only partially saving on failed master startup.
* Mitigated security vulnerability: Sensitive data is no longer leaked from temp directory inside SVR.JS installation directory.
* SVR.JS now logs certificate loading errors.
## <s>SVR.JS 3.4.33 LTS</s>
<s>
* Changed enableRemoteLogBrowsing property to be false by default.
* Mitigated security vulnerability: Sensitive data is no longer leaked from temp directory inside SVR.JS installation directory.
</s>
_This version is unpublished and no longer available for download, because of failed security vulnerability mitigation._
## <s>SVR.JS 3.9.5</s>
<s>
* Changed enableRemoteLogBrowsing property to be false by default.
* Mitigated security vulnerability: Sensitive data is no longer leaked from temp directory inside SVR.JS installation directory.
</s>
_This version is unpublished and no longer available for download, because of failed security vulnerability mitigation._
## SVR.JS 3.4.32 LTS
* Added "svrmodpack" deprecation warning.
* Removed unmaintained primitive analytics mod.
* Removed unmaintained and undocumented hexstrbase64 library.
* Added TypeError workaround for Bun 1.0.0
## SVR.JS 3.9.4
* Changed warning about no support for HTTP/2.
* Added "svrmodpack" deprecation warning.
* Removed unmaintained primitive analytics mod.
* Removed unmaintained and undocumented hexstrbase64 library.
* Added TypeError workaround for Bun 1.0.0
## SVR.JS 3.4.31 LTS
* Mitigated security vulnerability: SVR.JS mods and server-side JavaScript not using href or uobject.pathname in some path checks are no longer vulnerable to access control bypass (from SVR.JS configuration).
## SVR.JS 3.9.3
* Mitigated security vulnerability: SVR.JS mods and server-side JavaScript not using href or uobject.pathname in some path checks are no longer vulnerable to access control bypass (from SVR.JS configuration).
## SVR.JS 3.4.30 LTS
* Mitigated security vulnerability: SVR.JS mods and server-side JavaScript using req.url are no longer vulnerable to path traversal (not including query strings).
## SVR.JS 3.9.2
* Mitigated security vulnerability: SVR.JS mods and server-side JavaScript using req.url are no longer vulnerable to path traversal (not including query strings).
## SVR.JS 3.4.29 LTS
* Added new config.json property - exposeModsInErrorPages
## SVR.JS 3.9.1
* Added new config.json property - exposeModsInErrorPages
## SVR.JS 3.9.0
* Dropped support for undocumented unused non-standard SVR.JS-specific headers.
* Fixed bug with _wwwredirect_.
* Replaced HTTP => HTTPS redirect handler
* Added support for listening to specific IP address.
* Added new config.json property - useWebRootServerSideScript
* Added notice about logged user (HTTP authentication).
* Added validation of X-Forwarded-For header
## SVR.JS 3.4.28 LTS
* Added validation for X-Forwarded-For header.
## SVR.JS 3.4.27 LTS
* Dropped support for undocumented unused non-standard SVR.JS-specific headers.
* Fixed bug with _wwwredirect_.
## SVR.JS 3.4.26 LTS
* Changed default SVR.JS configuration.
* Disabled server-side script exposure by default.
## SVR.JS 3.8.1
* Changed default SVR.JS configuration.
* Disabled server-side script exposure by default.
## SVR.JS 3.8.0
* Added partial virtual hosting support
* Added _host_ field to _nonStandardCodes_ and _rewriteMap_ properties.
* Added _userList_ field to _nonStandardCodes_ properties (with _scode_ set to 401).
* Added new config.json properties: _errorPages_, _enableDirectoryListingVHost_ and _customHeadersVHost_.
* Improved HTTP authentication error handling.
## SVR.JS 3.4.25 LTS
* Improved HTTP authentication error handling.
* Updated SVR.JS license.
## SVR.JS 3.7.5
* Fixed non-working blacklist.
* Updated SVR.JS license.
## SVR.JS 3.4.24 LTS
* Added reverse DNS lookup support.
## SVR.JS 3.7.4
* Added reverse DNS lookup support.
## SVR.JS 3.4.23 LTS
* Fixed server crashes while one of two ports are in use
## SVR.JS 3.7.3
* Fixed server crashes while one of two ports are in use
## SVR.JS 3.4.22 LTS
* ENAMETOOLONG errors now correspond to 414 code.
* EMFILE errors now correspond to 503 code.
## SVR.JS 3.7.2
* ENAMETOOLONG errors now correspond to 414 code.
## SVR.JS 3.7.1
* Fixed bug with SVR.JS hang-up check requests logged in server logs (bug occurred on upstream Node.JS v12.22.12).
## SVR.JS 3.4.21 LTS
* Changed descriptions of 501 and 503 errors.
* Disabled open proxy in default server-side JavaScript.
* Fixed NotImplementedError in "cluster" module when running SVR.JS on newer versions of Bun.
* Fixed redirect loops related to URL sanitizer.
* Fixed SVR.JS proxy API (fixed bug, which relied of calling wrong callback [Mod.callback] instead of proper one [Mod.proxyCallback]).
* Improved Bun IPC shim connection error handling.
* Improved server error handling for Bun.
* Updated svrpasswd tool.
## SVR.JS 3.7.0
* Added new config.json property - disableUnusedWorkerTermination.
* Added option to rewrite "dirty" URLs - rewriteDirtyURLs.
* Added PBKDF2 and scrypt support for HTTP authentication.
* Added termination of unused workers.
* Changed descriptions of 501 and 503 errors.
* Disabled checking for hung up server processes, while SVR.JS is not yet listening.
* Disabled open proxy in default server-side JavaScript.
* Disabled X-SVR-JS-From-Main-Thread header for non-localhost clients.
* EMFILE errors now correspond to 503 Service Unavailable error code.
* Fixed NotImplementedError in "cluster" module when running SVR.JS on newer versions of Bun.
* Fixed redirect loops related to URL sanitizer.
* Fixed SVR.JS proxy API. (fixed bug, which relied of calling wrong callback [Mod.callback] instead of proper one [Mod.proxyCallback])
* Improved Bun IPC shim connection error handling.
* Improved extension checking function in directory listing generation.
* Improved server error handling for Bun.
* SVR.JS now exits gracefully on "stop" command.
* Updated svrpasswd tool.
## SVR.JS 3.4.20 LTS
* Improved reliability while loading server-side JavaScript.
## SVR.JS 3.6.4
* Improved reliability while loading server-side JavaScript.
## SVR.JS 3.4.19 LTS
* Fixed bug with directory listing generating invalid HTML with custom head containing _<html>_ tag with attributes.
## SVR.JS 3.6.3
* Fixed bug with directory listing generating invalid HTML with custom head containing _<html>_ tag with attributes.
## SVR.JS 3.4.18 LTS
* Fixed bug with ENOTDIR error (was 500, now it's 404).
* Fixed bug with forbidden path checker.
## SVR.JS 3.6.2
* Fixed bug with ENOTDIR error (was 500, now it's 404).
* Fixed bug with forbidden path checker.
* Optimized regular expression creating function.
## SVR.JS 3.4.17 LTS
* Improved URL sanitizer.
* Fixed bug with formidable wrapper.
## SVR.JS 3.6.1
* Added support for ETags.
* Added new config.json property: enableETag.
* Improved URL sanitizer.
* Fixed bug with formidable wrapper.
## SVR.JS 3.6.0
* Optimized sanitized URL comparison function.
* Expanded warning messages.
* Added support for Unix sockets and Windows named pipes.
* Cleaned up SVR.JS code.
## SVR.JS 3.4.16 LTS
* Improved URL sanitizer and mitigates security vulnerability: attacker could use "..." to traverse directories, while SVR.JS is run in Windows.
* Cleaned up code.
## SVR.JS 3.5.6
* Improved URL sanitizer and mitigates security vulnerability: attacker could use "..." to traverse directories, while SVR.JS is run in Windows.
* Cleaned up code.
## SVR.JS 3.4.15 LTS
* Fixed broken URL sanitation redirect.
* Improved URL sanitizer. ("%2F" now turns into "/" instead of "%252F")
## SVR.JS 3.5.5
* Fixed broken URL sanitation redirect.
* Improved URL sanitizer. ("%2F" now turns into "/" instead of "%252F")
## SVR.JS 3.4.14 LTS
* Fixed bug: SVR.JS mods now load reliably with multiple threads on startup.
## SVR.JS 3.5.4
* Fixed bug: SVR.JS mods now load reliably with multiple threads on startup.
## SVR.JS 3.4.13 LTS
* Improved compatibility with Bun 0.9.14.
* Replaced more blocking system calls with non-blocking ones.
## SVR.JS 3.5.3
* Improved compatibility with Bun 0.9.14.
## SVR.JS 3.5.2
* Replaced more blocking system calls with non-blocking ones.
## SVR.JS 3.5.1
* Added better HTTP error handler.
## SVR.JS 3.4.12 LTS
* Added better HTTP error handler.
## SVR.JS 3.5.0
* Dropped support for Node.JS 8.x and 9.x.
* Directory listing icons now show even, if ".dirimages" directory is missing from web root.
* Updated formidable module.
## SVR.JS 3.4.11 LTS
* Added support for Brotli compression.
## SVR.JS 3.4.10
* Added OCSP module loading failure warning.
* SVR.JS now displays error message, when it's run on JS runtime non-compatible with Node.JS.
## SVR.JS 3.4.9
* Added new config.json option: enableOCSPStapling.
* Added support for OCSP stapling.
* Added new dependency: ocsp
* Replaced some blocking system calls in directory listing function with non-blocking ones.
* Optimized HTTP basic authentication algorithm.
## SVR.JS 3.4.8
* Added HTTP authentication brute force protection.
## SVR.JS 3.4.7
* Fixed SVR.JS crashing on Node.JS 8.x and 9.x.
## SVR.JS 3.4.6
* Improved reliability in loading mods, server-side JavaScript and saving configuration file.
## SVR.JS 3.4.5
* Fixed bug with custom head and SVR.JS status page.
## SVR.JS 3.4.4
* req.socket.realRemoteAddress and res.socket.realRemotePort are now original users remote address and port respectively.
## SVR.JS 3.4.3
* Fixed bug related with saving config.json.
* Disabled gzip compression for .gz files.
## SVR.JS 3.4.2
* Fixed bug with regular expression non-standard HTTP status codes.
## SVR.JS 3.4.1
* SVR.JS now uses 2 public IP providers: SeeIP.org and ipify.
## SVR.JS 3.4.0
* autocannon is no longer included with SVR.JS.
* Fixed requirement on pretty-bytes library.
* Removed version field from config.json
* Fixed random worker crashes that occur, while config.json is saved.
* SVR.JS no longer overrides config.json values, that are set after SVR.JS has been started.
* SVR.JS no longer displays native Node.JS error message, while SVR.JS is run on read-only file system.
## SVR.JS 3.3.3
* Improved reliability of loading mods and server-side JavaScript.
## SVR.JS 3.3.2
* Calling callServerError or res.writeHead mutltiple times now invokes a warning instead of crashing SVR.JS.
## SVR.JS 3.3.1
* Fixed bug: Logs didn't save during crash report generation.
* Fixed bug: Worker crashes didn't display message about starting new workers.
* Fixed bug with SVR.JS status page.
* Added image icons for .ico and .icn files in directory listings.
* Added OpenSSL 1.x EOL warning message.
* SVR.JS now uses WHATWG URL parser instead of deprecated url.parse() function.
## SVR.JS 3.3.0
* SVR.JS now forks itself at startup as many times the CPU host has cores (max 16 cores).
* Fixed bug and potential security vulnerability: Non-standard codes didn't work, and thus attackers could bypass HTTP authentication.
## SVR.JS 3.2.1
* Optimized SVR.JS blacklist and path sanitation code.
* Mitigated security vulnerability: Attacker could access directory listing of directory above web root using "/.." path.
## SVR.JS 3.2.0
* Optimized SVR.JS code.
* Logs from single-threaded SVR.JS now begin with "singlethread".
* Cyclic links now causes server to return 508 error instead of 404 error.
## SVR.JS 3.1.2
* Improved forbidden paths access control.
## SVR.JS 3.1.1
* SVR.JS is now able to run on Node.JS versions without crypto.
* Changed IP provider to SeeIP (used, when crypto support is available).
* Added new server status metrics: CPU usage percentage, Average request rate.
* Added new command: restart.
## SVR.JS 3.1.0
* SVR.JS is now able to run on Node.JS versions without crypto.
* Added HTTP/2 no-support indication for Bun.
* Added more indication of request methods.
* Cleaned up SVR.JS code.
* Updated supplied tar and minipass modules.
## SVR.JS 3.0.3
* Changed public IP provider to ipify.
## SVR.JS 3.0.2
* Fixed server-side JavaScript handling.
## SVR.JS 3.0.1
* Improved error stack generation.
* SVR.JS now serves files from directory on which script resides, unless wwwroot is specified.
## SVR.JS 3.0.0
* 502 errors now logs their stacks.
* Added better exception handler.
* Added callServerError function for use in server-side JavaScript and mods.
* Added cluster+ipc shim used when SVR.JS is running on Bun (SVR.JS can now run multi-threaded on Bun).
* Added command-line parameter: -v/--version.
* Added Content-Range support for static files.
* Added custom Expect header handler.
* Added custom request parse error handler.
* Added date and time to logs.
* Added --disable-mods option. (disables all mods and server side JavaScript)
* Added displaying of contact information on 500 error.
* Added experimental support for Bun (no SVR.JS command line for now...).
* Added HTTP status code message to logs.
* Added new command-line option: --single-threaded
* Added new config.json properties: sni, serverAdministratorEmail, stackHidden, enableRemoteLogBrowsing, dontCompress, enableIPSpoofing, allowStatus, disableServerSideScriptExpose, exposeServerVersion, rewriteMap, secure, wwwroot, disableNonEncryptedServer and disableToHTTPSRedirect.
* Added new depedency - formidable.
* Added new method callable from mods: getCustomHeaders (gets headers from config.json file along with "Server" header).
* Added new mod methods - getCustomHeaders, origHref, parsePostData and redirect.
* Added new server-side JavaScript fields - customvar1, customvar2, customvar3, customvar4.
* Added new utility: log highlighter at loghighlighter.js
* Added new utility: log viewer at logviewer.js
* Added new utility: SVR.JS user utility at svrpasswd.js
* Added option to disable HTTP => HTTPS redirect server.
* Added option to listen only for HTTPS.
* Added {path} directive in custom error pages and headers.
* Added RegEx support for non-standard error codes.
* Added request ID to logs.
* Added server error descriptions.
* Added SNI support.
* Added status page at /svrjsstatus.svr.
* Added support for CIDR notation in non-standard codes.
* Added support for CONNECT method (along with mod callbacks).
* Added support for HTTP authentication.
* Added support for RegEx for nonStandardCodes property.
* Added support for X-Forwarded-For header.
* Added URL rewriting.
* Added warning, when SVR.JS is run as root.
* Addedd error message in case SVR.JS is attempted to be started without Node.JS.
* Allowed Node.JS versions without HTTP/2 support. (although HTTP/2 will not work)
* Allowed starting without Internet connection.
* Attackers can no longer bypass content blocking mechanism (non-standard codes set in config.json), when SVR.JS is run in Windows.
* Attackers can no longer bypass content blocking mechanism, when SVR.JS is run in Windows.
* Bare minimum now requires only "svr.js" script and node_modules directory.
* Broken server availability addresses are now invisible in the console.
* Change of working directory is now possible.
* Changed demo server-side JavaScript to use new callServerError function.
* Changed file type icons.
* Changed HTTP error descriptions.
* Changed log format.
* Changed logo to new one.
* Changed SVR.JS log descriptions.
* config.json options which are not used by SVR.JS are now kept.
* Configuration file now has diffrent placeholder content.
* Connection messages when using SVR.JS as proxy aren't longer broken.
* Connection with null req.socket are now dropped.
* Corrected handling of multi-line log messages.
* Custom headers are no longer set by default on proxy requests.
* DEBUG: /crash.svr crashes the server (only in Nightly).
* Default content type can be no longer set.
* Deprecated config.json property: defaultpage.
* Directory listing custom foots now are displayed even if foot.html file doesn't exist.
* Directory listing custom heads now are displayed even if head.html file doesn't exist.
* Directory listing no longer breaks with "<" and ">" characters (XSS mitigated).
* Directory listing now shows original URL, when URL is rewritten.
* Directory listing now shows whatever the file is block device, chacter device, FIFO or socket.
* Directory traversal through symbolic links is no longer possible (new URL sanitation function).
* Disabled HTTP compression for w3m and Netscape 4.x.
* Error pages can use new format: .<error_code> instead of <error_code>.html.
* Error stack can be now hidden using stackHidden property.
* Factory reset no longer replaces config.json with placeholder one.
* Files without extension are no longer presented as HTML content.
* Fixed bug: Blacklist didn't save into config.json file.
* Fixed bug: Downloading files above 2GB now works properly.
* Fixed bug: Next thread no longer starts after closing ports.
* Fixed bug related to broken access controls in SVR.JS when it's run in Windows.
* Fixed bug with server version exposure.
* Fixed crash on malformed public IP check response.
* Fixed crashes with TCP resets, when using default handler for CONNECT method.
* Fixed default config.json file.
* Fixed directory listing, when URL contains "@" or "?"
* Fixed filterHeaders method.
* Fixed handling of some proxy requests by default redirect server.
* Fixed HEAD method handling.
* Fixed HTTP compression.
* Fixed master process crash, when unable to fork process.
* Fixed process crash, when unable to save to a log file.
* Fixed proxy mod loader.
* Fixed public IP address identification on server console.
* Fixed security vulnerability: Attacker could append "%00" to URL to bypass access restrictions when SVR.JS is running on Bun.
* Fixed security vulnerability: Attacker could send specially constructed HTTP request to bypass content block mechanism.
* Fixed security vulnerability: Attacker could used encoded characters to bypass access restrictions.
* Fixed server endlessly spawning threads in Node.JS 20.x.
* Fixed SVR.JS not able to start in Android (d/node.js).
* Fixed SVR.JS not able to start in Node.JS 16.x in Haiku OS.
* Fixed URL mojibake.
* Fixed website block, when SVR.JS is running on Bun
* Fixed XSS bug in host name indication in default error pages.
* HTTP => HTTPS redirect server now returns 400 error when no host is specified.
* HTTP requests made to HTTPS server now return 497 error page.
* HTTP requests using CONNECT method now return 501 error, if SVR.JS is run on Bun.
* Icons on directory listings are no longer stretched, when padding is applies to the table.
* Improved bad request handler.
* Improved compatibility with Bun.
* Improved compatibility with Node.JS 20.x.
* Improved default error pages and directory listings for mobile devices.
* Improved directory listings.
* Improved file handling by URL.
* Improved handling of 405 error.
* Improved handling of OPTIONS method.
* Improved HTTP => HTTPS redirect handler.
* Improved HTTP/2 => HTTP/1.x translation API.
* Improved possible server access URLs.
* IPv6 URLs are now shown properly.
* Links now show sizes of referenced file in directory listing.
* Logs are no longer remotely accessible, when enableRemoteLogBrowsing is set to false.
* Made HTTP => HTTPS redirect server more compatible with Node.JS 20.x.
* Main script moved to "svr.js" file.
* Many request problem will now result in 500 error instead of crash.
* Mitigated path traversal at bad URL rewriting.
* Mod loader no longer uses eval.
* Node.JS version is now exposed in Server header (unless exposeServerVersion is false).
* Non-standard codes no longer works on proxy requests.
* Patched supplied fs-minipass module to work with Bun.
* Removed strict depedencies for: tar, svrmodpack, hexstrbase64 and formidable.
* Removed "Welcome to DorianTech Node.JS Server!" and "Goodbye." log, rendering welcomeMessage property useless.
* Replaced 403 error page specific to disabled directory listing with generic one.
* Replaced "domian" property with "domain" in config.json.
* Replaced URL sanitation algorithm with faster one.
* Server is now more protected against directory traversal attack.
* Server no longer crashes on some malformed URIs.
* Server now returns 403 error, when server software itself doesn't have permissions to access files.
* Size function now requires pretty-bytes library.
* Size function now uses custom fallback.
* Stack traces from 500 errors are now displayed in logs.
* SVR.JS doesn't use template config.json anymore, if config.json doesn't exist
* SVR.JS no longer crashes on mod loading problem.
* SVR.JS no longer crashes when displaying listing of directory containing invalid files.
* SVR.JS no longer drops connections having null response socket.
* SVR.JS now keeps unused properties of config.json file.
* SVR.JS used as HTTPS server works even without key and cert fields in config.json.
* SVR.JS version is no longer leaked via svr.js file, when exposeServerVersion property is set to false.
* Updated supplied mime-types and mime-db modules.
* Using SVR.JS as an proxy without proxy mod now returns no-proxy message.
## SVR.JS 2.1.4
* Fixed security vulnerability: Attacker could used encoded characters to bypass access restrictions. (fix backported from SVR.JS 3.0.0-beta19)
* Fixed access control bypass vulnerability, when server is run in Windows (fix backported from SVR.JS 3.0.0-beta19)
## SVR.JS 2.1.3
* Added new config.json properties: exposeServerVersion and stackHidden (backported from SVR.JS 3.0.0-beta1)
* Fixed path traversal vulnerability (fix backported from SVR.JS 3.0.0-beta1)
* Fixed access control bypass vulnerability, when server is run in Windows (fix backported from SVR.JS 3.0.0-beta1)
* Fixed server crash on malformed URL (fix backported from SVR.JS 3.0.0-beta1)
## SVR.JS 2.1.2
* Methods other than "POST", "GET", "OPTIONS" and "HEAD" are allowed.
## SVR.JS 2.1.1
* Fixed security vulnerability using directory listing to access secret files.
## SVR.JS 2.1.0
* Added new property of config.json "enableDirectoryListingWithDefaultHead".
* Added personalization of directory listing.
* Added compability with Node.JS v8.10.0
* Replaced MIME type table with one from mime-types module.
* Fixed bug: Directory listing shows wrong icons.
* Changed icons in directory listing.
* Changed size display in directory listing.
* Deleted analytics inside SVR.JS - those analytics are now in seperate mod, of which SVR.JS comes with it.
## SVR.JS 2.0.0
* Added support for .tar.gz mods and server side Javascript in .JS file.
* Moved directory listing icons to seperate directory.
* Replaced ASCII Art.
* Added support for HTTP/2.0, disabled by default.
* Changed default footer.
* Added unpacking SVR.JS in first run.
* Added checking, if head and foot exists.
* Optimized directory listing for Lynx text client
* Modified Server UI.
* Added new properties of config.json "enableLogging" and "enableDirectoryListing".
* Added "--clean" and "--reset" arguments.
* Fixed security vulnerability: The block is only covering part of SVR.JS
* Fixed bug: Not saving config.json on Linux.
* Added multi-threading.
* Deleted "getip" command.
## SVR.JS 1.2.2
* Fixed bug, which caused mojibake in Unicode files.
* Fixed bug, which caused SVR.JS to require SSL certificate, even if HTTPS mode is disabled.
* Fixed bug, which caused SVR.JS to crash, if no mods are loaded.
* Fixed bug, which caused SVR.JS to display blank directory, if URL is with query.
## SVR.JS 1.2.1
* Fixed bug, which caused SVR.JS in Ubuntu to not work
* Added platform showing
## SVR.JS 1.2.0
* First released version of SVR.JS

37
source/contact.md Normal file
View file

@ -0,0 +1,37 @@
---
title: Contact us
date: 2023-12-21 18:29:55
---
If you have any questions or want to report a bug or security vulnerability, you can contact SVR.JS people through email.
## Technical support
If you have any questions or issues with SVR.JS or other software, contact _support[at]svrjs[dot]org_.
You can also ask the community in [our official support forum](https://forum.svrjs.org).
## SVR.JS bugs
You can send your bug reports to one of two addresses:
* If you have discovered a security vulnerability, contact _vulnerability-reports[at]svrjs[dot]org_;
* For other bug reports, contact _bugreports[at]svrjs[dot]org_. You can also report them on the appropriate board in the [SVR.JS problems category](https://forum.svrjs.org/svr-js-problems).
**But you need to make sure that the issue results from a bug in SVR.JS, not some misconfiguration or broken server-side JavaScript file.**
## SVR.JS git commits
_[See the SVR.JS contributions page](https://svrjs.org/contribute)_
## SVR.JS website
If you have any issues with or found a security vulnerability on the SVR.JS website, blog, forum, or git server, contact _webmaster[at]svrjs[dot]org_.
## Privacy inquiries
If you have any questions regarding privacy, contact _privacy[at]svrjs[dot]org_.
## SVR.JS staff
If you want to contact with specific member of your staff, you can contact from one of us:
* **Dorian Niemiec** &mdash; _dorian[dot]niemiec[at]svrjs[dot]org_

60
source/contribute.md Normal file
View file

@ -0,0 +1,60 @@
---
title: Contributing to SVR.JS
date: 2024-01-01 18:29:17
excerpt: Contribute to SVR.JS and be part of an exciting open-source project. Follow the step-by-step guidelines to fork the repository, create feature branches, and make your code contributions. Submit your patches for review and integration, and collaborate with the SVR.JS community of developers. Your contributions matter — start making an impact today!
---
**We welcome your contributions to SVR.JS!** By following these steps, you can submit your changes for review and potential integration into the SVR.JS codebase.
## 1\. Fork the Repository
Start by forking the SVR.JS repository. Clone it to your local machine using:
git clone https://git.svrjs.org/svrjs.git
If you want to contribute to other project, e.g. RedBrick SVR.JS mod, replace `svrjs.git` with respective repository name.
## 2\. Create a Feature Branch
Create a new branch for your changes with a descriptive name. For example:
git checkout -b feature/your-feature-name
## 3\. Make Your Changes
Now comes the exciting part! Make the necessary changes, add new features, or fix bugs in your feature branch.
## 4\. Commit
Commit your changes to your forked repository:
git add .
git commit -m "Your commit message"
## 5\. Generate Patches
Before submitting your changes, generate patches using `git format-patch`:
git format-patch -n HEAD^
This creates patch files (usually ending with .patch) for each commit in your branch.
## 6\. Submit Your Patches
Email your patches to _commit[at]svrjs[dot]org_ along with the following details:
* A clear description of your changes and their purpose.
* The commit ID from which you cloned the SVR.JS (or other) repository (e.g., the latest commit in your fork).
* The repository you want to contribute to (if not added, then it's assumed it's SVR.JS repository).
Please note the following:
* Maximum attachment size: 25MB
* Compress large patches in .zip, .7z, .tar.gz, or .tar.xz format.
## 7\. Code Review and Integration
The SVR.JS authors will review your code and provide feedback as needed. They may suggest improvements or ask for clarifications during the review process.
If your changes align with the project's goals and coding standards, they may be integrated into the SVR.JS codebase. Your contributions will be acknowledged and celebrated!
**Thank you for contributing to SVR.JS! Your efforts play a vital role in making the project better for everyone.**

1765
source/docs.md Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,40 @@
---
title: easy-waf integration change log
date: 2024-01-29 22:33:27
---
## easy-waf integration 1.2.4
* easy-waf integration now waits for specific length of the request instead of immediately processing it.
* Added configurable strict request size limit.
* easy-waf integration now reverts the _req.body_ variable after inspecting the request body via easy-waf.
## easy-waf integration 1.2.3
* Full request URL is now visible in the notification email.
## easy-waf integration 1.2.2
* Some WAF errors now result in 500 errors instead of crashing the server.
## easy-waf integration 1.2.1
* Improved the error handling of code executed behind the WAF.
## easy-waf integration 1.2.0
* Added email notifiaction support
* Added custom hooks support
## easy-waf integration 1.1.2
* Stability fixes
* Added support for _config.json_ file in the SVR.JS installation directory
## easy-waf integration 1.1.1
* Added support for regex strings (like in SVR.JS)
## Earlier versions
_There was no change log for earlier easy-waf integration versions._

View file

@ -0,0 +1,24 @@
---
title: GreenRhombus change log
date: 2024-02-16 20:10:14
---
## GreenRhombus 1.0.4
* Requests are no longer intermittently dropped under load.
## GreenRhombus 1.0.3
* Prevented "write after end" SVR.JS crashes.
## GreenRhombus 1.0.2
* Prevented SVR.JS crashes due to the EOF of the _stderr_ stream.
## GreenRhombus 1.0.1
* Overloaded FastCGI server now results in 429 Too Many Requests status code.
## GreenRhombus 1.0.0
* First release

BIN
source/img/configurable.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
source/img/scalable.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
source/img/secure.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

292
source/index.md Normal file
View file

@ -0,0 +1,292 @@
---
title: Main page
date: 2024-01-21 19:41:01
layout: index-page
sitemap: false
svrjsversion: 3.14.5
---
<section class="hero">
<div class="hero-content-column">
<div class="hero-content">
<div class="hero-description">
<h1>SVR.JS is a web server running on Node.JS</h1>
<p>Host a webpage, run server-side JavaScript, use mods to expand server functionality, or use it as a reverse proxy &mdash; all in SVR.JS! SVR.JS is a web server that runs on top of Node.JS, thus enabling server-side JavaScript on webpages. SVR.JS also has an integrated log viewer, log highlighter, and user management tool. SVR.JS can run not only on Node.JS but also in Bun (experimental support).</p>
</div>
<div class="maindownloads">
<a href="https://downloads.svrjs.org/svr.js.3.14.5.zip" class="styled-button">Download SVR.JS 3.14.5</a>
<div class="download-seperator">
<br />
</div>
<a class="styled-button styled-button-disabled">No supported LTS version</a>
</div>
<div class="otherdls">
<a href="https://downloads.svrjs.org/installer">
<b>Download SVR.JS installer for GNU/Linux</b>
</a>
<br />
<a href="/docs#Installation"><b>How do I install SVR.JS?</b></a> <a href="/docs#Updating-SVR-JS"><b>How can I update it?</b></a>
<br />
<a href="/mods"><b>Download official SVR.JS mods</b></a>
<br />
<a href="/otherdownloads">More download options</a>
<br />
<a href="/changelog">Change log</a>
<br />
</div>
</div>
</div>
</section>
<section class="index-section-even">
<h2>FEATURES</h2>
<div class="promo-point-container">
<div class="promo-point-subcontainer">
<div class="promo-point">
<img src="/img/free-as-in-freedom.png" alt="Free as in freedom" class="promo-image">
<div class="promo-text">
<h3>It's free as in freedom!</h3>
<p>You don't need to worry about <a href="https://www.gnu.org/proprietary/proprietary.html">proprietary malware</a>, "You may be a victim of software counterfeiting." windows (but you can <a href="/invoke500.svr?aprilfools">visit it</a>), crashes caused by non-genuine versions of server software, or <a href="https://www.gnu.org/proprietary/proprietary-back-doors.html">universal backdoors planted by Big Tech</a>. SVR.JS is licensed under the MIT (or X11) license, and it's open-source, so there are no secretly planted backdoors. SVR.JS is run on Node.JS, which is also free software (also MIT/X11 license). We have a <a href="https://git.svrjs.org">Git repository</a>, so you can <a href="/contribute">contribute to SVR.JS</a>! </p>
</div>
</div>
</div>
<div class="promo-point-subcontainer">
<div class="promo-point">
<img src="/img/scalable.png" alt="Scalable" class="promo-image">
<div class="promo-text">
<h3>It's scalable!</h3>
<p>SVR.JS is running on Node.JS, which is a JavaScript runtime using event-driven infrastructure, so SVR.JS is handling I/O-intensive operations pretty well. Additionally, SVR.JS is by default running in clusters, so it withstands more requests, server process hang-ups, and worker crashes.</p>
</div>
</div>
</div>
<div class="promo-point-clearfix-halfway"></div>
<div class="promo-point-subcontainer">
<div class="promo-point">
<img src="/img/secure.png" alt="Secure" class="promo-image">
<div class="promo-text">
<h3>It's secure!</h3>
<p>We are putting the cybersecurity of your websites first. SVR.JS has a built-in URL sanitizer to prevent path traversal, protects sensitive data from brute force attacks on HTTP authentication by default, and forbids website visitors' access to sensitive configuration files. SVR.JS can also be configured to hide server-side JavaScript files and hide the server version. This way, bad actors will have a pretty hard time hacking your site (unless you're using vulnerable mods or vulnerable server-side JavaScript)! SVR.JS also has a built-in blacklist, so you can simply block those bad actors that might take control over your server. You can check <a href="/vulnerabilities">which versions of SVR.JS are vulnerable</a>. </p>
</div>
</div>
</div>
<div class="promo-point-subcontainer">
<div class="promo-point">
<img src="/img/configurable.png" alt="Configurable" class="promo-image">
<div class="promo-text">
<h3>It's configurable!</h3>
<p>You can configure SVR.JS through <i>config.json</i> file. You can also install mods and use server-side JavaScript! Focus on developing JavaScript web applications with SVR.JS! </p>
</div>
</div>
</div>
<div class="promo-point-clearfix"></div>
</div>
</section>
<section class="index-section-odd">
<h2>SVR.JS IN ACTION</h2>
<div class="section-videos">
<video poster="/vid/svrjs-in-action.png" controls preload="metadata">
<source src="/vid/svrjs-in-action.mp4" type="video/mp4">
<source src="/vid/svrjs-in-action.ogv" type="video/ogg">
<b>Your browser is obsolete and doesn't support HTML5 video.</b>
<a href="/vid/svrjs-in-action.mp4">Watch the video</a>
</video>
<p>
<i>This video shows the process of developing a basic web application showing user's IP address using Node.JS and the SVR.JS API. HTML, CSS, and server-side JavaScript files are all in the public domain.</i>
</p>
</div>
</section>
<section class="index-section-even">
<h2>COMPARISON WITH COMPETITORS</h2>
<div class="section-container">
<div class="comparison-table-container">
<table class="comparison-table">
<tbody>
<tr>
<th class="comparison-table-blank"></th>
<th class="comparison-table-myproduct">SVR.JS</th>
<th>lws</th>
<th>http-server</th>
<th>serve</th>
<th>Apache httpd<sup>*</sup></th>
</tr>
<tr class="comparison-table-mobile-feature">
<td colspan="5"> HTTP authentication </td>
</tr>
<tr>
<td class="comparison-table-feature">HTTP authentication</td>
<td class="comparison-table-yes comparison-table-myproduct">
<div>Yes (basic)</div>
</td>
<td class="comparison-table-yes">Yes (basic)</td>
<td class="comparison-table-yes">Yes (basic)</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-yes">Yes (basic, digest)</td>
</tr>
<tr class="comparison-table-mobile-feature">
<td colspan="5"> HTTP authentication brute force prevention </td>
</tr>
<tr>
<td class="comparison-table-feature">HTTP authentication brute force prevention</td>
<td class="comparison-table-yes comparison-table-myproduct">
<div>Yes, enabled by default</div>
</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-yes">Yes, via mod_security</td>
</tr>
<tr class="comparison-table-mobile-feature">
<td colspan="5"> HTTPS </td>
</tr>
<tr>
<td class="comparison-table-feature">HTTPS</td>
<td class="comparison-table-yes comparison-table-myproduct">
<div>Yes</div>
</td>
<td class="comparison-table-yes">Yes</td>
<td class="comparison-table-yes">Yes</td>
<td class="comparison-table-yes">Yes</td>
<td class="comparison-table-yes">Yes</td>
</tr>
<tr class="comparison-table-mobile-feature">
<td colspan="5"> OCSP stapling </td>
</tr>
<tr>
<td class="comparison-table-feature">OCSP stapling</td>
<td class="comparison-table-yes comparison-table-myproduct">
<div>Yes</div>
</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-yes">Yes</td>
</tr>
<tr class="comparison-table-mobile-feature">
<td colspan="5"> CGI (Common Gateway Interface) </td>
</tr>
<tr>
<td class="comparison-table-feature">CGI (Common Gateway Interface)</td>
<td class="comparison-table-yes comparison-table-myproduct">
<div>Yes, via RedBrick</div>
</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-yes">Yes, via mod_cgi</td>
</tr>
<tr class="comparison-table-mobile-feature">
<td colspan="5"> SSI (Server-Side Includes) </td>
</tr>
<tr>
<td class="comparison-table-feature">SSI (Server-Side Includes)</td>
<td class="comparison-table-sus comparison-table-myproduct">
<div>Obsolete, via Berno</div>
</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-yes">Yes, via mod_ssi</td>
</tr>
<tr class="comparison-table-mobile-feature">
<td colspan="5"> Server-side JavaScript </td>
</tr>
<tr>
<td class="comparison-table-feature">Server-side JavaScript</td>
<td class="comparison-table-yes comparison-table-myproduct">
<div>Yes, via Node.JS and SVR.JS API</div>
</td>
<td class="comparison-table-yes">Yes, via Node.JS and Koa framework</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-sus">Experimental, via mod_js</td>
</tr>
<tr class="comparison-table-mobile-feature">
<td colspan="5"> HTTP compression </td>
</tr>
<tr>
<td class="comparison-table-feature">HTTP compression</td>
<td class="comparison-table-yes comparison-table-myproduct">
<div>Yes (br, gzip, deflate)</div>
</td>
<td class="comparison-table-yes">Yes (br, gzip)</td>
<td class="comparison-table-yes">Yes (br, gzip)</td>
<td class="comparison-table-yes">Yes (gzip, deflate)</td>
<td class="comparison-table-yes">Yes (br, gzip)</td>
</tr>
<tr class="comparison-table-mobile-feature">
<td colspan="5"> URL rewriting </td>
</tr>
<tr>
<td class="comparison-table-feature">URL rewriting</td>
<td class="comparison-table-yes comparison-table-myproduct">
<div>Yes, built-in</div>
</td>
<td class="comparison-table-yes">Yes, via lws-rewrite</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-yes">Yes, via mod_rewrite</td>
</tr>
<tr class="comparison-table-mobile-feature">
<td colspan="5"> HTTP/2 </td>
</tr>
<tr>
<td class="comparison-table-feature">HTTP/2</td>
<td class="comparison-table-yes comparison-table-myproduct">
<div>Yes</div>
</td>
<td class="comparison-table-yes">Yes</td>
<td class="comparison-table-yes">Yes</td>
<td class="comparison-table-no">No</td>
<td class="comparison-table-yes">Yes</td>
</tr>
<tr class="comparison-table-mobile-feature">
<td colspan="5"> License </td>
</tr>
<tr>
<td class="comparison-table-feature">License</td>
<td class="comparison-table-myproduct">
<div>MIT</div>
</td>
<td>MIT</td>
<td>MIT</td>
<td>MIT</td>
<td>Apache 2.0</td>
</tr>
<tr class="comparison-table-mobile-feature">
<td colspan="5"> Architecture </td>
</tr>
<tr>
<td class="comparison-table-feature">Architecture</td>
<td class="comparison-table-myproduct">
<div>Event-driven + Clustered</div>
</td>
<td>Event-driven</td>
<td>Event-driven</td>
<td>Event-driven</td>
<td>Thread-based</td>
</tr>
</tbody>
</table>
<small>
<sup>*</sup>Apache httpd was included as a non-Node.JS-based reference <br /> Comparison done on August 2023. Node.JS-based servers are compared based on source code analysis from corresponding GitHub repositories (with exception of SVR.JS, which has self-hosted git repository). </small>
</div>
<p>
<b>As you can see, SVR.JS is more similar to traditional HTTP servers, like Apache httpd, and it's more advanced than some other Node.JS-based web servers.</b> You can deploy your JavaScript web applications and use many features offered by traditional web servers without using any reverse proxy (using a reverse proxy, like NGINX or Apache httpd is common when deploying Node.JS-based web apps).
</p>
</div>
</section>
<section class="index-section-odd">
<h2>FAQ</h2>
<div class="section-container">
<h3>What is a web server?</h3>
<p>A web server is computer software that accepts HTTP requests and serves websites. Web servers can also be underlying hardware running web server software.</p>
<h3>What is SVR.JS?</h3>
<p>SVR.JS is web server software running on Node.JS that can host both static and dynamic content. With additional mods, SVR.JS can be used for different types of dynamic content and can even be used as a forward or reverse proxy. SVR.JS is licensed under a permissive MIT/X11 license.</p>
<h3>How was SVR.JS created?</h3>
<p>Someone in 2018 wanted to create a website, but he didn't know about setting up typical server software like Apache httpd, NGINX, or IIS... So he created his own web server in Node.JS to serve his website! And he saved it in a file called <i>svr.js</i>. Since then, this web server has gradually turned from a web server intended for one website into a general-purpose web server. And this is now what SVR.JS is today! You can read more about the recent history of SVR.JS by deciphering <i><a href="/zsoiebook.svr">The Book of ZSOiE</a></i>!</p>
<h3>How did SVR.JS get its name?</h3>
<p>SVR.JS got its name from the original name of the server script: <i>svr.js</i>, one of many generic file names for a server written in JavaScript. </p>
<h3>What is Node.JS?</h3>
<p>Node.JS is an asynchronous event-driven JavaScript runtime built on Chromium's V8 engine. Node.JS is designed to build scalable network applications.</p>
<h3>How can I use SVR.JS?</h3>
<p>You can <a href="/docs">read its documentation</a> to learn how to use the SVR.JS web server. </p>
</div>
</section>

BIN
source/logo-bw-onblack.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

118
source/logo-bw-onblack.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 24 KiB

BIN
source/logo-bw-onwhite.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

118
source/logo-bw-onwhite.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

BIN
source/logo-wide-white.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

151
source/logo-wide-white.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 27 KiB

BIN
source/logo-wide.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

148
source/logo-wide.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 27 KiB

BIN
source/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

127
source/logo.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

125
source/mods.md Normal file
View file

@ -0,0 +1,125 @@
---
title: Download official SVR.JS mods
date: 2023-12-21 20:42:00
---
SVR.JS has these official SVR.JS mods:
* [**Berno**](https://downloads.svrjs.org/mods/berno.ssi.1.1.0.tar.gz) - SSI (Server-Side Includes) engine (**not maintained**). ***Latest version: 1.1.0***
* [**easy-waf integration**](https://downloads.svrjs.org/mods/easywaf.integration.1.2.4.tar.gz) - WAF (web application firewall) mod. ***Latest version: 1.2.4***
* [**GreenRhombus**](https://downloads.svrjs.org/mods/greenrhombus.fastcgi.1.0.4.tar.gz) - FastCGI (Fast Common Gateway Interface) client. ***Latest version: 1.0.4***
* [**OrangeCircle**](https://downloads.svrjs.org/mods/orangecircle.scgi.1.2.0.tar.gz) - SCGI (Simple Common Gateway Interface) client. ***Latest version: 1.2.0***
* [**RedBrick**](https://downloads.svrjs.org/mods/redbrick.cgi.2.6.0.tar.gz) - CGI (Common Gateway Interface) engine. ***Latest version: 2.6.0***
* [**reverse-proxy-mod**](https://downloads.svrjs.org/mods/reverse-proxy-mod.1.1.3.tar.gz) - mod, that enables SVR.JS to do reverse proxy functionality. ***Latest version: 1.1.3***
* [**YellowSquare**](https://downloads.svrjs.org/mods/yellowsquare.jsgi.1.1.3.tar.gz) - JSGI (JavaScript Gateway Interface) engine. ***Latest version: 1.1.3***
**All of those mods are licensed under MIT/X11 license.**
## Notes
### Berno
Current version of Berno allows SSI only in _.shtml_ files. Berno includes parts from very old version of RedBrick (1.x) to handle "exec" SSI directives.
### easy-waf integration
**NOTICE: Using a WAF (Web Application Firewall) is no subsitute for web application security, because attacker will find a way to bypass the WAF.**
Configuration file is _easywaf-config.json_ inside SVR.JS installation directory. Configuration is passed to easy-waf. You can see documentation at [its GitHub page](https://github.com/timokoessler/easy-waf). This mod requires _easy-waf_ Node.JS module.
From easy-waf-integration 1.2.0, there is also additional mailConfig property, which is an object with those values:
* _serverConfig_ - server configuration object passed to _nodemailer_
* _from_ - source e-mail address
* _to_ - destination e-mail address
These versions support sending email in case of blocked request (requires _nodemailer_ module).
From easy-waf-integration 1.2.0, there is support of pre-block and post-block hooks in _easywaf-hooks.js_ inside SVR.JS installation directory.
Example _easywaf-hooks.js_ code:
```js
//EasyWAF hooks. For more information read the easy-waf documentation in GitHub.
function preBlockHook(req, moduleInfo, ip) {
//You can add exceptions for WAF. In this example we do add exception for "cgi-bin".
if (moduleInfo.name == 'directoryTraversal' && req.url.match(/\/cgi-bin(?:$|[#?/])/)) return false;
//We're also adding XSS exception for YaBB forum software to prevent false positives
if (moduleInfo.name == 'xss' && /\/YaBB\.(?:pl|cgi)(?:$|[?#])/.test(req.url) && /(?:(\\?)|[;&])action=(?:post2|modify2|imsend2|cdchatupdate|ajxmessage)($|[;&#])/.test(req.url)) return false;
}
function postBlockHook(req, moduleInfo, ip) {
//You can, for example send an e-mail notification or log it into file.
}
module.exports = {postBlockHook: postBlockHook, preBlockHook: preBlockHook};
```
From easy-waf-integration 1.2.4, there are additional configuration properties:
* _maxRequestCheckedSize_ - maximum size of the request body (in bytes) to be checked. Default is `65536` (64 KiB).
* _maxRequestCheckedSizeStrict_ - option to enable strict request body limits. If the limits are exceeded, then the server will return a 413 Content Too Large error. Default is `false`.
If you're using SVR.JS behind a reverse proxy, you need to configure _trustProxy_ property in _easy-waf_ configuration.
Example _easywaf-config.json_ file:
```json
{
"modules" : {
"xss": {
"excludePaths": "/^\\/(?:git\\/)?(?:(?!\\.git).)*\\.git\\/|^\\/(?:(?:navbar-)?logo|powered).png$/"
},
"noSqlInjection": {
"excludePaths": "/^\\/(?:git\\/)?(?:(?!\\.git).)*\\.git\\//"
},
"crlfInjection": {
"excludePaths": "/^\\/(?:git\\/)?(?:(?!\\.git).)*\\.git\\//"
}
},
"mailConfig": {
"serverConfig": {
"host": "localhost",
"port": 25
},
"from": "svrjs@localhost",
"to": "sysadmin@localhost"
}
}
```
_View the [change log.](/easy-waf-integration-changelog)_
### GreenRhombus
_Notes are in the [SVR.JS documentation.](/docs#FastCGI-PHP-FPM)_
_View the [change log.](/greenrhombus-changelog)_
### OrangeCircle
_Notes moved to [SVR.JS documentation.](/docs#CGI-SCGI-JSGI-PHP)_
_View the [change log.](/orangecircle-changelog)_
### RedBrick
_Notes moved to [SVR.JS documentation.](/docs#CGI-SCGI-JSGI-PHP)_
_View the [change log.](/redbrick-changelog)_
### reverse-proxy-mod
_Notes moved to [SVR.JS documentation.](/docs#Reverse-proxy-configuration)_
_View the [change log.](/reverse-proxy-mod-changelog)_
### YellowSquare
_Notes moved to [SVR.JS documentation.](/docs#CGI-SCGI-JSGI-PHP)_
_View the [change log.](/yellowsquare-changelog)_
## Download older versions of mods
[You can download older versions of SVR.JS mods.](https://downloads.svrjs.org/mods)
## Download deprecated mods
**WARNING! Deprecated SVR.JS mods are not maintained anymore, and may have NO DOCUMENTATION available and have SECURITY VULNERABILITIES.**
[You can download deprecated SVR.JS mods.](https://downloads.svrjs.org/mods/deprecated)

View file

@ -0,0 +1,60 @@
---
title: OrangeCircle change log
date: 2024-01-29 20:21:43
---
## OrangeCircle 1.2.0
* Reduced buffer memory leaks.
* Improved performace by using streams after the header processing.
* Prevented server crashes caused by header write errors
## OrangeCircle 1.1.3
* All responses with Location header are now 3xx redirects.
## OrangeCircle 1.1.2
* OrangeCircle no longer sets *AUTH_TYPE* and *REMOTE_USER* environment variables, when 401 code is not specified in SVR.JS configuration.
## OrangeCircle 1.1.1
* Fixed bug with URLs containing URL-encoded characters.
## OrangeCircle 1.1.0
* Removed "DorianTech" from _mod.info_ file.
* OrangeCircle no longer crashes when broken SVR.JS config is loaded.
* Changed error handling.
## OrangeCircle 1.0.7
* Fixed OrangeCircle not working in external web root setups.
## OrangeCircle 1.0.6
* Fixed bug with *REMOTE_PORT* environment variable.
## OrangeCircle 1.0.5
* Added support for *SERVER_ADMIN* environment variable.
## OrangeCircle 1.0.4
* Added support for "\n\r" line endings in CGI response.
## OrangeCircle 1.0.3
* Added _HTTPS_ environment variable support.
## OrangeCircle 1.0.2
* Mitigated configuration file leakage vulnerability in Windows.
## OrangeCircle 1.0.1
* Improved the error handling.
## OrangeCircle 1.0.0
* First OrangeCircle release.

41
source/otherdownloads.md Normal file
View file

@ -0,0 +1,41 @@
---
title: Other download options
date: 2023-12-21 17:10:14
---
## Older versions
You can download older versions of SVR.JS [here](https://downloads.svrjs.org).
## Beta versions
You can download beta versions of SVR.JS [here](https://downloads.svrjs.org/beta).
## Nightly versions
**WARNING: Nightly versions of SVR.JS may not be stable.**
You can download nightly versions of SVR.JS [here](https://downloads.svrjs.org/nightly).
## SVR.JS mods
You can download official SVR.JS mods [here](/mods).
## SVR.JS installer
You can download SVR.JS installer [here](https://downloads.svrjs.org/installer). Right now it is available only for GNU/Linux.
## _create-svrjs-server_ tool
You can use `create-svrjs-server <svrjs_version>` command to install and update SVR.JS. You can install this tool using `npm install -g svrjs` command. [Read about how to use _create-svrjs-server_ tool.](https://www.npmjs.com/package/svrjs)
## Download through Tor hidden service
You can download SVR.JS through [a Tor hidden service](https://svrjstn3fs2uaoyjks4rd7f5vptg4fsjarqvjzqqfrfomliagl5z3mqd.onion) (requires Tor connection).
## SVR.JS Core
**WARNING: SVR.JS Core is in pre-alpha stage.**
SVR.JS Core is Node.JS library for static file and directory listing serving built out of SVR.JS technology.
You can download SVR.JS Core [here](https://downloads.svrjs.org/core).

BIN
source/powered.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

190
source/privacy.md Normal file
View file

@ -0,0 +1,190 @@
---
title: Privacy Policy
date: 2023-12-21 18:37:50
---
_Effective date: 10.03.2024_
## 1\. Introduction
Welcome to **SVR.JS**.
**SVR.JS** ("us", "we", or "our") operates **svrjs.org** (hereinafter referred to as **"Service"**).
Our Privacy Policy governs your visit to **svrjs.org**, and explains how we collect, safeguard and disclose information that results from your use of our Service.
We use your data to provide and improve Service. By using Service, you agree to the collection and use of information in accordance with this policy. Unless otherwise defined in this Privacy Policy, the terms used in this Privacy Policy have the same meanings as in our Terms and Conditions.
Our Terms and Conditions (**"Terms"**) govern all use of our Service and together with the Privacy Policy constitutes your agreement with us (**"agreement"**).
## 2\. Definitions
**SERVICE** means the svrjs.org website operated by SVR.JS.
**PERSONAL DATA** means data about a living individual who can be identified from those data (or from those and other information either in our possession or likely to come into our possession).
**USAGE DATA** is data collected automatically either generated by the use of Service or from Service infrastructure itself (for example, the duration of a page visit).
**COOKIES** are small files stored on your device (computer or mobile device).
**DATA CONTROLLER** means a natural or legal person who (either alone or jointly or in common with other persons) determines the purposes for which and the manner in which any personal data are, or are to be, processed. For the purpose of this Privacy Policy, we are a Data Controller of your data.
**DATA PROCESSORS (OR SERVICE PROVIDERS)** means any natural or legal person who processes the data on behalf of the Data Controller. We may use the services of various Service Providers in order to process your data more effectively.
**DATA SUBJECT** is any living individual who is the subject of Personal Data.
**THE USER** is the individual using our Service. The User corresponds to the Data Subject, who is the subject of Personal Data.
## 3\. Information Collection and Use
We collect several different types of information for various purposes to provide and improve our Service to you.
## 4\. Types of Data Collected
### Personal Data
We don't ask you to provide us with any personally identifiable information.
### Usage Data
We may collect information that your browser sends whenever you visit our Service or when you access Service by or through any device (**"Usage Data"**).
This Usage Data may include information such as your computer's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that you visit, the time and date of your visit, and other diagnostic data.
When you access Service with a device, this Usage Data may include information such as the type of device you use, the IP address of your device, your device operating system, the type of Internet browser you use and other diagnostic data.
### Tracking Cookies Data
We don't use any cookies nor any similar tracking technologies on our Service.
## 5\. Use of Data
SVR.JS uses the collected data for various purposes:
1. to provide and maintain our Service;
2. to allow you to participate in interactive features of our Service when you choose to do so;
3. to provide customer support;
4. to gather analysis or valuable information so that we can improve our Service;
5. to monitor the usage of our Service;
6. to detect, prevent and address technical issues;
7. to fulfil any other purpose for which you provide it;
8. in any other way we may describe when you provide the information;
9. for any other purpose with your consent.
## 6\. Retention of Data
We will retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period, except when this data is used to strengthen the security or to improve the functionality of our Service, or we are legally obligated to retain this data for longer time periods.
## 7\. Transfer of Data
Your information, may be transferred to and maintained on computers located outside of your state, province, country or other governmental jurisdiction where the data protection laws may differ from those of your jurisdiction.
If you are located outside Poland and choose to provide information to us, please note that we transfer the data, to Poland and process it there.
Your consent to this Privacy Policy followed by your submission of such information represents your agreement to that transfer.
SVR.JS will take all the steps reasonably necessary to ensure that your data is treated securely and in accordance with this Privacy Policy and no transfer of your data will take place to an organisation or a country unless there are adequate controls in place including the security of your data and other personal information.
## 8\. Disclosure of Data
We don't disclose any information that we collect.
## 9\. Security of Data
The security of your data is important to us but remember that no method of transmission over the Internet or method of electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your Personal Data, we cannot guarantee its absolute security.
## 10\. Your Data Protection Rights Under General Data Protection Regulation (GDPR)
If you are a resident of the European Union (EU) and European Economic Area (EEA), you have certain data protection rights, covered by GDPR.
We aim to take reasonable steps to allow you to correct, amend, delete, or limit the use of your Personal Data.
If you wish to be informed what Personal Data we hold about you and if you want it to be removed from our systems, please email us at _privacy[at]svrjs[dot]org_.
In certain circumstances, you have the following data protection rights:
1. the right to access, update or to delete the information we have on you;
2. the right of rectification. You have the right to have your information rectified if that information is inaccurate or incomplete;
3. the right to object. You have the right to object to our processing of your Personal Data;
4. the right of restriction. You have the right to request that we restrict the processing of your personal information;
5. the right to data portability. You have the right to be provided with a copy of your Personal Data in a structured, machine-readable and commonly used format;
6. the right to withdraw consent. You also have the right to withdraw your consent at any time where we rely on your consent to process your personal information;
Please note that we may ask you to verify your identity before responding to such requests. Please note, we may not able to provide Service without some necessary data.
You have the right to complain to a Data Protection Authority about our collection and use of your Personal Data. For more information, please contact your local data protection authority in the European Economic Area (EEA).
## 11\. Your Data Protection Rights under the California Privacy Protection Act (CalOPPA)
CalOPPA is the first state law in the nation to require commercial websites and online services to post a privacy policy. The law's reach stretches well beyond California to require a person or company in the United States (and conceivable the world) that operates websites collecting personally identifiable information from California consumers to post a conspicuous privacy policy on its website stating exactly the information being collected and those individuals with whom it is being shared, and to comply with this policy.
According to CalOPPA we agree to the following:
1. users can visit our site anonymously;
2. our Privacy Policy link includes the word "Privacy", and can easily be found on the home page of our website;
3. users will be notified of any privacy policy changes on our Privacy Policy Page;
4. users are able to change their personal information by emailing us at _privacy[at]svrjs[dot]org_.
## 12\. Your Data Protection Rights under the California Consumer Privacy Act (CCPA)
If you are a California resident, you are entitled to learn what data we collect about you, ask to delete your data and not to sell (share) it. To exercise your data protection rights, you can make certain requests and ask us:
**What personal information we have about you. If you make this request, we will return to you:**
1. The categories of personal information we have collected about you.
2. The categories of sources from which we collect your personal information.
3. The business or commercial purpose for collecting or selling your personal information.
4. The categories of third parties with whom we share personal information.
5. The specific pieces of personal information we have collected about you.
6. A list of categories of personal information that we have sold, along with the category of any other company we sold it to. If we have not sold your personal information, we will inform you of that fact.
7. A list of categories of personal information that we have disclosed for a business purpose, along with the category of any other company we shared it with.
Please note, you are entitled to ask us to provide you with this information up to two times in a rolling twelve-month period. When you make this request, the information provided may be limited to the personal information we collected about you in the previous 12 months.
- **To delete your personal information. If you make this request, we will delete the personal information we hold about you as of the date of your request from our records and direct any service providers to do the same. In some cases, deletion may be accomplished through de-identification of the information. If you choose to delete your personal information, you may not be able to use certain functions that require your personal information to operate.**
- **To stop selling your personal information. We don't sell or rent your personal information to any third parties for any purpose. We do not sell your personal information for monetary consideration. However, under some circumstances, a transfer of personal information to a third party, or within our family of companies, without monetary consideration may be considered a "sale" under California law. You are the only owner of your Personal Data and can request disclosure or deletion at any time.**
If you submit a request to stop selling your personal information, we will stop making such transfers.
Please note, if you ask us to delete or stop selling your data, it may impact your experience with us, and you may not be able to participate in certain programs or membership services which require the usage of your personal information to function. But in no circumstances, we will discriminate against you for exercising your rights.
To exercise your California data protection rights described above, please send your request(s) by email: _privacy[at]svrjs[dot]org_.
Your data protection rights, described above, are covered by the CCPA, short for the California Consumer Privacy Act. To find out more, visit the official California Legislative Information website. The CCPA took effect on 01.01.2020.
## 13\. Service Providers
We may employ third party companies and individuals to facilitate our Service (**"Service Providers"**), provide Service on our behalf, perform Service-related services or assist us in analysing how our Service is used.
These third parties have access to your Personal Data only to perform these tasks on our behalf and are obligated not to disclose or use it for any other purpose.
## 14\. CI/CD tools
We may use third-party Service Providers to automate the development process of our Service.
## 15\. Behavioral Remarketing
We may use remarketing services to advertise on third party websites to you after you visited our Service. We and our third-party vendors use cookies to inform, optimise and serve ads based on your past visits to our Service.
## 16\. Links to Other Sites
Our Service may contain links to other sites that are not operated by us. If you click a third party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit.
We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.
## 17\. Children's Privacy
Our Services are not intended for use by children under the age of 18 (**"Child"** or **"Children"**).
We do not knowingly collect personally identifiable information from Children under 18\. If you become aware that a Child has provided us with Personal Data, please contact us. If we become aware that we have collected Personal Data from Children without verification of parental consent, we take steps to remove that information from our servers.
## 18\. Changes to This Privacy Policy
We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page.
We will let you know via a prominent notice on our Service, prior to the change becoming effective and update "effective date" at the top of this Privacy Policy.
You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.
## 19\. Contact Us
If you have any questions about this Privacy Policy, please contact us by email: _privacy[at]svrjs[dot]org_.

View file

@ -0,0 +1,105 @@
---
title: RedBrick change log
date: 2024-01-29 20:21:43
---
## RedBrick 2.6.0
* Reduced buffer memory leaks.
* Improved performace by using streams after the header processing.
* Prevented server crashes caused by header write errors
* Added _stderr_ logging.
## RedBrick 2.5.6
* Fixed bug with URLs containing "cgi-bin" that don't refer to "cgi-bin" directory in the web root.
## RedBrick 2.5.5
* All responses with Location header are now 3xx redirects.
## RedBrick 2.5.4
* RedBrick no longer sets *AUTH_TYPE* and *REMOTE_USER* environment variables, when 401 code is not specified in SVR.JS configuration.
## RedBrick 2.5.3
* Fixed bug with URLs containing URL-encoded characters.
## RedBrick 2.5.2
* Removed "DorianTech" from _mod.info_ file.
* RedBrick no longer crashes when broken SVR.JS config is loaded.
## RedBrick 2.5.1
* Fixed bug with too long URLs causing server to not respond.
* Added support for _exposeModsInErrorPages_ _config.json_ property.
## RedBrick 2.5.0
* Added support for CGI execution outside the _cgi-bin_ directory.
* Fixed "broken access control" (it hid configuration files, but it returned 200 OK instead of 403 Forbidden)
* Changed error handling.
* Changed _redbrick-interpreters.json_ handling.
* Added support for _redbrick-scriptexts.json_ configuration file.
* Dropped _.cmd_ default prefix.
## RedBrick 2.4.3
* Fixed RedBrick not working in external web root setups.
## RedBrick 2.4.2
* Fixed bug with *REMOTE_PORT* environment variable.
## RedBrick 2.4.1
* Improved CGI response parser.
* Narrowed down conditions for CGI execution for security reasons.
## RedBrick 2.4.0
* Added support for *SERVER_ADMIN* environment variable.
* Improved the CGI program preparation and startup.
## RedBrick 2.3.6
* Fixed RedBrick not working in Windows.
## RedBrick 2.3.5
* Added support for "\n\r" line endings in CGI response.
## RedBrick 2.3.4
* Added _index.cgi_ file support.
* Added _HTTPS_ environment variable support.
## RedBrick 2.3.3
* Mitigated source code leakage (through using "CGI-BIN" instead of "cgi-bin") in Windows
## RedBrick 2.3.2
* Fixed _redbrick-interpreters.json_ file loading.
## RedBrick 2.3.1
* The *REQUEST_URI* environment variable now includes rewritten URLs.
## RedBrick 2.3.0
* Made it work with PHP-CGI
## RedBrick 2.2.0
* Replaced some blocking calls with non-blocking ones.
## RedBrick 2.1.1
* Mitigated configuration file leakage (_redbrick-interpreters.json_ file).
## Earlier versions
_There was no change log for earlier RedBrick versions._

View file

@ -0,0 +1,33 @@
---
title: reverse-proxy-mod change log
date: 2024-01-29 20:52:59
---
## reverse-proxy-mod 1.1.3
* Fixed bug with wildcard in domain name selectors.
## reverse-proxy-mod 1.1.2
* Fixed server crashes with invalid HTTP/2 status codes.
## reverse-proxy-mod 1.1.1
* Add support for reverse proxy paths.
## reverse-proxy-mod 1.1.0
* Add support for HTTP upgrades.
## reverse-proxy-mod 1.0.4
* Improved the error handling.
* Mitigated configuration file leakage vulnerability.
## reverse-proxy-mod 1.0.3
* Reverse proxies with this mod no longer establish keep alive connections, instead establishing connections with _Response_ header set to _Close_ in upstream servers.
## Earlier versions
_There was no change log for earlier reverse-proxy-mod versions._

141
source/toc.md Normal file
View file

@ -0,0 +1,141 @@
---
title: Terms and Conditions
date: 2023-12-21 18:31:20
---
_Last updated: 10.03.2024_
## 1\. Introduction
Welcome to **SVR.JS** ("Company", "we", "our", "us")!
These Terms of Service ("Terms", "Terms of Service") govern your use of our website located at **svrjs.org** (together or individually "Service") operated by **SVR.JS**.
Our Privacy Policy also governs your use of our Service and explains how we collect, safeguard and disclose information that results from your use of our web pages.
Your agreement with us includes these Terms and our Privacy Policy ("Agreements"). You acknowledge that you have read and understood Agreements, and agree to be bound of them.
If you do not agree with (or cannot comply with) Agreements, then you may not use the Service, but please let us know by emailing at _support[at]svrjs[dot]org_ so we can try to find a solution. These Terms apply to all visitors, users and others who wish to access or use Service.
## 2\. Content
Content found on or through this Service are the property of SVR.JS or used with permission. You may not distribute, modify, transmit, reuse, download, repost, copy, or use said Content, whether in whole or in part, for commercial purposes or for personal gain, unless stated otherwise.
## 3\. Prohibited Uses
You may use Service only for lawful purposes and in accordance with Terms. You agree not to use Service:
1. In any way that violates any applicable national or international law or regulation.
2. For the purpose of exploiting, harming, or attempting to exploit or harm minors in any way by exposing them to inappropriate content or otherwise.
3. To transmit, or procure the sending of, any advertising or promotional material, including any "junk mail", "chain letter," "spam," or any other similar solicitation.
4. To impersonate or attempt to impersonate Company, a Company employee, another user, or any other person or entity.
5. In any way that infringes upon the rights of others, or in any way is illegal, threatening, fraudulent, or harmful, or in connection with any unlawful, illegal, fraudulent, or harmful purpose or activity.
6. To engage in any other conduct that restricts or inhibits anyone's use or enjoyment of Service, or which, as determined by us, may harm or offend Company or users of Service or expose them to liability.
Additionally, you agree not to:
1. Use Service in any manner that could disable, overburden, damage, or impair Service or interfere with any other party's use of Service, including their ability to engage in real time activities through Service.
2. Use any robot, spider, or other automatic device, process, or means to access Service for any purpose, including monitoring or copying any of the material on Service.
3. Use any manual process to monitor or copy any of the material on Service or for any other unauthorized purpose without our prior written consent.
4. Use any device, software, or routine that interferes with the proper working of Service.
5. Introduce any viruses, trojan horses, worms, logic bombs, or other material which is malicious or technologically harmful.
6. Attempt to gain unauthorized access to, interfere with, damage, or disrupt any parts of Service, the server on which Service is stored, or any server, computer, or database connected to Service.
7. Attack Service via a denial-of-service attack or a distributed denial-of-service attack.
8. Take any action that may damage or falsify Company rating.
9. Otherwise attempt to interfere with the proper working of Service.
## 4\. Analytics
We don't use third-party Service Providers to monitor and analyze the use of our Service.
## 5\. Intellectual Property
Service and its original content (excluding Content provided by users), features and functionality are and will remain the exclusive property of SVR.JS and its licensors. Service is protected by copyright, trademark, and other laws of and foreign countries. Our trademarks may not be used in connection with any product or service without the prior written consent of SVR.JS.
## 6\. Copyright Policy
We respect the intellectual property rights of others. It is our policy to respond to any claim that Content posted on Service infringes on the copyright or other intellectual property rights ("Infringement") of any person or entity.
If you are a copyright owner, or authorized on behalf of one, and you believe that the copyrighted work has been copied in a way that constitutes copyright infringement, please submit your claim via email to _support[at]svrjs[dot]org_, with the subject line: "Copyright Infringement" and include in your claim a detailed description of the alleged Infringement as detailed below, under "DMCA Notice and Procedure for Copyright Infringement Claims"
You may be held accountable for damages (including costs and attorneys' fees) for misrepresentation or bad-faith claims on the infringement of any Content found on and/or through Service on your copyright.
## 7\. DMCA Notice and Procedure for Copyright Infringement Claims
You may submit a notification pursuant to the Digital Millennium Copyright Act (DMCA) by providing our Copyright Agent with the following information in writing (see 17 U.S.C 512(c)(3) for further detail):
1. an electronic or physical signature of the person authorized to act on behalf of the owner of the copyright's interest;
2. a description of the copyrighted work that you claim has been infringed, including the URL (i.e., web page address) of the location where the copyrighted work exists or a copy of the copyrighted work;
3. identification of the URL or other specific location on Service where the material that you claim is infringing is located;
4. your address, telephone number, and email address;
5. a statement by you that you have a good faith belief that the disputed use is not authorized by the copyright owner, its agent, or the law;
6. a statement by you, made under penalty of perjury, that the above information in your notice is accurate and that you are the copyright owner or authorized to act on the copyright owner's behalf.
You can contact our Copyright Agent via email at _dorian[dot]niemiec[at]svrjs[dot]org_.
## 8\. Error Reporting and Feedback
You may provide us either directly at _support[at]svrjs[dot]org_ or via third party sites and tools with information and feedback concerning errors, suggestions for improvements, ideas, problems, complaints, and other matters related to our Service ("Feedback"). You acknowledge and agree that: (i) you shall not retain, acquire or assert any intellectual property right or other right, title or interest in or to the Feedback; (ii) Company may have development ideas similar to the Feedback; (iii) Feedback does not contain confidential information or proprietary information from you or any third party; and (iv) Company is not under any obligation of confidentiality with respect to the Feedback. In the event the transfer of the ownership to the Feedback is not possible due to applicable mandatory laws, you grant Company and its affiliates an exclusive, transferable, irrevocable, free-of-charge, sub-licensable, unlimited and perpetual right to use (including copy, modify, create derivative works, publish, distribute and commercialize) Feedback in any manner and for any purpose.
## 9\. Links To Other Web Sites
Our Service may contain links to third party web sites or services that are not owned or controlled by SVR.JS.
SVR.JS has no control over, and assumes no responsibility for the content, privacy policies, or practices of any third party web sites or services. We do not warrant the offerings of any of these entities/individuals or their websites.
**<u>YOU ACKNOWLEDGE AND AGREE THAT COMPANY SHALL NOT BE RESPONSIBLE OR LIABLE, DIRECTLY OR INDIRECTLY, FOR ANY DAMAGE OR LOSS CAUSED OR ALLEGED TO BE CAUSED BY OR IN CONNECTION WITH USE OF OR RELIANCE ON ANY SUCH CONTENT, GOODS OR SERVICES AVAILABLE ON OR THROUGH ANY SUCH THIRD PARTY WEB SITES OR SERVICES.</u>**
**<u>WE STRONGLY ADVISE YOU TO READ THE TERMS OF SERVICE AND PRIVACY POLICIES OF ANY THIRD PARTY WEB SITES OR SERVICES THAT YOU VISIT.</u>**
## 10\. Disclaimer Of Warranty
**<u>THESE SERVICES ARE PROVIDED BY COMPANY ON AN "AS IS" AND "AS AVAILABLE" BASIS. COMPANY MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, AS TO THE OPERATION OF THEIR SERVICES, OR THE INFORMATION, CONTENT OR MATERIALS INCLUDED THEREIN. YOU EXPRESSLY AGREE THAT YOUR USE OF THESE SERVICES, THEIR CONTENT, AND ANY SERVICES OR ITEMS OBTAINED FROM US IS AT YOUR SOLE RISK.</u>**
**<u>NEITHER COMPANY NOR ANY PERSON ASSOCIATED WITH COMPANY MAKES ANY WARRANTY OR REPRESENTATION WITH RESPECT TO THE COMPLETENESS, SECURITY, RELIABILITY, QUALITY, ACCURACY, OR AVAILABILITY OF THE SERVICES. WITHOUT LIMITING THE FOREGOING, NEITHER COMPANY NOR ANYONE ASSOCIATED WITH COMPANY REPRESENTS OR WARRANTS THAT THE SERVICES, THEIR CONTENT, OR ANY SERVICES OR ITEMS OBTAINED THROUGH THE SERVICES WILL BE ACCURATE, RELIABLE, ERROR-FREE, OR UNINTERRUPTED, THAT DEFECTS WILL BE CORRECTED, THAT THE SERVICES OR THE SERVER THAT MAKES IT AVAILABLE ARE FREE OF VIRUSES OR OTHER HARMFUL COMPONENTS OR THAT THE SERVICES OR ANY SERVICES OR ITEMS OBTAINED THROUGH THE SERVICES WILL OTHERWISE MEET YOUR NEEDS OR EXPECTATIONS.</u>**
**<u>COMPANY HEREBY DISCLAIMS ALL WARRANTIES OF ANY KIND, WHETHER EXPRESS OR IMPLIED, STATUTORY, OR OTHERWISE, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, AND FITNESS FOR PARTICULAR PURPOSE.</u>**
**<u>THE FOREGOING DOES NOT AFFECT ANY WARRANTIES WHICH CANNOT BE EXCLUDED OR LIMITED UNDER APPLICABLE LAW.</u>**
## 11\. Limitation Of Liability
**<u>EXCEPT AS PROHIBITED BY LAW, YOU WILL HOLD US AND OUR OFFICERS, DIRECTORS, EMPLOYEES, AND AGENTS HARMLESS FOR ANY INDIRECT, PUNITIVE, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGE, HOWEVER IT ARISES (INCLUDING ATTORNEYS' FEES AND ALL RELATED COSTS AND EXPENSES OF LITIGATION AND ARBITRATION, OR AT TRIAL OR ON APPEAL, IF ANY, WHETHER OR NOT LITIGATION OR ARBITRATION IS INSTITUTED), WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE, OR OTHER TORTIOUS ACTION, OR ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT, INCLUDING WITHOUT LIMITATION ANY CLAIM FOR PERSONAL INJURY OR PROPERTY DAMAGE, ARISING FROM THIS AGREEMENT AND ANY VIOLATION BY YOU OF ANY FEDERAL, STATE, OR LOCAL LAWS, STATUTES, RULES, OR REGULATIONS, EVEN IF COMPANY HAS BEEN PREVIOUSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. EXCEPT AS PROHIBITED BY LAW, IF THERE IS LIABILITY FOUND ON THE PART OF COMPANY, IT WILL BE LIMITED TO THE AMOUNT PAID FOR THE PRODUCTS AND/OR SERVICES, AND UNDER NO CIRCUMSTANCES WILL THERE BE CONSEQUENTIAL OR PUNITIVE DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF PUNITIVE, INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE PRIOR LIMITATION OR EXCLUSION MAY NOT APPLY TO YOU.</u>**
## 12\. Termination
We may terminate or suspend your account and bar access to Service immediately, without prior notice or liability, under our sole discretion, for any reason whatsoever and without limitation, including but not limited to a breach of Terms.
If you wish to terminate your account, you may simply discontinue using Service.
All provisions of Terms which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability.
## 13\. Governing Law
These Terms shall be governed and construed in accordance with the laws of Poland, which governing law applies to agreement without regard to its conflict of law provisions.
Our failure to enforce any right or provision of these Terms will not be considered a waiver of those rights. If any provision of these Terms is held to be invalid or unenforceable by a court, the remaining provisions of these Terms will remain in effect. These Terms constitute the entire agreement between us regarding our Service and supersede and replace any prior agreements we might have had between us regarding Service.
## 14\. Changes To Service
We reserve the right to withdraw or amend our Service, and any service or material we provide via Service, in our sole discretion without notice. We will not be liable if for any reason all or any part of Service is unavailable at any time or for any period. From time to time, we may restrict access to some parts of Service, or the entire Service, to users, including registered users.
## 15\. Amendments To Terms
We may amend Terms at any time by posting the amended terms on this site. It is your responsibility to review these Terms periodically.
Your continued use of the Platform following the posting of revised Terms means that you accept and agree to the changes. You are expected to check this page frequently so you are aware of any changes, as they are binding on you.
By continuing to access or use our Service after any revisions become effective, you agree to be bound by the revised terms. If you do not agree to the new terms, you are no longer authorized to use Service.
## 16\. Waiver And Severability
No waiver by Company of any term or condition set forth in Terms shall be deemed a further or continuing waiver of such term or condition or a waiver of any other term or condition, and any failure of Company to assert a right or provision under Terms shall not constitute a waiver of such right or provision.
If any provision of Terms is held by a court or other tribunal of competent jurisdiction to be invalid, illegal or unenforceable for any reason, such provision shall be eliminated or limited to the minimum extent such that the remaining provisions of Terms will continue in full force and effect.
## 17\. Acknowledgement
**<u>BY USING SERVICE OR OTHER SERVICES PROVIDED BY US, YOU ACKNOWLEDGE THAT YOU HAVE READ THESE TERMS OF SERVICE AND AGREE TO BE BOUND BY THEM.</u>**
## 18\. Contact Us
Please send your feedback, comments, requests for technical support by email: _support[at]svrjs[dot]org_.

BIN
source/vid/svrjs-in-action.mp4 (Stored with Git LFS) Normal file

Binary file not shown.

BIN
source/vid/svrjs-in-action.ogv (Stored with Git LFS) Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

137
source/vulnerabilities.md Normal file
View file

@ -0,0 +1,137 @@
---
title: SVR.JS vulnerabilities
excerpt: Learn about potential security risks associated with outdated SVR.JS web server versions. Stay informed and safeguard your web applications from potential threats with timely updates.
date: 2023-12-21 20:29:44
---
Some older versions of SVR.JS are vulnerable to cyberattacks. It's recommended to update your SVR.JS version to the newest one.
If you find a security issue with SVR.JS, report it as soon as possible to _vulnerability-reports[at]svrjs[dot]org_. We'll mitigate that vulnerability if it is possible.
## SVR.JS
### Fixed in SVR.JS 3.13.0 and in SVR.JS 3.4.41 LTS
* An attacker could use user name with newlines on HTTP authentication to inject false log entries. (introduced in SVR.JS 3.0.0)
* An attacker could install problematic SVR.JS mod with newlines in its filename to inject false log entries. (introduced in SVR.JS 3.0.0)
### Fixed in SVR.JS 3.12.1 and in SVR.JS 3.4.39 LTS
* An attacker could inject HTML code into the _extName_ parameter of the _callServerError_ method to perform XSS attack.
* An attacker could inject HTML code into the _serverAdministratorEmail_ config.json property and cause the server to return 500, 502, 503, 504, 506 or 509 error code using a default error page or an error page with a _{contact}_ placeholder to perform XSS attack.
### Fixed in SVR.JS 3.10.2
* SVR.JS mods and server-side JavaScript were executed in the wrong order. So the attacker could bypass access controls if one of the mods had them, but the other one allowed browsing sensitive information. (introduced in SVR.JS 3.9.3; not present in LTS)
### Fixed in SVR.JS 3.9.6 and in SVR.JS 3.4.34 LTS
* An attacker could use URL beginning with "_/temp/_" to leak information from _temp_ directory in SVR.JS installation directory (includes source code through hidden _.modloader_w12345_ and _.serverSideScript_w12345.js_), if web root is in SVR.JS installation directory. [_View the security advisory_](/advisories/svrjs-00004.pdf)
### Fixed in SVR.JS 3.9.3 and in SVR.JS 3.4.31 LTS
* An attacker could use request URL that begins with "_http://_" or with "_https://_" (instead of one that begins with "_/_") to bypass all access controls (including HTTP authentication) in affected versions that use SVR.JS mods or server-side JavaScript not using _href_ or _uobject.pathname_ properties in at least one of path checks. [_View the security advisory_](/advisories/svrjs-00003.pdf)
### Fixed in SVR.JS 3.9.2 and in SVR.JS 3.4.30 LTS
* Affected SVR.JS versions failed to protect the _req.url_ property in SVR.JS mods and server-side JavaScript from path traversal because they didn't detect partial URL sanitation done by WHATWG URL parser and they didn't apply sanitations back to the _req.url_ property. (introduced in SVR.JS 3.3.1) [_View the security advisory_](/advisories/svrjs-00002.pdf)
### Fixed in SVR.JS 3.9.0 and in SVR.JS 3.4.28 LTS
* An attacker could put invalid X-Forwarded-For header value in order to possibly cause problems with web application. (when _enableIPSpoofing_ was enabled)
### Fixed in SVR.JS 3.7.5
* Block list didn't work, and thus attackers could bypass blocks. (introduced in SVR.JS 3.5.0; not present in LTS)
### Fixed in SVR.JS 3.5.6 and in SVR.JS 3.4.16 LTS
* An attacker could use "..." to traverse directories, while SVR.JS is running on Windows. (in web apps, less probable in SVR.JS itself, since Node.JS itself reports that "..." doesn't exist)
### Fixed in SVR.JS 3.3.1
* An attacker could use request URL, that begins with "_http://_" or with "_https://_" to bypass all access controls in affected versions, that use SVR.JS mods or server-side JavaScript.
### Fixed in SVR.JS 3.3.0
* Non-standard codes didn't work, and thus attackers could bypass HTTP authentication. (introduced in SVR.JS 3.2.1)
### Fixed in SVR.JS 3.2.1
* An attacker could access directory listing of directory above web root using "/.." path. (introduced in SVR.JS 3.0.0 and SVR.JS 2.1.3)
### Fixed in SVR.JS 3.1.2
* If SVR.JS script is above (not on) web root directory, then _config.json_ and other sensitive files can be easily accessed. (through security misconfiguration; introduced in SVR.JS 3.0.0)
### Fixed in SVR.JS 3.0.0
* There was a XSS bug in host name indication in default error pages.
### Fixed in SVR.JS 3.0.0 and SVR.JS 2.1.4
* An attacker could append "%00" to the URL in order to bypass access restrictions when SVR.JS is running on Bun.
* An attacker could use encoded characters to bypass access restrictions.
* Fixed access control bypass vulnerability when the server is running on Windows
### Fixed in SVR.JS 3.0.0 and SVR.JS 2.1.3
* Server crashed on malformed URL.
* Path traversal was possible with files.
* Fixed access control bypass vulnerability when the server is running on Windows (partial fix)
### Fixed in SVR.JS 2.1.1
* An attacker could use directory listing to access secret files (through path traversal).
---
## easy-waf integration
### Fixed in easy-waf integration 1.2.4
* An attacker could send a very small chunk of the POST request body (which will not trigger WAF) before the payload to bypass the WAF.
### Fixed in easy-waf integration 1.2.1
* An attacker could access the resource on the server with poorly written SVR.JS mod or server-side JavaScript (that normally would invoke 500 Internal Server Error) to crash the server.
## RedBrick
### Fixed in RedBrick 2.5.4
* An attacker could add HTTP authentication header to the HTTP request when not required to enable web application functionality normally disabled on unauthenticated requests. [_View the security advisory_](/advisories/svrjs-00005.pdf)
### Fixed in RedBrick 2.3.3
* An attacker could use "CGI-BIN" instead of "cgi-bin" to leak source code, while SVR.JS with RedBrick is running on Windows. [_View the security advisory_](/advisories/svrjs-00001.pdf)
* An attacker could leak RedBrick interpreter settings, while SVR.JS with RedBrick is running on Windows. [_View the security advisory_](/advisories/svrjs-00001.pdf)
## reverse-proxy-mod
### Fixed in reverse-proxy-mod 1.1.2
* An attacker could hack the upstream server, replace the web server or application with one that sends an invalid HTTP response code, and make a request to the hacked server through the reverse proxy to crash the reverse proxy server.
### Fixed in reverse-proxy-mod 1.0.4
* An attacker could leak reverse proxy configuration file. [_View the security advisory_](/advisories/svrjs-00001.pdf)
## OrangeCircle
### Fixed in OrangeCircle 1.1.2
* An attacker could add HTTP authentication header to the HTTP request when not required to enable web application functionality normally disabled on unauthenticated requests. [_View the security advisory_](/advisories/svrjs-00005.pdf)
### Fixed in OrangeCircle 1.0.2
* An attacker could leak OrangeCircle configuration, while SVR.JS with YellowSquare is running on Windows. [_View the security advisory_](/advisories/svrjs-00001.pdf)
## YellowSquare
### Fixed in YellowSquare 1.1.2
* An attacker could add HTTP authentication header to the HTTP request when not required to enable web application functionality normally disabled on unauthenticated requests. [_View the security advisory_](/advisories/svrjs-00005.pdf)
### Fixed in YellowSquare 1.0.1
* An attacker could use "JSGI-BIN" instead of "jsgi-bin" to leak source code, while SVR.JS with YellowSquare is running on Windows. [_View the security advisory_](/advisories/svrjs-00001.pdf)

View file

@ -0,0 +1,38 @@
---
title: YellowSquare change log
date: 2024-01-29 20:21:43
---
## YellowSquare 1.1.3
* Fixed bug with URLs containing "jsgi-bin" that don't refer to "jsgi-bin" directory in the web root.
## YellowSquare 1.1.2
* YellowSquare no longer sets _authType_ and _remoteUser_ JSGI properties, when 401 code is not specified in SVR.JS configuration.
## YellowSquare 1.1.1
* Fixed bug with URLs containing URL-encoded characters.
## YellowSquare 1.1.0
* Removed "DorianTech" from _mod.info_ file.
* YellowSquare no longer crashes when broken SVR.JS config is loaded.
* Changed error handling.
## YellowSquare 1.0.3
* Fixed YellowSquare not working in external web root setups.
## YellowSquare 1.0.2
* Fixed bug with _remotePort_ property.
## YellowSquare 1.0.1
* Mitigated source code leakage (through using "JSGI-BIN" instead of "jsgi-bin") in Windows
## YellowSquare 1.0.0
* First YellowSquare release.

46
svrjs-config.json Normal file
View file

@ -0,0 +1,46 @@
{
"port": 3000,
"nonStandardCodes": [
{
"regex": "/^\\/((?:[^\\/?#]+\\/)*[^\\/?#]+)\\.htm($|[?#].*)/",
"location": "/$1$2",
"scode": 301
},
{
"regex": "/^\\/(.*)\\/($|[?#].*)/",
"location": "/$1$2",
"scode": 302
}
],
"rewriteMap": [
{
"definingRegex": "/(\\/[^\\/.]+)\\.html?(?:$|[?#])/",
"replacements": [
{
"regex": "/(\\/[^\\/.]+)\\.html?($|[?#].*)/",
"replacement": "$1.htm$2"
}
]
},
{
"definingRegex": "/(\\/[^\\/.]+)(?:$|[?#])/",
"replacements": [
{
"regex": "/(\\/[^\\/.]+)($|[?#].*)/",
"replacement": "$1.html$2"
}
]
}
],
"dontCompress": [
"/.*\\.ipxe$/",
"/.*\\.img$/",
"/.*\\.iso$/",
"/.*\\.gz$/",
"/.*\\.webp$/",
"/.*\\.jpg$/",
"/.*\\.png$/",
"/.*\\.woff$/"
],
"wwwroot": "../public"
}

View file

@ -0,0 +1,92 @@
<div class="error404">
<div class="error-inner">
<h1>404 Not Found</h1>
<p>The requested file doesn't exist. If you have typed the URL manually, then please check the spelling.</p>
<p><b>Or maybe go back to <a href="/">main page</a>, read <a href="/zsoiebook.svr">The Book of ZSOiE</a> or browse our <a href="/docs">SVR.JS documentation</a>? You decide!</b></p>
<div class="error-button-container">
<a href="/" class="styled-button">Go back to the main page</a>
</div>
</div>
</div>
<div class="error-link-container">
<h2>Links</h2>
<div class="error-link-column-container">
<div class="error-link-column">
<h3>Main website</h3>
<ul>
<li><a href="/">Main page</a></li>
<li><a href="/docs">Documentation</a></li>
<li><a href="/mods">Official SVR.JS mods</a></li>
<li><a href="/otherdownloads">Download options</a></li>
<li><a href="/vulnerabilities">SVR.JS vulnerabilities</a></li>
<li><a href="/contribute">Contribute to SVR.JS</a></li>
<li><a href="/contact">Contact us</a></li>
<li><a href="/privacy">Privacy Policy</a></li>
<li><a href="/toc">Terms and Conditions</a></li>
</ul>
</div>
</div>
<div class="error-link-column-container">
<div class="error-link-column">
<h3>Downloads</h3>
<ul>
<li><a href="https://downloads.svrjs.org">SVR.JS downloads</a></li>
<li><a href="https://downloads.svrjs.org/beta/">SVR.JS Beta</a></li>
<li><a href="https://downloads.svrjs.org/installer/">SVR.JS installer</a></li>
<li><a href="https://downloads.svrjs.org/mods/">SVR.JS mods</a></li>
<li><a href="https://downloads.svrjs.org/nightly/">SVR.JS Nightly</a></li>
</ul>
<h3>Blog</h3>
<ul>
<li><a href="https://blog.svrjs.org">Blog main page</a></li>
<li><a href="https://blog.svrjs.org/archives">Archives</a></li>
<li><a href="https://blog.svrjs.org/atom.xml">RSS</a></li>
</ul>
</div>
</div>
<div class="error-link-column-container">
<div class="error-link-column">
<h3>Forum</h3>
<ul>
<li><a href="https://forum.svrjs.org">Forum main page</a></li>
<li><a href="https://forum.svrjs.org/rss/recent">RSS</a></li>
<li><a href="https://forum.svrjs.org/help">Help</a></li>
<li><a href="https://forum.svrjs.org/search">Search</a></li>
<li><a href="https://forum.svrjs.org/brd_svrjs-problems">SVR.JS problems</a></li>
<li><a href="https://forum.svrjs.org/brd_bugreports">SVR.JS bug reports</a></li>
<li><a href="https://forum.svrjs.org/brd_mod-problems">SVR.JS mod problems</a></li>
<li><a href="https://forum.svrjs.org/brd_mod-bugreports">SVR.JS mod bugs</a></li>
<li><a href="https://forum.svrjs.org/brd_svrjs-ssjs-problems">Problems with server-side JavaScript</a></li>
<li><a href="https://forum.svrjs.org/brd_svrjs-3-mods">SVR.JS 3.x mods</a></li>
<li><a href="https://forum.svrjs.org/brd_svrjs-2-mods">SVR.JS 2.x mods</a></li>
<li><a href="https://forum.svrjs.org/brd_cgi-ssi-scgi">CGI/SSI/SCGI</a></li>
<li><a href="https://forum.svrjs.org/brd_non-svrjs-ssjs">Non-SVR.JS server-side JavaScript</a></li>
<li><a href="https://forum.svrjs.org/brd_php">PHP</a></li>
<li><a href="https://forum.svrjs.org/brd_general">General SVR.JS discussions</a></li>
<li><a href="https://forum.svrjs.org/brd_featuresuggestions">Feature suggestions</a></li>
<li><a href="https://forum.svrjs.org/brd_3party-services">Third-party services</a></li>
<li><a href="https://forum.svrjs.org/brd_general-webmaster">General webmaster discussions</a></li>
<li><a href="https://forum.svrjs.org/brd_introduction">Introductions</a></li>
<li><a href="https://forum.svrjs.org/brd_off-topic">Off-topic</a></li>
</ul>
</div>
</div>
<div class="error-link-column-container">
<div class="error-link-column">
<h3>Git server</h3>
<ul>
<li><a href="https://git.svrjs.org">Git main page</a></li>
<li><a href="https://git.svrjs.org/create-svrjs-server.git"><i>create-svrjs-server</i> utility</a></li>
<li><a href="https://git.svrjs.org/svrjs-installer-linux.git">SVR.JS installer</a></li>
<li><a href="https://git.svrjs.org/svrjs.git">SVR.JS</a></li>
<li><a href="https://git.svrjs.org/svrjs-build-tools.git">SVR.JS build tools</a></li>
<li><a href="https://git.svrjs.org/easywaf-integration.git">EasyWAF integration mod</a></li>
<li><a href="https://git.svrjs.org/orangecircle.git">OrangeCircle</a></li>
<li><a href="https://git.svrjs.org/redbrick.git">RedBrick</a></li>
<li><a href="https://git.svrjs.org/reverse-proxy-mod.git">Reverse proxy mod</a></li>
<li><a href="https://git.svrjs.org/yellowsquare.git">YellowSquare</a></li>
</ul>
</div>
</div>
<div class="error-link-clearfix"></div>
</div>

View file

@ -0,0 +1,44 @@
<% if(!(is_page() && page.layout == "docs-page")) { %>
<footer class="footer">
<div class="footer-contents">
<div class="footer-layout">
<div class="footer-column">
<span class="footer-headline">Resources and development</span>
<ul class="footer-list">
<li><a href="https://blog.svrjs.org">Blog</a> (<a href="https://blog.svrjs.org/atom.xml">Feed</a>)</li>
<li><a href="https://git.svrjs.org">Git server</a></li>
<li><a href="https://svrjs.org/contribute">Contribute</a></li>
<li><a href="https://svrjs.org/changelog">Change log</a></li>
<li><a href="https://downloads.svrjs.org">Downloads</a></li>
<li><a href="https://svrjs.org/mods">Official SVR.JS mods</a></li>
<li><a href="https://svrjs.org/branding">Branding</a></li>
</ul>
</div>
<div class="footer-column">
<span class="footer-headline">Support</span>
<ul class="footer-list">
<li><a href="https://svrjs.org/docs">Documentation</a></li>
<li><a href="https://forum.svrjs.org">Forum</a> (<a href="https://forum.svrjs.org/feed">Feed</a>)</li>
<li><a href="https://svrjs.org/contact">Contact us</a></li>
<li><a href="https://status.svrjs.org">Server uptime</a></li>
</ul>
</div>
<div class="footer-column">
<span class="footer-headline">Social</span>
<ul class="footer-list">
<li><a rel="me" href="https://mastodon.social/@svrjs">Mastodon</a></li>
<li><a rel="me" href="https://twitter.com/SVR_JS">X (Twitter)</a></li>
</ul>
<span class="footer-headline">Policies and Security</span>
<ul class="footer-list">
<li><a href="https://svrjs.org/vulnerabilities">Security</a></li>
<li><a href="https://svrjs.org/toc">Terms and Conditions</a></li>
<li><a href="https://svrjs.org/privacy">Privacy Policy</a></li>
</ul>
</div>
</div>
<hr/>
<p class="footer-copyright-text">Copyright &copy; <%= (date(new Date(), 'YYYY') == "2023" ? "" : "2023-") + date(new Date(), 'YYYY') %> SVR.JS. All rights reserved.</p>
</div>
</footer>
<% } %>

View file

@ -0,0 +1,55 @@
<head>
<%
var title = page.title;
if(is_current('/docs.html') || is_current('/docs/')) {
title = "Documentation - " + config.title;
} else if(title && !(is_home() || (is_current('/') || is_current('/index.html')))) {
title = title + " - " + config.title;
} else {
title = config.title + " - " + config.subtitle;
}
%>
<title><%= title %></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<% if(is_home() || (is_current('/') || is_current('/index.html'))) { %>
<%- open_graph({description: config.description, image: "https://svrjs.org/logo.png", title: title}); %>
<% } else if(is_page() && page.layout == 'error-page') { %>
<%- open_graph({description: "An error page."}); %>
<% } else { %>
<%- open_graph(); %>
<% } %>
<%- favicon_tag("/favicon.ico"); %>
<% if(is_home() || (is_current('/') || is_current('/index.html'))) { %>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "SVR.JS",
"downloadUrl": "https://svrjs.org",
"author": "SVR.JS Authors",
"applicationCategory": "BrowserApplication",
"offers": {
"@type": "Offer",
"price": "0"
},
"operatingSystem": "Windows, Linux, MacOS, Haiku, FreeBSD, OpenBSD, Solaris, AIX, Android",
"softwareVersion": "<%= page.svrjsversion %>"
}
</script>
<% } %>
<!--[if lt IE 9]><%- js('js/html5shiv.js') %><![endif]-->
<% if(!(is_page() && page.layout == "docs-page")) { %>
<%- css('css/main.css'); %>
<!--[if lte IE 7]><%- css('css/main-ie7.css'); %><![endif]-->
<% if(is_page() && page.layout == 'error-page') { %>
<%- css('css/error.css'); %>
<% } %>
<% } else { %>
<%- css('css/docs.css'); %>
<% } %>
<% if(is_home() || page.layout == 'index-page') { %>
<%- css('css/index-page.css'); %>
<% } %>
<%- css('css/highlight.css'); %>
</head>

View file

@ -0,0 +1,21 @@
<% if(!(is_page() && page.layout == "docs-page")) { %>
<header class="header">
<div class="header-contents">
<div class="mainlink">
<a href="/" translate="no">
<span class="headlogo-container">
<img src="/img/navbar-logo.png" class="headlogo" alt="<%= config.title %> logo"><span class="headname">SVR.JS</span>
</span>
</a>
</div>
<nav class="navigation">
<ul>
<li><a href="https://forum.svrjs.org">Forum</a></li>
<li><a href="https://git.svrjs.org">Git</a></li>
<li><a href="https://blog.svrjs.org">Blog</a></li>
<li><a href="/docs">Docs</a></li>
</ul>
</nav>
</div>
</header>
<% } %>

View file

@ -0,0 +1,6 @@
<div class="content">
<div class="real-content">
<h1><%= page.title %></h1>
<%- page.content %>
</div>
</div>

View file

@ -0,0 +1,5 @@
<div class="content">
<div class="real-content">
<h1>You need to <code>npm uninstall hexo-generate-index</code> in order to use this theme.
</div>
</div>

View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html lang="<%= config.language %>">
<%- partial('_partial/head.ejs') %>
<body>
<%- partial('_partial/header.ejs') %>
<%- body %>
<%- partial('_partial/footer.ejs') %>
<% if (is_home() || ((is_current('/') || is_current('/index.html')) && page.layout == 'index-page')) { %>
<script type="text/javascript" src="/js/fancyheader.js" async=""></script>
<% } %>
</body>
</html>

View file

@ -0,0 +1,25 @@
<% if(is_page() && page.layout == "docs-page") { %>
<aside class="sidenav">
<div class="sidenav-contents">
<a href="/"><b>Return to the main page</b></a>
<%- toc(page.content, {min_depth: 2, max_depth: 3, list_number: false}) %>
</div>
</aside>
<% } %>
<% if(!(is_home() || page.layout == 'index-page' || page.layout == 'error-page')) { %>
<div class="content">
<% if(!(is_page() && page.layout == "docs-page")) { %>
<main class="real-content">
<% } else { %>
<main>
<% } %>
<% if(is_page() && page.layout == "docs-page") { %>
<a href="/" class="hideinprint">Return to the main page</a>
<% } %>
<h1><%= page.title %></h1>
<% } %>
<%- page.content %>
<% if(!(is_home() || page.layout == 'index-page' || page.layout == 'error-page')) { %>
</main>
</div>
<% } %>

View file

@ -0,0 +1,21 @@
<% if(is_current('/404.html') || is_current('/404/')) { %>
<%- partial('_partial/404') %>
<% } else { %>
<% if(is_current('/docs.html') || is_current('/docs/')) { %>
<div class="sidenav">
<div class="sidenav-contents">
<a href="/"><b>Return to the main page</b></a>
<%- toc(page.content, {min_depth: 2, max_depth: 3, list_number: false}) %>
</div>
</div>
<% } %>
<div class="content">
<div class="real-content">
<% if(is_current('/docs.html') || is_current('/docs/')) { %>
<a href="/" class="hideinprint">Return to the main page</a>
<% } %>
<h1><%= page.title %></h1>
<%- page.content %>
</div>
</div>
<% } %>

View file

@ -0,0 +1,245 @@
/*
* Prefixed by https://autoprefixer.github.io
* PostCSS: v8.4.14,
* Autoprefixer: v10.4.7
* Browsers: last 4 version
*/
body {
margin: 0;
padding: 0;
font-family: FreeSans, Helvetica, Tahoma, Verdana, Arial, sans-serif;
background-color: #dfffdf;
color: #000000;
}
.translated-rtl {
direction: rtl;
}
.sidenav {
height: 100%;
width: 14.5em;
position: fixed;
z-index: 1;
top: 0;
left: 0;
background-color: #007000;
color: #ffffff;
float: left;
-webkit-box-shadow: 5px 0 10px 0 rgba(0, 0, 0, 0.25);
-moz-box-shadow: 5px 0 10px 0 rgba(0, 0, 0, 0.25);
box-shadow: 5px 0 10px 0 rgba(0, 0, 0, 0.25);
overflow-y: auto;
display: block;
}
.sidenav-contents {
padding: 0.75em;
}
.translated-rtl .sidenav {
left: auto;
right: 0;
}
.sidenav h1, .sidenav h2, .sidenav h3, .sidenav h4, .sidenav h5, .sidenav h6, .sidenav p {
margin: 0;
padding: 0;
}
.sidenav .toc {
padding-left: 0;
list-style-type: none;
margin: 0;
}
.sidenav .toc-level-2 {
font-size: 1.5em;
font-weight: bold;
}
.sidenav .toc-level-2 .toc-child {
font-size: 0.7333333333333em;
font-weight: normal;
}
.sidenav .toc-child {
list-style-type: none;
padding: 0.25em 0.25em 0.25em 1em;
margin: 0;
}
.sidenav a {
text-decoration: none;
color: #ffffff;
}
.sidenav a:hover {
text-decoration: none;
color: #00ff00;
}
.content {
margin-left: 14.5em;
padding: 0.75em;
word-wrap: break-word;
overflow-wrap: break-word;
display: block;
}
.translated-rtl .content {
margin-left: 0;
margin-right: 14em;
}
.content img {
display: block;
width: 100%;
max-width: 1280px;
margin: 0 auto;
}
table {
border-collapse: collapse;
margin: 0;
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-all;
word-break: break-word;
position: relative;
}
table tbody {
background-color: #ffffff;
color: #000000;
}
table tbody:after {
-webkit-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.175);
-moz-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.175);
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.175);
content: ' ';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: -1;
}
table img {
margin: 0;
display: inline;
}
th,
tr {
padding: 0.15em;
text-align: center;
}
th {
background-color: #007000;
color: #ffffff;
}
th a {
color: #ffffff;
}
.highlight, .git {
margin: 0 -0.75em;
}
pre {
margin: 0 -0.88235em;
}
@media screen and (prefers-color-scheme: dark) {
.dummy {}
body {
background-color: #002000;
color: #ffffff;
}
a {
color: #ffffff;
}
a:hover {
color: #00ff00;
}
.sidenav {
-webkit-box-shadow: 5px 0 10px 0 rgba(127, 127, 127, 0.25);
-moz-box-shadow: 5px 0 10px 0 rgba(127, 127, 127, 0.25);
box-shadow: 5px 0 10px 0 rgba(127, 127, 127, 0.25);
}
}
@media screen and (max-width: 640px) {
.sidenav {
display: none;
position: static;
}
.content {
margin: 0;
}
.translated-rtl .content {
margin: 0;
}
}
@media print {
body {
background-color: #ffffff;
color: #000000;
}
.sidenav {
display: none;
}
.content {
margin: 0;
}
.hideinprint {
display: none;
}
pre {
white-space: pre-wrap; /* Since CSS 2.1 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
}
}
@font-face {
font-family: "FreeSans";
font-display: swap;
src: url("/fonts/FreeSans.woff") format("woff"), url("/fonts/FreeSans.ttf") format("truetype");
}
@font-face {
font-family: "FreeSans";
font-weight: bold;
font-display: swap;
src: url("/fonts/FreeSansBold.woff") format("woff"), url("/fonts/FreeSansBold.ttf") format("truetype");
}
@font-face {
font-family: "FreeSans";
font-style: italic;
font-display: swap;
src: url("/fonts/FreeSansOblique.woff") format("woff"), url("/fonts/FreeSansOblique.ttf") format("truetype");
}
@font-face {
font-family: "FreeSans";
font-style: italic;
font-weight: bold;
font-display: swap;
src: url("/fonts/FreeSansBoldOblique.woff") format("woff"), url("/fonts/FreeSansBoldOblique.ttf") format("truetype");
}

View file

@ -0,0 +1,163 @@
/*
* Prefixed by https://autoprefixer.github.io
* PostCSS: v8.4.14,
* Autoprefixer: v10.4.7
* Browsers: last 400 version
*/
.error404 {
background-image: url('/img/404-image.jpg');
background-position: center;
background-repeat: no-repeat;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
background-color: #007000;
padding: 5em 3em;
font-size: 16px;
-webkit-box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.2);
box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.2);
color: #ffffff;
}
.error404 p a {
color: #ffffff;
}
.error404 p a:hover {
color: #00ff00;
}
.error-inner {
font-size: 1.25em;
width: 100%;
max-width: 1600px;
margin: auto;
}
.error-inner h1 {
font-size: 2.75em;
margin: 0;
}
.error-button-container {
font-size: 16px;
}
.error-link-container {
width: 100%;
max-width: 1440px;
margin: auto;
padding-bottom: 1.5em;
}
.error-link-container h2 {
font-size: 2.5em;
margin: 0.5em;
text-align: center;
text-transform: uppercase;
}
.error-link-column-container {
width: 25%;
float: left;
margin-left: -1px;
}
.error-link-column {
padding: 0 0.5em;
}
.error-link-column h3 {
font-size: 1.75em;
}
.error-link-column h4 {
font-size: 1.5em;
}
.error-link-column h5 {
font-size: 1.17em;
}
.error-link-clearfix {
content: "";
display: table;
clear: both;
}
/*CSS hacks for Webp support check*/
@media screen and (-webkit-min-device-pixel-ratio: 0) and (min-resolution:.001dpcm) {
@supports (background-image: -webkit-image-set(url('/img/hero-image.webp') 1x)) {
.error404 {
background-image: url('/img/404-image.webp');
}
}
}
@supports (flex-basis: max-content) {
.error404 {
background-image: url('/img/404-image.webp');
}
}
@supports selector(:nth-child) {
.error404 {
background-image: url('/img/404-image.webp');
}
}
@media screen and (prefers-color-scheme: dark) {
.dummy {}
.error404 {
-webkit-box-shadow: 0 3px 6px 0 rgba(127, 127, 127, 0.2);
-moz-box-shadow: 0 3px 6px 0 rgba(127, 127, 127, 0.2);
box-shadow: 0 3px 6px 0 rgba(127, 127, 127, 0.2);
}
}
@media screen and (max-width: 1000px) {
.error404 {
text-align: center;
}
}
@media screen and (max-width: 890px) {
.error-link-column-container {
width: 50%;
}
.error-link-clearfix-halfway {
content: "";
display: table;
clear: both;
}
}
@media screen and (max-width: 640px) {
.error404 {
padding: 2.5em 1.5em;
}
}
@media screen and (max-width: 480px) {
.error-inner {
font-size: 1.125em;
}
.error-inner h1 {
font-size: 2.5em;
}
.error-link-column-container {
width: 100%;
float: none;
}
.error-link-clearfix-halfway, .error-link-clearfix {
display: none;
}
}

View file

@ -0,0 +1,269 @@
.content pre,
.content .highlight {
background: #2d2d2d;
padding: 15px 20px;
border-style: solid;
border-color: #ddd;
border-width: 1px 0;
overflow: auto;
color: #ccc;
line-height: 1.6em;
}
.content .highlight .gutter pre,
.content .gist .gist-file .gist-data .line-numbers {
color: #666;
font-size: 0.7225em;
line-height: 1.88235em;
}
.content pre,
.content code {
font-family: "DejaVu Sans Mono", "Bitstream Vera Sans Mono", Hack, Menlo, Consolas, Monaco, monospace;
font-size: 0.85em;
}
.translated-rtl .content .highlight {
direction: ltr;
text-align: left;
}
.content code {
background: #ffffff;
text-shadow: 0 1px #fff;
padding: 0 0.3em;
}
@media screen and (prefers-color-scheme: dark) {
.content code {
background: #000f00;
text-shadow: 0 1px #000;
}
}
.content pre code {
background: none;
text-shadow: none;
padding: 0;
}
.content .highlight pre {
border: none;
margin: 0;
padding: 0;
font-size: 0.85em;
}
.content .highlight table {
margin: 0;
width: auto;
}
.content .highlight table tbody::after {
display: none;
}
.content .highlight td {
border: none;
padding: 0;
text-align: left;
}
.content .highlight figcaption {
font-size: 0.85em;
color: #999;
line-height: 1em;
margin-bottom: 1em;
}
.content .highlight figcaption a {
float: right;
}
.content .highlight .gutter {
-moz-user-select: none;
-ms-user-select: none;
-webkit-user-select: none;
user-select: none;
overflow-wrap: normal;
word-wrap: normal;
word-break: keep-all;
background-color: #2d2d2d;
}
.content .highlight .gutter pre {
text-align: right;
padding-right: 20px;
}
.content .highlight .code {
background-color: #2d2d2d;
}
.content .highlight .line {
height: 1.6em;
}
.content .highlight .line.marked {
background: #515151;
}
.content .gist {
border-style: solid;
border-color: #ddd;
border-width: 1px 0;
background: #2d2d2d;
padding: 15px 20px 15px 0;
}
.content .gist .gist-file {
border: none;
font-family: "DejaVu Sans Mono", "Bitstream Vera Sans Mono", Hack, Menlo, Consolas, Monaco, monospace;
margin: 0;
}
.content .gist .gist-file .gist-data {
background: none;
border: none;
}
.content .gist .gist-file .gist-data .line-numbers {
background: none;
border: none;
padding: 0 20px 0 0;
}
.content .gist .gist-file .gist-data .line-data {
padding: 0 !important;
}
.content .gist .gist-file .highlight {
margin: 0;
padding: 0;
border: none;
font-size: 0.85em;
}
.content .gist .gist-file .gist-meta {
background: #2d2d2d;
color: #999;
font: 0.85em FreeSans, Helvetica, Tahoma, Verdana, Arial, sans-serif;
text-shadow: 0 0;
padding: 0;
margin-top: 1em;
margin-left: 20px;
}
.content .gist .gist-file .gist-meta a {
/*color: #007000;*/
font-weight: normal;
}
.content .gist .gist-file .gist-meta a:hover {
text-decoration: underline;
}
pre .comment,
pre .title {
color: #999;
}
pre .variable,
pre .attribute,
pre .tag,
pre .regexp,
pre .ruby .constant,
pre .xml .tag .title,
pre .xml .pi,
pre .xml .doctype,
pre .html .doctype,
pre .css .id,
pre .css .class,
pre .css .pseudo {
color: #f2777a;
}
pre .number,
pre .preprocessor,
pre .built_in,
pre .literal,
pre .params,
pre .constant {
color: #f99157;
}
pre .class,
pre .ruby .class .title,
pre .css .rules .attribute {
color: #9c9;
}
pre .string,
pre .value,
pre .inheritance,
pre .header,
pre .ruby .symbol,
pre .xml .cdata {
color: #9c9;
}
pre .css .hexcolor {
color: #6cc;
}
pre .function,
pre .python .decorator,
pre .python .title,
pre .ruby .function .title,
pre .ruby .title .keyword,
pre .perl .sub,
pre .javascript .title,
pre .coffeescript .title {
color: #69c;
}
pre .keyword,
pre .javascript .function {
color: #c9c;
}
@media print {
.content .highlight .gutter {
display: none;
}
}
@media screen and (prefers-color-scheme: dark) {
.content pre,
.content .highlight {
border-color: #000a00;
}
}
@font-face {
font-family: "DejaVu Sans Mono";
font-display: swap;
src: url("/fonts/DejaVuSansMono.woff") format("woff"), url("/fonts/DejaVuSansMono.ttf") format("truetype");
}
@font-face {
font-family: "DejaVu Sans Mono";
font-weight: bold;
font-display: swap;
src: url("/fonts/DejaVuSansMono-Bold.woff") format("woff"), url("/fonts/DejaVuSansMono-Bold.ttf") format("truetype");
}
@font-face {
font-family: "DejaVu Sans Mono";
font-style: italic;
font-display: swap;
src: url("/fonts/DejaVuSansMono-Oblique.woff") format("woff"), url("/fonts/DejaVuSansMono-Oblique.ttf") format("truetype");
}
@font-face {
font-family: "DejaVu Sans Mono";
font-style: italic;
font-weight: bold;
font-display: swap;
src: url("/fonts/DejaVuSansMono-BoldOblique.woff") format("woff"), url("/fonts/DejaVuSansMono-BoldOblique.ttf") format("truetype");
}

View file

@ -0,0 +1,546 @@
/*
* Prefixed by https://autoprefixer.github.io
* PostCSS: v8.4.14,
* Autoprefixer: v10.4.7
* Browsers: last 400 version
*/
.comparison-table-container {
width: 100%; /* For NetSurf 3.6 */
max-width: 1152px;
margin: 0 auto;
}
.comparison-table {
width: 100%;
table-layout: auto;
}
.comparison-table tr td,
.comparison-table tr th {
padding-top: 0.225em;
padding-bottom: 0.225em;
width: 16.66666666666666666666666666%;
}
.comparison-table-feature {
background-color: #00b000;
color: #ffffff;
font-weight: bold;
}
tr.comparison-table-mobile-feature {
display: none;
}
tr.comparison-table-mobile-feature td {
background-color: #00b000;
border-left: #00b000 solid 0.3125em;
color: #ffffff;
font-weight: bold;
padding: 0.225em;
padding-left: 0.06875em;
}
.translated-rtl tr.comparison-table-mobile-feature td {
padding-left: 0.225em;
padding-right: 0.06875em;
border-left: none;
border-right: #00b000 solid 0.3125em;
}
.comparison-table tr td:nth-child(2n+3) {
background-color: #dfffdf
}
.comparison-table-yes {
background-color: #00ff00;
color: #000000;
}
.comparison-table tr td.comparison-table-yes:nth-child(2n+3) {
background-color: #60ff60;
color: #000000;
}
.comparison-table-no {
background-color: #ff0000;
color: #ffffff;
}
.comparison-table tr td.comparison-table-no:nth-child(2n+3) {
background-color: #ff6060;
color: #ffffff;
}
.comparison-table-sus {
background-color: #ffff00;
color: #000000;
}
.comparison-table tr td.comparison-table-sus:nth-child(2n+3) {
background-color: #ffff60;
color: #000000;
}
.comparison-table tr th.comparison-table-myproduct,
.comparison-table tr td.comparison-table-myproduct {
border-left: #007000 solid 0.3125em;
border-right: #007000 solid 0.3125em;
padding-left: 0.15625em;
padding-right: 0.15625em;
}
.comparison-table tr:last-child td.comparison-table-myproduct {
border-bottom: #007000 solid 0.3125em;
padding-bottom: 0.3125em;
}
.hero {
background-image: url("/img/hero-image.jpg");
background-repeat: no-repeat;
background-position: right top;
-webkit-background-size: 50% 50%;
-moz-background-size: 50%;
-o-background-size: 50%;
background-size: 50%;
background-attachment: fixed;
background-color: #9aff9a;
-webkit-box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.2);
box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.2);
font-size: 16px; /*So hero image wouldn't break*/
display: block;
}
.translated-rtl .hero {
background-position: left top;
}
.hero-content-column {
background-color: #9aff9a;
width: 50%;
}
.hero-content {
padding: 2.5em 2.85em;
}
.hero-description {
min-height: 20.35em;
}
.hero h1 {
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-word;
font-size: 3.115em;
line-height: 1.15em;
margin: 0;
}
.hero p {
font-size: 1.235em;
padding: 1.25em 0 1.1em 0;
margin: 0;
line-height: 1.165em;
}
.download-container {
display: block;
}
.maindownloads {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.otherdls {
margin-top: 0.425em;
font-size: 0.8965em;
line-height: 1.35em;
}
.promo-point-clearfix {
content: "";
display: table;
clear: both
}
.promo-point-subcontainer {
width: 25%;
float: left;
margin-left: -1px;
/*padding: 0.5em 0;*/
text-align: center;
}
.promo-point {
margin: 0.5em;
margin-top: 0;
margin-bottom: 1.15em;
background-color: #ffffff;
-webkit-box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.15);
-moz-box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.15);
box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.15);
}
.translated-rtl .promo-point-subcontainer {
float: right;
}
.promo-image {
display: block;
margin: auto;
width: 100%;
height: auto;
max-width: 320px;
}
.promo-text {
text-align: left;
padding-bottom: 0.5em;
padding-left: 0.5em;
padding-right: 0.5em;
}
.translated-rtl .promo-text {
text-align: right;
}
.index-section-even h2,
.index-section-odd h2 {
text-align: center;
text-transform: uppercase;
font-size: 2.5em;
margin: 0;
margin-bottom: 0.35em;
padding: 0.5em 0 0 0;
overflow-wrap: break-word;
word-wrap: break-word;
/*Doesn't use word-break: break-all fallback*/
word-break: break-word;
}
.index-section-even h3,
.index-section-odd h3 {
font-size: 1.5em;
margin: 0.83em 0;
}
.index-section-even h4,
.index-section-odd h4 {
font-size: 1.17em;
margin: 1em 0;
}
.index-section-even h5,
.index-section-odd h5 {
font-size: 1em;
margin: 1.33em 0;
}
.index-section-even h6,
.index-section-odd h6 {
font-size: 0.83em;
margin: 1.67em 0;
}
.index-section-even,
.index-section-odd {
padding: 0 0.5em;
display: block;
}
.index-section-even:nth-child(n+5),
.index-section-odd {
-webkit-box-shadow: 0 -3px 6px 0 rgba(0, 0, 0, 0.175);
-moz-box-shadow: 0 -3px 6px 0 rgba(0, 0, 0, 0.175);
box-shadow: 0 -3px 6px 0 rgba(0, 0, 0, 0.175);
}
.index-section-even,
.index-section-odd {
padding-bottom: 0.8em;
}
.index-section-odd p:last-child,
.index-section-even p:last-child {
margin-bottom: 0;
padding-bottom: 0.2em;
}
.index-section-odd {
background-color: #c5ffc5;
}
.section-videos {
text-align: center;
}
.section-container, .section-videos, .promo-point-container {
width: 100%; /* For NetSurf 3.6 */
max-width: 1280px;
margin: 0 auto;
}
.promo-point-container {
max-width: 1440px;
}
.section-videos video {
width: 100%;
max-width: 800px;
-webkit-box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.225);
-moz-box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.225);
box-shadow: 0 5px 10px 0 rgba(0, 0, 0, 0.225);
}
/*CSS hacks for Webp support check*/
@media screen and (-webkit-min-device-pixel-ratio: 0) and (min-resolution:.001dpcm) {
@supports (background-image: -webkit-image-set(url('/img/hero-image.webp') 1x)) {
.hero {
background-image: url('/img/hero-image.webp');
}
}
}
@supports (flex-basis: max-content) {
.hero {
background-image: url('/img/hero-image.webp');
}
}
@supports selector(:nth-child) {
.hero {
background-image: url('/img/hero-image.webp');
}
}
@media screen and (prefers-color-scheme: dark) {
.dummy {}
.hero {
background-color: #006f00;
-webkit-box-shadow: 0 3px 6px 0 rgba(127, 127, 127, 0.2);
-moz-box-shadow: 0 3px 6px 0 rgba(127, 127, 127, 0.2);
box-shadow: 0 3px 6px 0 rgba(127, 127, 127, 0.2);
}
.hero-content-column {
background-color: #006f00;
}
.index-section-even:nth-child(n+5),
.index-section-odd {
-webkit-box-shadow: 0 -3px 6px 0 rgba(127, 127, 127, 0.175);
-moz-box-shadow: 0 -3px 6px 0 rgba(127, 127, 127, 0.175);
box-shadow: 0 -3px 6px 0 rgba(127, 127, 127, 0.175);
}
.index-section-odd {
background-color: #003a00;
}
.promo-point {
background-color: #000f00;
-webkit-box-shadow: 0 5px 10px 0 rgba(127, 127, 127, 0.15);
-moz-box-shadow: 0 5px 10px 0 rgba(127, 127, 127, 0.15);
box-shadow: 0 5px 10px 0 rgba(127, 127, 127, 0.15);
}
.section-videos video {
-webkit-box-shadow: 0 5px 10px 0 rgba(127, 127, 127, 0.225);
-moz-box-shadow: 0 5px 10px 0 rgba(127, 127, 127, 0.225);
box-shadow: 0 5px 10px 0 rgba(127, 127, 127, 0.225);
}
.comparison-table tr td:nth-child(2n+3) {
background-color: #002000
}
.comparison-table tr td.comparison-table-yes:nth-child(2n+3) {
background-color: #009f00;
color: #ffffff;
}
.comparison-table tr td.comparison-table-no:nth-child(2n+3) {
background-color: #9f0000;
color: #ffffff;
}
.comparison-table tr td.comparison-table-sus:nth-child(2n+3) {
background-color: #c0c000;
color: #ffffff;
}
}
@media screen and (min-width: 1800px) {
.hero {
background-image: url("/img/hero-image-big.jpg");
}
/*CSS hacks for Webp support check*/
@media screen and (-webkit-min-device-pixel-ratio: 0) and (min-resolution:.001dpcm) {
@supports (background-image: -webkit-image-set(url('/img/hero-image.webp') 1x)) {
.hero {
background-image: url('/img/hero-image-big.webp');
}
}
}
@supports (flex-basis: max-content) {
.hero {
background-image: url('/img/hero-image-big.webp');
}
}
@supports selector(:nth-child) {
.hero {
background-image: url('/img/hero-image-big.webp');
}
}
}
@media screen and (max-width: 1600px) {
.hero-description {
min-height: 23.65em;
}
}
@media screen and (max-width: 1440px) {
.hero-description {
min-height: 24.25em;
}
}
@media screen and (max-width: 1000px) {
.hero {
background-image: url("/img/hero-image-small.jpg");
background-color: #006f00;
-webkit-background-size: 100% 100%;
-moz-background-size: 100%;
-o-background-size: 100%;
background-size: 100%;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
background-position: top center;
background-attachment: fixed;
color: #ffffff;
padding: 3em;
font-size: 1em;
}
.hero a {
color: #ffffff;
}
.hero a:hover {
color: #00ff00;
}
.hero .styled-button {
background-color: #00b000;
-webkit-box-shadow: 0 4px 8px 0 rgba(127, 127, 127, 0.25);
-moz-box-shadow: 0 4px 8px 0 rgba(127, 127, 127, 0.25);
box-shadow: 0 4px 8px 0 rgba(127, 127, 127, 0.25);
}
.hero .styled-button:hover {
background-color: #00d000;
color: #ffffff;
}
.hero .styled-button.styled-button-disabled, .hero .styled-button.styled-button-disabled:hover {
background-color: #808080;
}
.hero-content-column {
width: 100%;
background: none;
}
.hero-content {
padding: 0;
text-align: center;
}
.hero-description {
min-height: 0px;
}
/*CSS hacks for Webp support check*/
@media screen and (-webkit-min-device-pixel-ratio: 0) and (min-resolution:.001dpcm) {
@supports (background-image: -webkit-image-set(url('/img/hero-image.webp') 1x)) {
.hero {
background-image: url('/img/hero-image-small.webp');
}
}
}
@supports (flex-basis: max-content) {
.hero {
background-image: url('/img/hero-image-small.webp');
}
}
@supports selector(:nth-child) {
.hero {
background-image: url('/img/hero-image-small.webp');
}
}
}
@media screen and (max-width: 890px) {
.promo-point-subcontainer {
width: 50%;
}
.promo-point-clearfix-halfway {
content: "";
display: table;
clear: both
}
}
@media screen and (max-width: 480px) {
.promo-point-subcontainer {
width: 100%;
float: none;
}
.promo-point-clearfix-halfway, .promo-point-clearfix {
display:none;
}
.hero {
padding: 2.5em;
}
.hero h1 {
font-size: 3.05em;
}
.comparison-table tr td,
.comparison-table tr th {
width: 20%;
}
.comparison-table-feature,
.comparison-table-blank {
display: none;
}
tr.comparison-table-mobile-feature {
display: table-row;
}
}
@media screen and (max-width: 350px) {
.hero {
padding: 2.0em;
}
}

View file

@ -0,0 +1,18 @@
.mainlink {
float: left;
}
.headname {
line-height: normal;
display: inline;
}
.navigation {
float: right;
padding: 10px 0;
}
.footer-layout {
display: block;
text-align: center;
}
.footer-column {
display: block;
}

View file

@ -0,0 +1,491 @@
/*
* Prefixed by https://autoprefixer.github.io
* PostCSS: v8.4.14,
* Autoprefixer: v10.4.7
* Browsers: last 400 version
*/
body {
margin: 0;
padding: 0;
font-family: FreeSans, Helvetica, Tahoma, Verdana, Arial, sans-serif;
background-color: #dfffdf;
color: #000000;
}
.translated-rtl {
direction: rtl;
}
.header {
position: relative;
position: -webkit-sticky;
position: sticky;
top: 0;
z-index: 10;
padding: 0.65em 0.45em;
background-color: #ffffff;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
display: block;
}
.header:after {
content: '';
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
-webkit-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2);
z-index: -1;
}
.header-contents {
display: table;
width: 100%;
table-layout: fixed;
}
.headlogo {
display: inline;
height: 2.2em;
padding-left: 0.2em;
padding-right: 0.35em;
padding-bottom: 0.03em;
vertical-align: middle;
}
.translated-rtl .headlogo {
padding-left: 0.35em;
padding-right: 0.2em;
}
.headname {
font-size: 2.3em;
font-weight: bold;
vertical-align: middle;
line-height: 0.9em;
display: inline-block;
}
.navigation {
display: table-cell;
text-align: right;
position: relative;
vertical-align: middle;
width: 57.5%;
}
.navigation ul {
overflow-x: auto;
overflow-y: hidden;
white-space: nowrap;
margin: 0;
padding: 0;
list-style-type: none;
display: block;
}
.mainlink {
display: table-cell;
vertical-align: middle;
position: relative;
white-space: nowrap;
width: 42.5%;
}
.mainlink a {
text-decoration: none;
color: #000000;
}
.translated-rtl .navigation {
text-align: left;
}
.headlogo-container {
display: inline-block;
}
.navigation ul li {
display: inline;
}
.navigation ul li a {
text-decoration: none;
font-size: 1.45em;
padding: 0 0.25em;
color: #000000;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
@-moz-document url-prefix() {
.navigation ul li a {
display: inline-block;
margin-bottom: 0.05em;
}
}
.navigation ul li a:hover {
color: #007f00;
}
.content {
padding: 0.5em;
}
.real-content {
width: 100%;
max-width: 1280px;
margin: 0 auto;
display: block;
}
.real-content img {
max-width: 100%;
margin: auto;
display: block;
}
.styled-button {
display: inline-block;
text-decoration: none;
color: #ffffff;
background-color: #00b000;
font-size: 1.225em;
padding: 0.725em;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.25);
-moz-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.25);
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.25);
}
.styled-button:hover {
background-color: #007000;
}
.styled-button.styled-button-disabled, .styled-button.styled-button-disabled:hover {
background-color: #808080;
}
.download-seperator {
font-size: 0.75em;
}
.footer {
background-color: #007000;
color: #ffffff;
-webkit-box-shadow: 0 -4px 8px 0 rgba(0, 0, 0, 0.2);
-moz-box-shadow: 0 -4px 8px 0 rgba(0, 0, 0, 0.2);
box-shadow: 0 -4px 8px 0 rgba(0, 0, 0, 0.2);
padding: 1.75em 1em;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
display: block;
}
.footer hr {
border-color: white;
}
.footer a {
color: #ffffff;
}
.footer a:hover {
color: #00ff00;
}
.footer-contents {
max-width: 1440px;
width: 100%;
margin: auto;
}
.footer-copyright-text {
font-size: 1.25em;
margin: 0;
margin-top: 0.5em;
padding-bottom: 0.5em;
display: block;
text-align: center;
}
.footer-layout {
display: table;
table-layout: fixed;
width: 100%;
font-size: 1.075em;
}
.footer-column {
display: table-cell;
padding: 0.3em;
}
.footer-headline {
display: block;
font-weight: bold;
font-size: 1.525em;
}
.footer-list {
margin: 0;
padding: 0;
margin-bottom: 1em;
list-style-type: none;
}
img {
border-style: none;
}
table {
border-collapse: collapse;
margin: 0;
overflow-wrap: break-word;
word-wrap: break-word;
word-break: break-all;
word-break: break-word;
position: relative;
}
table tbody {
background-color: #ffffff;
color: #000000;
}
table tbody:after {
-webkit-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.175);
-moz-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.175);
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.175);
content: ' ';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: -1;
}
table img {
margin: 0;
display: inline;
}
th,
tr {
padding: 0.15em;
text-align: center;
}
th {
background-color: #007000;
color: #ffffff;
}
th a {
color: #ffffff;
}
.highlight, .gist {
margin: 0 -0.5em;
}
pre {
margin: 0 -0.588235em;
}
@media screen and (-ms-high-contrast:active), (-ms-high-contrast:none) {
.headname {
margin-top: 0.06em;
}
}
@media screen and (prefers-color-scheme: dark) {
.dummy {}
body {
background-color: #002000;
color: #ffffff;
}
a {
color: #ffffff;
}
a:hover {
color: #00ff00;
}
.header {
background-color: #004f00;
}
.header:after {
-webkit-box-shadow: 0 4px 8px 0 rgba(127, 127, 127, 0.2);
-moz-box-shadow: 0 4px 8px 0 rgba(127, 127, 127, 0.2);
box-shadow: 0 4px 8px 0 rgba(127, 127, 127, 0.2);
}
.mainlink a {
color: #ffffff;
}
.mainlink:hover {
color: #ffffff;
}
.navigation ul li a {
color: #ffffff;
}
.navigation ul li a:hover {
color: #00ff00;
}
.footer {
-webkit-box-shadow: 0 -4px 8px 0 rgba(127, 127, 127, 0.2);
-moz-box-shadow: 0 -4px 8px 0 rgba(127, 127, 127, 0.2);
box-shadow: 0 -4px 8px 0 rgba(127, 127, 127, 0.2);
}
.styled-button {
background-color: #00b000;
-webkit-box-shadow: 0 4px 8px 0 rgba(127, 127, 127, 0.25);
-moz-box-shadow: 0 4px 8px 0 rgba(127, 127, 127, 0.25);
box-shadow: 0 4px 8px 0 rgba(127, 127, 127, 0.25);
}
.styled-button:hover {
background-color: #00d000;
color: #ffffff;
}
table tbody {
background-color: #000f00;
color: #ffffff;
}
table tbody:after {
-webkit-box-shadow: 0 4px 8px 0 rgba(127, 127, 127, 0.175);
-moz-box-shadow: 0 4px 8px 0 rgba(127, 127, 127, 0.175);
box-shadow: 0 4px 8px 0 rgba(127, 127, 127, 0.175);
}
}
@media screen and (max-width: 768px) {
.footer-layout {
display: block;
}
.footer-column {
display: block;
text-align: center;
padding: 0;
}
}
@media screen and (max-width: 480px) {
.headlogo {
height: 1.8em;
padding-left: 0;
padding-right: 0.25em;
padding-bottom: 0;
}
.translated-rtl .headlogo {
padding-left: 0.25em;
padding-right: 0;
}
.headname {
font-size: 1.85em;
}
.navigation ul li a {
font-size: 1.15em;
padding: 0 0.225em;
}
}
@media screen and (max-width: 372px) {
.navigation ul li a {
font-size: 1.075em;
padding: 0 0.2em;
}
}
@media screen and (max-width: 350px) {
.navigation {
display: block;
text-align: left;
width: 100%;
}
.translated-rtl .navigation {
text-align: right
}
.mainlink {
display: block;
width: 100%;
}
.header-contents {
display: block;
}
}
@media print {
.dummy {}
.header, .footer {
display: none;
}
.real-content {
max-width: none !important;
}
}
@font-face {
font-family: "FreeSans";
font-display: swap;
src: url("/fonts/FreeSans.woff") format("woff"), url("/fonts/FreeSans.ttf") format("truetype");
}
@font-face {
font-family: "FreeSans";
font-weight: bold;
font-display: swap;
src: url("/fonts/FreeSansBold.woff") format("woff"), url("/fonts/FreeSansBold.ttf") format("truetype");
}
@font-face {
font-family: "FreeSans";
font-style: italic;
font-display: swap;
src: url("/fonts/FreeSansOblique.woff") format("woff"), url("/fonts/FreeSansOblique.ttf") format("truetype");
}
@font-face {
font-family: "FreeSans";
font-style: italic;
font-weight: bold;
font-display: swap;
src: url("/fonts/FreeSansBoldOblique.woff") format("woff"), url("/fonts/FreeSansBoldOblique.ttf") format("truetype");
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 276 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Some files were not shown because too many files have changed in this diff Show more