diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 459df0aec..42f3523d7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -47,7 +47,7 @@ body: label: BunkerWeb version description: What version of BunkerWeb are you running? placeholder: Version - value: 1.5.4 + value: 1.5.5 validations: required: true - type: dropdown diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index e638fcdcb..97caad4e2 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -35,12 +35,12 @@ jobs: python -m pip install --no-cache-dir --require-hashes -r src/common/db/requirements.txt echo "CODEQL_PYTHON=$(which python)" >> $GITHUB_ENV - name: Initialize CodeQL - uses: github/codeql-action/init@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 + uses: github/codeql-action/init@012739e5082ff0c22ca6d6ab32e07c36df03c4a4 # v3.22.12 with: languages: ${{ matrix.language }} config-file: ./.github/codeql.yml setup-python-dependencies: false - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 + uses: github/codeql-action/analyze@012739e5082ff0c22ca6d6ab32e07c36df03c4a4 # v3.22.12 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/container-build.yml b/.github/workflows/container-build.yml index ad8c17284..cc03c0b22 100644 --- a/.github/workflows/container-build.yml +++ b/.github/workflows/container-build.yml @@ -84,7 +84,7 @@ jobs: # Compute metadata - name: Extract metadata id: meta - uses: docker/metadata-action@31cebacef4805868f9ce9a0cb03ee36c32df2ac4 # v5.3.0 + uses: docker/metadata-action@9dc751fe249ad99385a2583ee0d084c400eee04e # v5.4.0 with: images: bunkerity/${{ inputs.IMAGE }} # Build cached image @@ -115,7 +115,7 @@ jobs: # Check OS vulnerabilities - name: Check OS vulnerabilities if: ${{ inputs.CACHE_SUFFIX != 'arm' }} - uses: aquasecurity/trivy-action@69cbbc0cbbf6a2b0bab8dcf0e9f2d7ead08e87e4 # master + uses: aquasecurity/trivy-action@d43c1f16c00cfd3978dde6c07f4bbcf9eb6993ca # v0.16.1 with: vuln-type: os skip-dirs: /root/.cargo diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index 040acd846..f5df172ac 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -72,19 +72,19 @@ jobs: # UI tests tests-ui: - needs: [codeql, build-containers] + needs: [build-containers] uses: ./.github/workflows/tests-ui.yml with: RELEASE: dev tests-ui-linux: - needs: [codeql, build-packages] + needs: [build-packages] uses: ./.github/workflows/tests-ui-linux.yml with: RELEASE: dev # Core tests prepare-tests-core: - needs: [codeql, build-containers, build-packages] + needs: [build-containers, build-packages] runs-on: ubuntu-latest steps: - name: Checkout repository diff --git a/.github/workflows/doc-to-pdf.yml b/.github/workflows/doc-to-pdf.yml index 98987426f..f840d2ba2 100644 --- a/.github/workflows/doc-to-pdf.yml +++ b/.github/workflows/doc-to-pdf.yml @@ -23,7 +23,7 @@ jobs: - name: Install chromium run: sudo apt install chromium-browser - name: Install node - uses: actions/setup-node@8f152de45cc393bb48ce5d89d36b731f54556e65 # v4.0.0 + uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v4.0.1 with: node-version: 18 - name: Install puppeteer @@ -32,7 +32,7 @@ jobs: run: mkdocs serve & sleep 10 - name: Run pdf script run: node docs/misc/pdf.js http://localhost:8000/print_page/ BunkerWeb_documentation_v${{ inputs.VERSION }}.pdf 'BunkerWeb documentation v${{ inputs.VERSION }}' - - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + - uses: actions/upload-artifact@c7d193f32edcb7bfad88892161225aeda64e9392 # v4.0.0 with: name: BunkerWeb_documentation_v${{ inputs.VERSION }}.pdf path: BunkerWeb_documentation_v${{ inputs.VERSION }}.pdf diff --git a/.github/workflows/linux-build.yml b/.github/workflows/linux-build.yml index f45346a24..69109b98b 100644 --- a/.github/workflows/linux-build.yml +++ b/.github/workflows/linux-build.yml @@ -127,7 +127,7 @@ jobs: scp -r root@arm:/root/package-${{ inputs.LINUX }} ./package-${{ inputs.LINUX }} env: LARCH: ${{ env.LARCH }} - - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + - uses: actions/upload-artifact@c7d193f32edcb7bfad88892161225aeda64e9392 # v4.0.0 with: name: package-${{ inputs.LINUX }}-${{ env.LARCH }} path: package-${{ inputs.LINUX }}/*.${{ inputs.PACKAGE }} @@ -135,7 +135,7 @@ jobs: - name: Extract metadata if: inputs.TEST == true id: meta - uses: docker/metadata-action@31cebacef4805868f9ce9a0cb03ee36c32df2ac4 # v5.3.0 + uses: docker/metadata-action@9dc751fe249ad99385a2583ee0d084c400eee04e # v5.4.0 with: images: ghcr.io/bunkerity/${{ inputs.LINUX }}-tests:${{ inputs.RELEASE }} - name: Build test image diff --git a/.github/workflows/push-docker.yml b/.github/workflows/push-docker.yml index 062f495e6..05fa5d7be 100644 --- a/.github/workflows/push-docker.yml +++ b/.github/workflows/push-docker.yml @@ -63,7 +63,7 @@ jobs: # Compute metadata - name: Extract metadata id: meta - uses: docker/metadata-action@31cebacef4805868f9ce9a0cb03ee36c32df2ac4 # v5.3.0 + uses: docker/metadata-action@9dc751fe249ad99385a2583ee0d084c400eee04e # v5.4.0 with: images: bunkerity/${{ inputs.IMAGE }} # Build and push diff --git a/.github/workflows/push-github.yml b/.github/workflows/push-github.yml index 43a92ba11..241b3be7a 100644 --- a/.github/workflows/push-github.yml +++ b/.github/workflows/push-github.yml @@ -19,11 +19,11 @@ jobs: # Get PDF doc - name: Get documentation if: inputs.VERSION != 'testing' - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + uses: actions/download-artifact@f44cd7b40bfd40b6aa1cc1b9b5b7bf03d3c67110 # v4.1.0 with: name: BunkerWeb_documentation_v${{ inputs.VERSION }}.pdf # Create tag - - uses: rickstaa/action-create-tag@861755f3fcbce1b21a65c17bad10e7d35c27b6d9 # v1.7.1 + - uses: rickstaa/action-create-tag@a1c7777fcb2fee4f19b0f283ba888afa11678b72 # v1.7.2 name: Create tag if: inputs.VERSION != 'testing' with: @@ -31,7 +31,7 @@ jobs: message: "v${{ inputs.VERSION }}" force_push_tag: true # Create tag - - uses: rickstaa/action-create-tag@861755f3fcbce1b21a65c17bad10e7d35c27b6d9 # v1.7.1 + - uses: rickstaa/action-create-tag@a1c7777fcb2fee4f19b0f283ba888afa11678b72 # v1.7.2 name: Create tag if: inputs.VERSION == 'testing' with: diff --git a/.github/workflows/push-packagecloud.yml b/.github/workflows/push-packagecloud.yml index fe7912ea4..5bcbb259d 100644 --- a/.github/workflows/push-packagecloud.yml +++ b/.github/workflows/push-packagecloud.yml @@ -42,18 +42,18 @@ jobs: - name: Check out repository code uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Install ruby - uses: ruby/setup-ruby@8575951200e472d5f2d95c625da0c7bec8217c42 # v1.161.0 + uses: ruby/setup-ruby@360dc864d5da99d54fcb8e9148c14a84b90d3e88 # v1.165.1 with: ruby-version: "3.0" - name: Install packagecloud run: gem install package_cloud # Download packages - - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + - uses: actions/download-artifact@f44cd7b40bfd40b6aa1cc1b9b5b7bf03d3c67110 # v4.1.0 if: inputs.LINUX != 'el' with: name: package-${{ inputs.LINUX }}-${{ inputs.PACKAGE_ARCH }} path: /tmp/${{ inputs.LINUX }} - - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + - uses: actions/download-artifact@f44cd7b40bfd40b6aa1cc1b9b5b7bf03d3c67110 # v4.1.0 if: inputs.LINUX == 'el' with: name: package-rhel-${{ inputs.PACKAGE_ARCH }} diff --git a/.github/workflows/scorecards-analysis.yml b/.github/workflows/scorecards-analysis.yml index 979021677..1f897f919 100644 --- a/.github/workflows/scorecards-analysis.yml +++ b/.github/workflows/scorecards-analysis.yml @@ -25,6 +25,6 @@ jobs: results_format: sarif publish_results: true - name: "Upload SARIF results to code scanning" - uses: github/codeql-action/upload-sarif@407ffafae6a767df3e0230c3df91b6443ae8df75 # v2.22.8 + uses: github/codeql-action/upload-sarif@012739e5082ff0c22ca6d6ab32e07c36df03c4a4 # v3.22.12 with: sarif_file: results.sarif diff --git a/.github/workflows/staging-create-infra.yml b/.github/workflows/staging-create-infra.yml index 28d00ca7a..8783f096d 100644 --- a/.github/workflows/staging-create-infra.yml +++ b/.github/workflows/staging-create-infra.yml @@ -31,11 +31,11 @@ jobs: if: inputs.TYPE == 'k8s' with: version: "v1.28.2" - - name: Set up Python 3.11 + - name: Set up Python 3.12 uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 if: inputs.TYPE != 'k8s' with: - python-version: "3.11" + python-version: "3.12" - name: Install ansible run: pip install --no-cache-dir --require-hashes -r misc/requirements-ansible.txt if: inputs.TYPE != 'k8s' @@ -55,7 +55,7 @@ jobs: if: always() env: SECRET_KEY: ${{ secrets.SECRET_KEY }} - - uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + - uses: actions/upload-artifact@c7d193f32edcb7bfad88892161225aeda64e9392 # v4.0.0 if: always() with: name: tf-${{ inputs.TYPE }} diff --git a/.github/workflows/staging-delete-infra.yml b/.github/workflows/staging-delete-infra.yml index a0f8af347..ddca65457 100644 --- a/.github/workflows/staging-delete-infra.yml +++ b/.github/workflows/staging-delete-infra.yml @@ -23,7 +23,7 @@ jobs: uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Install terraform uses: hashicorp/setup-terraform@a1502cd9e758c50496cc9ac5308c4843bcd56d36 # v3.0.0 - - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + - uses: actions/download-artifact@f44cd7b40bfd40b6aa1cc1b9b5b7bf03d3c67110 # v4.1.0 with: name: tf-${{ inputs.TYPE }} path: /tmp diff --git a/.github/workflows/staging-tests.yml b/.github/workflows/staging-tests.yml index ea68d1b41..a51ff335b 100644 --- a/.github/workflows/staging-tests.yml +++ b/.github/workflows/staging-tests.yml @@ -43,7 +43,7 @@ jobs: if: inputs.TYPE == 'swarm' - name: Install test dependencies run: pip3 install --no-cache-dir --require-hashes --no-deps -r tests/requirements.txt - - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + - uses: actions/download-artifact@f44cd7b40bfd40b6aa1cc1b9b5b7bf03d3c67110 # v4.1.0 with: name: tf-k8s path: /tmp diff --git a/.github/workflows/test-core-linux.yml b/.github/workflows/test-core-linux.yml index 616eca382..a8c190d6f 100644 --- a/.github/workflows/test-core-linux.yml +++ b/.github/workflows/test-core-linux.yml @@ -17,21 +17,23 @@ jobs: # Prepare - name: Checkout source code uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - name: Set up Python 3.11 + - name: Set up Python 3.12 uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 with: - python-version: "3.11" + python-version: "3.12" - name: Install Firefox manually and dependencies run: | - sudo apt purge -y firefox - sudo apt update sudo add-apt-repository ppa:mozillateam/ppa -y + sudo apt purge -y firefox echo ' Package: * Pin: release o=LP-PPA-mozillateam Pin-Priority: 1001 + + Package: firefox + Pin: version 1:1snap1-0ubuntu2 + Pin-Priority: -1 ' | sudo tee /etc/apt/preferences.d/mozilla-firefox - sudo apt update sudo apt install --no-install-recommends -y openssl git nodejs tar bzip2 wget curl grep libx11-xcb1 libappindicator3-1 libasound2 libdbus-glib-1-2 libxtst6 libxt6 php-fpm unzip firefox - name: Download geckodriver uses: nick-fields/retry@14672906e672a08bd6eeb15720e9ed3ce869cdd4 # v2.9.0 @@ -57,7 +59,7 @@ jobs: container_id=$(docker create "ghcr.io/bunkerity/ubuntu-tests:${{ inputs.RELEASE }}") docker cp "$container_id:/opt/bunkerweb_${{ inputs.RELEASE }}-1_amd64.deb" "/tmp/bunkerweb.deb" docker rm "$container_id" - - name: Install BunkerWeb + - name: Install NGINX run: | sudo apt install -y gnupg2 ca-certificates lsb-release ubuntu-keyring curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null @@ -93,7 +95,9 @@ jobs: run: sudo apt install -fy /tmp/bunkerweb.deb - name: Run tests run: | + export MAKEFLAGS="-j $(nproc)" + pip install --no-cache-dir --ignore-installed --require-hashes -r src/deps/requirements-deps.txt + MAKEFLAGS="-j $(nproc)" find tests/core -name "requirements.txt" -exec pip install --no-cache-dir --require-hashes --no-deps -r {} \; cd ./tests/core/${{ inputs.TEST }} - MAKEFLAGS="-j $(nproc)" find . -name "requirements.txt" -exec pip install --no-cache-dir --require-hashes --no-deps -r {} \; sudo truncate -s 0 /var/log/bunkerweb/error.log ./test.sh "linux" diff --git a/.github/workflows/tests-ui-linux.yml b/.github/workflows/tests-ui-linux.yml index c6e7280cc..8b59645d4 100644 --- a/.github/workflows/tests-ui-linux.yml +++ b/.github/workflows/tests-ui-linux.yml @@ -14,21 +14,23 @@ jobs: # Prepare - name: Checkout source code uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - - name: Set up Python 3.11 + - name: Set up Python 3.12 uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 with: - python-version: "3.11" + python-version: "3.12" - name: Install Firefox manually and dependencies run: | - sudo apt purge -y firefox - sudo apt update sudo add-apt-repository ppa:mozillateam/ppa -y + sudo apt purge -y firefox echo ' Package: * Pin: release o=LP-PPA-mozillateam Pin-Priority: 1001 + + Package: firefox + Pin: version 1:1snap1-0ubuntu2 + Pin-Priority: -1 ' | sudo tee /etc/apt/preferences.d/mozilla-firefox - sudo apt update sudo apt install --no-install-recommends -y openssl git nodejs tar bzip2 wget curl grep libx11-xcb1 libappindicator3-1 libasound2 libdbus-glib-1-2 libxtst6 libxt6 php-fpm unzip firefox - name: Download geckodriver uses: nick-fields/retry@14672906e672a08bd6eeb15720e9ed3ce869cdd4 # v2.9.0 @@ -54,7 +56,7 @@ jobs: container_id=$(docker create "ghcr.io/bunkerity/ubuntu-tests:${{ inputs.RELEASE }}") docker cp "$container_id:/opt/bunkerweb_${{ inputs.RELEASE }}-1_amd64.deb" "/tmp/bunkerweb.deb" docker rm "$container_id" - - name: Install BunkerWeb + - name: Install NGINX run: | sudo apt install -y gnupg2 ca-certificates lsb-release ubuntu-keyring curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null @@ -72,35 +74,30 @@ jobs: echo "127.0.0.1 www.example.com" | sudo tee -a /etc/hosts echo "127.0.0.1 app1.example.com" | sudo tee -a /etc/hosts # BunkerWeb - echo "SERVER_NAME=www.example.com" | sudo tee /etc/bunkerweb/variables.env + echo "SERVER_NAME=" | sudo tee /etc/bunkerweb/variables.env echo "HTTP_PORT=80" | sudo tee -a /etc/bunkerweb/variables.env - echo "HTTPS_PORT=443" | sudo tee -a /etc/bunkerweb/variables.env echo 'DNS_RESOLVERS=9.9.9.9 8.8.8.8 8.8.4.4' | sudo tee -a /etc/bunkerweb/variables.env echo 'API_LISTEN_IP=127.0.0.1' | sudo tee -a /etc/bunkerweb/variables.env echo "MULTISITE=yes" | sudo tee -a /etc/bunkerweb/variables.env echo "LOG_LEVEL=info" | sudo tee -a /etc/bunkerweb/variables.env echo "USE_BUNKERNET=no" | sudo tee -a /etc/bunkerweb/variables.env echo "USE_BLACKLIST=no" | sudo tee -a /etc/bunkerweb/variables.env + echo "SEND_ANONYMOUS_REPORT=no" | sudo tee -a /etc/bunkerweb/variables.env echo "DISABLE_DEFAULT_SERVER=yes" | sudo tee -a /etc/bunkerweb/variables.env echo "USE_CLIENT_CACHE=yes" | sudo tee -a /etc/bunkerweb/variables.env echo "USE_GZIP=yes" | sudo tee -a /etc/bunkerweb/variables.env echo "DATASTORE_MEMORY_SIZE=384m" | sudo tee -a /etc/bunkerweb/variables.env - echo "www.example.com_USE_UI=yes" | sudo tee -a /etc/bunkerweb/variables.env - echo "www.example.com_SERVE_FILES=no" | sudo tee -a /etc/bunkerweb/variables.env - echo "www.example.com_USE_REVERSE_PROXY=yes" | sudo tee -a /etc/bunkerweb/variables.env - echo "www.example.com_REVERSE_PROXY_URL=/admin" | sudo tee -a /etc/bunkerweb/variables.env - echo "www.example.com_REVERSE_PROXY_HOST=http://127.0.0.1:7000" | sudo tee -a /etc/bunkerweb/variables.env - echo "www.example.com_INTERCEPTED_ERROR_CODES=400 405 413 429 500 501 502 503 504" | sudo tee -a /etc/bunkerweb/variables.env - - echo "ADMIN_USERNAME=admin" | sudo tee /etc/bunkerweb/ui.env - echo "ADMIN_PASSWORD=S\$cr3tP@ssw0rd" | sudo tee -a /etc/bunkerweb/ui.env + echo "UI_HOST=http://127.0.0.1:7000" | sudo tee -a /etc/bunkerweb/variables.env + sudo touch /etc/bunkerweb/ui.env sudo chown nginx:nginx /etc/bunkerweb/variables.env /etc/bunkerweb/ui.env sudo chmod 777 /etc/bunkerweb/variables.env /etc/bunkerweb/ui.env - name: Run tests run: | + export MAKEFLAGS="-j $(nproc)" + pip install --no-cache-dir --ignore-installed --require-hashes -r src/deps/requirements-deps.txt + pip install --no-cache-dir --require-hashes -r tests/ui/requirements.txt cd ./tests/ui - MAKEFLAGS="-j $(nproc)" find . -name "requirements.txt" -exec pip install --no-cache-dir --require-hashes --no-deps -r {} \; touch test.txt zip test.zip test.txt rm test.txt diff --git a/.gitignore b/.gitignore index f8c5853af..a4deff667 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ env node_modules /src/ui/*.txt .mypy_cache +.cache/ diff --git a/.gitleaksignore b/.gitleaksignore new file mode 100644 index 000000000..35a6a3396 --- /dev/null +++ b/.gitleaksignore @@ -0,0 +1 @@ +src/ui/templates/profile.html:hashicorp-tf-password:343 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 107954b79..baee1ba60 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks -exclude: (^LICENSE.md$|^src/VERSION$|^src/(bw/misc/root-ca.pem$|deps/src/|common/core/modsecurity/files|ui/static/js/(editor/|utils/purify/|tsparticles\.bundle\.min\.js))|\.(svg|drawio|patch\d?|ascii|tf|tftpl)$) +exclude: (^LICENSE.md$|^src/VERSION$|^env/|^src/(bw/misc/root-ca.pem$|deps/src/|common/core/modsecurity/files|ui/static/js/(editor/|utils/purify/|tsparticles\.bundle\.min\.js))|\.(svg|drawio|patch\d?|ascii|tf|tftpl|key)$) repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: c4a0b883114b00d8d76b479c820ce7950211c99b # frozen: v4.5.0 @@ -16,8 +16,8 @@ repos: args: ["--allow-multiple-documents"] - id: check-case-conflict - - repo: https://github.com/ambv/black - rev: 2a1c67e0b2f81df602ec1f6e7aeb030b9709dc7c # frozen: 23.11.0 + - repo: https://github.com/psf/black + rev: ec91a2be3c44d88e1a3960a4937ad6ed3b63464e # frozen: 23.12.1 hooks: - id: black name: Black Python Formatter @@ -36,21 +36,21 @@ repos: exclude: ^src/(bw/lua/middleclass.lua|common/core/antibot/captcha.lua)$ - repo: https://github.com/lunarmodules/luacheck - rev: ababb6d403d634eb74d2c541035e9ede966e710d # frozen: v1.1.1 + rev: 418f48976c73be697fe64b0eba9ea9821ac9bca8 # frozen: v1.1.2 hooks: - id: luacheck exclude: ^src/(bw/lua/middleclass.lua|common/core/antibot/captcha.lua)$ args: ["--std", "min", "--codes", "--ranges", "--no-cache"] - repo: https://github.com/pycqa/flake8 - rev: 10f4af6dbcf93456ba7df762278ae61ba3120dc6 # frozen: 6.1.0 + rev: 7d37d9032d0d161634be4554273c30efd4dea0b3 # frozen: 7.0.0 hooks: - id: flake8 name: Flake8 Python Linter args: ["--max-line-length=250", "--ignore=E266,E402,E722,W503"] - repo: https://github.com/dosisod/refurb - rev: a25b5d6087bba1509f96654c583efcd7796452cd # frozen: v1.24.0 + rev: a7c461fcfaa2ca3248d489cdf7fed8e2d4fd8520 # frozen: v1.26.0 hooks: - id: refurb name: Refurb Python Refactoring Tool diff --git a/CHANGELOG.md b/CHANGELOG.md index c5a9fd378..cf917ea7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,23 @@ ## v1.5.5 - YYYY/MM/DD +- [BUGFIX] Fix issues with the database when upgrading from version 1.5.3 and 1.5.4 to the most recent version +- [BUGFIX] Fix ModSecurity-nginx to make it work with brotli +- [BUGFIX] Remove certbot renew delay causing errors on k8s +- [BUGFIX] Fix missing custom modsec files when BW instances change +- [BUGFIX] Fix inconsistency on config changes when using Redis - [FEATURE] Add Anonymous reporting feature -- [MISC] Updated ModSecurity to v3.0.11 +- [FEATURE] Add support for fallback Referrer-Policies +- [FEATURE] Add profile page to web ui and the possibility to activate the 2FA +- [FEATURE] Add setting REVERSE_PROXY_INCLUDES to manually add "include" directives in the reverse proxies +- [FEATURE] Add support for Redis Sentinel +- [FEATURE] Add support for tls in Ingress definition +- [MISC] Fallback to default HTTPS certificate to prevent errors +- [MISC] Various internal improvements in LUA code +- [MISC] Check nginx configuration before reload +- [MISC] Updated Python Docker image to 3.12.1-alpine3.18 in Dockerfiles +- [MISC] Switch gunicorn worker_class back to gevent in web UI +- [DEPS] Updated ModSecurity to v3.0.11 ## v1.5.4 - 2023/12/04 diff --git a/README.md b/README.md index e4b3840c7..8d1e18c34 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- BunkerWeb logo + BunkerWeb logo

@@ -18,21 +18,23 @@

- 🌐 Website + 🌐 Website | - πŸ““ Documentation + 🀝 Panel | - πŸ‘¨β€πŸ’» Demo + πŸ““ Documentation | - πŸ›‘οΈ Examples + πŸ‘¨β€πŸ’» Demo + | + πŸ›‘οΈ Examples | πŸ’¬ Chat | πŸ“ Forum
- βš™οΈ Configurator + βš™οΈ Configurator | - πŸ—ΊοΈ Threatmap + πŸ—ΊοΈ Threatmap

> πŸ›‘οΈ Make security by default great again ! @@ -40,23 +42,24 @@ # BunkerWeb

- Overview banner + Overview banner

BunkerWeb is a next-generation and open-source Web Application Firewall (WAF). -Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default". BunkerWeb integrates seamlessly into your existing environments ([Linux](https://docs.bunkerweb.io/1.5.4/integrations/#linux), [Docker](https://docs.bunkerweb.io/1.5.4/integrations/#docker), [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/#swarm), [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes), …) and is fully configurable (don't panic, there is an [awesome web UI](https://docs.bunkerweb.io/1.5.4/web-ui/) if you don't like the CLI) to meet your own use-cases . In other words, cybersecurity is no more a hassle. +Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default". BunkerWeb integrates seamlessly into your existing environments ([Linux](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#linux), [Docker](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#docker), [Swarm](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#swarm), [Kubernetes](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#kubernetes), …) and is fully configurable (don't panic, there is an [awesome web UI](https://docs.bunkerweb.io/1.5.5/web-ui/?utm_campaign=self&utm_source=github) if you don't like the CLI) to meet your own use-cases . In other words, cybersecurity is no more a hassle. -BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.5.4/security-tuning/) as part of the core but can be easily extended with additional ones thanks to a [plugin system](https://docs.bunkerweb.io/1.5.4/plugins/). +BunkerWeb contains primary [security features](https://docs.bunkerweb.io/1.5.5/security-tuning/?utm_campaign=self&utm_source=github) as part of the core but can be easily extended with additional ones thanks to a [plugin system](https://docs.bunkerweb.io/1.5.5/plugins/?utm_campaign=self&utm_source=github). ## Why BunkerWeb ? -- **Easy integration into existing environments** : support for Linux, Docker, Swarm, Kubernetes, Ansible, Vagrant, ... -- **Highly customizable** : enable, disable and configure features easily to meet your use case -- **Secure by default** : offers out-of-the-box and hassle-free minimal security for your web services -- **Awesome web UI** : keep control of everything more efficiently without the need of the CLI -- **Plugin system** : extend BunkerWeb to meet your own use-cases -- **Free as in "freedom"** : licensed under the free [AGPLv3 license](https://www.gnu.org/licenses/agpl-3.0.en.html) +- **Easy integration into existing environments** : Seamlessly integrate BunkerWeb into various environments such as Linux, Docker, Swarm, Kubernetes and more. Enjoy a smooth transition and hassle-free implementation. +- **Highly customizable** : Tailor BunkerWeb to your specific requirements with ease. Enable, disable, and configure features effortlessly, allowing you to customize the security settings according to your unique use case. +- **Secure by default** : BunkerWeb provides out-of-the-box, hassle-free minimal security for your web services. Experience peace of mind and enhanced protection right from the start. +- **Awesome web UI** : Take control of BunkerWeb more efficiently with the exceptional web user interface (UI). Navigate settings and configurations effortlessly through a user-friendly graphical interface, eliminating the need for the command-line interface (CLI). +- **Plugin system** : Extend the capabilities of BunkerWeb to meet your own use cases. Seamlessly integrate additional security measures and customize the functionality of BunkerWeb according to your specific requirements. +- **Free as in "freedom"** : BunkerWeb is licensed under the free [AGPLv3 license](https://www.gnu.org/licenses/agpl-3.0.en.html), embracing the principles of freedom and openness. Enjoy the freedom to use, modify, and distribute the software, backed by a supportive community. +- **Professional services** : Get technical support, tailored consulting and custom development directly from the maintainers of BunkerWeb. Visit the [Bunker Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github) for more information. ## Security features @@ -71,7 +74,7 @@ A non-exhaustive list of security features : - **Block known bad IPs** with external blacklists and DNSBL - And much more ... -Learn more about the core security features in the [security tuning](https://docs.bunkerweb.io/1.5.4/security-tuning/) section of the documentation. +Learn more about the core security features in the [security tuning](https://docs.bunkerweb.io/1.5.5/security-tuning/?utm_campaign=self&utm_source=github) section of the documentation. ## Demo @@ -79,15 +82,41 @@ Learn more about the core security features in the [security tuning](https://doc BunkerWeb demo

-A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io). Feel free to visit it and perform some security tests. +A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=github). Feel free to visit it and perform some security tests. + +## Professional services + +Maximize your BunkerWeb experience by getting professional services directly from the maintainers of the project. Whether you require technical support, personalized consulting, or development services, we stand ready to assist you in fortifying the security of your web services. + +You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github), our dedicated platform for professional services. + +Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=github) if you have any question, we will be more than happy to respond to your needs. + +## Ecosystem, community and resources + +Official websites, tools and resources about BunkerWeb : + +- [**Website**](https://www.bunkerweb.io/?utm_campaign=self&utm_source=github) : get more information, news and articles about BunkerWeb +- [**Panel**](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github) : dedicated platform to order and manage professional services (e.g. technical support) around BunkerWeb +- [**Documentation**](https://docs.bunkerweb.io/?utm_campaign=self&utm_source=github) : technical documentation of the BunkerWeb solution +- [**Demo**](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=github) : demonstration website of BunkerWeb, don't hesitate to attempt attacks to test the robustness of the solution +- [**Configurator**](https://config.bunkerweb.io/?utm_campaign=self&utm_source=github) : user-friendly tool to help you configure BunkerWeb +- [**Threatmap**](https://threatmap.bunkerweb.io/?utm_campaign=self&utm_source=github) : live cyber attack blocked by BunkerWeb instances all around the world + +Community and social networks : + +- [**Discord**](https://discord.com/invite/fTf46FmtyD) +- [**LinkedIn**](https://www.linkedin.com/company/bunkerity/) +- [**Twitter**](https://twitter.com/bunkerity) +- [**Reddit**](https://www.reddit.com/r/BunkerWeb/) # Concepts

- Concepts banner + Concepts banner

-You will find more information about the key concepts of BunkerWeb in the [documentation](https://docs.bunkerweb.io/1.5.4/concepts). +You will find more information about the key concepts of BunkerWeb in the [documentation](https://docs.bunkerweb.io/1.5.5/concepts/?utm_campaign=self&utm_source=github). ## Integrations @@ -95,13 +124,13 @@ The first concept is the integration of BunkerWeb into the target environment. W The following integrations are officially supported : -- [Docker](https://docs.bunkerweb.io/1.5.4/integrations/#docker) -- [Docker autoconf](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf) -- [Swarm](https://docs.bunkerweb.io/1.5.4/integrations/#swarm) -- [Kubernetes](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes) -- [Linux](https://docs.bunkerweb.io/1.5.4/integrations/#linux) -- [Ansible](https://docs.bunkerweb.io/1.5.4/integrations/#ansible) -- [Vagrant](https://docs.bunkerweb.io/1.5.4/integrations/#vagrant) +- [Docker](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#docker) +- [Docker autoconf](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#docker-autoconf) +- [Swarm](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#swarm) +- [Kubernetes](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#kubernetes) +- [Linux](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#linux) +- [Ansible](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#ansible) +- [Vagrant](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#vagrant) ## Settings @@ -121,7 +150,7 @@ USE_GZIP=yes USE_BROTLI=no ``` -You will find an easy to use settings generator at [config.bunkerweb.io](https://config.bunkerweb.io). +You will find an easy to use settings generator at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=github). ## Multisite mode @@ -133,7 +162,7 @@ When multisite mode is enabled, BunkerWeb will serve and protect multiple web ap ## Custom configurations -Because meeting all the use cases only using the settings is not an option (even with [external plugins](https://docs.bunkerweb.io/1.5.4/plugins)), you can use custom configurations to solve your specific challenges. +Because meeting all the use cases only using the settings is not an option (even with [external plugins](https://docs.bunkerweb.io/1.5.5/plugins/?utm_campaign=self&utm_source=github)), you can use custom configurations to solve your specific challenges. Under the hood, BunkerWeb uses the notorious NGINX web server, that's why you can leverage its configuration system for your specific needs. Custom NGINX configurations can be included in different [contexts](https://docs.nginx.com/nginx/admin-guide/basic-functionality/managing-configuration-files/#contexts) like HTTP or server (all servers and/or specific server block). @@ -167,7 +196,7 @@ In other words, the scheduler is the brain of BunkerWeb. ## Docker

- Docker banner + Docker banner

We provide ready to use prebuilt images for x64, x86, armv7 and arm64 platforms on [Docker Hub](https://hub.docker.com/u/bunkerity). @@ -178,77 +207,77 @@ Docker integration key concepts are : - **Scheduler** container to store configuration and execute jobs - **Networks** to expose ports for clients and connect to upstream web services -You will find more information in the [Docker integration section](https://docs.bunkerweb.io/1.5.4/integrations/#docker) of the documentation. +You will find more information in the [Docker integration section](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#docker) of the documentation. ## Docker autoconf

- Docker autoconf banner + Docker autoconf banner

The downside of using environment variables is that the container needs to be recreated each time there is an update which is not very convenient. To counter that issue, you can use another image called **autoconf** which will listen for Docker events and automatically reconfigure BunkerWeb in real-time without recreating the container. Instead of defining environment variables for the BunkerWeb container, you simply add **labels** to your web applications containers and the **autoconf** will "automagically" take care of the rest. -You will find more information in the [Docker autoconf section](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf) of the documentation. +You will find more information in the [Docker autoconf section](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#docker-autoconf) of the documentation. ## Swarm

- Swarm banner + Swarm banner

To automatically configure BunkerWeb instances, a special service, called **autoconf** will listen for Docker Swarm events like service creation or deletion and automatically configure the **BunkerWeb instances** in real-time without downtime. -Like the [Docker autoconf integration](https://docs.bunkerweb.io/1.5.4/integrations/#docker-autoconf), configuration for web services is defined using labels starting with the special **bunkerweb.** prefix. +Like the [Docker autoconf integration](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#docker-autoconf), configuration for web services is defined using labels starting with the special **bunkerweb.** prefix. -You will find more information in the [Swarm section](https://docs.bunkerweb.io/1.5.4/integrations/#swarm) of the documentation. +You will find more information in the [Swarm section](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#swarm) of the documentation. ## Kubernetes

- Kubernetes banner + Kubernetes banner

The autoconf acts as an [Ingress controller](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/) and will configure the BunkerWeb instances according to the [Ingress resources](https://kubernetes.io/docs/concepts/services-networking/ingress/). It also monitors other Kubernetes objects like [ConfigMap](https://kubernetes.io/docs/concepts/configuration/configmap/) for custom configurations. -You will find more information in the [Kubernetes section](https://docs.bunkerweb.io/1.5.4/integrations/#kubernetes) of the documentation. +You will find more information in the [Kubernetes section](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#kubernetes) of the documentation. ## Linux

- Linux banner + Linux banner

List of supported Linux distros : -- Debian 12 "Bookworm" +- Debian 11 "Bullseye" - Ubuntu 22.04 "Jammy" -- Fedora 39 -- RHEL 8.9 +- Fedora 38 +- RHEL 8.7 Repositories of Linux packages for BunkerWeb are available on [PackageCloud](https://packagecloud.io/bunkerity/bunkerweb), they provide a bash script to automatically add and trust the repository (but you can also follow the [manual installation](https://packagecloud.io/bunkerity/bunkerweb/install) instructions if you prefer). -You will find more information in the [Linux section](https://docs.bunkerweb.io/1.5.4/integrations/#linux) of the documentation. +You will find more information in the [Linux section](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#linux) of the documentation. ## Ansible

- Ansible banner + Ansible banner

List of supported Linux distros : -- Debian 12 "Bookworm" +- Debian 11 "Bullseye" - Ubuntu 22.04 "Jammy" -- Fedora 39 -- RHEL 8.9 +- Fedora 38 +- RHEL 8.7 [Ansible](https://www.ansible.com/) is an IT automation tool. It can configure systems, deploy software, and orchestrate more advanced IT tasks such as continuous deployments or zero downtime rolling updates. A specific BunkerWeb Ansible role is available on [Ansible Galaxy](https://galaxy.ansible.com/bunkerity/bunkerweb) (source code is available [here](https://github.com/bunkerity/bunkerweb-ansible)). -You will find more information in the [Ansible section](https://docs.bunkerweb.io/1.5.4/integrations/#ansible) of the documentation. +You will find more information in the [Ansible section](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#ansible) of the documentation. ## Vagrant @@ -257,11 +286,11 @@ We maintain ready to use Vagrant boxes hosted on Vagrant cloud for the following - virtualbox - libvirt -You will find more information in the [Vagrant section](https://docs.bunkerweb.io/1.5.4/integrations/#vagrant) of the documentation. +You will find more information in the [Vagrant section](https://docs.bunkerweb.io/1.5.5/integrations/?utm_campaign=self&utm_source=github#vagrant) of the documentation. # Quickstart guide -Once you have setup BunkerWeb with the integration of your choice, you can follow the [quickstart guide](https://docs.bunkerweb.io/1.5.4/quickstart-guide/) that will cover the following common use cases : +Once you have setup BunkerWeb with the integration of your choice, you can follow the [quickstart guide](https://docs.bunkerweb.io/1.5.5/quickstart-guide/?utm_campaign=self&utm_source=github) that will cover the following common use cases : - Protecting a single HTTP application - Protecting multiple HTTP application @@ -272,25 +301,25 @@ Once you have setup BunkerWeb with the integration of your choice, you can follo # Security tuning -BunkerWeb offers many security features that you can configure with [settings](https://docs.bunkerweb.io/1.5.4/settings). Even if the default values of settings ensure a minimal "security by default", we strongly recommend you to tune them. By doing so you will be able to ensure a security level of your choice but also manage false positives. +BunkerWeb offers many security features that you can configure with [settings](https://docs.bunkerweb.io/1.5.5/settings/?utm_campaign=self&utm_source=github). Even if the default values of settings ensure a minimal "security by default", we strongly recommend you to tune them. By doing so you will be able to ensure a security level of your choice but also manage false positives. -You will find more information in the [security tuning section](https://docs.bunkerweb.io/1.5.4/security-tuning) of the documentation. +You will find more information in the [security tuning section](https://docs.bunkerweb.io/1.5.5/security-tuning/?utm_campaign=self&utm_source=github) of the documentation. # Settings -To help you tuning BunkerWeb we have made an easy to use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io). +To help you tuning BunkerWeb we have made an easy to use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=github). As a general rule when multisite mode is enabled, if you want to apply settings with multisite context to a specific server you will need to add the primary (first) server name as a prefix like `www.example.com_USE_ANTIBOT=captcha` or `myapp.example.com_USE_GZIP=yes` for example. When settings are considered as "multiple", it means that you can have multiple groups of settings for the same feature by adding numbers as suffix like `REVERSE_PROXY_URL_1=/subdir`, `REVERSE_PROXY_HOST_1=http://myhost1`, `REVERSE_PROXY_URL_2=/anotherdir`, `REVERSE_PROXY_HOST_2=http://myhost2`, ... for example. -Check the [settings section](https://docs.bunkerweb.io/1.5.4/settings) of the documentation to get the full list. +Check the [settings section](https://docs.bunkerweb.io/1.5.5/settings/?utm_campaign=self&utm_source=github) of the documentation to get the full list. # Web UI

- +

@@ -304,13 +333,13 @@ The "Web UI" is a web application that helps you manage your BunkerWeb instance - Monitor jobs execution - View the logs and search pattern -You will find more information in the [Web UI section](https://docs.bunkerweb.io/1.5.4/web-ui) of the documentation. +You will find more information in the [Web UI section](https://docs.bunkerweb.io/1.5.5/web-ui/?utm_campaign=self&utm_source=github) of the documentation. # Plugins BunkerWeb comes with a plugin system to make it possible to easily add new features. Once a plugin is installed, you can manage it using additional settings defined by the plugin. -Here is the list of "official" plugins that we maintain (see the [bunkerweb-plugins](https://github.com/bunkerity/bunkerweb-plugins) repository for more information) : +Here is the list of "official" plugins that we maintain (see the [bunkerweb-plugins](https://github.com/bunkerity/bunkerweb-plugins/?utm_campaign=self&utm_source=github) repository for more information) : | Name | Version | Description | Link | | :------------: | :-----: | :------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------: | @@ -320,45 +349,40 @@ Here is the list of "official" plugins that we maintain (see the [bunkerweb-plug | **Discord** | 1.2 | Send security notifications to a Discord channel using a Webhook. | [bunkerweb-plugins/discord](https://github.com/bunkerity/bunkerweb-plugins/tree/main/discord) | | **Slack** | 1.2 | Send security notifications to a Slack channel using a Webhook. | [bunkerweb-plugins/slack](https://github.com/bunkerity/bunkerweb-plugins/tree/main/slack) | | **VirusTotal** | 1.2 | Automatically scans uploaded files with the VirusTotal API and denies the request when a file is detected as malicious. | [bunkerweb-plugins/virustotal](https://github.com/bunkerity/bunkerweb-plugins/tree/main/virustotal) | -| **WebHook** | 1.2 | Send security notifications to a custom HTTP endpoint using a Webhook. | [bunkerweb-plugins/slack](https://github.com/bunkerity/bunkerweb-plugins/tree/main/webhook) | +| **WebHook** | 1.2 | Send security notifications to a custom HTTP endpoint using a Webhook. | [bunkerweb-plugins/slack](https://github.com/bunkerity/bunkerweb-plugins/tree/main/webhook) | -You will find more information in the [plugins section](https://docs.bunkerweb.io/1.5.4/plugins) of the documentation. +You will find more information in the [plugins section](https://docs.bunkerweb.io/1.5.5/plugins/?utm_campaign=self&utm_source=github) of the documentation. # Support ## Professional -We offer professional services related to BunkerWeb like : +Get technical support directly from the BunkerWeb maintainers. You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=github), our dedicated platform for professional services. -* Consulting -* Support -* Custom development -* Partnership - -Please contact us at [contact@bunkerity.com](mailto:contact@bunkerity.com) if you are interested. +Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=github) if you have any question, we will be more than happy to respond to your needs. ## Community To get free community support you can use the following media : -* The #help channel of BunkerWeb in the [Discord server](https://discord.com/invite/fTf46FmtyD) -* The help category of [GitHub discussions](https://github.com/bunkerity/bunkerweb/discussions) -* The [/r/BunkerWeb](https://www.reddit.com/r/BunkerWeb) subreddit -* The [Server Fault](https://serverfault.com/) and [Super User](https://superuser.com/) forums +- The #help channel of BunkerWeb in the [Discord server](https://discord.com/invite/fTf46FmtyD) +- The help category of [GitHub discussions](https://github.com/bunkerity/bunkerweb/discussions) +- The [/r/BunkerWeb](https://www.reddit.com/r/BunkerWeb) subreddit +- The [Server Fault](https://serverfault.com/) and [Super User](https://superuser.com/) forums Please don't use [GitHub issues](https://github.com/bunkerity/bunkerweb/issues) to ask for help, use it only for bug reports and feature requests. # License -This project is licensed under the terms of the [GNU Affero General Public License (AGPL) version 3](https://github.com/bunkerity/bunkerweb/raw/v1.5.4/LICENSE.md). +This project is licensed under the terms of the [GNU Affero General Public License (AGPL) version 3](https://github.com/bunkerity/bunkerweb/raw/v1.5.5/LICENSE.md). # Contribute -If you would like to contribute to the plugins you can read the [contributing guidelines](https://github.com/bunkerity/bunkerweb/raw/v1.5.4/CONTRIBUTING.md) to get started. +If you would like to contribute to the plugins you can read the [contributing guidelines](https://github.com/bunkerity/bunkerweb/raw/v1.5.5/CONTRIBUTING.md) to get started. # Security policy -We take security bugs as serious issues and encourage responsible disclosure, see our [security policy](https://github.com/bunkerity/bunkerweb/raw/v1.5.4/SECURITY.md) for more information. +We take security bugs as serious issues and encourage responsible disclosure, see our [security policy](https://github.com/bunkerity/bunkerweb/raw/v1.5.5/SECURITY.md) for more information. # Stargazers over time diff --git a/docs/about.md b/docs/about.md index 91483092e..d1b30dbf3 100644 --- a/docs/about.md +++ b/docs/about.md @@ -2,7 +2,7 @@ ## Who maintains BunkerWeb ? -BunkerWeb is maintained by [Bunkerity](https://www.bunkerity.com), a French πŸ‡«πŸ‡· company specialized in Cybersecurity πŸ›‘οΈ. +BunkerWeb is maintained by [Bunkerity](https://www.bunkerity.com/?utm_campaign=self&utm_source=doc), a French πŸ‡«πŸ‡· company specialized in Cybersecurity πŸ›‘οΈ. ## Do you offer professional services ? @@ -13,7 +13,9 @@ Yes, we offer professional services related to BunkerWeb such as : - Custom development - Partnership -Please contact us at [contact@bunkerity.com](mailto:contact@bunkerity.com) if you are interested. +**We have a [dedicated panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) to centralize all professional requests.** + +You can also contact use at [contact@bunkerity.com](mailto:contact@bunkerity.com) if you are interested. ## Where to get community support ? diff --git a/docs/assets/extra.css b/docs/assets/extra.css index a2ced6322..72596b8a5 100644 --- a/docs/assets/extra.css +++ b/docs/assets/extra.css @@ -1,3 +1,8 @@ +/* avoid font to pop on family change */ +* { + font-display: swap; +} + :root { --md-primary-fg-color: #125678; --md-text-font: "Roboto"; @@ -7,6 +12,37 @@ background-color: #125678; } +/* better link contrast */ +article a { + color: #2388bb; +} + +/* highlight content links */ +article a, +article p > a { + text-decoration: underline; +} + +/* header list links and config tabs stay default */ +article li > a, +article label > a { + text-decoration: none; +} + +/* lighter base tab color */ +nav.md-tabs ul li a { + opacity: 0.9; +} + +/* active desktop tabs nav */ +nav.md-tabs ul li.md-tabs__item--active a { + color: #36ce7a; + font-weight: bold; +} + +nav.md-tabs ul li.md-tabs__item--active a:hover { + filter: brightness(0.9); +} /* @font-face { font-family: Consolas, monaco, monospace; diff --git a/docs/assets/img/configwebsite.png b/docs/assets/img/configwebsite.png new file mode 100644 index 000000000..3a4527f39 Binary files /dev/null and b/docs/assets/img/configwebsite.png differ diff --git a/docs/assets/img/demowebsite.webp b/docs/assets/img/demowebsite.webp new file mode 100644 index 000000000..6a9166429 Binary files /dev/null and b/docs/assets/img/demowebsite.webp differ diff --git a/docs/assets/img/panelbunkerweb.webp b/docs/assets/img/panelbunkerweb.webp new file mode 100644 index 000000000..de5a27f23 Binary files /dev/null and b/docs/assets/img/panelbunkerweb.webp differ diff --git a/docs/assets/img/threatmapwebsite.webp b/docs/assets/img/threatmapwebsite.webp new file mode 100644 index 000000000..b4ec6f405 Binary files /dev/null and b/docs/assets/img/threatmapwebsite.webp differ diff --git a/docs/assets/img/ui-wizard-account.png b/docs/assets/img/ui-wizard-account.png deleted file mode 100644 index 8337f91a6..000000000 Binary files a/docs/assets/img/ui-wizard-account.png and /dev/null differ diff --git a/docs/assets/img/ui-wizard-account.webp b/docs/assets/img/ui-wizard-account.webp new file mode 100644 index 000000000..dc73d95de Binary files /dev/null and b/docs/assets/img/ui-wizard-account.webp differ diff --git a/docs/assets/img/ui-wizard-settings.png b/docs/assets/img/ui-wizard-settings.png deleted file mode 100644 index e7d37b289..000000000 Binary files a/docs/assets/img/ui-wizard-settings.png and /dev/null differ diff --git a/docs/assets/img/ui-wizard-settings.webp b/docs/assets/img/ui-wizard-settings.webp new file mode 100644 index 000000000..ea51812a8 Binary files /dev/null and b/docs/assets/img/ui-wizard-settings.webp differ diff --git a/docs/assets/img/user_interface_demo.png b/docs/assets/img/user_interface_demo.png deleted file mode 100644 index 71e7a2429..000000000 Binary files a/docs/assets/img/user_interface_demo.png and /dev/null differ diff --git a/docs/assets/img/user_interface_demo.webp b/docs/assets/img/user_interface_demo.webp new file mode 100644 index 000000000..5e6f4ca39 Binary files /dev/null and b/docs/assets/img/user_interface_demo.webp differ diff --git a/docs/assets/logo.png b/docs/assets/logo.png index 2b7bcf430..b209e8c0a 100644 Binary files a/docs/assets/logo.png and b/docs/assets/logo.png differ diff --git a/docs/concepts.md b/docs/concepts.md index d2ee98d4e..6465e2a36 100644 --- a/docs/concepts.md +++ b/docs/concepts.md @@ -48,7 +48,7 @@ USE_BROTLI=no !!! info "Settings generator tool" - To help you tune BunkerWeb, we offer an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io). + To help you tune BunkerWeb, we offer an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc). ## Multisite mode @@ -81,7 +81,7 @@ app3.example.com_USE_BAD_BEHAVIOR=no !!! info "Going further" - You will find concrete examples of multisite mode in the [quickstart guide](quickstart-guide.md) of the documentation and the [examples](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/examples) directory of the repository. + You will find concrete examples of multisite mode in the [quickstart guide](quickstart-guide.md) of the documentation and the [examples](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/examples) directory of the repository. ## Custom configurations @@ -95,7 +95,7 @@ By leveraging custom configurations, you unlock a world of possibilities to tail !!! info "Going further" - You will find concrete examples of custom configurations in the [quickstart guide](quickstart-guide.md) of the documentation and the [examples](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/examples) directory of the repository. + You will find concrete examples of custom configurations in the [quickstart guide](quickstart-guide.md) of the documentation and the [examples](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/examples) directory of the repository. ## Database diff --git a/docs/index.md b/docs/index.md index c5014802b..5fe38d6e3 100644 --- a/docs/index.md +++ b/docs/index.md @@ -7,24 +7,15 @@
Make your web services secure by default !
-Introducing BunkerWeb, the **cutting-edge** and **open-source Web Application Firewall** (WAF) that will revolutionize your web security experience. +BunkerWeb is a next-generation and open-source Web Application Firewall (WAF). -With BunkerWeb, your web services are safeguarded by default, providing you with peace of mind and enhanced protection. Powered by [NGINX](https://nginx.org/), this comprehensive web server combines advanced features seamlessly, ensuring your online assets remain secure. - -BunkerWeb effortlessly integrates into your existing environments, whether it's [Linux](integrations.md#linux), [Docker](integrations.md#docker), [Swarm](integrations.md#swarm), [Kubernetes](integrations.md#kubernetes), or more. Its versatility allows for easy configuration to suit your specific requirements. Don't worry if you prefer a user-friendly interfaceβ€”BunkerWeb offers an exceptional [web UI](web-ui.md) alongside the command-line interface (CLI), ensuring accessibility for all users. - -Experience the transformation in cybersecurity, where complexities and obstacles are a thing of the past. With BunkerWeb, fortifying your digital assets has never been more delightful and hassle-free. - -Furthermore, BunkerWeb boasts a comprehensive set of primary [security features](security-tuning.md) at its core. However, what sets it apart is its remarkable flexibility through an intuitive [plugin system](plugins.md). This ingenious design empowers you to effortlessly enhance BunkerWeb with additional security measures, ensuring a tailored and robust defense for your web applications. - -By seamlessly integrating new plugins into BunkerWeb, you can customize and expand its capabilities to address specific security requirements unique to your environment. Whether you need to strengthen authentication protocols, bolster threat detection, or implement specialized security measures, BunkerWeb's [plugin system](plugins.md) grants you the freedom to fortify your web infrastructure with ease. - -With BunkerWeb's dynamic [plugin system](plugins.md), security becomes an enjoyable journey of exploration and empowerment. Discover the endless possibilities and create a fortified web environment that perfectly aligns with your needs. +Being a full-featured web server (based on [NGINX](https://nginx.org/) under the hood), it will protect your web services to make them "secure by default". BunkerWeb integrates seamlessly into your existing environments ([Linux](integrations.md#linux), [Docker](integrations.md#docker), [Swarm](integrations.md#swarm), [Kubernetes](integrations.md#kubernetes), …) and is fully configurable (don't panic, there is an [awesome web UI](web-ui.md) if you don't like the CLI) to meet your own use-cases . In other words, cybersecurity is no more a hassle. +BunkerWeb contains primary [security features](security-tuning.md) as part of the core but can be easily extended with additional ones thanks to a [plugin system](plugins.md). ## Why BunkerWeb ? -- **Easy integration into existing environments** : Seamlessly integrate BunkerWeb into various environments such as Linux, Docker, Swarm, Kubernetes, Ansible, Vagrant, and more. Enjoy a smooth transition and hassle-free implementation. +- **Easy integration into existing environments** : Seamlessly integrate BunkerWeb into various environments such as Linux, Docker, Swarm, Kubernetes and more. Enjoy a smooth transition and hassle-free implementation. - **Highly customizable** : Tailor BunkerWeb to your specific requirements with ease. Enable, disable, and configure features effortlessly, allowing you to customize the security settings according to your unique use case. @@ -36,6 +27,8 @@ With BunkerWeb's dynamic [plugin system](plugins.md), security becomes an enjoya - **Free as in "freedom"** : BunkerWeb is licensed under the free [AGPLv3 license](https://www.gnu.org/licenses/agpl-3.0.en.html), embracing the principles of freedom and openness. Enjoy the freedom to use, modify, and distribute the software, backed by a supportive community. +- **Professional services** : Get technical support, tailored consulting and custom development directly from the maintainers of BunkerWeb. Visit the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) for more information. + ## Security features Explore the impressive array of security features offered by BunkerWeb. While not exhaustive, here are some notable highlights: @@ -61,7 +54,33 @@ To delve deeper into the core security features, we invite you to explore the [s ## Demo

- +

-A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io). Feel free to visit it and perform some security tests. +A demo website protected with BunkerWeb is available at [demo.bunkerweb.io](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=doc). Feel free to visit it and perform some security tests. + +## Professional services + +Get the most of BunkerWeb by getting professional services directly from the maintainers of the project. From technical support to tailored consulting and development, we are here to assist you in the security of your web services. + +You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc), our dedicated platform for professional services. + +Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=doc) if you have any question, we will be more than happy to respond to your needs. + +## Ecosystem, community and resources + +Official websites, tools and resources about BunkerWeb : + +- [**Website**](https://www.bunkerweb.io/?utm_campaign=self&utm_source=doc) : get more information, news and articles about BunkerWeb +- [**Panel**](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) : dedicated platform to order and manage professional services (e.g. technical support) around BunkerWeb +- [**Documentation**](https://docs.bunkerweb.io) : technical documentation of the BunkerWeb solution +- [**Demo**](https://demo.bunkerweb.io/?utm_campaign=self&utm_source=doc) : demonstration website of BunkerWeb, don't hesitate to attempt attacks to test the robustness of the solution +- [**Configurator**](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc) : user-friendly tool to help you configure BunkerWeb +- [**Threatmap**](https://threatmap.bunkerweb.io/?utm_campaign=self&utm_source=doc) : live cyber attack blocked by BunkerWeb instances all around the world + +Community and social networks : + +- [**Discord**](https://discord.com/invite/fTf46FmtyD) +- [**LinkedIn**](https://www.linkedin.com/company/bunkerity/) +- [**Twitter**](https://twitter.com/bunkerity) +- [**Reddit**](https://www.reddit.com/r/BunkerWeb/) diff --git a/docs/integrations.md b/docs/integrations.md index 577fe47a7..87d2b01b6 100644 --- a/docs/integrations.md +++ b/docs/integrations.md @@ -21,13 +21,13 @@ By accessing these prebuilt images from Docker Hub, you can quickly pull and run Whether you're conducting tests, developing applications, or deploying BunkerWeb in production, the Docker containerization option provides flexibility and ease of use. Embracing this method empowers you to take full advantage of BunkerWeb's features while leveraging the benefits of Docker technology. ```shell -docker pull bunkerity/bunkerweb:1.5.4 +docker pull bunkerity/bunkerweb:1.5.5 ``` Docker images are also available on [GitHub packages](https://github.com/orgs/bunkerity/packages?repo_name=bunkerweb) and can be downloaded using the `ghcr.io` repository address : ```shell -docker pull ghcr.io/bunkerity/bunkerweb:1.5.4 +docker pull ghcr.io/bunkerity/bunkerweb:1.5.5 ``` Alternatively, if you prefer a more hands-on approach, you have the option to build the Docker image directly from the [source](https://github.com/bunkerity/bunkerweb). Building the image from source gives you greater control and customization over the deployment process. However, please note that this method may take some time to complete, depending on your hardware configuration. @@ -57,7 +57,7 @@ When integrating BunkerWeb with Docker, there are key concepts to keep in mind, - **Networks**: Docker networks play a vital role in the integration of BunkerWeb. These networks serve two main purposes: exposing ports to clients and connecting to upstream web services. By exposing ports, BunkerWeb can accept incoming requests from clients, allowing them to access the protected web services. Additionally, by connecting to upstream web services, BunkerWeb can efficiently route and manage the traffic, providing enhanced security and performance. !!! info "Database backend" - Please be aware that our instructions assume you are using SQLite as the default database backend, as configured by the `DATABASE_URI` setting. However, we understand that you may prefer to utilize alternative backends for your Docker integration. If that is the case, rest assured that other database backends are still possible. See docker-compose files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/misc/integrations) folder of the repository for more information. + Please be aware that our instructions assume you are using SQLite as the default database backend, as configured by the `DATABASE_URI` setting. However, we understand that you may prefer to utilize alternative backends for your Docker integration. If that is the case, rest assured that other database backends are still possible. See docker-compose files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/misc/integrations) folder of the repository for more information. ### Environment variables @@ -67,7 +67,7 @@ Settings are passed to BunkerWeb using Docker environment variables : ... services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 labels: - "bunkerweb.INSTANCE=yes" environment: @@ -86,7 +86,7 @@ Please note that the `bunkerweb.INSTANCE` is mandatory to make sure the schedule The [scheduler](concepts.md#scheduler) is executed in its own container which is also available on Docker Hub : ```shell -docker pull bunkerity/bunkerweb-scheduler:1.5.4 +docker pull bunkerity/bunkerweb-scheduler:1.5.5 ``` Alternatively, you can build the Docker image directly from the [source](https://github.com/bunkerity/bunkerweb) (less coffee β˜• needed than BunkerWeb image) : @@ -103,7 +103,7 @@ A volume is needed to store the SQLite database that will be used by the schedul ... services: bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 volumes: - bw-data:/data ... @@ -165,7 +165,7 @@ You will need to create the Docker API proxy container, mount the socket and set ... services: bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 env: - DOCKER_HOST=tcp://bw-docker:2375 ... @@ -213,7 +213,7 @@ To secure the communication between the scheduler and BunkerWeb API, it is impor ... services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -222,7 +222,7 @@ services: - bw-universe ... bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 networks: - bw-universe - bw-docker @@ -252,7 +252,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -266,7 +266,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -326,7 +326,7 @@ By adopting this approach, you can enjoy real-time reconfiguration of BunkerWeb The Docker autoconf integration implies the use of **multisite mode**. Please refer to the [multisite section](concepts.md#multisite-mode) of the documentation for more information. !!! info "Database backend" - Please be aware that our instructions assume you are using MariaDB as the default database backend, as configured by the `DATABASE_URI` setting. However, we understand that you may prefer to utilize alternative backends for your Docker integration. If that is the case, rest assured that other database backends are still possible. See docker-compose files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/misc/integrations) folder of the repository for more information. + Please be aware that our instructions assume you are using MariaDB as the default database backend, as configured by the `DATABASE_URI` setting. However, we understand that you may prefer to utilize alternative backends for your Docker integration. If that is the case, rest assured that other database backends are still possible. See docker-compose files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/misc/integrations) folder of the repository for more information. To enable automated configuration updates, include an additional container called `bw-autoconf` in the stack. This container hosts the autoconf service, which manages dynamic configuration changes for BunkerWeb. To support this functionality, use a dedicated "real" database backend (e.g., MariaDB, MySQL, or PostgreSQL) for synchronized configuration storage. By integrating `bw-autoconf` and a suitable database backend, you establish the infrastructure for seamless automated configuration management in BunkerWeb. @@ -335,7 +335,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -352,7 +352,7 @@ services: - bw-services bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 depends_on: - bunkerweb - bw-docker @@ -365,7 +365,7 @@ services: - bw-docker bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -464,7 +464,7 @@ Since multiple instances of BunkerWeb are running, a shared data store implement As for the database volume, the documentation does not specify a specific approach. Choosing either a shared folder or a specific driver for the database volume is dependent on your unique use-case and is left as an exercise for the reader. !!! info "Database backend" - Please be aware that our instructions assume you are using MariaDB as the default database backend, as configured by the `DATABASE_URI` setting. However, we understand that you may prefer to utilize alternative backends for your Docker integration. If that is the case, rest assured that other database backends are still possible. See docker-compose files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/misc/integrations) folder of the repository for more information. + Please be aware that our instructions assume you are using MariaDB as the default database backend, as configured by the `DATABASE_URI` setting. However, we understand that you may prefer to utilize alternative backends for your Docker integration. If that is the case, rest assured that other database backends are still possible. See docker-compose files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/misc/integrations) folder of the repository for more information. Clustered database backends setup are out-of-the-scope of this documentation. @@ -475,7 +475,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - published: 80 target: 8080 @@ -505,7 +505,7 @@ services: - "bunkerweb.INSTANCE=yes" bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -537,7 +537,7 @@ services: - "node.role == manager" bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -637,7 +637,7 @@ For an optimal setup, it is recommended to define BunkerWeb as a **[DaemonSet](h Given the presence of multiple BunkerWeb instances, it is necessary to establish a shared data store implemented as a [Redis](https://redis.io/) service. This Redis service will be utilized by the instances to cache and share data among themselves. Further information about the Redis settings can be found [here](settings.md#redis). !!! info "Database backend" - Please be aware that our instructions assume you are using MariaDB as the default database backend, as configured by the `DATABASE_URI` setting. However, we understand that you may prefer to utilize alternative backends for your Docker integration. If that is the case, rest assured that other database backends are still possible. See docker-compose files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/misc/integrations) folder of the repository for more information. + Please be aware that our instructions assume you are using MariaDB as the default database backend, as configured by the `DATABASE_URI` setting. However, we understand that you may prefer to utilize alternative backends for your Docker integration. If that is the case, rest assured that other database backends are still possible. See docker-compose files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/misc/integrations) folder of the repository for more information. Clustered database backends setup are out-of-the-scope of this documentation. @@ -654,7 +654,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] @@ -698,7 +698,7 @@ spec: containers: # using bunkerweb as name is mandatory - name: bunkerweb - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 imagePullPolicy: Always securityContext: runAsUser: 101 @@ -768,7 +768,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-controller - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -795,7 +795,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-scheduler - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -978,12 +978,12 @@ To simplify the installation process, Linux package repositories for BunkerWeb a !!! warning "Testing version" If you use the `testing` version, you will need to add the `force-bad-version` directive to your `/etc/dpkg/dpkg.cfg` file before installing BunkerWeb. - And finally install BunkerWeb 1.5.4 : + And finally install BunkerWeb 1.5.5 : ```shell curl -s https://packagecloud.io/install/repositories/bunkerity/bunkerweb/script.deb.sh | sudo bash && \ sudo apt update && \ - sudo apt install -y bunkerweb=1.5.4 + sudo apt install -y bunkerweb=1.5.5 ``` To prevent upgrading NGINX and/or BunkerWeb packages when executing `apt upgrade`, you can use the following command : @@ -1015,12 +1015,12 @@ To simplify the installation process, Linux package repositories for BunkerWeb a !!! warning "Testing version" If you use the `testing` version, you will need to add the `force-bad-version` directive to your `/etc/dpkg/dpkg.cfg` file before installing BunkerWeb. - And finally install BunkerWeb 1.5.4 : + And finally install BunkerWeb 1.5.5 : ```shell curl -s https://packagecloud.io/install/repositories/bunkerity/bunkerweb/script.deb.sh | sudo bash && \ sudo apt update && \ - sudo apt install -y bunkerweb=1.5.4 + sudo apt install -y bunkerweb=1.5.5 ``` To prevent upgrading NGINX and/or BunkerWeb packages when executing `apt upgrade`, you can use the following command : @@ -1037,14 +1037,14 @@ To simplify the installation process, Linux package repositories for BunkerWeb a sudo dnf install -y nginx-1.24.0 ``` - And finally install BunkerWeb 1.5.4 : + And finally install BunkerWeb 1.5.5 : ```shell curl -s https://packagecloud.io/install/repositories/bunkerity/bunkerweb/script.rpm.sh | \ sed 's/yum install -y pygpgme --disablerepo='\''bunkerity_bunkerweb'\''/yum install -y python-gnupg/g' | \ sed 's/pypgpme_check=`rpm -qa | grep -qw pygpgme`/python-gnupg_check=`rpm -qa | grep -qw python-gnupg`/g' | sudo bash && \ sudo dnf makecache && \ - sudo dnf install -y bunkerweb-1.5.4 + sudo dnf install -y bunkerweb-1.5.5 ``` To prevent upgrading NGINX and/or BunkerWeb packages when executing `dnf upgrade`, you can use the following command : @@ -1081,13 +1081,13 @@ To simplify the installation process, Linux package repositories for BunkerWeb a ```shell sudo dnf install nginx-1.24.0 ``` - And finally install BunkerWeb 1.5.4 : + And finally install BunkerWeb 1.5.5 : ```shell dnf install -y epel-release && \ curl -s https://packagecloud.io/install/repositories/bunkerity/bunkerweb/script.rpm.sh | sudo bash && \ sudo dnf check-update && \ - sudo dnf install -y bunkerweb-1.5.4 + sudo dnf install -y bunkerweb-1.5.5 ``` To prevent upgrading NGINX and/or BunkerWeb packages when executing `dnf upgrade`, you can use the following command : @@ -1165,7 +1165,7 @@ the configuration of BunkerWeb is done by using specific role variables : | Name | Type | Description | Default value | | :-------------------: | :--------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- | -| `bunkerweb_version` | string | Version of BunkerWeb to install. | `1.5.4` | +| `bunkerweb_version` | string | Version of BunkerWeb to install. | `1.5.5` | | `nginx_version` | string | Version of NGINX to install. | `1.24.0` | | `freeze_versions` | boolean | Prevent upgrade of BunkerWeb and NGINX when performing packages upgrades. | `true` | | `variables_env` | string | Path of the variables.env file to configure BunkerWeb. | `files/variables.env` | diff --git a/docs/json2md.py b/docs/json2md.py index 2a0fa478e..cca38729a 100755 --- a/docs/json2md.py +++ b/docs/json2md.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from io import StringIO from json import loads @@ -39,7 +39,7 @@ doc = StringIO() print("# Settings\n", file=doc) print( - '!!! info "Settings generator tool"\n\n To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io).\n', + '!!! info "Settings generator tool"\n\n To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc).\n', file=doc, ) print( diff --git a/docs/migrating.md b/docs/migrating.md index ecd8d5a1b..50d9d93bd 100644 --- a/docs/migrating.md +++ b/docs/migrating.md @@ -2,7 +2,7 @@ !!! warning "Read this if you were a 1.4.X user" - A lot of things changed since the 1.4.X releases. Container-based integrations stacks contain more services but, trust us, fundamental principles of BunkerWeb are still there. You will find ready to use boilerplates for various integrations in the [misc/integrations](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/misc/integrations) folder of the repository. + A lot of things changed since the 1.4.X releases. Container-based integrations stacks contain more services but, trust us, fundamental principles of BunkerWeb are still there. You will find ready to use boilerplates for various integrations in the [misc/integrations](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/misc/integrations) folder of the repository. ## Scheduler diff --git a/docs/overrides/main.html b/docs/overrides/main.html index 1bec2b77c..c3d5a16dd 100644 --- a/docs/overrides/main.html +++ b/docs/overrides/main.html @@ -1,22 +1,34 @@ -{% extends "base.html" %} - -{% block outdated %} - You're not viewing the documentation of the latest version. - - Click here to view latest. - -{% endblock %} - -{% block announce %} - πŸ“’ Looking for tailored support, consulting or development for BunkerWeb ? - Contact us at contact@bunkerity.com for enterprise offers ! -{% endblock %} - -{% block libs %} +{% extends "base.html" %} {% block outdated %} You're not viewing the +documentation of the latest version. + + Click here to view latest. + +{% endblock %} {% block announce %} πŸ“’ Looking for technical support, tailored +consulting or custom development for BunkerWeb ? Visit the +BunkerWeb Panel +for more information on our enterprise offers. {% endblock %} {% block libs %} + {% endblock %} diff --git a/docs/package-lock.json b/docs/package-lock.json deleted file mode 100644 index b460d1262..000000000 --- a/docs/package-lock.json +++ /dev/null @@ -1,1124 +0,0 @@ -{ - "name": "docs", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "puppeteer": "^21.3.6" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@puppeteer/browsers": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.8.0.tgz", - "integrity": "sha512-TkRHIV6k2D8OlUe8RtG+5jgOF/H98Myx0M6AOafC8DdNVOFiBSFa5cpRDtpm8LXOa9sVwe0+e6Q3FC56X/DZfg==", - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.1", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - } - }, - "node_modules/@tootallnate/quickjs-emscripten": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" - }, - "node_modules/@types/node": { - "version": "20.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.1.tgz", - "integrity": "sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==", - "optional": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/ast-types": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", - "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/basic-ftp": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", - "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chromium-bidi": { - "version": "0.4.33", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.33.tgz", - "integrity": "sha512-IxoFM5WGQOIAd95qrSXzJUv4eXIrh+RvU3rwwqIiwYuvfE7U/Llj4fejbsJnjJMUYCuGtVQsY2gv7oGl4aTNSQ==", - "dependencies": { - "mitt": "3.0.1", - "urlpattern-polyfill": "9.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz", - "integrity": "sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", - "dependencies": { - "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.1203626", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1203626.tgz", - "integrity": "sha512-nEzHZteIUZfGCZtTiS1fRpC8UZmsfD1SiyPvaUNvS13dvKf666OAm8YTi0+Ca3n1nLEyu49Cy4+dPWpaHFJk9g==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-uri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.2.tgz", - "integrity": "sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==", - "dependencies": { - "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.0", - "debug": "^4.3.4", - "fs-extra": "^8.1.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", - "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "get-uri": "^6.0.1", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/pac-resolver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", - "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", - "dependencies": { - "degenerator": "^5.0.0", - "ip": "^1.1.8", - "netmask": "^2.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-agent": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", - "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/puppeteer": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.5.2.tgz", - "integrity": "sha512-BaAGJOq8Fl6/cck6obmwaNLksuY0Bg/lIahCLhJPGXBFUD2mCffypa4A592MaWnDcye7eaHmSK9yot0pxctY8A==", - "hasInstallScript": true, - "dependencies": { - "@puppeteer/browsers": "1.8.0", - "cosmiconfig": "8.3.6", - "puppeteer-core": "21.5.2" - }, - "engines": { - "node": ">=16.13.2" - } - }, - "node_modules/puppeteer-core": { - "version": "21.5.2", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.5.2.tgz", - "integrity": "sha512-v4T0cWnujSKs+iEfmb8ccd7u4/x8oblEyKqplqKnJ582Kw8PewYAWvkH4qUWhitN3O2q9RF7dzkvjyK5HbzjLA==", - "dependencies": { - "@puppeteer/browsers": "1.8.0", - "chromium-bidi": "0.4.33", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1203626", - "ws": "8.14.2" - }, - "engines": { - "node": ">=16.13.2" - } - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks/node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/streamx": { - "version": "2.15.5", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.5.tgz", - "integrity": "sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==", - "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "optional": true - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/urlpattern-polyfill": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz", - "integrity": "sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } -} diff --git a/docs/package.json b/docs/package.json deleted file mode 100644 index d6a25ae20..000000000 --- a/docs/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dependencies": { - "puppeteer": "^21.3.6" - } -} diff --git a/docs/plugins.md b/docs/plugins.md index f99613c3c..25d4bc77f 100644 --- a/docs/plugins.md +++ b/docs/plugins.md @@ -58,7 +58,7 @@ The first step is to install the plugin by putting the plugin files inside the c services: ... bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 volumes: - ./bw-data:/data ... @@ -95,7 +95,7 @@ The first step is to install the plugin by putting the plugin files inside the c services: ... bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 volumes: - ./bw-data:/data ... @@ -134,7 +134,7 @@ The first step is to install the plugin by putting the plugin files inside the c services: ... bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 volumes: - /shared/bw-plugins:/data/plugins ... @@ -181,7 +181,7 @@ The first step is to install the plugin by putting the plugin files inside the c serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-scheduler - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -262,7 +262,7 @@ The first step is to install the plugin by putting the plugin files inside the c !!! tip "Existing plugins" - If the documentation is not enough, you can have a look at the existing source code of [official plugins](https://github.com/bunkerity/bunkerweb-plugins) and the [core plugins](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/src/common/core) (already included in BunkerWeb but they are plugins, technically speaking). + If the documentation is not enough, you can have a look at the existing source code of [official plugins](https://github.com/bunkerity/bunkerweb-plugins) and the [core plugins](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/src/common/core) (already included in BunkerWeb but they are plugins, technically speaking). The first step is to create a folder that will contain the plugin : @@ -507,7 +507,7 @@ end !!! tip "More examples" - If you want to see the full list of available functions, you can have a look at the files present in the [lua directory](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/src/bw/lua/bunkerweb) of the repository. + If you want to see the full list of available functions, you can have a look at the files present in the [lua directory](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/src/bw/lua/bunkerweb) of the repository. ### Jobs diff --git a/docs/professional-services.md b/docs/professional-services.md new file mode 100644 index 000000000..4f190c418 --- /dev/null +++ b/docs/professional-services.md @@ -0,0 +1,30 @@ +# Professional services + +## Why should I get professional services ? + +Since BunkerWeb is a free (as in freedom) software, you've the right to use it freely as long as you respect the [AGPLv3 license](https://www.gnu.org/licenses/agpl-3.0.en.html). + +But dedicating time to a specific technology may not be easy depending on your business priorities. Not mentioning that cybersecurity is complex domain where being both judge and jury is not recommended. + +Getting professional services in addition to the open-source solution is the ideal solution to cover your business needs. You can focus on your top priorities and rely on a trusted partner when it comes to web security. + +Please note that professionnal services are directly offered by [Bunkerity](https://www.bunkerity.com/?utm_campaign=self&utm_source=doc), the company maintaining the BunkerWeb project, through our [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc) online platform. + +## Which professional services do you offer ? + +We offer technical support around the BunkerWeb solution. By using this service, we will assist you on the technical issues (installation, configuration, false positive, ...). + +According to your needs you have the choice between "one time" and subscriptions offers. + +One important thing to note is that the support service is based on "credit" system where you pay for a number of support hours dedicated for you. Time passed on your requests will be deducted to your credit. In other words, you only pay for real time dedicated to your needs. + +In addition to the support service, we also offer custom services around the BunkerWeb solution to meet your specific needs : + +- Consulting : a dedicated expert will give you advices on your project +- Development : if you need specific features in BunkerWeb, we can do it for you + +## How can I get more information ? + +You will find more information by visiting the [BunkerWeb Panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc), our dedicated platform for professional services. + +Don't hesitate to [contact us](https://panel.bunkerweb.io/contact.php?utm_campaign=self&utm_source=doc) if you have any question, we will be more than happy to respond to your needs. diff --git a/docs/quickstart-guide.md b/docs/quickstart-guide.md index 488f110ee..f98cbbf29 100644 --- a/docs/quickstart-guide.md +++ b/docs/quickstart-guide.md @@ -4,7 +4,7 @@ We assume that you're already familiar with the [core concepts](concepts.md) and you have followed the [integrations instructions](integrations.md) for your environment. !!! tip "Going further" - To demonstrate the use of BunkerWeb, we will deploy a dummy "Hello World" web application as an example. See the [examples folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/examples) of the repository to get real-world examples. + To demonstrate the use of BunkerWeb, we will deploy a dummy "Hello World" web application as an example. See the [examples folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/examples) of the repository to get real-world examples. ## Protect HTTP applications @@ -35,7 +35,7 @@ You will find more settings about reverse proxy in the [settings section](settin - bw-services bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -52,7 +52,7 @@ You will find more settings about reverse proxy in the [settings section](settin - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -389,7 +389,7 @@ You will find more settings about reverse proxy in the [settings section](settin - bw-services bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -409,7 +409,7 @@ You will find more settings about reverse proxy in the [settings section](settin - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -828,7 +828,7 @@ REAL_IP_HEADER=X-Forwarded-For ```yaml mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ... environment: - USE_REAL_IP=yes @@ -843,7 +843,7 @@ REAL_IP_HEADER=X-Forwarded-For ```yaml mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ... environment: - USE_REAL_IP=yes @@ -858,7 +858,7 @@ REAL_IP_HEADER=X-Forwarded-For ```yaml mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ... environment: - USE_REAL_IP=yes @@ -978,7 +978,7 @@ REAL_IP_HEADER=proxy_protocol ```yaml mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ... environment: - USE_REAL_IP=yes @@ -994,7 +994,7 @@ REAL_IP_HEADER=proxy_protocol ```yaml mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ... environment: - USE_REAL_IP=yes @@ -1010,7 +1010,7 @@ REAL_IP_HEADER=proxy_protocol ```yaml mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ... environment: - USE_REAL_IP=yes @@ -1156,7 +1156,7 @@ For complete list of settings regarding `stream` mode, please refer to the [sett - bw-services bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 # Keep it if you want to use Let's Encrypt automation - 10000:10000 # app1 @@ -1178,7 +1178,7 @@ For complete list of settings regarding `stream` mode, please refer to the [sett - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -1227,7 +1227,7 @@ For complete list of settings regarding `stream` mode, please refer to the [sett services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 # Keep it if you want to use Let's Encrypt automation - 10000:10000 # app1 @@ -1285,7 +1285,7 @@ For complete list of settings regarding `stream` mode, please refer to the [sett services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: # Keep it if you want to use Let's Encrypt automation - published: 80 @@ -1473,7 +1473,7 @@ Some integrations provide more convenient ways to apply configurations, such as ```yaml ... mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 environment: - | CUSTOM_CONF_SERVER_HTTP_hello-world= @@ -1516,7 +1516,7 @@ Some integrations provide more convenient ways to apply configurations, such as ```yaml bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 volumes: - ./bw-data:/data ... @@ -1586,7 +1586,7 @@ Some integrations provide more convenient ways to apply configurations, such as ```yaml bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 volumes: - ./bw-data:/data ... @@ -1819,7 +1819,7 @@ BunkerWeb supports PHP using external or remote [PHP-FPM](https://www.php.net/ma - bw-services bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 volumes: - ./www:/var/www/html ports: @@ -1842,7 +1842,7 @@ BunkerWeb supports PHP using external or remote [PHP-FPM](https://www.php.net/ma - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -1920,7 +1920,7 @@ BunkerWeb supports PHP using external or remote [PHP-FPM](https://www.php.net/ma services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 volumes: - ./www:/var/www/html labels: @@ -1934,7 +1934,7 @@ BunkerWeb supports PHP using external or remote [PHP-FPM](https://www.php.net/ma - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -2078,7 +2078,7 @@ BunkerWeb supports PHP using external or remote [PHP-FPM](https://www.php.net/ma services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 volumes: - /shared/www:/var/www/html ... @@ -2360,7 +2360,7 @@ By default, BunkerWeb will only listen on IPv4 addresses and won't use IPv6 for services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 environment: - USE_IPv6=yes @@ -2405,7 +2405,7 @@ By default, BunkerWeb will only listen on IPv4 addresses and won't use IPv6 for services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 environment: - USE_IPv6=yes diff --git a/docs/requirements.in b/docs/requirements.in index 9ecdddd44..6c4eeadba 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -1,5 +1,5 @@ mike==2.0.0 mkdocs==1.5.3 -mkdocs-material==9.4.14 +mkdocs-material[imaging]==9.5.3 mkdocs-print-site-plugin==2.3.6 pytablewriter==1.2.0 diff --git a/docs/requirements.txt b/docs/requirements.txt index 1e1b163b8..8b5dacd8b 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -4,14 +4,76 @@ # # pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in # -babel==2.13.1 \ - --hash=sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900 \ - --hash=sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed +babel==2.14.0 \ + --hash=sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363 \ + --hash=sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287 + # via mkdocs-material +cairocffi==1.6.1 \ + --hash=sha256:78e6bbe47357640c453d0be929fa49cd05cce2e1286f3d2a1ca9cbda7efdb8b7 \ + --hash=sha256:aa78ee52b9069d7475eeac457389b6275aa92111895d78fbaa2202a52dac112e + # via cairosvg +cairosvg==2.7.1 \ + --hash=sha256:432531d72347291b9a9ebfb6777026b607563fd8719c46ee742db0aef7271ba0 \ + --hash=sha256:8a5222d4e6c3f86f1f7046b63246877a63b49923a1cd202184c3a634ef546b3b # via mkdocs-material certifi==2023.11.17 \ --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ --hash=sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474 # via requests +cffi==1.16.0 \ + --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ + --hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \ + --hash=sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 \ + --hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \ + --hash=sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520 \ + --hash=sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36 \ + --hash=sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743 \ + --hash=sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8 \ + --hash=sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed \ + --hash=sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684 \ + --hash=sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56 \ + --hash=sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324 \ + --hash=sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d \ + --hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \ + --hash=sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e \ + --hash=sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088 \ + --hash=sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000 \ + --hash=sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7 \ + --hash=sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e \ + --hash=sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673 \ + --hash=sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c \ + --hash=sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe \ + --hash=sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2 \ + --hash=sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 \ + --hash=sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8 \ + --hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \ + --hash=sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0 \ + --hash=sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b \ + --hash=sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896 \ + --hash=sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e \ + --hash=sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9 \ + --hash=sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2 \ + --hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \ + --hash=sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6 \ + --hash=sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 \ + --hash=sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f \ + --hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \ + --hash=sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4 \ + --hash=sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc \ + --hash=sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 \ + --hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \ + --hash=sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872 \ + --hash=sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb \ + --hash=sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614 \ + --hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1 \ + --hash=sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d \ + --hash=sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969 \ + --hash=sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b \ + --hash=sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4 \ + --hash=sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627 \ + --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ + --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 + # via cairocffi chardet==5.2.0 \ --hash=sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7 \ --hash=sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970 @@ -116,12 +178,20 @@ colorama==0.4.6 \ --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 # via mkdocs-material +cssselect2==0.7.0 \ + --hash=sha256:1ccd984dab89fc68955043aca4e1b03e0cf29cad9880f6e28e3ba7a74b14aa5a \ + --hash=sha256:fd23a65bfd444595913f02fc71f6b286c29261e354c41d722ca7a261a49b5969 + # via cairosvg dataproperty==1.0.1 \ --hash=sha256:0b8b07d4fb6453fcf975b53d35dea41f3cfd69c9d79b5010c3cf224ff0407a7a \ --hash=sha256:723e5729fa6e885e127a771a983ee1e0e34bb141aca4ffe1f0bfa7cde34650a4 # via # pytablewriter # tabledata +defusedxml==0.7.1 \ + --hash=sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69 \ + --hash=sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61 + # via cairosvg ghp-import==2.1.0 \ --hash=sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619 \ --hash=sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343 @@ -130,9 +200,9 @@ idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via requests -importlib-metadata==7.0.0 \ - --hash=sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7 \ - --hash=sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67 +importlib-metadata==7.0.1 \ + --hash=sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e \ + --hash=sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc # via # markdown # mike @@ -241,11 +311,12 @@ mkdocs==1.5.3 \ # -r requirements.in # mike # mkdocs-material -mkdocs-material==9.4.14 \ - --hash=sha256:a511d3ff48fa8718b033e7e37d17abd9cc1de0fdf0244a625ca2ae2387e2416d \ - --hash=sha256:dbc78a4fea97b74319a6aa9a2f0be575a6028be6958f813ba367188f7b8428f6 +mkdocs-material==9.5.3 \ + --hash=sha256:5899219f422f0a6de784232d9d40374416302ffae3c160cacc72969fcc1ee372 \ + --hash=sha256:76c93a8525cceb0b395b9cedab3428bf518cf6439adef2b940f1c1574b775d89 # via # -r requirements.in + # mkdocs-material # mkdocs-print-site-plugin mkdocs-material-extensions==1.3.1 \ --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \ @@ -264,25 +335,99 @@ packaging==23.2 \ paginate==0.5.6 \ --hash=sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d # via mkdocs-material -pathspec==0.11.2 \ - --hash=sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20 \ - --hash=sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3 +pathspec==0.12.1 \ + --hash=sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08 \ + --hash=sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712 # via mkdocs pathvalidate==3.2.0 \ --hash=sha256:5e8378cf6712bff67fbe7a8307d99fa8c1a0cb28aa477056f8fc374f0dff24ad \ --hash=sha256:cc593caa6299b22b37f228148257997e2fa850eea2daf7e4cc9205cef6908dee # via pytablewriter +pillow==9.5.0 \ + --hash=sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1 \ + --hash=sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba \ + --hash=sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a \ + --hash=sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799 \ + --hash=sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51 \ + --hash=sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb \ + --hash=sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5 \ + --hash=sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270 \ + --hash=sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6 \ + --hash=sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47 \ + --hash=sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf \ + --hash=sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e \ + --hash=sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b \ + --hash=sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66 \ + --hash=sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865 \ + --hash=sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec \ + --hash=sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c \ + --hash=sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1 \ + --hash=sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38 \ + --hash=sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906 \ + --hash=sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705 \ + --hash=sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef \ + --hash=sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc \ + --hash=sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f \ + --hash=sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf \ + --hash=sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392 \ + --hash=sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d \ + --hash=sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe \ + --hash=sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32 \ + --hash=sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5 \ + --hash=sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7 \ + --hash=sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44 \ + --hash=sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d \ + --hash=sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3 \ + --hash=sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625 \ + --hash=sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e \ + --hash=sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829 \ + --hash=sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089 \ + --hash=sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3 \ + --hash=sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78 \ + --hash=sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96 \ + --hash=sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964 \ + --hash=sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597 \ + --hash=sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99 \ + --hash=sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a \ + --hash=sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140 \ + --hash=sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7 \ + --hash=sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16 \ + --hash=sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903 \ + --hash=sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1 \ + --hash=sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296 \ + --hash=sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572 \ + --hash=sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115 \ + --hash=sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a \ + --hash=sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd \ + --hash=sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4 \ + --hash=sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1 \ + --hash=sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb \ + --hash=sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa \ + --hash=sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a \ + --hash=sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569 \ + --hash=sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c \ + --hash=sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf \ + --hash=sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082 \ + --hash=sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062 \ + --hash=sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579 + # via + # cairosvg + # mkdocs-material platformdirs==4.1.0 \ --hash=sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380 \ --hash=sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420 # via mkdocs +pycparser==2.21 \ + --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ + --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 + # via cffi pygments==2.17.2 \ --hash=sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c \ --hash=sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367 # via mkdocs-material -pymdown-extensions==10.5 \ - --hash=sha256:1b60f1e462adbec5a1ed79dac91f666c9c0d241fa294de1989f29d20096cfd0b \ - --hash=sha256:1f0ca8bb5beff091315f793ee17683bc1390731f6ac4c5eb01e27464b80fe879 +pymdown-extensions==10.7 \ + --hash=sha256:6ca215bc57bc12bf32b414887a68b810637d039124ed9b2e5bd3325cbb2c050c \ + --hash=sha256:c0d64d5cf62566f59e6b2b690a4095c931107c250a8c8e1351c1de5f6b036deb # via mkdocs-material pyparsing==3.1.1 \ --hash=sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb \ @@ -362,95 +507,100 @@ pyyaml-env-tag==0.1 \ --hash=sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb \ --hash=sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069 # via mkdocs -regex==2023.10.3 \ - --hash=sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a \ - --hash=sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07 \ - --hash=sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca \ - --hash=sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58 \ - --hash=sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54 \ - --hash=sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed \ - --hash=sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff \ - --hash=sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528 \ - --hash=sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9 \ - --hash=sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971 \ - --hash=sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14 \ - --hash=sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af \ - --hash=sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302 \ - --hash=sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec \ - --hash=sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597 \ - --hash=sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b \ - --hash=sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd \ - --hash=sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767 \ - --hash=sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f \ - --hash=sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6 \ - --hash=sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293 \ - --hash=sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be \ - --hash=sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41 \ - --hash=sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc \ - --hash=sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29 \ - --hash=sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964 \ - --hash=sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d \ - --hash=sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a \ - --hash=sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc \ - --hash=sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55 \ - --hash=sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af \ - --hash=sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930 \ - --hash=sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e \ - --hash=sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d \ - --hash=sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863 \ - --hash=sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c \ - --hash=sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f \ - --hash=sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e \ - --hash=sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d \ - --hash=sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368 \ - --hash=sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb \ - --hash=sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52 \ - --hash=sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8 \ - --hash=sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4 \ - --hash=sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac \ - --hash=sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e \ - --hash=sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2 \ - --hash=sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a \ - --hash=sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4 \ - --hash=sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa \ - --hash=sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533 \ - --hash=sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b \ - --hash=sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588 \ - --hash=sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0 \ - --hash=sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915 \ - --hash=sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841 \ - --hash=sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a \ - --hash=sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988 \ - --hash=sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292 \ - --hash=sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3 \ - --hash=sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c \ - --hash=sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f \ - --hash=sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420 \ - --hash=sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9 \ - --hash=sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f \ - --hash=sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0 \ - --hash=sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b \ - --hash=sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037 \ - --hash=sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b \ - --hash=sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee \ - --hash=sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c \ - --hash=sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b \ - --hash=sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353 \ - --hash=sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051 \ - --hash=sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039 \ - --hash=sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a \ - --hash=sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b \ - --hash=sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e \ - --hash=sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5 \ - --hash=sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf \ - --hash=sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94 \ - --hash=sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991 \ - --hash=sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711 \ - --hash=sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a \ - --hash=sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab \ - --hash=sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a \ - --hash=sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11 \ - --hash=sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48 +regex==2023.12.25 \ + --hash=sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5 \ + --hash=sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770 \ + --hash=sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc \ + --hash=sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105 \ + --hash=sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d \ + --hash=sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b \ + --hash=sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9 \ + --hash=sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630 \ + --hash=sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6 \ + --hash=sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c \ + --hash=sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482 \ + --hash=sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6 \ + --hash=sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a \ + --hash=sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80 \ + --hash=sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5 \ + --hash=sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1 \ + --hash=sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f \ + --hash=sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf \ + --hash=sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb \ + --hash=sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2 \ + --hash=sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347 \ + --hash=sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20 \ + --hash=sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060 \ + --hash=sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5 \ + --hash=sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73 \ + --hash=sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f \ + --hash=sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d \ + --hash=sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3 \ + --hash=sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae \ + --hash=sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4 \ + --hash=sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2 \ + --hash=sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457 \ + --hash=sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c \ + --hash=sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4 \ + --hash=sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87 \ + --hash=sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0 \ + --hash=sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704 \ + --hash=sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f \ + --hash=sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f \ + --hash=sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b \ + --hash=sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5 \ + --hash=sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923 \ + --hash=sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715 \ + --hash=sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c \ + --hash=sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca \ + --hash=sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1 \ + --hash=sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756 \ + --hash=sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360 \ + --hash=sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc \ + --hash=sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445 \ + --hash=sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e \ + --hash=sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4 \ + --hash=sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a \ + --hash=sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8 \ + --hash=sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53 \ + --hash=sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697 \ + --hash=sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf \ + --hash=sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a \ + --hash=sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415 \ + --hash=sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f \ + --hash=sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9 \ + --hash=sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400 \ + --hash=sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d \ + --hash=sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392 \ + --hash=sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb \ + --hash=sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd \ + --hash=sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861 \ + --hash=sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232 \ + --hash=sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95 \ + --hash=sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7 \ + --hash=sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39 \ + --hash=sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887 \ + --hash=sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5 \ + --hash=sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39 \ + --hash=sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb \ + --hash=sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586 \ + --hash=sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97 \ + --hash=sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423 \ + --hash=sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69 \ + --hash=sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7 \ + --hash=sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1 \ + --hash=sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7 \ + --hash=sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5 \ + --hash=sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8 \ + --hash=sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91 \ + --hash=sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590 \ + --hash=sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe \ + --hash=sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c \ + --hash=sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64 \ + --hash=sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd \ + --hash=sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa \ + --hash=sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31 \ + --hash=sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988 # via mkdocs-material requests==2.31.0 \ --hash=sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f \ @@ -460,9 +610,9 @@ requests==2.31.0 \ # importlib-resources # The following packages are considered to be unsafe in a requirements file: -setuptools==69.0.2 \ - --hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \ - --hash=sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6 +setuptools==69.0.3 \ + --hash=sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05 \ + --hash=sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78 # via mkdocs-material six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ @@ -476,6 +626,12 @@ tcolorpy==0.1.4 \ --hash=sha256:d0926480aa5012f34877d69fc3b670f207dc165674e68ad07458fa6ee5b12724 \ --hash=sha256:f0dceb1cb95e554cee63024b3cd2fd8d4628c568773de2d1e6b4f0478461901c # via pytablewriter +tinycss2==1.2.1 \ + --hash=sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847 \ + --hash=sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627 + # via + # cairosvg + # cssselect2 typepy==1.3.2 \ --hash=sha256:b69fd48b9f50cdb3809906eef36b855b3134ff66c8893a4f8580abddb0b39517 \ --hash=sha256:d5d1022a424132622993800f1d2cd16cfdb691ac4e3b9c325f0fcb37799db1ae @@ -521,6 +677,12 @@ watchdog==3.0.0 \ --hash=sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44 \ --hash=sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33 # via mkdocs +webencodings==0.5.1 \ + --hash=sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78 \ + --hash=sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923 + # via + # cssselect2 + # tinycss2 zipp==3.17.0 \ --hash=sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 \ --hash=sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0 diff --git a/docs/security-tuning.md b/docs/security-tuning.md index 57e1ebb67..49ebd2501 100644 --- a/docs/security-tuning.md +++ b/docs/security-tuning.md @@ -484,7 +484,7 @@ You can quickly protect sensitive resources like the admin area for example, by ### Auth request -You can deploy complex authentication (e.g. SSO), by using the auth request settings (see [here](https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-subrequest-authentication/) for more information on the feature). Please note that you will find [Authelia](https://www.authelia.com/) and [Authentik](https://goauthentik.io/) examples in the [repository](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/examples). +You can deploy complex authentication (e.g. SSO), by using the auth request settings (see [here](https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-subrequest-authentication/) for more information on the feature). Please note that you will find [Authelia](https://www.authelia.com/) and [Authentik](https://goauthentik.io/) examples in the [repository](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/examples). **Auth request settings are related to reverse proxy rules.** diff --git a/docs/settings.md b/docs/settings.md index 95693794d..143108788 100644 --- a/docs/settings.md +++ b/docs/settings.md @@ -2,7 +2,7 @@ !!! info "Settings generator tool" - To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io). + To help you tune BunkerWeb, we have made an easy-to-use settings generator tool available at [config.bunkerweb.io](https://config.bunkerweb.io/?utm_campaign=self&utm_source=doc). This section contains the full list of settings supported by BunkerWeb. If you are not yet familiar with BunkerWeb, you should first read the [concepts](concepts.md) section of the documentation. Please follow the instructions for your own [integration](integrations.md) on how to apply the settings. @@ -205,11 +205,13 @@ STREAM support :white_check_mark: Choose custom certificate for HTTPS. -| Setting |Default| Context |Multiple| Description | -|-----------------|-------|---------|--------|--------------------------------------------------------------------------------| -|`USE_CUSTOM_SSL` |`no` |multisite|no |Use custom HTTPS certificate. | -|`CUSTOM_SSL_CERT`| |multisite|no |Full path of the certificate or bundle file (must be readable by the scheduler).| -|`CUSTOM_SSL_KEY` | |multisite|no |Full path of the key file (must be readable by the scheduler). | +| Setting |Default| Context |Multiple| Description | +|----------------------|-------|---------|--------|--------------------------------------------------------------------------------| +|`USE_CUSTOM_SSL` |`no` |multisite|no |Use custom HTTPS certificate. | +|`CUSTOM_SSL_CERT` | |multisite|no |Full path of the certificate or bundle file (must be readable by the scheduler).| +|`CUSTOM_SSL_KEY` | |multisite|no |Full path of the key file (must be readable by the scheduler). | +|`CUSTOM_SSL_CERT_DATA`| |multisite|no |Certificate data encoded in base64. | +|`CUSTOM_SSL_KEY_DATA` | |multisite|no |Key data encoded in base64. | ### DB @@ -241,7 +243,7 @@ Manage default error pages | Setting | Default | Context |Multiple| Description | |-------------------------|-------------------------------------------------|---------|--------|------------------------------------------------------------------------------------------------------------------------| |`ERRORS` | |multisite|no |List of HTTP error code and corresponding error pages, separated with spaces (404=/my404.html 403=/errors/403.html ...).| -|`INTERCEPTED_ERROR_CODES`|`400 401 403 404 405 413 429 500 501 502 503 504`|multisite|no |List of HTTP error code intercepted by Bunkerweb | +|`INTERCEPTED_ERROR_CODES`|`400 401 403 404 405 413 429 500 501 502 503 504`|multisite|no |List of HTTP error code intercepted by BunkerWeb | ### Greylist @@ -363,6 +365,7 @@ Miscellaneous settings. |`OPEN_FILE_CACHE_VALID` |`30s` |multisite|no |Open file cache valid time | |`EXTERNAL_PLUGIN_URLS` | |global |no |List of external plugins URLs (direct download to .zip or .tar file) to download and install (URLs are separated with space).| |`DENY_HTTP_STATUS` |`403` |global |no |HTTP status code to send when the request is denied (403 or 444). When using 444, BunkerWeb will close the connection. | +|`SEND_ANONYMOUS_REPORT` |`yes` |global |no |Send anonymous report to BunkerWeb maintainers. | ### ModSecurity @@ -424,16 +427,22 @@ STREAM support :white_check_mark: Redis server configuration when using BunkerWeb in cluster mode. -| Setting |Default|Context|Multiple| Description | -|----------------------|-------|-------|--------|------------------------------------------------------------------| -|`USE_REDIS` |`no` |global |no |Activate Redis. | -|`REDIS_HOST` | |global |no |Redis server IP or hostname. | -|`REDIS_PORT` |`6379` |global |no |Redis server port. | -|`REDIS_DATABASE` |`0` |global |no |Redis database number. | -|`REDIS_SSL` |`no` |global |no |Use SSL/TLS connection with Redis server. | -|`REDIS_TIMEOUT` |`1000` |global |no |Redis server timeout (in ms) for connect, read and write. | -|`REDIS_KEEPALIVE_IDLE`|`30000`|global |no |Max idle time (in ms) before closing redis connection in the pool.| -|`REDIS_KEEPALIVE_POOL`|`10` |global |no |Max number of redis connection(s) kept in the pool. | +| Setting |Default|Context|Multiple| Description | +|-------------------------|-------|-------|--------|-------------------------------------------------------------------| +|`USE_REDIS` |`no` |global |no |Activate Redis. | +|`REDIS_HOST` | |global |no |Redis server IP or hostname. | +|`REDIS_PORT` |`6379` |global |no |Redis server port. | +|`REDIS_DATABASE` |`0` |global |no |Redis database number. | +|`REDIS_SSL` |`no` |global |no |Use SSL/TLS connection with Redis server. | +|`REDIS_TIMEOUT` |`1000` |global |no |Redis server timeout (in ms) for connect, read and write. | +|`REDIS_KEEPALIVE_IDLE` |`30000`|global |no |Max idle time (in ms) before closing redis connection in the pool. | +|`REDIS_KEEPALIVE_POOL` |`10` |global |no |Max number of redis connection(s) kept in the pool. | +|`REDIS_USERNAME` | |global |no |Redis username used in AUTH command. | +|`REDIS_PASSWORD` | |global |no |Redis password used in AUTH command. | +|`REDIS_SENTINEL_HOSTS` | |global |no |Redis sentinel hosts with format host:[port] separated with spaces.| +|`REDIS_SENTINEL_USERNAME`| |global |no |Redis sentinel username. | +|`REDIS_SENTINEL_PASSWORD`| |global |no |Redis sentinel password. | +|`REDIS_SENTINEL_MASTER` | |global |no |Redis sentinel master name. | ### Reverse proxy @@ -468,6 +477,7 @@ Manage reverse proxy configurations. |`REVERSE_PROXY_CONNECT_TIMEOUT` |`60s` |multisite|yes |Timeout when connecting to the proxied resource. | |`REVERSE_PROXY_READ_TIMEOUT` |`60s` |multisite|yes |Timeout when reading from the proxied resource. | |`REVERSE_PROXY_SEND_TIMEOUT` |`60s` |multisite|yes |Timeout when sending to the proxied resource. | +|`REVERSE_PROXY_INCLUDES` | |multisite|yes |Additional configuration to include in the location block, separated with spaces. | ### Reverse scan @@ -540,4 +550,3 @@ Allow access based on internal and external IP/network/rDNS/ASN whitelists. |`WHITELIST_USER_AGENT_URLS`| |global |no |List of URLs, separated with spaces, containing good User-Agent to whitelist. | |`WHITELIST_URI` | |multisite|no |List of URI (PCRE regex), separated with spaces, to whitelist. | |`WHITELIST_URI_URLS` | |global |no |List of URLs, separated with spaces, containing bad URI to whitelist. | - diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index d6a2fbb2d..281c76a18 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -1,5 +1,8 @@ # Troubleshooting +!!! info "BunkerWeb Panel" + If you are unable to resolve your problems, you can [contact us directly via our panel](https://panel.bunkerweb.io/?utm_campaign=self&utm_source=doc). This centralises all requests relating to the BunkerWeb solution. + ## Logs When troubleshooting, logs are your best friends. We try our best to provide user-friendly logs to help you understand what's happening. diff --git a/docs/web-ui.md b/docs/web-ui.md index 7484c9a8f..4e6170092 100644 --- a/docs/web-ui.md +++ b/docs/web-ui.md @@ -3,7 +3,7 @@ ## Overview

- +

The "Web UI" is a web application that helps you manage your BunkerWeb instance using a user-friendly interface instead of the command-line one. @@ -40,14 +40,14 @@ Because the web UI is a web application, the recommended installation procedure The setup wizard is a feature that helps you to **configure** and **install the web UI** using a **user-friendly interface**. You will need to set the `UI_HOST` setting (`http://hostname-of-web-ui:7000`) and browse the `/setup` URI of your server to access the setup wizard.
- ![Overview](assets/img/ui-wizard-account.png){ align=center, width="350" } + ![Overview](assets/img/ui-wizard-account.webp){ align=center, width="350" }
Account section of the setup wizard
-Choose your administator username and password. Please note that password must have at least 8 chars with 1 lower case letter, 1 upper case letter, 1 digit and 1 special char. +Choose your administrator username and password. Please note that password must have at least 8 chars with 1 lower case letter, 1 upper case letter, 1 digit and 1 special char.
- ![Overview](assets/img/ui-wizard-settings.png){ align=center, width="350" } + ![Overview](assets/img/ui-wizard-settings.webp){ align=center, width="350" }
Settings section of the setup wizard
@@ -73,7 +73,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -89,7 +89,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -111,7 +111,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 depends_on: - bw-docker environment: @@ -160,7 +160,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -177,7 +177,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - bw-services bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 depends_on: - bunkerweb - bw-docker @@ -190,7 +190,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - bw-docker bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -225,7 +225,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 networks: bw-docker: bw-universe: @@ -263,7 +263,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - published: 80 target: 8080 @@ -293,7 +293,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - "bunkerweb.INSTANCE=yes" bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -321,7 +321,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - "node.role == manager" bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -348,7 +348,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - bw-universe bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -435,7 +435,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th containers: # using bunkerweb as name is mandatory - name: bunkerweb - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 imagePullPolicy: Always securityContext: runAsUser: 101 @@ -508,7 +508,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-controller - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -535,7 +535,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-scheduler - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -619,7 +619,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th spec: containers: - name: bunkerweb-ui - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -754,7 +754,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th !!! info "Database backend" - If you want another Database backend than MariaDB please refer to the docker-compose files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/misc/integrations) of the repository. + If you want another Database backend than MariaDB please refer to the docker-compose files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/misc/integrations) of the repository. Here is the docker-compose boilerplate that you can use (don't forget to edit the `changeme` data) : @@ -763,7 +763,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -787,7 +787,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -809,7 +809,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 depends_on: - bw-docker environment: @@ -874,7 +874,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th !!! info "Database backend" - If you want another Database backend than MariaDB please refer to the docker-compose files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/misc/integrations) of the repository. + If you want another Database backend than MariaDB please refer to the docker-compose files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/misc/integrations) of the repository. Here is the docker-compose boilerplate that you can use (don't forget to edit the `changeme` data) : @@ -883,7 +883,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -900,7 +900,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - bw-services bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 depends_on: - bunkerweb - bw-docker @@ -913,7 +913,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - bw-docker bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -948,7 +948,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 networks: bw-docker: bw-universe: @@ -1009,7 +1009,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th !!! info "Database backend" - If you want another Database backend than MariaDB please refer to the stack files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/misc/integrations) of the repository. + If you want another Database backend than MariaDB please refer to the stack files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/misc/integrations) of the repository. Here is the stack boilerplate that you can use (don't forget to edit the `changeme` data) : @@ -1018,7 +1018,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - published: 80 target: 8080 @@ -1048,7 +1048,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - "bunkerweb.INSTANCE=yes" bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -1076,7 +1076,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - "node.role == manager" bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -1103,7 +1103,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th - bw-universe bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 environment: - DATABASE_URI=mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db # Remember to set a stronger password for the database - DOCKER_HOST=tcp://bw-docker:2375 @@ -1157,7 +1157,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th !!! info "Database backend" - If you want another Database backend than MariaDB please refer to the yaml files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.4/misc/integrations) of the repository. + If you want another Database backend than MariaDB please refer to the yaml files in the [misc/integrations folder](https://github.com/bunkerity/bunkerweb/tree/v1.5.5/misc/integrations) of the repository. Here is the yaml boilerplate that you can use (don't forget to edit the `changeme` data) : @@ -1212,7 +1212,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th containers: # using bunkerweb as name is mandatory - name: bunkerweb - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 imagePullPolicy: Always securityContext: runAsUser: 101 @@ -1282,7 +1282,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-controller - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -1309,7 +1309,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-scheduler - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -1393,7 +1393,7 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th spec: containers: - name: bunkerweb-ui - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 imagePullPolicy: Always env: - name: ADMIN_USERNAME @@ -1641,4 +1641,4 @@ Review your final BunkerWeb UI URL and then click on the `Setup` button. Once th ```shell systemctl restart bunkerweb - ``` \ No newline at end of file + ``` diff --git a/examples/authelia/docker-compose.yml b/examples/authelia/docker-compose.yml index 0df8be2b4..dc4deaa5b 100644 --- a/examples/authelia/docker-compose.yml +++ b/examples/authelia/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.4" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -44,7 +44,7 @@ services: - app2.example.com_REVERSE_PROXY_HEADERS=Remote-User $$user;Remote-Groups $$groups;Remote-Name $$name;Remote-Email $$email bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/authelia/tests.json b/examples/authelia/tests.json index edb0fd9d6..dce84e981 100644 --- a/examples/authelia/tests.json +++ b/examples/authelia/tests.json @@ -7,12 +7,14 @@ { "type": "string", "url": "https://app1.example.com", - "string": "authelia" + "string": "authelia", + "tls": "app1.example.com" }, { "type": "string", "url": "https://app2.example.com", - "string": "authelia" + "string": "authelia", + "tls": "app2.example.com" } ] } diff --git a/examples/authentik/docker-compose.yml b/examples/authentik/docker-compose.yml index 533f354b7..da776a650 100644 --- a/examples/authentik/docker-compose.yml +++ b/examples/authentik/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.4" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -53,7 +53,7 @@ services: - app2.example.com_REVERSE_PROXY_HEADERS=X-authentik-username $$authentik_username;X-authentik-groups $$authentik_groups;X-authentik-email $$authentik_email;X-authentik-name $$authentik_name;X-authentik-uid $$authentik_uid bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/autoconf-configs/tests.json b/examples/autoconf-configs/tests.json index 5c4596e1f..dc92c1d69 100644 --- a/examples/autoconf-configs/tests.json +++ b/examples/autoconf-configs/tests.json @@ -7,17 +7,20 @@ { "type": "string", "url": "https://app1.example.com/hello", - "string": "app1" + "string": "app1", + "tls": "app1.example.com" }, { "type": "string", "url": "https://app2.example.com/hello", - "string": "app2" + "string": "app2", + "tls": "app2.example.com" }, { "type": "string", "url": "https://app3.example.com/hello", - "string": "app3" + "string": "app3", + "tls": "app3.example.com" } ] } diff --git a/examples/behind-reverse-proxy/docker-compose.yml b/examples/behind-reverse-proxy/docker-compose.yml index 0dd8a7d5f..99f21e070 100644 --- a/examples/behind-reverse-proxy/docker-compose.yml +++ b/examples/behind-reverse-proxy/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 environment: - SERVER_NAME=www.example.com # replace with your domains - API_WHITELIST_IP=127.0.0.0/8 10.20.30.0/24 @@ -24,7 +24,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/behind-reverse-proxy/setup-linux.sh b/examples/behind-reverse-proxy/setup-linux.sh index f93c7e24a..f6e7edd25 100755 --- a/examples/behind-reverse-proxy/setup-linux.sh +++ b/examples/behind-reverse-proxy/setup-linux.sh @@ -24,6 +24,7 @@ if [ -f /lib/systemd/system/haproxy.service ] ; then systemctl daemon-reload fi systemctl start haproxy +# shellcheck disable=SC2181 if [ $? -ne 0 ] ; then systemctl status haproxy journalctl -u haproxy.service diff --git a/examples/bigbluebutton/docker-compose.yml b/examples/bigbluebutton/docker-compose.yml index 24114e2de..d6df6aea8 100644 --- a/examples/bigbluebutton/docker-compose.yml +++ b/examples/bigbluebutton/docker-compose.yml @@ -27,7 +27,7 @@ services: ... mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -50,7 +50,7 @@ services: bw-universe: bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/certbot-dns-cloudflare/docker-compose.yml b/examples/certbot-dns-cloudflare/docker-compose.yml index 009d69bc9..c542a0065 100644 --- a/examples/certbot-dns-cloudflare/docker-compose.yml +++ b/examples/certbot-dns-cloudflare/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -33,7 +33,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/certbot-dns-digitalocean/docker-compose.yml b/examples/certbot-dns-digitalocean/docker-compose.yml index be5c1052b..09d8c9cdb 100644 --- a/examples/certbot-dns-digitalocean/docker-compose.yml +++ b/examples/certbot-dns-digitalocean/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -33,7 +33,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/certbot-dns-google/docker-compose.yml b/examples/certbot-dns-google/docker-compose.yml index bdee54a0e..8dd9ef46d 100644 --- a/examples/certbot-dns-google/docker-compose.yml +++ b/examples/certbot-dns-google/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -33,7 +33,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/certbot-dns-ovh/docker-compose.yml b/examples/certbot-dns-ovh/docker-compose.yml index f8af2e65b..85a796448 100644 --- a/examples/certbot-dns-ovh/docker-compose.yml +++ b/examples/certbot-dns-ovh/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -33,7 +33,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/certbot-dns-route53/docker-compose.yml b/examples/certbot-dns-route53/docker-compose.yml index a93ee061a..4ec606745 100644 --- a/examples/certbot-dns-route53/docker-compose.yml +++ b/examples/certbot-dns-route53/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -33,7 +33,7 @@ services: - bw-services bbw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/cors/docker-compose.yml b/examples/cors/docker-compose.yml index e7273fd42..e56ee0b19 100644 --- a/examples/cors/docker-compose.yml +++ b/examples/cors/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -38,7 +38,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/cors/tests.json b/examples/cors/tests.json index e3d40e664..f0cf07835 100644 --- a/examples/cors/tests.json +++ b/examples/cors/tests.json @@ -6,17 +6,20 @@ { "type": "string", "url": "https://app1.example.com", - "string": "app1" + "string": "app1", + "tls": "app1.example.com" }, { "type": "string", "url": "https://app2.example.com", - "string": "app2" + "string": "app2", + "tls": "app2.example.com" }, { "type": "string", "url": "https://app3.example.com", - "string": "app3" + "string": "app3", + "tls": "app3.example.com" } ] } diff --git a/examples/docker-configs/docker-compose.yml b/examples/docker-configs/docker-compose.yml index 01cc9fbd1..35685e7d8 100644 --- a/examples/docker-configs/docker-compose.yml +++ b/examples/docker-configs/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -53,7 +53,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/docker-configs/tests.json b/examples/docker-configs/tests.json index 54eb9ee94..c9bb815c2 100644 --- a/examples/docker-configs/tests.json +++ b/examples/docker-configs/tests.json @@ -7,22 +7,26 @@ { "type": "string", "url": "https://app1.example.com/hello", - "string": "world" + "string": "world", + "tls": "app1.example.com" }, { "type": "string", "url": "https://app2.example.com/hello", - "string": "world" + "string": "world", + "tls": "app2.example.com" }, { "type": "string", "url": "https://app1.example.com/app1", - "string": "app1" + "string": "app1", + "tls": "app1.example.com" }, { "type": "string", "url": "https://app2.example.com/app2", - "string": "app2" + "string": "app2", + "tls": "app2.example.com" } ] } diff --git a/examples/drupal/docker-compose.yml b/examples/drupal/docker-compose.yml index 63be86cc5..b20cf8162 100644 --- a/examples/drupal/docker-compose.yml +++ b/examples/drupal/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -28,7 +28,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/drupal/tests.json b/examples/drupal/tests.json index cc1edd375..258a1ed3a 100644 --- a/examples/drupal/tests.json +++ b/examples/drupal/tests.json @@ -8,7 +8,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "drupal" + "string": "drupal", + "tls": "www.example.com" } ] } diff --git a/examples/ghost/docker-compose.yml b/examples/ghost/docker-compose.yml index 605762d10..78d118615 100644 --- a/examples/ghost/docker-compose.yml +++ b/examples/ghost/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -24,7 +24,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/ghost/tests.json b/examples/ghost/tests.json index b96fecbf2..8a571690c 100644 --- a/examples/ghost/tests.json +++ b/examples/ghost/tests.json @@ -7,7 +7,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "ghost" + "string": "ghost", + "tls": "www.example.com" } ] } diff --git a/examples/gogs/docker-compose.yml b/examples/gogs/docker-compose.yml index 03a4f2c6f..c6c3e2ca5 100644 --- a/examples/gogs/docker-compose.yml +++ b/examples/gogs/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -28,7 +28,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/gogs/tests.json b/examples/gogs/tests.json index c2c13d113..c554f85f3 100644 --- a/examples/gogs/tests.json +++ b/examples/gogs/tests.json @@ -8,7 +8,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "gogs" + "string": "gogs", + "tls": "www.example.com" } ] } diff --git a/examples/hardened/docker-compose.yml b/examples/hardened/docker-compose.yml index 4e6e5f61b..7b807c58e 100644 --- a/examples/hardened/docker-compose.yml +++ b/examples/hardened/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 # dropping all capabilities cap_drop: - ALL @@ -39,7 +39,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/hardened/tests.json b/examples/hardened/tests.json index 18bddaba9..0f4732cff 100644 --- a/examples/hardened/tests.json +++ b/examples/hardened/tests.json @@ -6,7 +6,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "hello" + "string": "hello", + "tls": "www.example.com" } ] } diff --git a/examples/joomla/docker-compose.yml b/examples/joomla/docker-compose.yml index 91ec4429b..9433af8fe 100644 --- a/examples/joomla/docker-compose.yml +++ b/examples/joomla/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -28,7 +28,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/joomla/tests.json b/examples/joomla/tests.json index 02fec41c3..329bd57e4 100644 --- a/examples/joomla/tests.json +++ b/examples/joomla/tests.json @@ -7,7 +7,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "joomla" + "string": "joomla", + "tls": "www.example.com" } ] } diff --git a/examples/kubernetes-configs/tests.json b/examples/kubernetes-configs/tests.json index e0d4e97e0..036ec69ff 100644 --- a/examples/kubernetes-configs/tests.json +++ b/examples/kubernetes-configs/tests.json @@ -7,32 +7,38 @@ { "type": "string", "url": "https://app1.example.com/hello", - "string": "hello" + "string": "hello", + "tls": "app1.example.com" }, { "type": "string", "url": "https://app2.example.com/hello", - "string": "hello" + "string": "hello", + "tls": "app2.example.com" }, { "type": "string", "url": "https://app3.example.com/hello", - "string": "hello" + "string": "hello", + "tls": "app3.example.com" }, { "type": "string", "url": "https://app1.example.com/app1", - "string": "app1" + "string": "app1", + "tls": "app1.example.com" }, { "type": "string", "url": "https://app2.example.com/app2", - "string": "app2" + "string": "app2", + "tls": "app2.example.com" }, { "type": "string", "url": "https://app3.example.com/app3", - "string": "app3" + "string": "app3", + "tls": "app3.example.com" } ] } diff --git a/examples/kubernetes-ingress/tests.json b/examples/kubernetes-ingress/tests.json index 6747d7608..5049e3bee 100644 --- a/examples/kubernetes-ingress/tests.json +++ b/examples/kubernetes-ingress/tests.json @@ -7,17 +7,20 @@ { "type": "string", "url": "https://app1.example.com", - "string": "hello" + "string": "hello", + "tls": "app1.example.com" }, { "type": "string", "url": "https://app2.example.com", - "string": "hello" + "string": "hello", + "tls": "app2.example.com" }, { "type": "string", "url": "https://app3.example.com", - "string": "hello" + "string": "hello", + "tls": "app3.example.com" } ] } diff --git a/examples/kubernetes-tls/app1app2.crt b/examples/kubernetes-tls/app1app2.crt new file mode 100644 index 000000000..e7cce33ee --- /dev/null +++ b/examples/kubernetes-tls/app1app2.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFOTCCAyGgAwIBAgIUDBbkHicmx8nqUQNnkDvx32hqmiswDQYJKoZIhvcNAQEL +BQAwLDEqMCgGA1UEAwwhYXBwMS5leGFtcGxlLmNvbSxhcHAyLmV4YW1wbGUuY29t +MB4XDTIzMTIxNzExMjg0NFoXDTMzMTIxNDExMjg0NFowLDEqMCgGA1UEAwwhYXBw +MS5leGFtcGxlLmNvbSxhcHAyLmV4YW1wbGUuY29tMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA0PE86OpiyWSgQlm30SF737CM7+NIsUn0jo7RZUoB/rmM +jryWruQ/IZOH7TjKyPBemX+90q56ExIPthuGK6QTZBGpwNdGLRG7ghvKeJSWTkZv +8lYWx/ROSQZ5xRbJFMDyZAwjbhJhLlV2vV19vbC5NkgbBowSpMzwd9Ymy7ULazIQ +cQ7frZu4BNhLQ3aTuNktxT11tuvI4zOK6Ma0aoBWEMgyI/lYq/U61zLc0MOWVta1 +9Llo5AO90MN5+5pM0xZPgvVNsrwCyWga+cl/oykkimmzxRMA67t01ew8MheK6fFC +5sLqQPqSmelgkB/Ff3eaoxYhGgWYVx6jOg89zuW65wVbOVokq0pmlLWe48Ea6oTe +AC/+Xq2TWnzm/3RI10YSFTdzcslqO8H2e4Pa3oyj2kNk7JE8GHewCA9WL+SIP18t +GtbTAXonSHaseWu1Stelm43V/N2AViILv7aBNFHJ8iGWsOqSjJCVqymtOsmosZYZ +zosLSItNrTGtRTqj5v5gsynQrnEj2hM9nFVOsVSTHltMOj39nfrkcG70Vsn1Z7dB +mhm1hIDi0fZSPiLw1o/PsKdNOcfnmPX4ol4vW48HilBDINVaQAJMU016JgSOeBls +tGdCZWFceOdEwVy+12ATPolSaY8Ro6NtHW5r6ONcIkZi9Nccxjl5ETz9WalfyIEC +AwEAAaNTMFEwHQYDVR0OBBYEFHiUEzaEK6Iv6zQMopthSOfZpK5JMB8GA1UdIwQY +MBaAFHiUEzaEK6Iv6zQMopthSOfZpK5JMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggIBAAtXURD4HT3kMSscVByqUM4inJc3p8dGEAxAQRNBxN3VOkwA +melyRQ3SeBUJKnElGTtgMIW7JmEPdZdAcQiUZ2UEI7AKhMWACGg6LBGRNXATp1sA +GAzPgVqNVs+x2Iyif5kE9xWss+VE3PH17LMJMhqlpKcjkrrFwtmtRC2a1fGnDLtK +UoewUIjC/9qEKySQs3eyCCbjnJWDpvJaUrBpIUvjFHHus/UOYmCu7UBxSa31kku/ +cVpJVi0fODyA5VH606AS4fR9XQBDF80FYH7dr+jkXcMmh9FAl5AsvPeP7nhcX/nM +fwlEHT6/TOX0xw8c5P+sKmJASBt/Lvc+pFWxNRLlF9SWcskXT3wf5hoz8qRS89ip +567cPDquOHmG4qg2c0f8I2mNomxVl4TW4fjSqtvsoIQDDTzyXBBG1pMMhQMNcjGI +twpusIdIQHTkR6heBfmSjGSkh6c4bXw44QWl1kq0+uouKF2aFajAUmRq3MC+r6iP +yg1zBpPkNMICfCyekhY1N3THfU9bhEBtvbIqobuTGp2OyekBShOkpXfeLp1hDIPh +10RQU3lzE4/fipja+t/IiBxAJ20MSsHOFvPRpX2Q6/7584eguA5hAsflQw1PIXj5 +wOi4cm6tx3xVWzhuRHa6oUBtSS/IjRX55lcWFE8xYXqulpHM2rP/KAsCKu3N +-----END CERTIFICATE----- diff --git a/examples/kubernetes-tls/app1app2.key b/examples/kubernetes-tls/app1app2.key new file mode 100644 index 000000000..80df378b0 --- /dev/null +++ b/examples/kubernetes-tls/app1app2.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDQ8Tzo6mLJZKBC +WbfRIXvfsIzv40ixSfSOjtFlSgH+uYyOvJau5D8hk4ftOMrI8F6Zf73SrnoTEg+2 +G4YrpBNkEanA10YtEbuCG8p4lJZORm/yVhbH9E5JBnnFFskUwPJkDCNuEmEuVXa9 +XX29sLk2SBsGjBKkzPB31ibLtQtrMhBxDt+tm7gE2EtDdpO42S3FPXW268jjM4ro +xrRqgFYQyDIj+Vir9TrXMtzQw5ZW1rX0uWjkA73Qw3n7mkzTFk+C9U2yvALJaBr5 +yX+jKSSKabPFEwDru3TV7DwyF4rp8ULmwupA+pKZ6WCQH8V/d5qjFiEaBZhXHqM6 +Dz3O5brnBVs5WiSrSmaUtZ7jwRrqhN4AL/5erZNafOb/dEjXRhIVN3NyyWo7wfZ7 +g9rejKPaQ2TskTwYd7AID1Yv5Ig/Xy0a1tMBeidIdqx5a7VK16WbjdX83YBWIgu/ +toE0UcnyIZaw6pKMkJWrKa06yaixlhnOiwtIi02tMa1FOqPm/mCzKdCucSPaEz2c +VU6xVJMeW0w6Pf2d+uRwbvRWyfVnt0GaGbWEgOLR9lI+IvDWj8+wp005x+eY9fii +Xi9bjweKUEMg1VpAAkxTTXomBI54GWy0Z0JlYVx450TBXL7XYBM+iVJpjxGjo20d +bmvo41wiRmL01xzGOXkRPP1ZqV/IgQIDAQABAoICAQCtnhcnz0Ng532HRLfKThF5 +sWGbH/hSYQqWvrPef52ixRm3rZtkHgMbalTDWLKgP6PL1uqruxFy8Uoe30Yg00jN +mSO+OuN0JczycxdOFOHEjyEMdF6frjCy22+pxqI13ZJMcg2qtBkOgDOXbK1ERynP +oiDa0t/XEvgqC8fW80xWuZYR6/MPdlp1pCj+GPTs34H56HT9F3Wo3TZq8FoQOS3K +6h9H5zS4RqCrGveDfVJaPDWb8cjn1vgOFbAx0mhN6rcNMbprb3C9XQU1VCr8L/7O +CME5W+4i83RFIfRvB0MF29TknUg70DqrK9JyUAQzQ/Y51/SPg+CvW6T0ZJ/OYPRo +7HfNGk1+yhou2wvZnC9OqI98tZBniO5fEdcUCguaZZWW7jwMpONk0cI8sm6NoWpy +uiIb2W5jNlOpXqBx/0veejfDtfso7MvkPY/hwppw++DY331au2rsLsDbXUx96SOJ +d7PyflXNjrrzSTO5X6UyQiYNl1/EaBQjQN/R9YxyC2uS+UsM5UesB5Tg++jER6HL +mT6cccE5YLjbdTfT9TDvgNIgB2tS1mnBvI4nObaMX/JuASyMYUEoQQsiNPtuElqC +U7DXkgMKHd6qlrsVMxrIyih3UNjtyQZBQcokP4UcW5hIzTLyrNPyBSzh6QUbs4Kn +lL9PyYYcDEXlMP30i+M3AQKCAQEA7ccgjMYIYq2qv8X/G15ZmWdw5+Hz16S58KzE +n0mVF4Ht16mBDfrQve0h5nn6/h33bffpgxKigmM0b+vEzgPtPSlNhaLCE4Kt7SZn +NuRVHJ74nHXsTi+Z0ZSkgeKwBRmji5TN7PBEoVdaExhM/qGnwG7x5CQNLQ0O1w2J +5b6ywGnghjlhHRI5uGdmHy2n6N5Rj37OFrLVOLdEexy351ogZY74673BXGVjLNe2 +UMM6CazE00gDwKv0rOniZv732O8MVaOMR6CYG3z7TgfVGESWS1mEGTrkbLgGbT4X +naGhUH90+AKZwD2LmMJPbQR5PhwcmaCx/xgPj1RWRl4zemDjsQKCAQEA4PRl41Wd +Yiirgc41oXC3hk/cMtCsz+Cz8WL7pCRJL3hvX/Z+7Pp6eMeiHBnaObjZNUY/eC+s +I1i4tCShMnqSddm/YnvgiS1UsDF2N4Xm0oR0PfK0jcQDq/IYyxCJmp56ZJ8y1c5W +v9wvJ+7U/AELjuqkGiZ0w0wDGtdNdFVbUSjyf385Dmq0D19rrl3Y9OmoDaECYVdS +L7/8hjIgmT09+Yrf05+IlEo/f6aPjM1xi6WYC3+aQOp3yjW6oSPEZZuc2WfVyhss +AiDSwbqu1nxS5WswOTGKmirl3btACafOK8x/czeoqM8Wjju8HAG1btlUT4BzLNVk +GZR14iJcFxZ10QKCAQBri6czRNbCGx6hwqIR9Oi9s8Wje9VYcc8QBnSgPx3KFiBH +bQlME2ean8i3f/CAQ3mIKZtah3EtXEV5YcAQFkKVaTsA+I6jWHXmT3pbn4bHfTeh +PMz2yBzgaETH4ooOpHwOQ+2n/zxrZSD+hf09JkzDguqxb4TuHXva1OrMGSasVLcS +vp0oEvg8abgM3g+WCggFySrZpWU/U9ULgf/ECkWg6bu4lIkCi3EB9Ucm3EZB3fzg +OzBHUv9FvjuCrkvXuLdxfJmURBTISg04S96cLVl1FzXiW3q5mbp+apkv2M0npZ54 +FmUISE39d9WIz38vEnP1IHOhl3ZiM5kaFr1d2rjhAoIBAGOtB0R/GBh5at0+cNcS +6c7yreA6RIhryW/I6zWk+mS1WaxMvZrltcS0uGj5L4/qDxyi/taTURPsaRMxM9f5 +JdJgZIQP3cMKuf7EO9yIUWmwVQ1p8ITseLAEuuWnc0F2vUa+n7jLD/c9aguosOjk +0alG4OXRamVq1elbwy8r7yV8Hk9OIQr5TsWNA1qkrNCAg/1d/X8CQSF1UUBpD7a2 +wzJCTcEobE1AxPgb5nl+QrSc8E0QAlqHSgLoYcSq44geNpbCgqFl/s8GmjxLKtNR +DS4om5qMEB0Vqvrf0JU2rI0NtN9ppyr9b8IgR86lFy6Bz/DWOrJ/7zXCaaWEkgeM +5TECggEAKSvloR9pVm0nzvN3e4Xtjj01rVUZOU667lUT3TAeDycTTLK4tXsYR47V +olDmKwIN7YL/U6WAm1ClE+DGMnt27hKeIBctKJXiiIqK7hlAAOmk6nCWUXU7yCgb +RkV9DTXHQ4gEtzgU0kx0r9pTydc19rMAanl7fgiNUNc+RcHeNSH9hoWPTGpOb5Om +R4LuAJSewMdtnYFa7Xu3P7QjT7b0d7ARGnF1OrjKA9Nqm65D3bh8hlikANrGkM+k +pPM2BJiTnh6vLYMh5TBMSFNLJPUKItyTaIz2CVFdWE5ipV3UPjj8beYsFDt24XmC +FI88g7aCJHlP2wvuyZiPnOtCdGVVKw== +-----END PRIVATE KEY----- diff --git a/examples/kubernetes-tls/app3.crt b/examples/kubernetes-tls/app3.crt new file mode 100644 index 000000000..144da26d0 --- /dev/null +++ b/examples/kubernetes-tls/app3.crt @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFFzCCAv+gAwIBAgIUETXxobflxWhnHIL/u7KBRE/y4eswDQYJKoZIhvcNAQEL +BQAwGzEZMBcGA1UEAwwQYXBwMy5leGFtcGxlLmNvbTAeFw0yMzEyMTcxMTMwMTda +Fw0zMzEyMTQxMTMwMTdaMBsxGTAXBgNVBAMMEGFwcDMuZXhhbXBsZS5jb20wggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDEq6OCSCs3Uyswq4sH8FWfd4oR +ssX/qIzu5FwTjpvFKOa/d+b6rnWC2SR6RKKmR47bwGBx2jvQIOZ118ta0rKtws0F +AHYXgwxTpuljz3vESrybXxUA7Pmjiog2zvGkKIKHAOZdjwRbDQBvceocurChKn3V +t8CjKSGecq6qN4dh0xPwEIWAsIpIsnrMSI3JbjCDlUe7SKEcWYKcFZfgm71KBYnD +gwTTFaRnzrVWLyvqJ/wfQldCzmbGJ5cR6CsF9Keu/KQelJxQA9SEqqxLzU04dHOB +wYJVyBWL6m2udh6qWRRP3FwAdX6QB9cT0ql/JwxirS/+kBmHAKS8K+iTxl7JzaDw +hxwfjJkTNiw3mMnvah6L7SHAKVd53UXt1lc6vsz02/4cIiNxCA/k9TKWwYb6ogl0 +MenPPjfmSDp2zEHX9FP/xbJgnO9wPdzO1nQrVKFRynrC5tlnmzU9DKpn+dflKvmQ +/hqFwu//ZUnCfyApdrtF7ICj+mngJkD8M6aJ4ALDhXpOjPzIMxLe/b+vArPhOVIj +CEUSUg6u3eDuksKKS+0fBZgrrYhHpBNNiLXzD7rAXoAKOWorAgshdSlsLbWcEfm7 +RhiwXIfqK/Ykk0YOQRLlowRJuHU17w+8nfnGz80GL9ZN06AE3o7uCLem4FS0WK22 +3I8WKJWY3opjD6FdyQIDAQABo1MwUTAdBgNVHQ4EFgQUnyUyfZmtc1z0AtSo8AS2 +SHklcV4wHwYDVR0jBBgwFoAUnyUyfZmtc1z0AtSo8AS2SHklcV4wDwYDVR0TAQH/ +BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAn4OP9GNeUl42T1mPewQa8x1jbFj/ +klALcY1onrUFbpLHceFljyOLkDL+XufXGZ842h1/g4PVFQZlCku6qUaSNc9pz6JX +48olhJODV4+HZXh3KUpCDBXNxywnnKw+dF60imDPp7TdL2wdCSZAyH7pkbFlXsPU +B9SWLemyr/aX+/z3qD7OC6q1sHH9h7asRXbXycowROZozDCSVQKITC8P4avzbLJ9 +yrUgjHyj2ymxMUOGs65fnKr1/xrMLjYyjN8v9OMVEh02+qO4pOhz4WCEEur1zIC1 +X24YUhnX4QNJ4Qi1qwidAbBIZrXt4PW2i4Mw2eQO1RU1w81pz8vY725l2GygFG3N +DhEkAdILJ99KUN0YlU7BAPsCU5pe+uA40uBe5Oti9PAlEnvH4i49p34JKjZ4q30e +FIy5VjuCkmVlSzUfRQhZ8QRz2hdK/hJY6Pwo63UP7Mb1tup8hmEcfZATotMjUK4U +d+BYe6OFw50s2s6uMiVuu2Wb2sWsP5gOk9SkaCKbvQa4Miu/kWKbvT9Pb81u544t +XoqVO2d83uOm5FTM+gFgMDtJDK/poqIXho6MDnUES1SoUZgY2XRHLOBvCAms9SIW +HCzbrzSqs8P6UxaiV59Ht3toL/xQmR/skfrn/QUYdsSh9dtOStkHUOzzepkTroj0 +MZUb2FnSikWBzcI= +-----END CERTIFICATE----- diff --git a/examples/kubernetes-tls/app3.key b/examples/kubernetes-tls/app3.key new file mode 100644 index 000000000..fc38a7359 --- /dev/null +++ b/examples/kubernetes-tls/app3.key @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQwIBADANBgkqhkiG9w0BAQEFAASCCS0wggkpAgEAAoICAQDEq6OCSCs3Uysw +q4sH8FWfd4oRssX/qIzu5FwTjpvFKOa/d+b6rnWC2SR6RKKmR47bwGBx2jvQIOZ1 +18ta0rKtws0FAHYXgwxTpuljz3vESrybXxUA7Pmjiog2zvGkKIKHAOZdjwRbDQBv +ceocurChKn3Vt8CjKSGecq6qN4dh0xPwEIWAsIpIsnrMSI3JbjCDlUe7SKEcWYKc +FZfgm71KBYnDgwTTFaRnzrVWLyvqJ/wfQldCzmbGJ5cR6CsF9Keu/KQelJxQA9SE +qqxLzU04dHOBwYJVyBWL6m2udh6qWRRP3FwAdX6QB9cT0ql/JwxirS/+kBmHAKS8 +K+iTxl7JzaDwhxwfjJkTNiw3mMnvah6L7SHAKVd53UXt1lc6vsz02/4cIiNxCA/k +9TKWwYb6ogl0MenPPjfmSDp2zEHX9FP/xbJgnO9wPdzO1nQrVKFRynrC5tlnmzU9 +DKpn+dflKvmQ/hqFwu//ZUnCfyApdrtF7ICj+mngJkD8M6aJ4ALDhXpOjPzIMxLe +/b+vArPhOVIjCEUSUg6u3eDuksKKS+0fBZgrrYhHpBNNiLXzD7rAXoAKOWorAgsh +dSlsLbWcEfm7RhiwXIfqK/Ykk0YOQRLlowRJuHU17w+8nfnGz80GL9ZN06AE3o7u +CLem4FS0WK223I8WKJWY3opjD6FdyQIDAQABAoICABxlA4htzv9/3H58ZehRhKsv +YRnJC9krhp1/DuQr9MV0cEw4jXqn8YNgwml8u1bygeesUMBfV79m4J8m9s84GGAJ +/fu441PlscPqF0w3ypC+kZiFE808aZZ5C82N90lSJ/ZB5QChA2n56JQuiDR5p8K9 +Fcnja8aiy53KxPkCZ2NyTDCe0geQdYalbiFMYFwysoJs7RxXEhu7uKW8YF8nXR7w +ycEWi33GZCQwrfGxgc+e0kHZHCwjDKeTU7ZcJMoJVqRnCXL41dCfnPFCivmuvHVo +Kr0TKTQlXScEQ62qlCbYEZyuHgJa9FjrKNxNz/bxtlIQ2xsPxv+80gvw8vVS8KBF +KKZQ5R7SuCT1tGveHk3MEO8yUXj+LNB4H4xNK5LHcBc5ZFH5mcop5kkk4rnR+1pK +LFH1jpy1vdNEAeHNKbJAxrec1Z4NKs4Lwv6n5/b4EsoFwNlFM9IJ6dNqijMJXlsC +It9byyjKpcY/8w89EgN00aae4xPSBJTQU/gFgnUJmP+YD6i7B3/WCsZfnFeuj7qM +2T8Qxhf5R4/aNOqf0mCyV14HmglFygAzTin/e5fiEA1Pk8bc3+CHWmmfNIURq2kr +gQOg5k6R46P/93zLs6kZyLD4UL/7kn2rOIIlQqrbityaIppUNka7kxcD7h0R+yJW +lKLTMoEHPinkaM2X125ZAoIBAQD1ZZ7eeTsIdW5AcG+U1J690SGu03MHQAyZ+a0L +WOhVJn21lEuCTCu0dKcNSXET5ZLkzUmXt0UKJ20IZL1Az7cDekNvtNoTFDYrl1e7 +uH52TuoUxxiANkDlTm5dSqA44flzNtG1rPcjNBbW6IRWAUQGSzOWPzJHAO2H4Wa4 +m1m0YzwFz8PC5A1/NX8/BHsTYiIFsmf3o1I6M3HnrqHkftZmIVKataRZadDLpbTp +426kpY8WnnV9udXMPHmvBZ+P3kKjKc99oY/u4mtnPReBj0LIz+3Smc6cUpkdq/EI +VK2xCvFm/uJN93iLPyx2HJUf+bu/f+GvH8Fz8KCe/0PpKCv7AoIBAQDNKwu0jlaI +Y0mtrJZvXUPWtK3ZNUQ24BuVcCvi99R391f++oZ+g8ib1SqqLGNmY3DJ4WsbLtpi +9toPDLT4mgZAUEhjRLY+S0IeXTVxdN/JOZ6eMamyM3x75efWPILhxLk4AeibGIha +L5Ln2CWlDjc7mGZNjUn0HbXvdwEtDnlhoAnFDpKCOxEFt+r2cke3D0StpnFdcDfp +jL8NHmsSPBz2TFtMhtczkFB/1pc5Grf+3LemHQmKpOCfFQcS+VCI1UU5gfhkr6IS +ycCvvdioSwmolqhaBzug9yCx1pUL9s2FaiWIMzvvsy63lZkEC9009Zy5rGo0RWN8 +Hr5HllKXs04LAoIBAQDPHyV3W1VzL0KOSxgywz70sZY/bCNThEDemTjwMetvK1zB +LNiKsmXVGvyAn3M8uvFAAvFRh5NTHbHOetCt6mPrIH/YwgmqPs31/vhC7lZ23uZ+ +AQlx9djScl9+iGUxfbHBCAz6zXGOmgGJBJnlyY2zzjdNYiu6eFMD9EByIlUVhwh7 +U0BEt52Yt/udodeLpbFXo5xTDNtzWkaSqPfl1xR5ATkqcZO1EDX2HPfUzWxutXpP +OhGqu3Zzurtt+U4S7SLLepexzvKgSyUh7xNu/A7/VVjC/6S+loy72YtIX8h2fOkB +6LHz4qMwzHJngnpvkaZg3LwMxr3OcNPxPzz/hzOPAoIBAQCQ6s3KzBtdHNyG+vgL +U1I+jsKZQOGc7TEundux5qHB1wjlxmlHZahGQgxvxQi04pphToLL4Y1KB9jAdpZB +XvH5bXuj+n3LhHcAYZAFQqtrQ/LBBI07nNhZ32uhTH6aH81APUDihDKTmTTn5Cm6 +606iHqRsNNc+wdmnemRvQeEEzvj3orJjoHsGkgE58ECtkfBNw9ohSMmFgu/TwV+Z +srI2WnrGlBvfhRkHIzkPkcrTD238vFfoAUvTshOcGFQFQrcxxpb/73rIUI900uD9 +BnudBEWHycIZkVUbqFkA6WQDz5URHjdAuUzPSbCaRhMKfE4mbB1cLIL3wfNfN1PB +aVo/AoIBAFISVR5sVewY2uBu9a4eb64p/30g+BaOmvhVt2gLfm65sCCLzYH4GjcW +ZI1IPvf7NtTfKa/RvNEGcGs2GYyWhUu4GlC5t3oKDyZo66oHSeM005nDbsMszaeQ +m1c0eGj8NsSf+3GHxTwVAtxwOlEkznxLE+dZADD49DJSG9B/FnG/0g6LGfOxSWRk +J3iQAUTriVRKcIxBmYe/BUxtyfkwEv3Wjc7W5LMRzT87pljd2i4jy1fxSqXCH9Wy +tButCdI31UcQdZ9jrPydCy5eJng087pHSMvsVHv/CDP3aka5HQU/tCMERsaFJKiS +l2qeGi6z5g40o9wd3s0sBaPePtZ7dUY= +-----END PRIVATE KEY----- diff --git a/examples/kubernetes-tls/kubernetes.yml b/examples/kubernetes-tls/kubernetes.yml new file mode 100644 index 000000000..9fbe5d805 --- /dev/null +++ b/examples/kubernetes-tls/kubernetes.yml @@ -0,0 +1,164 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: ingress +spec: + tls: + - hosts: + - app1.example.com + - app2.example.com + secretName: secret-tls-app1app2 + - hosts: + - app3.example.com + secretName: secret-tls-app3 + rules: + - host: app1.example.com + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: svc-app1 + port: + number: 80 + - host: app2.example.com + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: svc-app2 + port: + number: 80 + - host: app3.example.com + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: svc-app3 + port: + number: 80 +--- +apiVersion: v1 +kind: Secret +metadata: + name: secret-tls-app1app2 +data: + tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZPVENDQXlHZ0F3SUJBZ0lVREJia0hpY214OG5xVVFObmtEdngzMmhxbWlzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0xERXFNQ2dHQTFVRUF3d2hZWEJ3TVM1bGVHRnRjR3hsTG1OdmJTeGhjSEF5TG1WNFlXMXdiR1V1WTI5dApNQjRYRFRJek1USXhOekV4TWpnME5Gb1hEVE16TVRJeE5ERXhNamcwTkZvd0xERXFNQ2dHQTFVRUF3d2hZWEJ3Ck1TNWxlR0Z0Y0d4bExtTnZiU3hoY0hBeUxtVjRZVzF3YkdVdVkyOXRNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUYKQUFPQ0FnOEFNSUlDQ2dLQ0FnRUEwUEU4Nk9waXlXU2dRbG0zMFNGNzM3Q003K05Jc1VuMGpvN1JaVW9CL3JtTQpqcnlXcnVRL0laT0g3VGpLeVBCZW1YKzkwcTU2RXhJUHRodUdLNlFUWkJHcHdOZEdMUkc3Z2h2S2VKU1dUa1p2CjhsWVd4L1JPU1FaNXhSYkpGTUR5WkF3amJoSmhMbFYydlYxOXZiQzVOa2diQm93U3BNendkOVlteTdVTGF6SVEKY1E3ZnJadTRCTmhMUTNhVHVOa3R4VDExdHV2STR6T0s2TWEwYW9CV0VNZ3lJL2xZcS9VNjF6TGMwTU9XVnRhMQo5TGxvNUFPOTBNTjUrNXBNMHhaUGd2Vk5zcndDeVdnYStjbC9veWtraW1tenhSTUE2N3QwMWV3OE1oZUs2ZkZDCjVzTHFRUHFTbWVsZ2tCL0ZmM2Vhb3hZaEdnV1lWeDZqT2c4OXp1VzY1d1ZiT1Zva3EwcG1sTFdlNDhFYTZvVGUKQUMvK1hxMlRXbnptLzNSSTEwWVNGVGR6Y3NscU84SDJlNFBhM295ajJrTms3SkU4R0hld0NBOVdMK1NJUDE4dApHdGJUQVhvblNIYXNlV3UxU3RlbG00M1YvTjJBVmlJTHY3YUJORkhKOGlHV3NPcVNqSkNWcXltdE9zbW9zWllaCnpvc0xTSXROclRHdFJUcWo1djVnc3luUXJuRWoyaE05bkZWT3NWU1RIbHRNT2ozOW5mcmtjRzcwVnNuMVo3ZEIKbWhtMWhJRGkwZlpTUGlMdzFvL1BzS2ROT2Nmbm1QWDRvbDR2VzQ4SGlsQkRJTlZhUUFKTVUwMTZKZ1NPZUJscwp0R2RDWldGY2VPZEV3VnkrMTJBVFBvbFNhWThSbzZOdEhXNXI2T05jSWtaaTlOY2N4amw1RVR6OVdhbGZ5SUVDCkF3RUFBYU5UTUZFd0hRWURWUjBPQkJZRUZIaVVFemFFSzZJdjZ6UU1vcHRoU09mWnBLNUpNQjhHQTFVZEl3UVkKTUJhQUZIaVVFemFFSzZJdjZ6UU1vcHRoU09mWnBLNUpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQUF0WFVSRDRIVDNrTVNzY1ZCeXFVTTRpbkpjM3A4ZEdFQXhBUVJOQnhOM1ZPa3dBCm1lbHlSUTNTZUJVSktuRWxHVHRnTUlXN0ptRVBkWmRBY1FpVVoyVUVJN0FLaE1XQUNHZzZMQkdSTlhBVHAxc0EKR0F6UGdWcU5Wcyt4Mkl5aWY1a0U5eFdzcytWRTNQSDE3TE1KTWhxbHBLY2prcnJGd3RtdFJDMmExZkduREx0SwpVb2V3VUlqQy85cUVLeVNRczNleUNDYmpuSldEcHZKYVVyQnBJVXZqRkhIdXMvVU9ZbUN1N1VCeFNhMzFra3UvCmNWcEpWaTBmT0R5QTVWSDYwNkFTNGZSOVhRQkRGODBGWUg3ZHIramtYY01taDlGQWw1QXN2UGVQN25oY1gvbk0KZndsRUhUNi9UT1gweHc4YzVQK3NLbUpBU0J0L0x2YytwRld4TlJMbEY5U1djc2tYVDN3ZjVob3o4cVJTODlpcAo1NjdjUERxdU9IbUc0cWcyYzBmOEkybU5vbXhWbDRUVzRmalNxdHZzb0lRRERUenlYQkJHMXBNTWhRTU5jakdJCnR3cHVzSWRJUUhUa1I2aGVCZm1TakdTa2g2YzRiWHc0NFFXbDFrcTArdW91S0YyYUZhakFVbVJxM01DK3I2aVAKeWcxekJwUGtOTUlDZkN5ZWtoWTFOM1RIZlU5YmhFQnR2Yklxb2J1VEdwMk95ZWtCU2hPa3BYZmVMcDFoRElQaAoxMFJRVTNsekU0L2ZpcGphK3QvSWlCeEFKMjBNU3NIT0Z2UFJwWDJRNi83NTg0ZWd1QTVoQXNmbFF3MVBJWGo1CndPaTRjbTZ0eDN4Vld6aHVSSGE2b1VCdFNTL0lqUlg1NWxjV0ZFOHhZWHF1bHBITTJyUC9LQXNDS3UzTgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRZ0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1N3d2dna29BZ0VBQW9JQ0FRRFE4VHpvNm1MSlpLQkMKV2JmUklYdmZzSXp2NDBpeFNmU09qdEZsU2dIK3VZeU92SmF1NUQ4aGs0ZnRPTXJJOEY2WmY3M1Nybm9URWcrMgpHNFlycEJOa0VhbkExMFl0RWJ1Q0c4cDRsSlpPUm0veVZoYkg5RTVKQm5uRkZza1V3UEprRENOdUVtRXVWWGE5ClhYMjlzTGsyU0JzR2pCS2t6UEIzMWliTHRRdHJNaEJ4RHQrdG03Z0UyRXREZHBPNDJTM0ZQWFcyNjhqak00cm8KeHJScWdGWVF5RElqK1ZpcjlUclhNdHpRdzVaVzFyWDB1V2prQTczUXczbjdta3pURmsrQzlVMnl2QUxKYUJyNQp5WCtqS1NTS2FiUEZFd0RydTNUVjdEd3lGNHJwOFVMbXd1cEErcEtaNldDUUg4Vi9kNXFqRmlFYUJaaFhIcU02CkR6M081YnJuQlZzNVdpU3JTbWFVdFo3andScnFoTjRBTC81ZXJaTmFmT2IvZEVqWFJoSVZOM055eVdvN3dmWjcKZzlyZWpLUGFRMlRza1R3WWQ3QUlEMVl2NUlnL1h5MGExdE1CZWlkSWRxeDVhN1ZLMTZXYmpkWDgzWUJXSWd1Lwp0b0UwVWNueUlaYXc2cEtNa0pXckthMDZ5YWl4bGhuT2l3dElpMDJ0TWExRk9xUG0vbUN6S2RDdWNTUGFFejJjClZVNnhWSk1lVzB3NlBmMmQrdVJ3YnZSV3lmVm50MEdhR2JXRWdPTFI5bEkrSXZEV2o4K3dwMDA1eCtlWTlmaWkKWGk5Ymp3ZUtVRU1nMVZwQUFreFRUWG9tQkk1NEdXeTBaMEpsWVZ4NDUwVEJYTDdYWUJNK2lWSnBqeEdqbzIwZApibXZvNDF3aVJtTDAxeHpHT1hrUlBQMVpxVi9JZ1FJREFRQUJBb0lDQVFDdG5oY256ME5nNTMySFJMZktUaEY1CnNXR2JIL2hTWVFxV3ZyUGVmNTJpeFJtM3JadGtIZ01iYWxURFdMS2dQNlBMMXVxcnV4Rnk4VW9lMzBZZzAwak4KbVNPK091TjBKY3p5Y3hkT0ZPSEVqeUVNZEY2ZnJqQ3kyMitweHFJMTNaSk1jZzJxdEJrT2dET1hiSzFFUnluUApvaURhMHQvWEV2Z3FDOGZXODB4V3VaWVI2L01QZGxwMXBDaitHUFRzMzRINTZIVDlGM1dvM1RacThGb1FPUzNLCjZoOUg1elM0UnFDckd2ZURmVkphUERXYjhjam4xdmdPRmJBeDBtaE42cmNOTWJwcmIzQzlYUVUxVkNyOEwvN08KQ01FNVcrNGk4M1JGSWZSdkIwTUYyOVRrblVnNzBEcXJLOUp5VUFRelEvWTUxL1NQZytDdlc2VDBaSi9PWVBSbwo3SGZOR2sxK3lob3Uyd3ZabkM5T3FJOTh0WkJuaU81ZkVkY1VDZ3VhWlpXVzdqd01wT05rMGNJOHNtNk5vV3B5CnVpSWIyVzVqTmxPcFhxQngvMHZlZWpmRHRmc283TXZrUFkvaHdwcHcrK0RZMzMxYXUycnNMc0RiWFV4OTZTT0oKZDdQeWZsWE5qcnJ6U1RPNVg2VXlRaVlObDEvRWFCUWpRTi9SOVl4eUMydVMrVXNNNVVlc0I1VGcrK2pFUjZITAptVDZjY2NFNVlMamJkVGZUOVREdmdOSWdCMnRTMW1uQnZJNG5PYmFNWC9KdUFTeU1ZVUVvUVFzaU5QdHVFbHFDClU3RFhrZ01LSGQ2cWxyc1ZNeHJJeWloM1VOanR5UVpCUWNva1A0VWNXNWhJelRMeXJOUHlCU3poNlFVYnM0S24KbEw5UHlZWWNERVhsTVAzMGkrTTNBUUtDQVFFQTdjY2dqTVlJWXEycXY4WC9HMTVabVdkdzUrSHoxNlM1OEt6RQpuMG1WRjRIdDE2bUJEZnJRdmUwaDVubjYvaDMzYmZmcGd4S2lnbU0wYit2RXpnUHRQU2xOaGFMQ0U0S3Q3U1puCk51UlZISjc0bkhYc1RpK1owWlNrZ2VLd0JSbWppNVRON1BCRW9WZGFFeGhNL3FHbndHN3g1Q1FOTFEwTzF3MkoKNWI2eXdHbmdoamxoSFJJNXVHZG1IeTJuNk41UmozN09GckxWT0xkRWV4eTM1MW9nWlk3NDY3M0JYR1ZqTE5lMgpVTU02Q2F6RTAwZ0R3S3Ywck9uaVp2NzMyTzhNVmFPTVI2Q1lHM3o3VGdmVkdFU1dTMW1FR1Rya2JMZ0diVDRYCm5hR2hVSDkwK0FLWndEMkxtTUpQYlFSNVBod2NtYUN4L3hnUGoxUldSbDR6ZW1EanNRS0NBUUVBNFBSbDQxV2QKWWlpcmdjNDFvWEMzaGsvY010Q3N6K0N6OFdMN3BDUkpMM2h2WC9aKzdQcDZlTWVpSEJuYU9ialpOVVkvZUMrcwpJMWk0dENTaE1ucVNkZG0vWW52Z2lTMVVzREYyTjRYbTBvUjBQZkswamNRRHEvSVl5eENKbXA1NlpKOHkxYzVXCnY5d3ZKKzdVL0FFTGp1cWtHaVowdzB3REd0ZE5kRlZiVVNqeWYzODVEbXEwRDE5cnJsM1k5T21vRGFFQ1lWZFMKTDcvOGhqSWdtVDA5K1lyZjA1K0lsRW8vZjZhUGpNMXhpNldZQzMrYVFPcDN5alc2b1NQRVpadWMyV2ZWeWhzcwpBaURTd2JxdTFueFM1V3N3T1RHS21pcmwzYnRBQ2FmT0s4eC9jemVvcU04V2pqdThIQUcxYnRsVVQ0QnpMTlZrCkdaUjE0aUpjRnhaMTBRS0NBUUJyaTZjelJOYkNHeDZod3FJUjlPaTlzOFdqZTlWWWNjOFFCblNnUHgzS0ZpQkgKYlFsTUUyZWFuOGkzZi9DQVEzbUlLWnRhaDNFdFhFVjVZY0FRRmtLVmFUc0ErSTZqV0hYbVQzcGJuNGJIZlRlaApQTXoyeUJ6Z2FFVEg0b29PcEh3T1ErMm4venhyWlNEK2hmMDlKa3pEZ3VxeGI0VHVIWHZhMU9yTUdTYXNWTGNTCnZwMG9Fdmc4YWJnTTNnK1dDZ2dGeVNyWnBXVS9VOVVMZ2YvRUNrV2c2YnU0bElrQ2kzRUI5VWNtM0VaQjNmemcKT3pCSFV2OUZ2anVDcmt2WHVMZHhmSm1VUkJUSVNnMDRTOTZjTFZsMUZ6WGlXM3E1bWJwK2Fwa3YyTTBucFo1NApGbVVJU0UzOWQ5V0l6Mzh2RW5QMUlIT2hsM1ppTTVrYUZyMWQycmpoQW9JQkFHT3RCMFIvR0JoNWF0MCtjTmNTCjZjN3lyZUE2UklocnlXL0k2eldrK21TMVdheE12WnJsdGNTMHVHajVMNC9xRHh5aS90YVRVUlBzYVJNeE05ZjUKSmRKZ1pJUVAzY01LdWY3RU85eUlVV213VlExcDhJVHNlTEFFdXVXbmMwRjJ2VWErbjdqTEQvYzlhZ3Vvc09qawowYWxHNE9YUmFtVnExZWxid3k4cjd5VjhIazlPSVFyNVRzV05BMXFrck5DQWcvMWQvWDhDUVNGMVVVQnBEN2EyCnd6SkNUY0VvYkUxQXhQZ2I1bmwrUXJTYzhFMFFBbHFIU2dMb1ljU3E0NGdlTnBiQ2dxRmwvczhHbWp4TEt0TlIKRFM0b201cU1FQjBWcXZyZjBKVTJySTBOdE45cHB5cjliOElnUjg2bEZ5NkJ6L0RXT3JKLzd6WENhYVdFa2dlTQo1VEVDZ2dFQUtTdmxvUjlwVm0wbnp2TjNlNFh0amowMXJWVVpPVTY2N2xVVDNUQWVEeWNUVExLNHRYc1lSNDdWCm9sRG1Ld0lON1lML1U2V0FtMUNsRStER01udDI3aEtlSUJjdEtKWGlpSXFLN2hsQUFPbWs2bkNXVVhVN3lDZ2IKUmtWOURUWEhRNGdFdHpnVTBreDByOXBUeWRjMTlyTUFhbmw3ZmdpTlVOYytSY0hlTlNIOWhvV1BUR3BPYjVPbQpSNEx1QUpTZXdNZHRuWUZhN1h1M1A3UWpUN2IwZDdBUkduRjFPcmpLQTlOcW02NUQzYmg4aGxpa0FOckdrTStrCnBQTTJCSmlUbmg2dkxZTWg1VEJNU0ZOTEpQVUtJdHlUYUl6MkNWRmRXRTVpcFYzVVBqajhiZVlzRkR0MjRYbUMKRkk4OGc3YUNKSGxQMnd2dXlaaVBuT3RDZEdWVkt3PT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo= +type: kubernetes.io/tls +--- +apiVersion: v1 +kind: Secret +metadata: + name: secret-tls-app3 +data: + tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZGekNDQXYrZ0F3SUJBZ0lVRVRYeG9iZmx4V2huSElML3U3S0JSRS95NGVzd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0d6RVpNQmNHQTFVRUF3d1FZWEJ3TXk1bGVHRnRjR3hsTG1OdmJUQWVGdzB5TXpFeU1UY3hNVE13TVRkYQpGdzB6TXpFeU1UUXhNVE13TVRkYU1Cc3hHVEFYQmdOVkJBTU1FR0Z3Y0RNdVpYaGhiWEJzWlM1amIyMHdnZ0lpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREVxNk9DU0NzM1V5c3dxNHNIOEZXZmQ0b1IKc3NYL3FJenU1RndUanB2RktPYS9kK2I2cm5XQzJTUjZSS0ttUjQ3YndHQngyanZRSU9aMTE4dGEwckt0d3MwRgpBSFlYZ3d4VHB1bGp6M3ZFU3J5Ylh4VUE3UG1qaW9nMnp2R2tLSUtIQU9aZGp3UmJEUUJ2Y2VvY3VyQ2hLbjNWCnQ4Q2pLU0dlY3E2cU40ZGgweFB3RUlXQXNJcElzbnJNU0kzSmJqQ0RsVWU3U0tFY1dZS2NGWmZnbTcxS0JZbkQKZ3dUVEZhUm56clZXTHl2cUovd2ZRbGRDem1iR0o1Y1I2Q3NGOUtldS9LUWVsSnhRQTlTRXFxeEx6VTA0ZEhPQgp3WUpWeUJXTDZtMnVkaDZxV1JSUDNGd0FkWDZRQjljVDBxbC9Kd3hpclMvK2tCbUhBS1M4SytpVHhsN0p6YUR3Cmh4d2ZqSmtUTml3M21NbnZhaDZMN1NIQUtWZDUzVVh0MWxjNnZzejAyLzRjSWlOeENBL2s5VEtXd1liNm9nbDAKTWVuUFBqZm1TRHAyekVIWDlGUC94Ykpnbk85d1Bkek8xblFyVktGUnluckM1dGxubXpVOURLcG4rZGZsS3ZtUQovaHFGd3UvL1pVbkNmeUFwZHJ0RjdJQ2orbW5nSmtEOE02YUo0QUxEaFhwT2pQeklNeExlL2IrdkFyUGhPVklqCkNFVVNVZzZ1M2VEdWtzS0tTKzBmQlpncnJZaEhwQk5OaUxYekQ3ckFYb0FLT1dvckFnc2hkU2xzTGJXY0VmbTcKUmhpd1hJZnFLL1lrazBZT1FSTGxvd1JKdUhVMTd3KzhuZm5HejgwR0w5Wk4wNkFFM283dUNMZW00RlMwV0syMgozSThXS0pXWTNvcGpENkZkeVFJREFRQUJvMU13VVRBZEJnTlZIUTRFRmdRVW55VXlmWm10YzF6MEF0U284QVMyClNIa2xjVjR3SHdZRFZSMGpCQmd3Rm9BVW55VXlmWm10YzF6MEF0U284QVMyU0hrbGNWNHdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBbjRPUDlHTmVVbDQyVDFtUGV3UWE4eDFqYkZqLwprbEFMY1kxb25yVUZicExIY2VGbGp5T0xrREwrWHVmWEdaODQyaDEvZzRQVkZRWmxDa3U2cVVhU05jOXB6NkpYCjQ4b2xoSk9EVjQrSFpYaDNLVXBDREJYTnh5d25uS3crZEY2MGltRFBwN1RkTDJ3ZENTWkF5SDdwa2JGbFhzUFUKQjlTV0xlbXlyL2FYKy96M3FEN09DNnExc0hIOWg3YXNSWGJYeWNvd1JPWm96RENTVlFLSVRDOFA0YXZ6YkxKOQp5clVnakh5ajJ5bXhNVU9HczY1Zm5LcjEveHJNTGpZeWpOOHY5T01WRWgwMitxTzRwT2h6NFdDRUV1cjF6SUMxClgyNFlVaG5YNFFOSjRRaTFxd2lkQWJCSVpyWHQ0UFcyaTRNdzJlUU8xUlUxdzgxcHo4dlk3MjVsMkd5Z0ZHM04KRGhFa0FkSUxKOTlLVU4wWWxVN0JBUHNDVTVwZSt1QTQwdUJlNU90aTlQQWxFbnZINGk0OXAzNEpLalo0cTMwZQpGSXk1Vmp1Q2ttVmxTelVmUlFoWjhRUnoyaGRLL2hKWTZQd282M1VQN01iMXR1cDhobUVjZlpBVG90TWpVSzRVCmQrQlllNk9GdzUwczJzNnVNaVZ1dTJXYjJzV3NQNWdPazlTa2FDS2J2UWE0TWl1L2tXS2J2VDlQYjgxdTU0NHQKWG9xVk8yZDgzdU9tNUZUTStnRmdNRHRKREsvcG9xSVhobzZNRG5VRVMxU29VWmdZMlhSSExPQnZDQW1zOVNJVwpIQ3picnpTcXM4UDZVeGFpVjU5SHQzdG9ML3hRbVIvc2tmcm4vUVVZZHNTaDlkdE9TdGtIVU96emVwa1Ryb2owCk1aVWIyRm5TaWtXQnpjST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUpRd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQ1Mwd2dna3BBZ0VBQW9JQ0FRREVxNk9DU0NzM1V5c3cKcTRzSDhGV2ZkNG9Sc3NYL3FJenU1RndUanB2RktPYS9kK2I2cm5XQzJTUjZSS0ttUjQ3YndHQngyanZRSU9aMQoxOHRhMHJLdHdzMEZBSFlYZ3d4VHB1bGp6M3ZFU3J5Ylh4VUE3UG1qaW9nMnp2R2tLSUtIQU9aZGp3UmJEUUJ2CmNlb2N1ckNoS24zVnQ4Q2pLU0dlY3E2cU40ZGgweFB3RUlXQXNJcElzbnJNU0kzSmJqQ0RsVWU3U0tFY1dZS2MKRlpmZ203MUtCWW5EZ3dUVEZhUm56clZXTHl2cUovd2ZRbGRDem1iR0o1Y1I2Q3NGOUtldS9LUWVsSnhRQTlTRQpxcXhMelUwNGRIT0J3WUpWeUJXTDZtMnVkaDZxV1JSUDNGd0FkWDZRQjljVDBxbC9Kd3hpclMvK2tCbUhBS1M4CksraVR4bDdKemFEd2h4d2ZqSmtUTml3M21NbnZhaDZMN1NIQUtWZDUzVVh0MWxjNnZzejAyLzRjSWlOeENBL2sKOVRLV3dZYjZvZ2wwTWVuUFBqZm1TRHAyekVIWDlGUC94Ykpnbk85d1Bkek8xblFyVktGUnluckM1dGxubXpVOQpES3BuK2RmbEt2bVEvaHFGd3UvL1pVbkNmeUFwZHJ0RjdJQ2orbW5nSmtEOE02YUo0QUxEaFhwT2pQeklNeExlCi9iK3ZBclBoT1ZJakNFVVNVZzZ1M2VEdWtzS0tTKzBmQlpncnJZaEhwQk5OaUxYekQ3ckFYb0FLT1dvckFnc2gKZFNsc0xiV2NFZm03Umhpd1hJZnFLL1lrazBZT1FSTGxvd1JKdUhVMTd3KzhuZm5HejgwR0w5Wk4wNkFFM283dQpDTGVtNEZTMFdLMjIzSThXS0pXWTNvcGpENkZkeVFJREFRQUJBb0lDQUJ4bEE0aHR6djkvM0g1OFplaFJoS3N2CllSbkpDOWtyaHAxL0R1UXI5TVYwY0V3NGpYcW44WU5nd21sOHUxYnlnZWVzVU1CZlY3OW00SjhtOXM4NEdHQUoKL2Z1NDQxUGxzY1BxRjB3M3lwQytrWmlGRTgwOGFaWjVDODJOOTBsU0ovWkI1UUNoQTJuNTZKUXVpRFI1cDhLOQpGY25qYThhaXk1M0t4UGtDWjJOeVREQ2UwZ2VRZFlhbGJpRk1ZRnd5c29KczdSeFhFaHU3dUtXOFlGOG5YUjd3CnljRVdpMzNHWkNRd3JmR3hnYytlMGtIWkhDd2pES2VUVTdaY0pNb0pWcVJuQ1hMNDFkQ2ZuUEZDaXZtdXZIVm8KS3IwVEtUUWxYU2NFUTYycWxDYllFWnl1SGdKYTlGanJLTnhOei9ieHRsSVEyeHNQeHYrODBndnc4dlZTOEtCRgpLS1pRNVI3U3VDVDF0R3ZlSGszTUVPOHlVWGorTE5CNEg0eE5LNUxIY0JjNVpGSDVtY29wNWtrazRyblIrMXBLCkxGSDFqcHkxdmRORUFlSE5LYkpBeHJlYzFaNE5LczRMd3Y2bjUvYjRFc29Gd05sRk05SUo2ZE5xaWpNSlhsc0MKSXQ5Ynl5aktwY1kvOHc4OUVnTjAwYWFlNHhQU0JKVFFVL2dGZ25VSm1QK1lENmk3QjMvV0NzWmZuRmV1ajdxTQoyVDhReGhmNVI0L2FOT3FmMG1DeVYxNEhtZ2xGeWdBelRpbi9lNWZpRUExUGs4YmMzK0NIV21tZk5JVVJxMmtyCmdRT2c1azZSNDZQLzkzekxzNmtaeUxENFVMLzdrbjJyT0lJbFFxcmJpdHlhSXBwVU5rYTdreGNEN2gwUit5SlcKbEtMVE1vRUhQaW5rYU0yWDEyNVpBb0lCQVFEMVpaN2VlVHNJZFc1QWNHK1UxSjY5MFNHdTAzTUhRQXlaK2EwTApXT2hWSm4yMWxFdUNUQ3UwZEtjTlNYRVQ1WkxrelVtWHQwVUtKMjBJWkwxQXo3Y0Rla052dE5vVEZEWXJsMWU3CnVINTJUdW9VeHhpQU5rRGxUbTVkU3FBNDRmbHpOdEcxclBjak5CYlc2SVJXQVVRR1N6T1dQekpIQU8ySDRXYTQKbTFtMFl6d0Z6OFBDNUExL05YOC9CSHNUWWlJRnNtZjNvMUk2TTNIbnJxSGtmdFptSVZLYXRhUlphZERMcGJUcAo0MjZrcFk4V25uVjl1ZFhNUEhtdkJaK1Aza0tqS2M5OW9ZL3U0bXRuUFJlQmowTEl6KzNTbWM2Y1Vwa2RxL0VJClZLMnhDdkZtL3VKTjkzaUxQeXgySEpVZitidS9mK0d2SDhGejhLQ2UvMFBwS0N2N0FvSUJBUUROS3d1MGpsYUkKWTBtdHJKWnZYVVBXdEszWk5VUTI0QnVWY0N2aTk5UjM5MWYrK29aK2c4aWIxU3FxTEdObVkzREo0V3NiTHRwaQo5dG9QRExUNG1nWkFVRWhqUkxZK1MwSWVYVFZ4ZE4vSk9aNmVNYW15TTN4NzVlZldQSUxoeExrNEFlaWJHSWhhCkw1TG4yQ1dsRGpjN21HWk5qVW4wSGJYdmR3RXREbmxob0FuRkRwS0NPeEVGdCtyMmNrZTNEMFN0cG5GZGNEZnAKakw4Tkhtc1NQQnoyVEZ0TWh0Y3prRkIvMXBjNUdyZiszTGVtSFFtS3BPQ2ZGUWNTK1ZDSTFVVTVnZmhrcjZJUwp5Y0N2dmRpb1N3bW9scWhhQnp1Zzl5Q3gxcFVMOXMyRmFpV0lNenZ2c3k2M2xaa0VDOTAwOVp5NXJHbzBSV044CkhyNUhsbEtYczA0TEFvSUJBUURQSHlWM1cxVnpMMEtPU3hneXd6NzBzWlkvYkNOVGhFRGVtVGp3TWV0dksxekIKTE5pS3NtWFZHdnlBbjNNOHV2RkFBdkZSaDVOVEhiSE9ldEN0Nm1QcklIL1l3Z21xUHMzMS92aEM3bFoyM3VaKwpBUWx4OWRqU2NsOStpR1V4ZmJIQkNBejZ6WEdPbWdHSkJKbmx5WTJ6empkTllpdTZlRk1EOUVCeUlsVVZod2g3ClUwQkV0NTJZdC91ZG9kZUxwYkZYbzV4VEROdHpXa2FTcVBmbDF4UjVBVGtxY1pPMUVEWDJIUGZVeld4dXRYcFAKT2hHcXUzWnp1cnR0K1U0UzdTTExlcGV4enZLZ1N5VWg3eE51L0E3L1ZWakMvNlMrbG95NzJZdElYOGgyZk9rQgo2TEh6NHFNd3pISm5nbnB2a2FaZzNMd014cjNPY05QeFB6ei9oek9QQW9JQkFRQ1E2czNLekJ0ZEhOeUcrdmdMClUxSStqc0taUU9HYzdURXVuZHV4NXFIQjF3amx4bWxIWmFoR1FneHZ4UWkwNHBwaFRvTEw0WTFLQjlqQWRwWkIKWHZINWJYdWorbjNMaEhjQVlaQUZRcXRyUS9MQkJJMDduTmhaMzJ1aFRINmFIODFBUFVEaWhES1RtVFRuNUNtNgo2MDZpSHFSc05OYyt3ZG1uZW1SdlFlRUV6dmozb3JKam9Ic0drZ0U1OEVDdGtmQk53OW9oU01tRmd1L1R3VitaCnNySTJXbnJHbEJ2ZmhSa0hJemtQa2NyVEQyMzh2RmZvQVV2VHNoT2NHRlFGUXJjeHhwYi83M3JJVUk5MDB1RDkKQm51ZEJFV0h5Y0laa1ZVYnFGa0E2V1FEejVVUkhqZEF1VXpQU2JDYVJoTUtmRTRtYkIxY0xJTDN3Zk5mTjFQQgphVm8vQW9JQkFGSVNWUjVzVmV3WTJ1QnU5YTRlYjY0cC8zMGcrQmFPbXZoVnQyZ0xmbTY1c0NDTHpZSDRHamNXClpJMUlQdmY3TnRUZkthL1J2TkVHY0dzMkdZeVdoVXU0R2xDNXQzb0tEeVpvNjZvSFNlTTAwNW5EYnNNc3phZVEKbTFjMGVHajhOc1NmKzNHSHhUd1ZBdHh3T2xFa3pueExFK2RaQURENDlESlNHOUIvRm5HLzBnNkxHZk94U1dSawpKM2lRQVVUcmlWUktjSXhCbVllL0JVeHR5Zmt3RXYzV2pjN1c1TE1SelQ4N3BsamQyaTRqeTFmeFNxWENIOVd5CnRCdXRDZEkzMVVjUWRaOWpyUHlkQ3k1ZUpuZzA4N3BIU012c1ZIdi9DRFAzYWthNUhRVS90Q01FUnNhRkpLaVMKbDJxZUdpNno1ZzQwbzl3ZDNzMHNCYVBlUHRaN2RVWT0KLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQo= +type: kubernetes.io/tls +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: app1 + labels: + app: app1 +spec: + replicas: 1 + selector: + matchLabels: + app: app1 + template: + metadata: + labels: + app: app1 + spec: + containers: + - name: app1 + image: tutum/hello-world + ports: + - containerPort: 80 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: app2 + labels: + app: app2 +spec: + replicas: 1 + selector: + matchLabels: + app: app2 + template: + metadata: + labels: + app: app2 + spec: + containers: + - name: app2 + image: tutum/hello-world + ports: + - containerPort: 80 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: app3 + labels: + app: app3 +spec: + replicas: 1 + selector: + matchLabels: + app: app3 + template: + metadata: + labels: + app: app3 + spec: + containers: + - name: app3 + image: tutum/hello-world + ports: + - containerPort: 80 +--- +apiVersion: v1 +kind: Service +metadata: + name: svc-app1 +spec: + selector: + app: app1 + ports: + - protocol: TCP + port: 80 + targetPort: 80 +--- +apiVersion: v1 +kind: Service +metadata: + name: svc-app2 +spec: + selector: + app: app2 + ports: + - protocol: TCP + port: 80 + targetPort: 80 +--- +apiVersion: v1 +kind: Service +metadata: + name: svc-app3 +spec: + selector: + app: app3 + ports: + - protocol: TCP + port: 80 + targetPort: 80 diff --git a/examples/kubernetes-tls/tests.json b/examples/kubernetes-tls/tests.json new file mode 100644 index 000000000..031368a2a --- /dev/null +++ b/examples/kubernetes-tls/tests.json @@ -0,0 +1,26 @@ +{ + "name": "kubernetes-ingress", + "kinds": ["kubernetes"], + "timeout": 60, + "delay": 60, + "tests": [ + { + "type": "string", + "url": "https://app1.example.com", + "string": "hello", + "tls": "app1.example.com,app2.example.com" + }, + { + "type": "string", + "url": "https://app2.example.com", + "string": "hello", + "tls": "app1.example.com,app2.example.com" + }, + { + "type": "string", + "url": "https://app3.example.com", + "string": "hello", + "tls": "app3.example.com" + } + ] +} diff --git a/examples/load-balancer/docker-compose.yml b/examples/load-balancer/docker-compose.yml index ed28df749..38de0214a 100644 --- a/examples/load-balancer/docker-compose.yml +++ b/examples/load-balancer/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -31,7 +31,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/load-balancer/tests.json b/examples/load-balancer/tests.json index a64188350..2191f2994 100644 --- a/examples/load-balancer/tests.json +++ b/examples/load-balancer/tests.json @@ -7,7 +7,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "hello" + "string": "hello", + "tls": "www.example.com" } ] } diff --git a/examples/magento/docker-compose.yml b/examples/magento/docker-compose.yml index 73a0eb873..321964b6e 100644 --- a/examples/magento/docker-compose.yml +++ b/examples/magento/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -29,7 +29,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/magento/tests.json b/examples/magento/tests.json index eb8e10491..27b759f53 100644 --- a/examples/magento/tests.json +++ b/examples/magento/tests.json @@ -8,7 +8,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "magento" + "string": "magento", + "tls": "www.example.com" } ] } diff --git a/examples/mattermost/docker-compose.yml b/examples/mattermost/docker-compose.yml index 832a3514e..f6b965ef6 100644 --- a/examples/mattermost/docker-compose.yml +++ b/examples/mattermost/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -44,7 +44,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/mattermost/tests.json b/examples/mattermost/tests.json index 677272a67..749ea3955 100644 --- a/examples/mattermost/tests.json +++ b/examples/mattermost/tests.json @@ -7,7 +7,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "mattermost" + "string": "mattermost", + "tls": "www.example.com" } ] } diff --git a/examples/mongo-express/docker-compose.yml b/examples/mongo-express/docker-compose.yml index cb5c1b099..971e4a40f 100644 --- a/examples/mongo-express/docker-compose.yml +++ b/examples/mongo-express/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -27,7 +27,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/mongo-express/tests.json b/examples/mongo-express/tests.json index ff82bce43..968f1d5fc 100644 --- a/examples/mongo-express/tests.json +++ b/examples/mongo-express/tests.json @@ -8,7 +8,8 @@ { "type": "status", "url": "https://www.example.com", - "status": 401 + "status": 401, + "tls": "www.example.com" } ] } diff --git a/examples/moodle/docker-compose.yml b/examples/moodle/docker-compose.yml index 7c1de8d6d..82537f2db 100644 --- a/examples/moodle/docker-compose.yml +++ b/examples/moodle/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -25,7 +25,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/moodle/tests.json b/examples/moodle/tests.json index 580a2fcc7..135f89925 100644 --- a/examples/moodle/tests.json +++ b/examples/moodle/tests.json @@ -7,7 +7,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "moodle" + "string": "moodle", + "tls": "www.example.com" } ] } diff --git a/examples/nextcloud/docker-compose.yml b/examples/nextcloud/docker-compose.yml index 1f994ff57..4950ee02b 100644 --- a/examples/nextcloud/docker-compose.yml +++ b/examples/nextcloud/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -54,7 +54,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/nextcloud/tests.json b/examples/nextcloud/tests.json index e6847a0bf..b93006fde 100644 --- a/examples/nextcloud/tests.json +++ b/examples/nextcloud/tests.json @@ -8,7 +8,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "nextcloud" + "string": "nextcloud", + "tls": "www.example.com" } ] } diff --git a/examples/passbolt/docker-compose.yml b/examples/passbolt/docker-compose.yml index dd1d4f8b0..0aea7c38c 100644 --- a/examples/passbolt/docker-compose.yml +++ b/examples/passbolt/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -26,7 +26,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/passbolt/tests.json b/examples/passbolt/tests.json index 952a214c7..e8ba50c57 100644 --- a/examples/passbolt/tests.json +++ b/examples/passbolt/tests.json @@ -6,7 +6,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "passbolt" + "string": "passbolt", + "tls": "www.example.com" } ] } diff --git a/examples/php-cookie-flags/docker-compose.yml b/examples/php-cookie-flags/docker-compose.yml index 707fb57ae..4858d5c49 100644 --- a/examples/php-cookie-flags/docker-compose.yml +++ b/examples/php-cookie-flags/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -31,7 +31,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/php-multisite/docker-compose.yml b/examples/php-multisite/docker-compose.yml index 6a6fb38f5..46bc2da66 100644 --- a/examples/php-multisite/docker-compose.yml +++ b/examples/php-multisite/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -34,7 +34,7 @@ services: - net-app2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/php-multisite/tests.json b/examples/php-multisite/tests.json index 8181d1938..f49238822 100644 --- a/examples/php-multisite/tests.json +++ b/examples/php-multisite/tests.json @@ -6,12 +6,14 @@ { "type": "string", "url": "https://app1.example.com", - "string": "app1" + "string": "app1", + "tls": "app1.example.com" }, { "type": "string", "url": "https://app2.example.com", - "string": "app2" + "string": "app2", + "tls": "app2.example.com" } ] } diff --git a/examples/php-singlesite/docker-compose.yml b/examples/php-singlesite/docker-compose.yml index 8056a499b..a1844704b 100644 --- a/examples/php-singlesite/docker-compose.yml +++ b/examples/php-singlesite/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -30,7 +30,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/php-singlesite/tests.json b/examples/php-singlesite/tests.json index b2e929ede..dcaa9a5d1 100644 --- a/examples/php-singlesite/tests.json +++ b/examples/php-singlesite/tests.json @@ -6,7 +6,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "hello" + "string": "hello", + "tls": "www.example.com" } ] } diff --git a/examples/prestashop/docker-compose.yml b/examples/prestashop/docker-compose.yml index 8cdab700f..5214c6728 100644 --- a/examples/prestashop/docker-compose.yml +++ b/examples/prestashop/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -28,7 +28,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/prestashop/tests.json b/examples/prestashop/tests.json index 073d74a36..354b54baf 100644 --- a/examples/prestashop/tests.json +++ b/examples/prestashop/tests.json @@ -7,7 +7,8 @@ { "type": "string", "url": "https://www.example.com/administration", - "string": "prestashop" + "string": "prestashop", + "tls": "www.example.com" } ] } diff --git a/examples/proxy-protocol/docker-compose.yml b/examples/proxy-protocol/docker-compose.yml index 3e3a08daa..c728f707b 100644 --- a/examples/proxy-protocol/docker-compose.yml +++ b/examples/proxy-protocol/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 environment: - SERVER_NAME=www.example.com # replace with your domains - API_WHITELIST_IP=127.0.0.0/8 10.20.30.0/24 @@ -27,7 +27,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/radarr/docker-compose.yml b/examples/radarr/docker-compose.yml index 8f1f8824a..37c87ccbb 100644 --- a/examples/radarr/docker-compose.yml +++ b/examples/radarr/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -34,7 +34,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/radarr/tests.json b/examples/radarr/tests.json index 763183c9c..029d4f1f3 100644 --- a/examples/radarr/tests.json +++ b/examples/radarr/tests.json @@ -7,7 +7,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "radarr" + "string": "radarr", + "tls": "www.example.com" } ] } diff --git a/examples/redmine/docker-compose.yml b/examples/redmine/docker-compose.yml index 2d73e8c3f..0b7ff3aeb 100644 --- a/examples/redmine/docker-compose.yml +++ b/examples/redmine/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -24,7 +24,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/redmine/tests.json b/examples/redmine/tests.json index bd20684e3..20f255049 100644 --- a/examples/redmine/tests.json +++ b/examples/redmine/tests.json @@ -7,7 +7,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "redmine" + "string": "redmine", + "tls": "www.example.com" } ] } diff --git a/examples/reverse-proxy-multisite/docker-compose.yml b/examples/reverse-proxy-multisite/docker-compose.yml index b749dcfc1..f72ce535d 100644 --- a/examples/reverse-proxy-multisite/docker-compose.yml +++ b/examples/reverse-proxy-multisite/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -27,7 +27,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/reverse-proxy-multisite/tests.json b/examples/reverse-proxy-multisite/tests.json index ec5a029ab..1cb634231 100644 --- a/examples/reverse-proxy-multisite/tests.json +++ b/examples/reverse-proxy-multisite/tests.json @@ -7,12 +7,14 @@ { "type": "string", "url": "https://app1.example.com", - "string": "hello" + "string": "hello", + "tls": "app1.example.com" }, { "type": "string", "url": "https://app2.example.com", - "string": "hello" + "string": "hello", + "tls": "app2.example.com" } ] } diff --git a/examples/reverse-proxy-singlesite/docker-compose.yml b/examples/reverse-proxy-singlesite/docker-compose.yml index 92d717867..7d877008b 100644 --- a/examples/reverse-proxy-singlesite/docker-compose.yml +++ b/examples/reverse-proxy-singlesite/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -32,7 +32,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/reverse-proxy-singlesite/tests.json b/examples/reverse-proxy-singlesite/tests.json index 43d9c6fd7..3acf24671 100644 --- a/examples/reverse-proxy-singlesite/tests.json +++ b/examples/reverse-proxy-singlesite/tests.json @@ -8,12 +8,14 @@ { "type": "string", "url": "https://www.example.com/app1", - "string": "hello" + "string": "hello", + "tls": "www.example.com" }, { "type": "string", "url": "https://www.example.com/app2", - "string": "hello" + "string": "hello", + "tls": "www.example.com" } ] } diff --git a/examples/reverse-proxy-websocket/docker-compose.yml b/examples/reverse-proxy-websocket/docker-compose.yml index 42955a53a..c7571a0c5 100644 --- a/examples/reverse-proxy-websocket/docker-compose.yml +++ b/examples/reverse-proxy-websocket/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -25,7 +25,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/stream-multisite/docker-compose.yml b/examples/stream-multisite/docker-compose.yml index 909fbc298..d8285efe8 100644 --- a/examples/stream-multisite/docker-compose.yml +++ b/examples/stream-multisite/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 # required to resolve let's encrypt challenges - 10000:10000 # app1 without SSL/TLS @@ -33,7 +33,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/swarm-configs/tests.json b/examples/swarm-configs/tests.json index 36e8be26a..53c474dae 100644 --- a/examples/swarm-configs/tests.json +++ b/examples/swarm-configs/tests.json @@ -6,32 +6,38 @@ { "type": "string", "url": "https://app1.example.com/app1", - "string": "app1" + "string": "app1", + "tls": "app1.example.com" }, { "type": "string", "url": "https://app2.example.com/app2", - "string": "app2" + "string": "app2", + "tls": "app2.example.com" }, { "type": "string", "url": "https://app3.example.com/app3", - "string": "app3" + "string": "app3", + "tls": "app3.example.com" }, { "type": "string", "url": "https://app1.example.com/hello", - "string": "hello" + "string": "hello", + "tls": "app1.example.com" }, { "type": "string", "url": "https://app2.example.com/hello", - "string": "hello" + "string": "hello", + "tls": "app2.example.com" }, { "type": "string", "url": "https://app3.example.com/hello", - "string": "hello" + "string": "hello", + "tls": "app3.example.com" } ] } diff --git a/examples/syslog/docker-compose.yml b/examples/syslog/docker-compose.yml index 02a57b19a..f4bd910fd 100644 --- a/examples/syslog/docker-compose.yml +++ b/examples/syslog/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 logging: driver: syslog options: @@ -28,7 +28,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 logging: driver: syslog options: diff --git a/examples/tomcat/docker-compose.yml b/examples/tomcat/docker-compose.yml index 663c1c7b8..7301d35ca 100644 --- a/examples/tomcat/docker-compose.yml +++ b/examples/tomcat/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -23,7 +23,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/tomcat/tests.json b/examples/tomcat/tests.json index cd5550005..fe413a747 100644 --- a/examples/tomcat/tests.json +++ b/examples/tomcat/tests.json @@ -6,7 +6,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "tomcat" + "string": "tomcat", + "tls": "www.example.com" } ] } diff --git a/examples/tor-hidden-service/docker-compose.yml b/examples/tor-hidden-service/docker-compose.yml index 747691aaf..410c424cb 100644 --- a/examples/tor-hidden-service/docker-compose.yml +++ b/examples/tor-hidden-service/docker-compose.yml @@ -12,7 +12,7 @@ services: - bw-universe mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 environment: - API_WHITELIST_IP=127.0.0.0/8 10.20.30.0/24 # disable common security measures based on IP @@ -34,7 +34,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/web-ui/docker-compose.wizard.yml b/examples/web-ui/docker-compose.wizard.yml index be275cdaa..7e4e46a5a 100644 --- a/examples/web-ui/docker-compose.wizard.yml +++ b/examples/web-ui/docker-compose.wizard.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -23,7 +23,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -45,7 +45,7 @@ services: - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 depends_on: - bw-docker environment: diff --git a/examples/web-ui/docker-compose.yml b/examples/web-ui/docker-compose.yml index 92d2a6420..9b8c67b97 100644 --- a/examples/web-ui/docker-compose.yml +++ b/examples/web-ui/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -27,7 +27,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -49,7 +49,7 @@ services: - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 depends_on: - bw-docker environment: diff --git a/examples/wordpress/docker-compose.yml b/examples/wordpress/docker-compose.yml index 0d1245448..8ca362d08 100644 --- a/examples/wordpress/docker-compose.yml +++ b/examples/wordpress/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: mybunker: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -25,7 +25,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - mybunker environment: diff --git a/examples/wordpress/tests.json b/examples/wordpress/tests.json index 5f87a4b3e..1b7450ab5 100644 --- a/examples/wordpress/tests.json +++ b/examples/wordpress/tests.json @@ -8,7 +8,8 @@ { "type": "string", "url": "https://www.example.com", - "string": "wordpress" + "string": "wordpress", + "tls": "www.example.com" } ] } diff --git a/misc/integrations/autoconf.mariadb.ui.yml b/misc/integrations/autoconf.mariadb.ui.yml index 5335b37e1..5092a14f2 100644 --- a/misc/integrations/autoconf.mariadb.ui.yml +++ b/misc/integrations/autoconf.mariadb.ui.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -19,7 +19,7 @@ services: - bw-services bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 depends_on: - bunkerweb - bw-docker @@ -32,7 +32,7 @@ services: - bw-docker bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -67,7 +67,7 @@ services: - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 networks: bw-docker: bw-universe: diff --git a/misc/integrations/autoconf.mariadb.yml b/misc/integrations/autoconf.mariadb.yml index 9e0c33c8d..3177d9579 100644 --- a/misc/integrations/autoconf.mariadb.yml +++ b/misc/integrations/autoconf.mariadb.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -19,7 +19,7 @@ services: - bw-services bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 depends_on: - bunkerweb - bw-docker @@ -32,7 +32,7 @@ services: - bw-docker bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker diff --git a/misc/integrations/autoconf.mysql.ui.yml b/misc/integrations/autoconf.mysql.ui.yml index d6cc02163..83eccac14 100644 --- a/misc/integrations/autoconf.mysql.ui.yml +++ b/misc/integrations/autoconf.mysql.ui.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -19,7 +19,7 @@ services: - bw-services bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 depends_on: - bunkerweb - bw-docker @@ -32,7 +32,7 @@ services: - bw-docker bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -67,7 +67,7 @@ services: - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 networks: bw-docker: bw-universe: diff --git a/misc/integrations/autoconf.mysql.yml b/misc/integrations/autoconf.mysql.yml index 55be5cfe3..9e6ded973 100644 --- a/misc/integrations/autoconf.mysql.yml +++ b/misc/integrations/autoconf.mysql.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -19,7 +19,7 @@ services: - bw-services bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 depends_on: - bunkerweb - bw-docker @@ -32,7 +32,7 @@ services: - bw-docker bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker diff --git a/misc/integrations/autoconf.postgres.ui.yml b/misc/integrations/autoconf.postgres.ui.yml index dcc2df54e..82ff2975a 100644 --- a/misc/integrations/autoconf.postgres.ui.yml +++ b/misc/integrations/autoconf.postgres.ui.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -19,7 +19,7 @@ services: - bw-services bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 depends_on: - bunkerweb - bw-docker @@ -32,7 +32,7 @@ services: - bw-docker bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -66,7 +66,7 @@ services: - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 networks: bw-docker: bw-universe: diff --git a/misc/integrations/autoconf.postgres.yml b/misc/integrations/autoconf.postgres.yml index a549e4b7d..4cdf8b343 100644 --- a/misc/integrations/autoconf.postgres.yml +++ b/misc/integrations/autoconf.postgres.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -19,7 +19,7 @@ services: - bw-services bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 depends_on: - bunkerweb - bw-docker @@ -32,7 +32,7 @@ services: - bw-docker bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker diff --git a/misc/integrations/autoconf.ui.yml b/misc/integrations/autoconf.ui.yml index 93c50cd4c..7519beab9 100644 --- a/misc/integrations/autoconf.ui.yml +++ b/misc/integrations/autoconf.ui.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -18,7 +18,7 @@ services: - bw-services bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 depends_on: - bunkerweb - bw-docker @@ -32,7 +32,7 @@ services: - bw-docker bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -56,7 +56,7 @@ services: - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 networks: bw-docker: bw-universe: diff --git a/misc/integrations/autoconf.yml b/misc/integrations/autoconf.yml index ae808ac24..901ff1487 100644 --- a/misc/integrations/autoconf.yml +++ b/misc/integrations/autoconf.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -18,7 +18,7 @@ services: - bw-services bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 depends_on: - bunkerweb - bw-docker @@ -32,7 +32,7 @@ services: - bw-docker bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker diff --git a/misc/integrations/docker.mariadb.ui.yml b/misc/integrations/docker.mariadb.ui.yml index 1861e829f..e2f9c1e37 100644 --- a/misc/integrations/docker.mariadb.ui.yml +++ b/misc/integrations/docker.mariadb.ui.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -26,7 +26,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -48,7 +48,7 @@ services: - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 depends_on: - bw-docker environment: diff --git a/misc/integrations/docker.mariadb.yml b/misc/integrations/docker.mariadb.yml index 3f6187736..4a13e2201 100644 --- a/misc/integrations/docker.mariadb.yml +++ b/misc/integrations/docker.mariadb.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -17,7 +17,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker diff --git a/misc/integrations/docker.mysql.ui.yml b/misc/integrations/docker.mysql.ui.yml index 7ceedab05..fcd7e3ba6 100644 --- a/misc/integrations/docker.mysql.ui.yml +++ b/misc/integrations/docker.mysql.ui.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -26,7 +26,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -48,7 +48,7 @@ services: - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 depends_on: - bw-docker environment: diff --git a/misc/integrations/docker.mysql.yml b/misc/integrations/docker.mysql.yml index 7e2559f60..27562ee58 100644 --- a/misc/integrations/docker.mysql.yml +++ b/misc/integrations/docker.mysql.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -17,7 +17,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker diff --git a/misc/integrations/docker.postgres.ui.yml b/misc/integrations/docker.postgres.ui.yml index 444b5310c..d05dc00d8 100644 --- a/misc/integrations/docker.postgres.ui.yml +++ b/misc/integrations/docker.postgres.ui.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -27,7 +27,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -49,7 +49,7 @@ services: - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 depends_on: - bw-docker environment: diff --git a/misc/integrations/docker.postgres.yml b/misc/integrations/docker.postgres.yml index 6c720abf7..88afe48f1 100644 --- a/misc/integrations/docker.postgres.yml +++ b/misc/integrations/docker.postgres.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -17,7 +17,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker diff --git a/misc/integrations/docker.ui.yml b/misc/integrations/docker.ui.yml index 900457ce1..c008e038e 100644 --- a/misc/integrations/docker.ui.yml +++ b/misc/integrations/docker.ui.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -22,7 +22,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker @@ -45,7 +45,7 @@ services: - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 depends_on: - bw-docker volumes: diff --git a/misc/integrations/docker.yml b/misc/integrations/docker.yml index 230e5f453..3ac298aac 100644 --- a/misc/integrations/docker.yml +++ b/misc/integrations/docker.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - 80:8080 - 443:8443 @@ -16,7 +16,7 @@ services: - bw-services bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 depends_on: - bunkerweb - bw-docker diff --git a/misc/integrations/k8s.mariadb.ui.yml b/misc/integrations/k8s.mariadb.ui.yml index 54622931a..7880a9137 100644 --- a/misc/integrations/k8s.mariadb.ui.yml +++ b/misc/integrations/k8s.mariadb.ui.yml @@ -4,7 +4,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] @@ -48,7 +48,7 @@ spec: containers: # using bunkerweb as name is mandatory - name: bunkerweb - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 imagePullPolicy: Always securityContext: runAsUser: 101 @@ -118,7 +118,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-controller - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -145,7 +145,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-scheduler - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -230,7 +230,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-ui - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 imagePullPolicy: Always env: - name: ADMIN_USERNAME diff --git a/misc/integrations/k8s.mariadb.yml b/misc/integrations/k8s.mariadb.yml index 7d5f4c1c2..565a576f8 100644 --- a/misc/integrations/k8s.mariadb.yml +++ b/misc/integrations/k8s.mariadb.yml @@ -4,7 +4,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] @@ -48,7 +48,7 @@ spec: containers: # using bunkerweb as name is mandatory - name: bunkerweb - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 imagePullPolicy: Always securityContext: runAsUser: 101 @@ -118,7 +118,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-controller - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -145,7 +145,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-scheduler - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE diff --git a/misc/integrations/k8s.mysql.ui.yml b/misc/integrations/k8s.mysql.ui.yml index 8b2ec3222..3b84b391a 100644 --- a/misc/integrations/k8s.mysql.ui.yml +++ b/misc/integrations/k8s.mysql.ui.yml @@ -4,7 +4,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] @@ -48,7 +48,7 @@ spec: containers: # using bunkerweb as name is mandatory - name: bunkerweb - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 imagePullPolicy: Always securityContext: runAsUser: 101 @@ -118,7 +118,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-controller - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -145,7 +145,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-scheduler - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -230,7 +230,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-ui - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 imagePullPolicy: Always env: - name: ADMIN_USERNAME diff --git a/misc/integrations/k8s.mysql.yml b/misc/integrations/k8s.mysql.yml index 7c01dc5d9..d8810eefc 100644 --- a/misc/integrations/k8s.mysql.yml +++ b/misc/integrations/k8s.mysql.yml @@ -4,7 +4,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] @@ -48,7 +48,7 @@ spec: containers: # using bunkerweb as name is mandatory - name: bunkerweb - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 imagePullPolicy: Always securityContext: runAsUser: 101 @@ -118,7 +118,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-controller - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -144,7 +144,7 @@ spec: spec: containers: - name: bunkerweb-controller - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE diff --git a/misc/integrations/k8s.postgres.ui.yml b/misc/integrations/k8s.postgres.ui.yml index cb165bb00..15df179d4 100644 --- a/misc/integrations/k8s.postgres.ui.yml +++ b/misc/integrations/k8s.postgres.ui.yml @@ -4,7 +4,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] @@ -48,7 +48,7 @@ spec: containers: # using bunkerweb as name is mandatory - name: bunkerweb - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 imagePullPolicy: Always securityContext: runAsUser: 101 @@ -118,7 +118,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-controller - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -145,7 +145,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-scheduler - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -230,7 +230,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-ui - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 imagePullPolicy: Always env: - name: ADMIN_USERNAME diff --git a/misc/integrations/k8s.postgres.yml b/misc/integrations/k8s.postgres.yml index 69df9178d..ae1616ca8 100644 --- a/misc/integrations/k8s.postgres.yml +++ b/misc/integrations/k8s.postgres.yml @@ -4,7 +4,7 @@ metadata: name: cr-bunkerweb rules: - apiGroups: [""] - resources: ["services", "pods", "configmaps"] + resources: ["services", "pods", "configmaps", "secrets"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] @@ -48,7 +48,7 @@ spec: containers: # using bunkerweb as name is mandatory - name: bunkerweb - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 imagePullPolicy: Always securityContext: runAsUser: 101 @@ -118,7 +118,7 @@ spec: serviceAccountName: sa-bunkerweb containers: - name: bunkerweb-controller - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE @@ -144,7 +144,7 @@ spec: spec: containers: - name: bunkerweb-controller - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 imagePullPolicy: Always env: - name: KUBERNETES_MODE diff --git a/misc/integrations/swarm.mariadb.ui.yml b/misc/integrations/swarm.mariadb.ui.yml index 7125aca65..1b0c42a09 100644 --- a/misc/integrations/swarm.mariadb.ui.yml +++ b/misc/integrations/swarm.mariadb.ui.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - published: 80 target: 8080 @@ -32,7 +32,7 @@ services: - "bunkerweb.INSTANCE=yes" bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -60,7 +60,7 @@ services: - "node.role == manager" bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -87,7 +87,7 @@ services: - bw-universe bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 environment: - DATABASE_URI=mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db # Remember to set a stronger password for the database - DOCKER_HOST=tcp://bw-docker:2375 diff --git a/misc/integrations/swarm.mariadb.yml b/misc/integrations/swarm.mariadb.yml index 4077453e9..0bba3238f 100644 --- a/misc/integrations/swarm.mariadb.yml +++ b/misc/integrations/swarm.mariadb.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - published: 80 target: 8080 @@ -32,7 +32,7 @@ services: - "bunkerweb.INSTANCE=yes" bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -64,7 +64,7 @@ services: - "node.role == manager" bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 diff --git a/misc/integrations/swarm.mysql.ui.yml b/misc/integrations/swarm.mysql.ui.yml index a806ca77c..f3e2b2060 100644 --- a/misc/integrations/swarm.mysql.ui.yml +++ b/misc/integrations/swarm.mysql.ui.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - published: 80 target: 8080 @@ -32,7 +32,7 @@ services: - "bunkerweb.INSTANCE=yes" bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -60,7 +60,7 @@ services: - "node.role == manager" bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -87,7 +87,7 @@ services: - bw-universe bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 environment: - DATABASE_URI=mariadb+pymysql://bunkerweb:changeme@bw-db:3306/db # Remember to set a stronger password for the database - DOCKER_HOST=tcp://bw-docker:2375 diff --git a/misc/integrations/swarm.mysql.yml b/misc/integrations/swarm.mysql.yml index 68cef9d81..5296400de 100644 --- a/misc/integrations/swarm.mysql.yml +++ b/misc/integrations/swarm.mysql.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - published: 80 target: 8080 @@ -32,7 +32,7 @@ services: - "bunkerweb.INSTANCE=yes" bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -60,7 +60,7 @@ services: - "node.role == manager" bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 diff --git a/misc/integrations/swarm.postgres.ui.yml b/misc/integrations/swarm.postgres.ui.yml index 959217606..3c40b6372 100644 --- a/misc/integrations/swarm.postgres.ui.yml +++ b/misc/integrations/swarm.postgres.ui.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - published: 80 target: 8080 @@ -32,7 +32,7 @@ services: - "bunkerweb.INSTANCE=yes" bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -60,7 +60,7 @@ services: - "node.role == manager" bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -86,7 +86,7 @@ services: - bw-universe bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 environment: - DATABASE_URI=postgresql://bunkerweb:changeme@bw-db:5432/db - DOCKER_HOST=tcp://bw-docker:2375 diff --git a/misc/integrations/swarm.postgres.yml b/misc/integrations/swarm.postgres.yml index f244d0fac..e979b5d60 100644 --- a/misc/integrations/swarm.postgres.yml +++ b/misc/integrations/swarm.postgres.yml @@ -2,7 +2,7 @@ version: "3.5" services: bunkerweb: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 ports: - published: 80 target: 8080 @@ -32,7 +32,7 @@ services: - "bunkerweb.INSTANCE=yes" bw-autoconf: - image: bunkerity/bunkerweb-autoconf:1.5.4 + image: bunkerity/bunkerweb-autoconf:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 @@ -60,7 +60,7 @@ services: - "node.role == manager" bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 environment: - SWARM_MODE=yes - DOCKER_HOST=tcp://bw-docker:2375 diff --git a/misc/logo.ascii b/misc/logo.ascii index 4a7126cbd..964309ee9 100644 --- a/misc/logo.ascii +++ b/misc/logo.ascii @@ -1,12 +1,12 @@ -β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ -β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ -β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ -β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ -β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ -β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ -β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ -β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ -β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ -β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ -β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ +β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ +β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ +β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ +β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ +β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ +β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ +β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ +β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ +β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ +β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ +β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„β–„ diff --git a/misc/logo.png b/misc/logo.png index b4f39d0da..18d95f3d7 100644 Binary files a/misc/logo.png and b/misc/logo.png differ diff --git a/misc/requirements-ansible.txt b/misc/requirements-ansible.txt index 0f99812f9..40f7cf1bc 100644 --- a/misc/requirements-ansible.txt +++ b/misc/requirements-ansible.txt @@ -8,9 +8,9 @@ ansible==8.6.1 \ --hash=sha256:18b397580c1f05ce5de1fe238508dd81218d278667956d2f7709320176c3ed4a \ --hash=sha256:222735c32d2d2749f207e55ef740638bb97c7aaaa8b63bb7c7592d447da47584 # via -r requirements-ansible.in -ansible-core==2.15.7 \ - --hash=sha256:8a7988b8fbd1f4bb5799becae120b828de6248ba9056d83f427235533d655e2b \ - --hash=sha256:bc51d011bdb67538d1ee043e0f8072b3a849b78897caf15b6f294160c5c7c6ba +ansible-core==2.15.8 \ + --hash=sha256:55e6f4350fb98ac5441620ba981b1d9f7b90aa5f320885965af996e149bd3caa \ + --hash=sha256:8aa49cb1ddbf33d88c2bb4bf09ecd4b0dd8b788e174adca8b88dda6e6bdbf59b # via ansible cffi==1.16.0 \ --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ diff --git a/mkdocs.yml b/mkdocs.yml index 34cc46cd3..6d6fcdcd6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,14 +1,14 @@ -site_name: BunkerWeb +site_name: BunkerWeb documentation site_url: https://docs.bunkerweb.io/ repo_url: https://github.com/bunkerity/bunkerweb -site_description: Make your web services secure by default. +site_description: Documentation of BunkerWeb, the open source and next generation WAF. copyright: Copyright © Bunkerity #remote_branch: ? #remote_name: ? nav: - Introduction: 'index.md' - - Migrating from 1.4.X: 'migrating.md' + - Migrating: 'migrating.md' - Concepts: 'concepts.md' - Integrations: 'integrations.md' - Quickstart guide: 'quickstart-guide.md' @@ -17,6 +17,7 @@ nav: - Web UI: 'web-ui.md' - Troubleshooting: 'troubleshooting.md' - Plugins: 'plugins.md' + - Professional services: 'professional-services.md' - About: 'about.md' theme: @@ -67,6 +68,10 @@ extra: plugins: - search - - print-site + - social: + cards_layout_options: + background_color: "#0b5577" + color: "white" - mike: canonical_version: latest + - print-site diff --git a/pyproject.toml b/pyproject.toml index 3cd3cfebe..cd43cb32f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "BunkerWeb" description = "Make your web services secure by default !" -version = "1.5.4" +version = "1.5.5" authors = [ { name = "Bunkerity", email = "contact@bunkerity.com" } ] diff --git a/src/VERSION b/src/VERSION index 63ebd3fe3..5ebba4f08 100644 --- a/src/VERSION +++ b/src/VERSION @@ -1 +1 @@ -1.5.4 \ No newline at end of file +1.5.5 \ No newline at end of file diff --git a/src/autoconf/Config.py b/src/autoconf/Config.py index 23f5a81a2..edf0bb60e 100644 --- a/src/autoconf/Config.py +++ b/src/autoconf/Config.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from os import getenv from time import sleep diff --git a/src/autoconf/Controller.py b/src/autoconf/Controller.py index 8754ea07f..616793c03 100644 --- a/src/autoconf/Controller.py +++ b/src/autoconf/Controller.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from abc import abstractmethod from os import getenv diff --git a/src/autoconf/DockerController.py b/src/autoconf/DockerController.py index 491850baf..4529e176d 100644 --- a/src/autoconf/DockerController.py +++ b/src/autoconf/DockerController.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from typing import Any, Dict, List from docker import DockerClient diff --git a/src/autoconf/Dockerfile b/src/autoconf/Dockerfile index b757f9031..65330ff4b 100644 --- a/src/autoconf/Dockerfile +++ b/src/autoconf/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 AS builder +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 AS builder # Copy python requirements COPY src/deps/requirements.txt /tmp/requirements-deps.txt @@ -34,7 +34,7 @@ COPY src/common/helpers helpers COPY src/common/settings.json settings.json COPY src/common/utils utils -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Set default umask to prevent huge recursive chmod increasing the final image size RUN umask 027 diff --git a/src/autoconf/IngressController.py b/src/autoconf/IngressController.py index cbfb9621e..2e9db4a77 100644 --- a/src/autoconf/IngressController.py +++ b/src/autoconf/IngressController.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from time import sleep from traceback import format_exc @@ -121,10 +121,6 @@ class IngressController(Controller): location += 1 services.append(service) - # parse tls - if controller_service.spec.tls: # TODO: support tls - self._logger.warning("Ignoring unsupported tls.") - # parse annotations if controller_service.metadata.annotations: for service in services: @@ -142,6 +138,36 @@ class IngressController(Controller): variable = variable.replace(f"{server_name}_", "", 1) if self._is_setting_context(variable, "multisite"): service[variable] = value + + # parse tls + if controller_service.spec.tls: + for tls in controller_service.spec.tls: + if tls.hosts and tls.secret_name: + for host in tls.hosts: + for service in services: + if host in service["SERVER_NAME"].split(" "): + secret_tls = self.__corev1.list_secret_for_all_namespaces( + watch=False, + field_selector=f"metadata.name={tls.secret_name},metadata.namespace={namespace}", + ).items + if not secret_tls: + self._logger.warning( + f"Ignoring tls setting for {host} : secret {tls.secret_name} not found.", + ) + break + if not secret_tls.data: + self._logger.warning( + f"Ignoring tls setting for {host} : secret {tls.secret_name} contains no data.", + ) + break + if "tls.crt" not in secret_tls.data or "tls.key" not in secret_tls.data: + self._logger.warning( + f"Ignoring tls setting for {host} : secret {tls.secret_name} is missing tls data.", + ) + break + service["USE_CUSTOM_SSL"] = "yes" + service["CUSTOM_SSL_CERT_DATA"] = secret_tls.data["tls.crt"] + service["CUSTOM_SSL_KEY_DATA"] = secret_tls.data["tls.key"] return services def _get_static_services(self) -> List[dict]: diff --git a/src/autoconf/SwarmController.py b/src/autoconf/SwarmController.py index 8772b320f..d0976620b 100644 --- a/src/autoconf/SwarmController.py +++ b/src/autoconf/SwarmController.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from time import sleep from traceback import format_exc diff --git a/src/autoconf/main.py b/src/autoconf/main.py index c70e27307..042f4fd7a 100644 --- a/src/autoconf/main.py +++ b/src/autoconf/main.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from os import _exit, getenv, sep from os.path import join diff --git a/src/bw/lua/bunkerweb/api.lua b/src/bw/lua/bunkerweb/api.lua index 6e969343d..9c2f9a2a8 100644 --- a/src/bw/lua/bunkerweb/api.lua +++ b/src/bw/lua/bunkerweb/api.lua @@ -1,7 +1,10 @@ +local ngx = ngx +local ngx_req = ngx.req +local cdatastore = require "bunkerweb.datastore" local cjson = require "cjson" local class = require "middleclass" -local datastore = require "bunkerweb.datastore" -local logger = require "bunkerweb.logger" +local clogger = require "bunkerweb.logger" +local helpers = require "bunkerweb.helpers" local process = require "ngx.process" local rsignal = require "resty.signal" local upload = require "resty.upload" @@ -9,16 +12,41 @@ local utils = require "bunkerweb.utils" local api = class("api") +local datastore = cdatastore:new() +local logger = clogger:new("API") + +local get_variable = utils.get_variable +local is_ip_in_networks = utils.is_ip_in_networks +-- local run = shell.run +local NOTICE = ngx.NOTICE +local ERR = ngx.ERR +local HTTP_OK = ngx.HTTP_OK +local HTTP_INTERNAL_SERVER_ERROR = ngx.HTTP_INTERNAL_SERVER_ERROR +local HTTP_BAD_REQUEST = ngx.HTTP_BAD_REQUEST +local HTTP_NOT_FOUND = ngx.HTTP_NOT_FOUND +local kill = rsignal.kill +local get_master_pid = process.get_master_pid +local execute = os.execute +local open = io.open +local read_body = ngx_req.read_body +local get_body_data = ngx_req.get_body_data +local get_body_file = ngx_req.get_body_file +local decode = cjson.decode +local encode = cjson.encode +local floor = math.floor +local match = string.match +local require_plugin = helpers.require_plugin +local new_plugin = helpers.new_plugin +local call_plugin = helpers.call_plugin + api.global = { GET = {}, POST = {}, PUT = {}, DELETE = {} } -function api:initialize() - self.datastore = datastore:new() - self.logger = logger:new("API") - self.ctx = ngx.ctx - local data, err = utils.get_variable("API_WHITELIST_IP", false) +function api:initialize(ctx) + self.ctx = ctx + local data, err = get_variable("API_WHITELIST_IP", false) self.ips = {} if not data then - self.logger.log(ngx.ERR, "can't get API_WHITELIST_IP variable : " .. err) + logger:log(ERR, "can't get API_WHITELIST_IP variable : " .. err) else for ip in data:gmatch("%S+") do table.insert(self.ips, ip) @@ -28,23 +56,23 @@ end -- luacheck: ignore 212 function api:log_cmd(cmd, status, stdout, stderr) - local level = ngx.NOTICE + local level = NOTICE local prefix = "success" if status ~= 0 then - level = ngx.ERR + level = ERR prefix = "error" end - self.logger:log(level, prefix .. " while running command " .. cmd) - self.logger:log(level, "stdout = " .. stdout) - self.logger:log(level, "stdout = " .. stderr) + logger:log(level, prefix .. " while running command " .. cmd) + logger:log(level, "stdout = " .. stdout) + logger:log(level, "stdout = " .. stderr) end -- TODO : use this if we switch to OpenResty function api:cmd(cmd) -- Non-blocking command -- luacheck: ignore 113 - local ok, stdout, stderr, reason, status = shell.run(cmd, nil, 10000) - self.logger:log_cmd(cmd, status, stdout, stderr) + local ok, stdout, stderr, reason, status = run(cmd, nil, 10000) + self:log_cmd(cmd, status, stdout, stderr) -- Timeout if ok == nil then return nil, reason @@ -62,25 +90,30 @@ function api:response(http_status, api_status, msg) end api.global.GET["^/ping$"] = function(self) - return self:response(ngx.HTTP_OK, "success", "pong") + return self:response(HTTP_OK, "success", "pong") end api.global.POST["^/reload$"] = function(self) - -- Send HUP signal to master process - local ok, err = rsignal.kill(process.get_master_pid(), "HUP") - if not ok then - return self:response(ngx.HTTP_INTERNAL_SERVER_ERROR, "error", "err = " .. err) + -- Check config + local status = execute("nginx -t") + if status ~= 0 then + return self:response(HTTP_INTERNAL_SERVER_ERROR, "error", "config check failed") end - return self:response(ngx.HTTP_OK, "success", "reload successful") + -- Send HUP signal to master process + local ok, err = kill(get_master_pid(), "HUP") + if not ok then + return self:response(HTTP_INTERNAL_SERVER_ERROR, "error", "err = " .. err) + end + return self:response(HTTP_OK, "success", "reload successful") end api.global.POST["^/stop$"] = function(self) -- Send QUIT signal to master process - local ok, err = rsignal.kill(process.get_master_pid(), "QUIT") + local ok, err = kill(get_master_pid(), "QUIT") if not ok then - return self:response(ngx.HTTP_INTERNAL_SERVER_ERROR, "error", "err = " .. err) + return self:response(HTTP_INTERNAL_SERVER_ERROR, "error", "err = " .. err) end - return self:response(ngx.HTTP_OK, "success", "stop successful") + return self:response(HTTP_OK, "success", "stop successful") end api.global.POST["^/confs$"] = function(self) @@ -99,16 +132,19 @@ api.global.POST["^/confs$"] = function(self) end local form, err = upload:new(4096) if not form then - return self:response(ngx.HTTP_BAD_REQUEST, "error", err) + return self:response(HTTP_BAD_REQUEST, "error", err) end form:set_timeout(1000) - local file = io.open(tmp, "w+") + local file, err = open(tmp, "w+") + if not file then + return self:response(HTTP_INTERNAL_SERVER_ERROR, "error", err) + end while true do -- luacheck: ignore 421 local typ, res, err = form:read() if not typ then file:close() - return self:response(ngx.HTTP_BAD_REQUEST, "error", err) + return self:response(HTTP_BAD_REQUEST, "error", err) end if typ == "eof" then break @@ -124,12 +160,12 @@ api.global.POST["^/confs$"] = function(self) "tar xzf " .. tmp .. " -C " .. destination, } for _, cmd in ipairs(cmds) do - local status = os.execute(cmd) + local status = execute(cmd) if status ~= 0 then - return self:response(ngx.HTTP_INTERNAL_SERVER_ERROR, "error", "exit status = " .. tostring(status)) + return self:response(HTTP_INTERNAL_SERVER_ERROR, "error", "exit status = " .. tostring(status)) end end - return self:response(ngx.HTTP_OK, "success", "saved data at " .. destination) + return self:response(HTTP_OK, "success", "saved data at " .. destination) end api.global.POST["^/data$"] = api.global.POST["^/confs$"] @@ -141,80 +177,86 @@ api.global.POST["^/custom_configs$"] = api.global.POST["^/confs$"] api.global.POST["^/plugins$"] = api.global.POST["^/confs$"] api.global.POST["^/unban$"] = function(self) - ngx.req.read_body() - local data = ngx.req.get_body_data() + read_body() + local data = get_body_data() if not data then - local data_file = ngx.req.get_body_file() + local data_file = get_body_file() if data_file then - local file = io.open(data_file) + local file, err = open(data_file) + if not file then + return self:response(HTTP_INTERNAL_SERVER_ERROR, "error", err) + end data = file:read("*a") file:close() end end - local ok, ip = pcall(cjson.decode, data) + local ok, ip = pcall(decode, data) if not ok then - return self:response(ngx.HTTP_INTERNAL_SERVER_ERROR, "error", "can't decode JSON : " .. ip) + return self:response(HTTP_INTERNAL_SERVER_ERROR, "error", "can't decode JSON : " .. ip) end - self.datastore:delete("bans_ip_" .. ip["ip"]) - return self:response(ngx.HTTP_OK, "success", "ip " .. ip["ip"] .. " unbanned") + datastore:delete("bans_ip_" .. ip["ip"]) + return self:response(HTTP_OK, "success", "ip " .. ip["ip"] .. " unbanned") end api.global.POST["^/ban$"] = function(self) - ngx.req.read_body() - local data = ngx.req.get_body_data() + read_body() + local data = get_body_data() if not data then - local data_file = ngx.req.get_body_file() + local data_file = get_body_file() if data_file then - local file = io.open(data_file) + local file, err = io.open(data_file) + if not file then + return self:response(HTTP_INTERNAL_SERVER_ERROR, "error", err) + end data = file:read("*a") file:close() end end - local ok, ip = pcall(cjson.decode, data) + local ok, ip = pcall(decode, data) if not ok then - return self:response(ngx.HTTP_INTERNAL_SERVER_ERROR, "error", "can't decode JSON : " .. ip) + return self:response(HTTP_INTERNAL_SERVER_ERROR, "error", "can't decode JSON : " .. ip) end - self.datastore:set("bans_ip_" .. ip["ip"], "manual", ip["exp"]) - return self:response(ngx.HTTP_OK, "success", "ip " .. ip["ip"] .. " banned") + datastore:set("bans_ip_" .. ip["ip"], "manual", ip["exp"]) + return self:response(HTTP_OK, "success", "ip " .. ip["ip"] .. " banned") end api.global.GET["^/bans$"] = function(self) local data = {} - for _, k in ipairs(self.datastore:keys()) do + for _, k in ipairs(datastore:keys()) do if k:find("^bans_ip_") then - local reason, err = self.datastore:get(k) + local reason, err = datastore:get(k) if err then return self:response( - ngx.HTTP_INTERNAL_SERVER_ERROR, + HTTP_INTERNAL_SERVER_ERROR, "error", "can't access " .. k .. " from datastore : " .. reason ) end - local ok, ttl = self.datastore:ttl(k) + local ok, ttl = datastore:ttl(k) if not ok then return self:response( - ngx.HTTP_INTERNAL_SERVER_ERROR, + HTTP_INTERNAL_SERVER_ERROR, "error", "can't access ttl " .. k .. " from datastore : " .. ttl ) end - local ban = { ip = k:sub(9, #k), reason = reason, exp = math.floor(ttl) } + local ban = { ip = k:sub(9, #k), reason = reason, exp = floor(ttl) } table.insert(data, ban) end end - return self:response(ngx.HTTP_OK, "success", data) + return self:response(HTTP_OK, "success", data) end api.global.GET["^/variables$"] = function(self) local variables, err = datastore:get("variables", true) if not variables then - return self:response(ngx.HTTP_INTERNAL_SERVER_ERROR, "error", "can't access variables from datastore : " .. err) + return self:response(HTTP_INTERNAL_SERVER_ERROR, "error", "can't access variables from datastore : " .. err) end - return self:response(ngx.HTTP_OK, "success", variables) + return self:response(HTTP_OK, "success", variables) end function api:is_allowed_ip() - if utils.is_ip_in_networks(self.ctx.bw.remote_addr, self.ips) then + if is_ip_in_networks(self.ctx.bw.remote_addr, self.ips) then return true, "ok" end return false, "IP is not in API_WHITELIST_IP" @@ -223,10 +265,10 @@ end function api:do_api_call() if self.global[self.ctx.bw.request_method] ~= nil then for uri, api_fun in pairs(self.global[self.ctx.bw.request_method]) do - if string.match(self.ctx.bw.uri, uri) then + if match(self.ctx.bw.uri, uri) then local status, resp = api_fun(self) local ret = true - if status ~= ngx.HTTP_OK then + if status ~= HTTP_OK then ret = false end if #resp["msg"] == 0 then @@ -235,26 +277,37 @@ function api:do_api_call() resp["data"] = resp["msg"] resp["msg"] = resp["status"] end - return ret, resp["msg"], status, cjson.encode(resp) + return ret, resp["msg"], status, encode(resp) end end end - local list, err = self.datastore:get("plugins", true) + local list, err = datastore:get("plugins", true) if not list then - local _, resp = self:response(ngx.HTTP_INTERNAL_SERVER_ERROR, "error", "can't list loaded plugins : " .. err) - return false, resp["msg"], ngx.HTTP_INTERNAL_SERVER_ERROR, cjson.encode(resp) + local _, resp = self:response(HTTP_INTERNAL_SERVER_ERROR, "error", "can't list loaded plugins : " .. err) + return false, resp["msg"], HTTP_INTERNAL_SERVER_ERROR, encode(resp) end for _, plugin in ipairs(list) do - if pcall(require, plugin.id .. "/" .. plugin.id) then - local plugin_lua = require(plugin.id .. "/" .. plugin.id) - if plugin_lua.api ~= nil then - local matched, status, resp = plugin_lua:api(self.ctx) - if matched then - local ret = true - if status ~= ngx.HTTP_OK then - ret = false + local plugin_lua, _ = require_plugin(plugin.id) + if plugin_lua and plugin_lua.api ~= nil then + local ok, plugin_obj = new_plugin(plugin_lua, self.ctx) + if not ok then + logger:log(ERR, "can't instantiate " .. plugin.id .. " : " .. plugin_obj) + else + local ret + ok, ret = call_plugin(plugin_obj, "api") + if not ok then + logger:log(ERR, "error while executing " .. plugin.id .. ":api() : " .. ret) + else + if ret.ret then + local resp = {} + if ret.status == HTTP_OK then + resp["status"] = "success" + else + resp["status"] = "error" + end + resp["msg"] = ret.msg + return ret.status == HTTP_OK, resp["status"], ret.status, encode(resp) end - return ret, resp["msg"], status, cjson.encode(resp) end end end @@ -262,7 +315,7 @@ function api:do_api_call() local resp = {} resp["status"] = "error" resp["msg"] = "not found" - return false, "error", ngx.HTTP_NOT_FOUND, cjson.encode(resp) + return false, "error", HTTP_NOT_FOUND, encode(resp) end return api diff --git a/src/bw/lua/bunkerweb/cachestore.lua b/src/bw/lua/bunkerweb/cachestore.lua index b26b6c474..c20349274 100644 --- a/src/bw/lua/bunkerweb/cachestore.lua +++ b/src/bw/lua/bunkerweb/cachestore.lua @@ -1,17 +1,27 @@ +local ngx = ngx local class = require "middleclass" +local clogger = require "bunkerweb.logger" local clusterstore = require "bunkerweb.clusterstore" -local logger = require "bunkerweb.logger" local mlcache = require "resty.mlcache" local utils = require "bunkerweb.utils" local cachestore = class("cachestore") +local logger = clogger:new("CACHESTORE") + +local subsystem = ngx.config.subsystem +local ERR = ngx.ERR +local INFO = ngx.INFO +local null = ngx.null +local get_ctx_obj = utils.get_ctx_obj +local is_cosocket_available = utils.is_cosocket_available + -- Instantiate mlcache object at module level (which will be cached when running init phase) -- TODO : custom settings local shm = "cachestore" local ipc_shm = "cachestore_ipc" local shm_miss = "cachestore_miss" local shm_locks = "cachestore_locks" -if not ngx.shared.cachestore then +if subsystem == "stream" then shm = "cachestore_stream" ipc_shm = "cachestore_ipc_stream" shm_miss = "cachestore_miss_stream" @@ -33,22 +43,18 @@ local cache, err = mlcache.new("cachestore", shm, { }, ipc_shm = ipc_shm, }) -local module_logger = logger:new("CACHESTORE") if not cache then - module_logger:log(ngx.ERR, "can't instantiate mlcache : " .. err) + logger:log(ERR, "can't instantiate mlcache : " .. err) end -function cachestore:initialize(use_redis, new_cs, ctx) - self.ctx = ctx - self.cache = cache +function cachestore:initialize(use_redis, ctx, pool) self.use_redis = use_redis or false - self.logger = module_logger - if new_cs then - self.clusterstore = clusterstore:new(false) - self.shared_cs = false - else - self.clusterstore = utils.get_ctx_obj("clusterstore", self.ctx) - self.shared_cs = true + if self.use_redis then + if ctx then + self.clusterstore = get_ctx_obj("clusterstore", ctx) + else + self.clusterstore = clusterstore:new(pool) + end end end @@ -57,8 +63,7 @@ function cachestore:get(key) local callback = function(key, cs) -- Connect to redis -- luacheck: ignore 431 - local clusterstore = cs or require "bunkerweb.clusterstore":new(false) - local ok, err, _ = clusterstore:connect() + local ok, err, _ = cs:connect(true) if not ok then return nil, "can't connect to redis : " .. err, nil end @@ -76,14 +81,14 @@ function cachestore:get(key) end return {ret_get, ret_ttl} ]] - local ret, err = clusterstore:call("eval", redis_script, 1, key) + local ret, err = cs:call("eval", redis_script, 1, key) if not ret then - clusterstore:close() + cs:close() return nil, err, nil end -- Extract values - clusterstore:close() - if ret[1] == ngx.null then + cs:close() + if ret[1] == null then ret[1] = nil ret[2] = -1 elseif ret[2] < 0 then @@ -96,35 +101,31 @@ function cachestore:get(key) end -- luacheck: ignore 431 local value, err, hit_level - if self.use_redis and utils.is_cosocket_available() then - local cs = nil - if self.shared_cs then - cs = self.clusterstore - end - value, err, hit_level = self.cache:get(key, nil, callback, key, cs) + if self.use_redis and is_cosocket_available() then + value, err, hit_level = cache:get(key, nil, callback, key, self.clusterstore) else - value, err, hit_level = self.cache:get(key, nil, callback_no_miss) + value, err, hit_level = cache:get(key, nil, callback_no_miss) end if value == nil and err ~= nil then return false, err end - self.logger:log(ngx.INFO, "hit level for " .. key .. " = " .. tostring(hit_level)) + logger:log(INFO, "hit level for " .. key .. " = " .. tostring(hit_level)) return true, value end function cachestore:set(key, value, ex) -- luacheck: ignore 431 local ok, err - if self.use_redis and utils.is_cosocket_available() then + if self.use_redis and is_cosocket_available() then ok, err = self:set_redis(key, value, ex) if not ok then - self.logger:log(ngx.ERR, err) + logger:log(ERR, err) end end if ex then - ok, err = self.cache:set(key, { ttl = ex }, value) + ok, err = cache:set(key, { ttl = ex }, value) else - ok, err = self.cache:set(key, nil, value) + ok, err = cache:set(key, nil, value) end if not ok then return false, err @@ -153,13 +154,13 @@ end function cachestore:delete(key) -- luacheck: ignore 431 local ok, err - if self.use_redis and utils.is_cosocket_available() then + if self.use_redis and is_cosocket_available() then ok, err = self:del_redis(key) if not ok then - self.logger:log(ngx.ERR, err) + logger:log(ERR, err) end end - ok, err = self.cache:delete(key) + ok, err = cache:delete(key) if not ok then return false, err end @@ -183,8 +184,14 @@ function cachestore:del_redis(key) return true end +-- luacheck: ignore 212 function cachestore:purge() - return self.cache:purge(true) + return cache:purge(true) +end + +-- luacheck: ignore 212 +function cachestore:update() + return cache:update() end return cachestore diff --git a/src/bw/lua/bunkerweb/clusterstore.lua b/src/bw/lua/bunkerweb/clusterstore.lua index d9359b477..ec7545afe 100644 --- a/src/bw/lua/bunkerweb/clusterstore.lua +++ b/src/bw/lua/bunkerweb/clusterstore.lua @@ -1,15 +1,26 @@ +local ngx = ngx local class = require "middleclass" -local logger = require "bunkerweb.logger" -local redis = require "resty.redis" +local clogger = require "bunkerweb.logger" +local rc = require "resty.redis.connector" +local rs = require("resty.redis.sentinel") local utils = require "bunkerweb.utils" local clusterstore = class("clusterstore") +local logger = clogger:new("CLUSTERSTORE") + +local get_variable = utils.get_variable +local is_cosocket_available = utils.is_cosocket_available +local ERR = ngx.ERR +local INFO = ngx.INFO +local tonumber = tonumber +local tostring = tostring +local random = math.random + function clusterstore:initialize(pool) - -- Instantiate logger - self.logger = logger:new("CLUSTERSTORE") -- Get variables local variables = { + ["USE_REDIS"] = "", ["REDIS_HOST"] = "", ["REDIS_PORT"] = "", ["REDIS_DATABASE"] = "", @@ -17,98 +28,157 @@ function clusterstore:initialize(pool) ["REDIS_TIMEOUT"] = "", ["REDIS_KEEPALIVE_IDLE"] = "", ["REDIS_KEEPALIVE_POOL"] = "", + ["REDIS_USERNAME"] = "", + ["REDIS_PASSWORD"] = "", + ["REDIS_SENTINEL_HOSTS"] = "", + ["REDIS_SENTINEL_USERNAME"] = "", + ["REDIS_SENTINEL_PASSWORD"] = "", + ["REDIS_SENTINEL_MASTER"] = "", } - -- Set them for later user + -- Set them for later use self.variables = {} for k, _ in pairs(variables) do - local value, err = utils.get_variable(k, false) + local value, err = get_variable(k, false) if value == nil then - self.logger:log(ngx.ERR, err) + logger:log(ERR, err) end self.variables[k] = value end - -- Don't instantiate a redis object for now - self.redis_client = nil - self.pool = pool == nil or pool -end - -function clusterstore:connect() - -- Check if we are already connected - if self.redis_client then - return true, "already connected", self.redis_client:get_reused_times() + -- Don't go further if redis is not used + if self.variables["USE_REDIS"] ~= "yes" then + return end - -- Instantiate object - local redis_client, err = redis:new() - if redis_client == nil then - return false, err - end - -- Set timeouts - redis_client:set_timeout(tonumber(self.variables["REDIS_TIMEOUT"])) - -- Connect + -- Compute options local options = { - ssl = self.variables["REDIS_SSL"] == "yes", + connect_timeout = tonumber(self.variables["REDIS_TIMEOUT"]), + read_timeout = tonumber(self.variables["REDIS_TIMEOUT"]), + send_timeout = tonumber(self.variables["REDIS_TIMEOUT"]), + keepalive_timeout = tonumber(self.variables["REDIS_KEEPALIVE_IDLE"]), + keepalive_poolsize = tonumber(self.variables["REDIS_KEEPALIVE_POOL"]), + connection_options = { + ssl = self.variables["REDIS_SSL"] == "yes", + }, + host = self.variables["REDIS_HOST"], + port = tonumber(self.variables["REDIS_PORT"]), + db = tonumber(self.variables["REDIS_DATABASE"]), + username = self.variables["REDIS_USERNAME"], + password = self.variables["REDIS_PASSWORD"], + sentinel_username = self.variables["REDIS_SENTINEL_USERNAME"], + sentinel_password = self.variables["REDIS_SENTINEL_PASSWORD"], + master_name = self.variables["REDIS_SENTINEL_MASTER"], + role = "master", + sentinels = {}, } + self.pool = pool == nil or pool if self.pool then - options.pool = "bw-redis" - options.pool_size = tonumber(self.variables["REDIS_KEEPALIVE_POOL"]) + options.connection_options.pool = "bw-redis" + options.connection_options.pool_size = tonumber(self.variables["REDIS_KEEPALIVE_POOL"]) end - local ok, err = redis_client:connect(self.variables["REDIS_HOST"], tonumber(self.variables["REDIS_PORT"]), options) - if not ok then - return false, err - end - self.redis_client = redis_client - -- Select database if needed - local times, err = self.redis_client:get_reused_times() - if err then - self:close() - return false, err - end - if times == 0 then - -- luacheck: ignore 421 - local _, err = self.redis_client:select(tonumber(self.variables["REDIS_DATABASE"])) - if err then - self:close() - return false, err + if self.variables["REDIS_SENTINEL_HOSTS"] ~= "" then + for sentinel_host in self.variables["REDIS_SENTINEL_HOSTS"]:gmatch("%S+") do + local shost, sport = sentinel_host:match("([^:]+):?(%d*)") + if sport == "" then + sport = 26379 + else + sport = tonumber(sport) + end + table.insert(options.sentinel, { host = shost, port = sport }) end end + self.options = options + -- Instantiate object + if is_cosocket_available() then + local redis_connector, err = rc.new(self.options) + self.redis_connector = redis_connector + if self.redis_connector == nil then + logger:log(ERR, "can't instantiate redis object : " .. err) + return + end + end +end + +function clusterstore:connect(readonly) + -- Check if connector is created + if not self.redis_connector then + return false, "connector is not instantiated" + end + -- Disconnect if needed + if self.redis_client then + self:close() + end + -- Connect to sentinels if needed + local redis_client, err + if #self.options.sentinels > 0 then + local redis_sentinel + redis_sentinel, err = self.redis_connector:connect() + if not redis_sentinel then + return false, "error while connecting to sentinels : " .. err + end + if readonly then + local redis_clients, _ = rs.get_slaves(redis_sentinel, self.options.master_name) + if redis_clients then + redis_client = redis_clients[random(#redis_clients)] + else + redis_client = nil + end + else + redis_client, err = rs.get_master(redis_sentinel, self.options.master_name) + end + -- Classic connection + else + redis_client, err = self.redis_connector:connect() + end + self.redis_client = redis_client + if not self.redis_client then + return false, "error while getting redis client : " .. err + end + -- Everything went well + local times, err = self.redis_client:get_reused_times() + if times == nil then + self:close() + return false, "error while getting reused times : " .. err + end + logger:log(INFO, "redis reused times = " .. tostring(times)) return true, "success", times end function clusterstore:close() - if self.redis_client then - -- Equivalent to close but keep a pool of connections - if self.pool then - local ok, err = self.redis_client:set_keepalive( - tonumber(self.variables["REDIS_KEEPALIVE_IDLE"]), - tonumber(self.variables["REDIS_KEEPALIVE_POOL"]) - ) - self.redis_client = nil - if not ok then - require("bunkerweb.logger"):new("clusterstore-close"):log(ngx.ERR, err) - end - return ok, err - end - -- Close - local ok, err = self.redis_client:close() - self.redis_client.redis_client = nil - return ok, err + -- Check if connected is created + if not self.redis_connector then + return false, "connector is not instantiated" end - return false, "not connected" + -- Check if client is created + if not self.redis_client then + return false, "client is not instantiated" + end + -- Pool case + local ok, err + if self.pool then + ok, err = self.redis_connector:set_keepalive(self.redis_client) + -- No pool + else + ok, err = self.redis_client:close() + end + self.redis_client = nil + if err then + logger:log(ERR, "error while closing redis_client : " .. err) + end + return ok ~= nil, err end function clusterstore:call(method, ...) - -- Check if we are connected + -- Check if client is created if not self.redis_client then - return false, "not connected" + return false, "client is not instantiated" end -- Call method return self.redis_client[method](self.redis_client, ...) end function clusterstore:multi(calls) - -- Check if we are connected + -- Check if client is created if not self.redis_client then - return false, "not connected" + return false, "client is not instantiated" end -- Start transaction local ok, err = self.redis_client:multi() @@ -121,7 +191,7 @@ function clusterstore:multi(calls) local args = unpack(call[2]) ok, err = self.redis_client[method](self.redis_client, args) if not ok then - return false, method + "() failed : " .. err + return false, method .. "() failed : " .. err end end -- Exec transaction diff --git a/src/bw/lua/bunkerweb/ctx.lua b/src/bw/lua/bunkerweb/ctx.lua new file mode 100644 index 000000000..f0ecf0801 --- /dev/null +++ b/src/bw/lua/bunkerweb/ctx.lua @@ -0,0 +1,99 @@ +-- A module for sharing ngx.ctx between subrequests. +-- Original work by Alex Zhang (openresty/lua-nginx-module/issues/1057) +-- updated by 3scale/apicast. +-- +-- Copyright (c) 2016 3scale Inc. +-- Licensed under the Apache License, Version 2.0. +-- License text: See LICENSE +-- +-- Modifications by Kong Inc. +-- * updated module functions signatures +-- * made module function idempotent +-- * replaced thrown errors with warn logs +-- * allow passing of context +-- * updated to work with new 1.19.x apis + +local base = require "resty.core.base" +local ffi = require "ffi" +require "resty.core.ctx" + +local C = ffi.C +local ngx = ngx +local var = ngx.var +local tonumber = tonumber +local registry = debug.getregistry() +local subsystem = ngx.config.subsystem +local get_request = base.get_request + +-- BW edits +local logger = require "bunkerweb.logger":new("CTX") +local ngx_ERR = ngx.ERR + +local ngx_lua_ffi_get_ctx_ref +if subsystem == "http" then + ngx_lua_ffi_get_ctx_ref = C.ngx_http_lua_ffi_get_ctx_ref +elseif subsystem == "stream" then + ngx_lua_ffi_get_ctx_ref = C.ngx_stream_lua_ffi_get_ctx_ref +end + +local in_ssl_phase = ffi.new("int[1]") +local ssl_ctx_ref = ffi.new("int[1]") + +local FFI_NO_REQ_CTX = base.FFI_NO_REQ_CTX + +local _M = {} + +function _M.stash_ref(ctx) + local r = get_request() + if not r then + logger:log(ngx_ERR, "could not stash ngx.ctx ref: no request found") + return + end + + do + local ctx_ref = var.ctx_ref + if not ctx_ref or ctx_ref ~= "" then + return + end + + if not ctx then + local _ = ngx.ctx -- load context if not previously loaded + end + end + local ctx_ref = ngx_lua_ffi_get_ctx_ref(r, in_ssl_phase, ssl_ctx_ref) + if ctx_ref == FFI_NO_REQ_CTX then + logger:log(ngx_ERR, "could not stash ngx.ctx ref: no ctx found") + return + end + + var.ctx_ref = ctx_ref +end + +function _M.apply_ref() + local r = get_request() + if not r then + logger:log(ngx_ERR, "could not apply ngx.ctx: no request found") + return + end + + local ctx_ref = var.ctx_ref + if not ctx_ref or ctx_ref == "" then + return + end + + ctx_ref = tonumber(ctx_ref) + if not ctx_ref then + return + end + + local orig_ctx = registry.ngx_lua_ctx_tables[ctx_ref] + if not orig_ctx then + logger:log(ngx_ERR, "could not apply ngx.ctx: no ctx found") + return + end + + ngx.ctx = orig_ctx + var.ctx_ref = "" +end + +return _M diff --git a/src/bw/lua/bunkerweb/datastore.lua b/src/bw/lua/bunkerweb/datastore.lua index 1eae070c0..c720d453a 100644 --- a/src/bw/lua/bunkerweb/datastore.lua +++ b/src/bw/lua/bunkerweb/datastore.lua @@ -1,18 +1,25 @@ +local ngx = ngx local class = require "middleclass" +local clogger = require "bunkerweb.logger" local lrucache = require "resty.lrucache" local datastore = class("datastore") -local lru, err = lrucache.new(100000) +local logger = clogger:new("DATASTORE") + +local ERR = ngx.ERR +local subsystem = ngx.config.subsystem +local shared = ngx.shared + +local lru, err_lru = lrucache.new(100000) if not lru then - require "bunkerweb.logger" - :new("DATASTORE") - :log(ngx.ERR, "failed to instantiate LRU cache : " .. (err or "unknown error")) + logger:log(ERR, "failed to instantiate LRU cache : " .. err_lru) end function datastore:initialize() - self.dict = ngx.shared.datastore - if not self.dict then - self.dict = ngx.shared.datastore_stream + if subsystem == "http" then + self.dict = shared.datastore + else + self.dict = shared.datastore_stream end end @@ -20,6 +27,9 @@ function datastore:get(key, worker) -- luacheck: ignore 431 local value, err if worker then + if not lru then + return nil, "lru is not instantiated" + end value, err = lru:get(key) return value, err or "not found" end @@ -32,6 +42,9 @@ end function datastore:set(key, value, exptime, worker) if worker then + if not lru then + return false, "lru is not instantiated" + end lru:set(key, value, exptime) return true, "success" end @@ -41,6 +54,9 @@ end function datastore:delete(key, worker) if worker then + if not lru then + return false, "lru is not instantiated" + end lru:delete(key) return true, "success" end @@ -50,6 +66,9 @@ end function datastore:keys(worker) if worker then + if not lru then + return false, "lru is not instantiated" + end return lru:keys(0) end return self.dict:get_keys(0) @@ -70,6 +89,9 @@ end function datastore:delete_all(pattern, worker) local keys if worker then + if not lru then + return false, "lru is not instantiated" + end keys = lru:keys(0) else keys = self.dict:get_keys(0) @@ -84,6 +106,9 @@ end -- luacheck: ignore 212 function datastore:flush_lru() + if not lru then + return false, "lru is not instantiated" + end lru:flush_all() end diff --git a/src/bw/lua/bunkerweb/helpers.lua b/src/bw/lua/bunkerweb/helpers.lua index 3fbaae06d..f417f2e04 100644 --- a/src/bw/lua/bunkerweb/helpers.lua +++ b/src/bw/lua/bunkerweb/helpers.lua @@ -1,16 +1,35 @@ +local ngx = ngx +local base = require "resty.core.base" +local bwctx = require "bunkerweb.ctx" local cjson = require "cjson" local utils = require "bunkerweb.utils" +local open = io.open +local decode = cjson.decode +local encode = cjson.encode +local tostring = tostring +local get_phases = utils.get_phases +local get_request = base.get_request +local apply_ref = bwctx.apply_ref +local stash_ref = bwctx.stash_ref +local subsystem = ngx.config.subsystem +local var = ngx.var +local req = ngx.req +local ip_is_global = utils.ip_is_global +local is_ipv4 = utils.is_ipv4 +local is_ipv6 = utils.is_ipv6 +local get_variable = utils.get_variable + local helpers = {} helpers.load_plugin = function(json) -- Open file - local file, err, nb = io.open(json, "r") + local file, err, nb = open(json, "r") if not file then return false, "can't load JSON at " .. json .. " : " .. err .. " (nb = " .. tostring(nb) .. ")" end -- Decode JSON - local ok, plugin = pcall(cjson.decode, file:read("*a")) + local ok, plugin = pcall(decode, file:read("*a")) file:close() if not ok then return false, "invalid JSON at " .. json .. " : " .. err @@ -24,7 +43,7 @@ helpers.load_plugin = function(json) end end if #missing_fields > 0 then - return false, "missing field(s) " .. cjson.encode(missing_fields) .. " for JSON at " .. json + return false, "missing field(s) " .. encode(missing_fields) .. " for JSON at " .. json end -- Try require local plugin_lua, err = helpers.require_plugin(plugin.id) @@ -32,7 +51,7 @@ helpers.load_plugin = function(json) return false, err end -- Fill phases - local phases = utils.get_phases() + local phases = get_phases() plugin.phases = {} if plugin_lua then for _, phase in ipairs(phases) do @@ -47,11 +66,11 @@ end helpers.order_plugins = function(plugins) -- Extract orders - local file, err, nb = io.open("/usr/share/bunkerweb/core/order.json", "r") + local file, err, nb = open("/usr/share/bunkerweb/core/order.json", "r") if not file then return false, err .. " (nb = " .. tostring(nb) .. ")" end - local ok, orders = pcall(cjson.decode, file:read("*a")) + local ok, orders = pcall(decode, file:read("*a")) file:close() if not ok then return false, "invalid order.json : " .. err @@ -66,7 +85,7 @@ helpers.order_plugins = function(plugins) end -- Order result local result_orders = {} - for _, phase in ipairs(utils.get_phases()) do + for _, phase in ipairs(get_phases()) do result_orders[phase] = {} end -- Fill order first @@ -80,7 +99,7 @@ helpers.order_plugins = function(plugins) end end -- Then append missing plugins to the end - for _, phase in ipairs(utils.get_phases()) do + for _, phase in ipairs(get_phases()) do for id, plugin in pairs(plugins_phases) do if plugin[phase] then table.insert(result_orders[phase], id) @@ -139,67 +158,76 @@ helpers.call_plugin = function(plugin, method) end end if #missing_values > 0 then - return false, "missing required return value(s) : " .. cjson.encode(missing_values) + return false, "missing required return value(s) : " .. encode(missing_values) end -- Return return true, ret end -helpers.fill_ctx = function() +helpers.fill_ctx = function(no_ref) -- Return errors as table local errors = {} + -- Try to load saved ctx + local request = get_request() + if no_ref ~= true and request then + apply_ref() + end local ctx = ngx.ctx -- Check if ctx is already filled if not ctx.bw then -- Instantiate bw table local data = {} - -- Common vars - data.kind = "http" - if ngx.shared.datastore_stream then - data.kind = "stream" + if request then + -- Common vars + data.kind = "http" + if subsystem == "stream" then + data.kind = "stream" + end + data.remote_addr = var.remote_addr + data.server_name = var.server_name + if data.kind == "http" then + data.uri = var.uri + data.request_uri = var.request_uri + data.request_method = var.request_method + data.http_user_agent = var.http_user_agent + data.http_host = var.http_host + data.http_content_type = var.http_content_type + data.http_content_length = var.http_content_length + data.http_origin = var.http_origin + data.http_version = req.http_version() + data.scheme = var.scheme + end + -- IP data : global + local ip_global, err = ip_is_global(data.remote_addr) + if ip_global == nil then + table.insert(errors, "can't check if IP is global : " .. err) + else + data.ip_is_global = ip_global + end + -- IP data : v4 / v6 + data.ip_is_ipv4 = is_ipv4(data.ip) + data.ip_is_ipv6 = is_ipv6(data.ip) end - data.remote_addr = ngx.var.remote_addr - data.server_name = ngx.var.server_name - if data.kind == "http" then - data.uri = ngx.var.uri - data.request_uri = ngx.var.request_uri - data.request_method = ngx.var.request_method - data.http_user_agent = ngx.var.http_user_agent - data.http_host = ngx.var.http_host - data.server_name = ngx.var.server_name - data.http_content_type = ngx.var.http_content_type - data.http_content_length = ngx.var.http_content_length - data.http_origin = ngx.var.http_origin - data.http_version = ngx.req.http_version() - data.scheme = ngx.var.scheme - end - -- IP data : global - local ip_is_global, err = utils.ip_is_global(data.remote_addr) - if ip_is_global == nil then - table.insert(errors, "can't check if IP is global : " .. err) - else - data.ip_is_global = ip_is_global - end - -- IP data : v4 / v6 - data.ip_is_ipv4 = utils.is_ipv4(data.ip) - data.ip_is_ipv6 = utils.is_ipv6(data.ip) - -- Misc info - data.integration = utils.get_integration() - data.version = utils.get_version() -- Fill ctx ctx.bw = data end -- Always create new objects for current phases in case of cosockets - local use_redis, err = utils.get_variable("USE_REDIS", false) + local use_redis, err = get_variable("USE_REDIS", false) if not use_redis then table.insert(errors, "can't get variable from datastore : " .. err) end ctx.bw.datastore = require "bunkerweb.datastore":new() ctx.bw.clusterstore = require "bunkerweb.clusterstore":new() - ctx.bw.cachestore = require "bunkerweb.cachestore":new(use_redis == "yes") + ctx.bw.cachestore = require "bunkerweb.cachestore":new(use_redis == "yes", ctx) return true, "ctx filled", errors, ctx end +helpers.save_ctx = function(ctx) + if get_request() then + stash_ref(ctx) + end +end + function helpers.load_variables(all_variables, plugins) -- Extract settings from plugins and global ones local all_settings = {} @@ -210,11 +238,11 @@ function helpers.load_variables(all_variables, plugins) end end end - local file = io.open("/usr/share/bunkerweb/settings.json") + local file = open("/usr/share/bunkerweb/settings.json") if not file then return false, "can't open settings.json" end - local ok, settings = pcall(cjson.decode, file:read("*a")) + local ok, settings = pcall(decode, file:read("*a")) file:close() if not ok then return false, "invalid settings.json : " .. settings diff --git a/src/bw/lua/bunkerweb/logger.lua b/src/bw/lua/bunkerweb/logger.lua index c71c64f27..e38111449 100644 --- a/src/bw/lua/bunkerweb/logger.lua +++ b/src/bw/lua/bunkerweb/logger.lua @@ -2,12 +2,15 @@ local class = require "middleclass" local errlog = require "ngx.errlog" local logger = class("logger") +local upper = string.upper +local raw_log = errlog.raw_log + function logger:initialize(prefix) - self.prefix = string.upper(prefix) + self.prefix = upper(prefix) end function logger:log(level, msg) - errlog.raw_log(level, "[" .. self.prefix .. "] " .. msg) + raw_log(level, "[" .. self.prefix .. "] " .. msg) end return logger diff --git a/src/bw/lua/bunkerweb/plugin.lua b/src/bw/lua/bunkerweb/plugin.lua index 473714a7c..3db038311 100644 --- a/src/bw/lua/bunkerweb/plugin.lua +++ b/src/bw/lua/bunkerweb/plugin.lua @@ -1,3 +1,4 @@ +local ngx = ngx local cachestore = require "bunkerweb.cachestore" local class = require "middleclass" local clusterstore = require "bunkerweb.clusterstore" @@ -6,50 +7,56 @@ local logger = require "bunkerweb.logger" local utils = require "bunkerweb.utils" local plugin = class("plugin") +local ERR = ngx.ERR +local get_phase = ngx.get_phase +local get_variable = utils.get_variable +local get_ctx_obj = utils.get_ctx_obj +local subsystem = ngx.config.subsystem + function plugin:initialize(id, ctx) -- Store common, values self.id = id - local multisite = false - local current_phase = ngx.get_phase() + local is_request = false + local current_phase = get_phase() for _, check_phase in ipairs { "set", + "rewrite", "access", "content", "header_filter", + "body_filter", "log", "preread", - "log_stream", - "log_default", } do if current_phase == check_phase then - multisite = true + is_request = true break end end - self.is_request = multisite + self.is_request = is_request -- Store common objects self.logger = logger:new(self.id) - local use_redis, err = utils.get_variable("USE_REDIS", false) + local use_redis, err = get_variable("USE_REDIS", false) if not use_redis then - self.logger:log(ngx.ERR, err) + self.logger:log(ERR, err) end self.use_redis = use_redis == "yes" if self.is_request then - -- Store ctx self.ctx = ctx or ngx.ctx - self.datastore = utils.get_ctx_obj("datastore", self.ctx) or datastore:new() - self.cachestore = utils.get_ctx_obj("cachestore", self.ctx) - or cachestore:new(use_redis == "yes", true, self.ctx) - self.clusterstore = utils.get_ctx_obj("clusterstore", self.ctx) or clusterstore:new(false) + self.datastore = get_ctx_obj("datastore", self.ctx) or datastore:new() + self.cachestore = get_ctx_obj("cachestore", self.ctx) or cachestore:new(use_redis == "yes", self.ctx) + self.clusterstore = get_ctx_obj("clusterstore", self.ctx) or clusterstore:new() + self.cachestore_local = get_ctx_obj("cachestore_local", self.ctx) or cachestore:new(false, self.ctx) else self.datastore = datastore:new() - self.cachestore = cachestore:new(use_redis == "yes", true) + self.cachestore = cachestore:new(use_redis == "yes") self.clusterstore = clusterstore:new(false) + self.cachestore_local = cachestore:new(false) end -- Get metadata local metadata, err = self.datastore:get("plugin_" .. id, true) if not metadata then - self.logger:log(ngx.ERR, err) + self.logger:log(ERR, err) return end -- Store variables @@ -57,21 +64,22 @@ function plugin:initialize(id, ctx) self.multiples = {} local value for k, v in pairs(metadata.settings) do - value, err = utils.get_variable(k, v.context == "multisite" and multisite) + value, err = get_variable(k, v.context == "multisite" and self.is_request) if value == nil then - self.logger:log(ngx.ERR, "can't get " .. k .. " variable : " .. err) + self.logger:log(ERR, "can't get " .. k .. " variable : " .. err) end self.variables[k] = value end -- Is loading - local is_loading, err = utils.get_variable("IS_LOADING", false) + local is_loading, err = get_variable("IS_LOADING", false) if is_loading == nil then - self.logger:log(ngx.ERR, "can't get IS_LOADING variable : " .. err) + self.logger:log(ERR, "can't get IS_LOADING variable : " .. err) end self.is_loading = is_loading == "yes" -- Kind of server - self.kind = "http" - if ngx.shared.datastore_stream then + if subsystem == "http" then + self.kind = "http" + else self.kind = "stream" end end @@ -81,8 +89,8 @@ function plugin:get_id() end -- luacheck: ignore 212 -function plugin:ret(ret, msg, status, redirect) - return { ret = ret, msg = msg, status = status, redirect = redirect } +function plugin:ret(ret, msg, status, redirect, data) + return { ret = ret, msg = msg, status = status, redirect = redirect, data = data } end return plugin diff --git a/src/bw/lua/bunkerweb/utils.lua b/src/bw/lua/bunkerweb/utils.lua index 364b52b85..9b381c680 100644 --- a/src/bw/lua/bunkerweb/utils.lua +++ b/src/bw/lua/bunkerweb/utils.lua @@ -1,3 +1,4 @@ +local ngx = ngx local cdatastore = require "bunkerweb.datastore" local clogger = require "bunkerweb.logger" local mmdb = require "bunkerweb.mmdb" @@ -10,11 +11,32 @@ local session = require "resty.session" local logger = clogger:new("UTILS") local datastore = cdatastore:new() +local var = ngx.var +local ERR = ngx.ERR +local INFO = ngx.INFO +local WARN = ngx.WARN +local null = ngx.null +local re_match = ngx.re.match +local subsystem = ngx.config.subsystem +local get_phase = ngx.get_phase +local kill = ngx.thread.kill +local ipmatcher_new = ipmatcher.new +local parse_ipv4 = ipmatcher.parse_ipv4 +local parse_ipv6 = ipmatcher.parse_ipv6 +local open = io.open +local encode = cjson.encode +local decode = cjson.decode +local char = string.char +local random = math.random +local session_start = session.start +local session_open = session.open +local tonumber = tonumber + local utils = {} math.randomseed(os.time()) -utils.get_variable = function(var, site_search) +utils.get_variable = function(variable, site_search, ctx) -- Default site search to true if site_search == nil then site_search = true @@ -24,20 +46,27 @@ utils.get_variable = function(var, site_search) if not variables then return nil, "can't access variables from datastore : " .. err end - local value = variables["global"][var] + local value = variables["global"][variable] -- Site search case - local multisite = site_search and variables["global"]["MULTISITE"] == "yes" and ngx.var.server_name ~= "_" - if multisite then - value = variables[ngx.var.server_name][var] + if site_search and variables["global"]["MULTISITE"] == "yes" then + local server_name + if ctx and ctx.bw then + server_name = ctx.bw.server_name + else + server_name = var.server_name + end + if variables[server_name] then + value = variables[server_name][variable] + end end return value, "success" end -utils.has_variable = function(var, value) +utils.has_variable = function(variable, value) -- Get global variable local variables, err = datastore:get("variables", true) if not variables then - return nil, "can't access variables " .. var .. " from datastore : " .. err + return nil, "can't access variables " .. variable .. " from datastore : " .. err end -- Multisite case local multisite = variables["global"]["MULTISITE"] == "yes" @@ -45,7 +74,7 @@ utils.has_variable = function(var, value) local servers = variables["global"]["SERVER_NAME"] -- Check each server for server in servers:gmatch("%S+") do - if variables[server][var] == value then + if variables[server][variable] == value then return true, "success" end end @@ -53,14 +82,14 @@ utils.has_variable = function(var, value) return false, "success" end end - return variables["global"][var] == value, "success" + return variables["global"][variable] == value, "success" end -utils.has_not_variable = function(var, value) +utils.has_not_variable = function(variable, value) -- Get global variable local variables, err = datastore:get("variables", true) if not variables then - return nil, "can't access variables " .. var .. " from datastore : " .. err + return nil, "can't access variables " .. variable .. " from datastore : " .. err end -- Multisite case local multisite = variables["global"]["MULTISITE"] == "yes" @@ -68,7 +97,7 @@ utils.has_not_variable = function(var, value) local servers = variables["global"]["SERVER_NAME"] -- Check each server for server in servers:gmatch("%S+") do - if variables[server][var] ~= "value" then + if variables[server][variable] ~= "value" then return true, "success" end end @@ -76,7 +105,7 @@ utils.has_not_variable = function(var, value) return false, "success" end end - return variables["global"][var] ~= value, "success" + return variables["global"][variable] ~= value, "success" end utils.get_multiple_variables = function(vars) @@ -90,8 +119,8 @@ utils.get_multiple_variables = function(vars) result[scope] = {} -- Loop on vars for variable, value in pairs(scoped_vars) do - for _, var in ipairs(vars) do - if variable:find("^" .. var .. "_?[0-9]*$") then + for _, tvar in ipairs(vars) do + if variable:find("^" .. tvar .. "_?[0-9]*$") then result[scope][variable] = value end end @@ -102,7 +131,7 @@ end utils.is_ip_in_networks = function(ip, networks) -- Instantiate ipmatcher - local ipm, err = ipmatcher.new(networks) + local ipm, err = ipmatcher_new(networks) if not ipm then return nil, "can't instantiate ipmatcher : " .. err end @@ -115,11 +144,11 @@ utils.is_ip_in_networks = function(ip, networks) end utils.is_ipv4 = function(ip) - return ipmatcher.parse_ipv4(ip) + return parse_ipv4(ip) end utils.is_ipv6 = function(ip) - return ipmatcher.parse_ipv6(ip) + return parse_ipv6(ip) end utils.ip_is_global = function(ip) @@ -157,7 +186,7 @@ utils.ip_is_global = function(ip) "ff00::/8", } -- Instantiate ipmatcher - local ipm, err = ipmatcher.new(reserved_ips) + local ipm, err = ipmatcher_new(reserved_ips) if not ipm then return nil, "can't instantiate ipmatcher : " .. err end @@ -169,7 +198,11 @@ utils.ip_is_global = function(ip) return not matched, "success" end -utils.get_integration = function() +utils.get_integration = function(ctx) + -- Check if already in ctx + if ctx and ctx.bw.integration then + return ctx.bw.integration + end -- Check if already in datastore local integration, _ = datastore:get("misc_integration", true) if integration then @@ -177,7 +210,7 @@ utils.get_integration = function() end local variables, err = datastore:get("variables", true) if not variables then - logger:log(ngx.ERR, "can't get variables from datastore : " .. err) + logger:log(ERR, "can't get variables from datastore : " .. err) return "unknown" end -- Swarm @@ -193,12 +226,12 @@ utils.get_integration = function() integration = "autoconf" else -- Already present (e.g. : linux) - local f, _ = io.open("/usr/share/bunkerweb/INTEGRATION", "r") + local f, _ = open("/usr/share/bunkerweb/INTEGRATION", "r") if f then integration = f:read("*a"):gsub("[\n\r]", "") f:close() else - f, _ = io.open("/etc/os-release", "r") + f, _ = open("/etc/os-release", "r") if f then local data = f:read("*a") f:close() @@ -217,58 +250,108 @@ utils.get_integration = function() -- Save integration local ok, err = datastore:set("misc_integration", integration, nil, true) if not ok then - logger:log(ngx.ERR, "can't cache integration to datastore : " .. err) + logger:log(ERR, "can't cache integration to datastore : " .. err) + end + if ctx then + ctx.bw.integration = integration end return integration end -utils.get_version = function() +utils.get_version = function(ctx) + -- Check if already in ctx + if ctx and ctx.bw.version then + return ctx.bw.version + end -- Check if already in datastore local version, _ = datastore:get("misc_version", true) if version then return version end -- Read VERSION file - local f, err = io.open("/usr/share/bunkerweb/VERSION", "r") + local f, err = open("/usr/share/bunkerweb/VERSION", "r") if not f then - logger:log(ngx.ERR, "can't read VERSION file : " .. err) + logger:log(ERR, "can't read VERSION file : " .. err) return nil end version = f:read("*a"):gsub("[\n\r]", "") f:close() - -- Save it to datastore + -- Save version local ok, err = datastore:set("misc_version", version, nil, true) if not ok then - logger:log(ngx.ERR, "can't cache version to datastore : " .. err) + logger:log(ERR, "can't cache version to datastore : " .. err) + end + if ctx then + ctx.bw.version = version end return version end utils.get_reason = function(ctx) -- ngx.ctx - if ctx.bw.reason then - return ctx.bw.reason + if ctx and ctx.bw and ctx.bw.reason then + return ctx.bw.reason, ctx.bw.reason_data or {} end -- ngx.var - if ngx.var.reason and ngx.var.reason ~= "" then - return ngx.var.reason + local var_reason = var.reason + if var_reason and var_reason ~= "" then + local reason_data = {} + local var_reason_data = var.reason_data + if var_reason_data and reason_data ~= "" then + local ok, data = pcall(decode, var_reason_data) + if ok then + reason_data = data + end + end + return var_reason, reason_data end -- os.getenv if os.getenv("REASON") == "modsecurity" then - return "modsecurity" + return "modsecurity", {} end -- datastore ban - local banned, _ = datastore:get("bans_ip_" .. ngx.var.remote_addr) + local ip + if ctx and ctx.bw then + ip = ctx.bw.remote_addr + else + ip = var.remote_addr + end + local banned, _ = datastore:get("bans_ip_" .. ip) if banned then - return banned + return banned, {} end -- unknown - if ngx.status == utils.get_deny_status(ctx) then - return "unknown" + if ngx.status == utils.get_deny_status() then + return "unknown", {} end return nil end +utils.set_reason = function(reason, reason_data, ctx) + if ctx and ctx.bw then + ctx.bw.reason = reason or "unknown" + ctx.bw.reason_data = reason_data or {} + end + if var.reason then + var.reason = reason + if var.reason_data then + var.reason_data = encode(reason_data or {}) + end + end +end + +utils.is_whitelisted = function(ctx) + -- ngx.ctx + if ctx and ctx.bw and ctx.bw.is_whitelisted then + return ctx.bw.is_whitelisted == "yes" + end + -- ngx.var + if var.is_whitelisted and var.is_whitelisted == "yes" then + return true + end + return false +end + utils.get_resolvers = function() -- Get resolvers from datastore if existing local resolvers, _ = datastore:get("misc_resolvers", true) @@ -278,7 +361,7 @@ utils.get_resolvers = function() -- Otherwise extract DNS_RESOLVERS variable local variables, err = datastore:get("variables", true) if not variables then - logger:log(ngx.ERR, "can't get variables from datastore : " .. err) + logger:log(ERR, "can't get variables from datastore : " .. err) return "unknown" end -- Make table for resolver1 resolver2 ... string @@ -289,19 +372,19 @@ utils.get_resolvers = function() -- Add it to the datastore local ok, err = datastore:set("misc_resolvers", resolvers, nil, true) if not ok then - logger:log(ngx.ERR, "can't save misc_resolvers to datastore : " .. err) + logger:log(ERR, "can't save misc_resolvers to datastore : " .. err) end return resolvers end -utils.get_rdns = function(ip) +utils.get_rdns = function(ip, ctx, pool) -- Check cache - local cachestore = utils.new_cachestore() + local cachestore = utils.new_cachestore(ctx, pool) local ok, value = cachestore:get("rdns_" .. ip) if not ok then - logger:log(ngx.ERR, "can't get rdns from cachestore : " .. value) + logger:log(ERR, "can't get rdns from cachestore : " .. value) elseif value then - return cjson.decode(value), "success" + return decode(value), "success" end -- Get resolvers local resolvers, err = utils.get_resolvers() @@ -323,7 +406,7 @@ utils.get_rdns = function(ip) -- Do rDNS query local answers, err = rdns:reverse_query(ip) if not answers then - logger:log(ngx.ERR, "error while doing reverse DNS query for " .. ip .. " : " .. err) + logger:log(ERR, "error while doing reverse DNS query for " .. ip .. " : " .. err) ret_err = err else if answers.errcode then @@ -337,21 +420,21 @@ utils.get_rdns = function(ip) end end -- Save to cache - ok, err = cachestore:set("rdns_" .. ip, cjson.encode(ptrs), 3600) + ok, err = cachestore:set("rdns_" .. ip, encode(ptrs), 3600) if not ok then - logger:log(ngx.ERR, "can't set rdns into cachestore : " .. err) + logger:log(ERR, "can't set rdns into cachestore : " .. err) end return ptrs, ret_err end -utils.get_ips = function(fqdn, ipv6) +utils.get_ips = function(fqdn, ipv6, ctx, pool) -- Check cache - local cachestore = utils.new_cachestore() + local cachestore = utils.new_cachestore(ctx, pool) local ok, value = cachestore:get("dns_" .. fqdn) if not ok then - logger:log(ngx.ERR, "can't get dns from cachestore : " .. value) + logger:log(ERR, "can't get dns from cachestore : " .. value) elseif value then - return cjson.decode(value), "success" + return decode(value), "success" end -- By default perform ipv6 lookups (only if USE_IPV6=yes) if ipv6 == nil then @@ -377,7 +460,7 @@ utils.get_ips = function(fqdn, ipv6) -- luacheck: ignore 421 local use_ipv6, err = utils.get_variable("USE_IPV6", false) if not use_ipv6 then - logger:log(ngx.ERR, "can't get USE_IPV6 variable " .. err) + logger:log(ERR, "can't get USE_IPV6 variable " .. err) elseif use_ipv6 == "yes" then table.insert(qtypes, res.TYPE_AAAA) end @@ -401,7 +484,7 @@ utils.get_ips = function(fqdn, ipv6) end end for qtype, error in pairs(res_errors) do - logger:log(ngx.ERR, "error while doing " .. qtype .. " DNS query for " .. fqdn .. " : " .. error) + logger:log(ERR, "error while doing " .. qtype .. " DNS query for " .. fqdn .. " : " .. error) end -- Extract all IPs local ips = {} @@ -414,11 +497,11 @@ utils.get_ips = function(fqdn, ipv6) end end -- Save to cache - ok, err = cachestore:set("dns_" .. fqdn, cjson.encode(ips), 3600) + ok, err = cachestore:set("dns_" .. fqdn, encode(ips), 3600) if not ok then - logger:log(ngx.ERR, "can't set dns into cachestore : " .. err) + logger:log(ERR, "can't set dns into cachestore : " .. err) end - return ips, cjson.encode(res_errors) .. " " .. cjson.encode(ans_errors) + return ips, encode(res_errors) .. " " .. encode(ans_errors) end utils.get_country = function(ip) @@ -458,38 +541,36 @@ utils.rand = function(nb, no_numbers) -- lowers, uppers and numbers if not no_numbers then for i = 48, 57 do - table.insert(charset, string.char(i)) + table.insert(charset, char(i)) end end for i = 65, 90 do - table.insert(charset, string.char(i)) + table.insert(charset, char(i)) end for i = 97, 122 do - table.insert(charset, string.char(i)) + table.insert(charset, char(i)) end local result = "" for _ = 1, nb do - result = result .. charset[math.random(1, #charset)] + result = result .. charset[random(1, #charset)] end return result end -utils.get_deny_status = function(ctx) - -- Stream case - if ctx.bw and ctx.bw.kind == "stream" then - return 444 +utils.get_deny_status = function() + if subsystem == "http" then + local variables, err = datastore:get("variables", true) + if not variables then + logger:log(ERR, "can't get variables from datastore : " .. err) + return 403 + end + return tonumber(variables["global"]["DENY_HTTP_STATUS"]) end - -- http case - local variables, err = datastore:get("variables", true) - if not variables then - logger:log(ngx.ERR, "can't get variables from datastore : " .. err) - return 403 - end - return tonumber(variables["global"]["DENY_HTTP_STATUS"]) + return 444 end utils.check_session = function(ctx) - local _session, _, exists, _ = session.start({ audience = "metadata" }) + local _session, _, exists, _ = session_start({ audience = "metadata" }) if exists then for _, check in ipairs(ctx.bw.sessions_checks) do local key = check[1] @@ -500,7 +581,7 @@ utils.check_session = function(ctx) if not ok then return false, "session:destroy() error : " .. err end - logger:log(ngx.WARN, "session check " .. key .. " failed, destroying session") + logger:log(WARN, "session check " .. key .. " failed, destroying session") return utils.check_session(ctx) end end @@ -527,9 +608,9 @@ utils.get_session = function(audience, ctx) end end -- Open session with specific audience - local _session, err, _ = session.open({ audience = audience }) + local _session, err, _ = session_open({ audience = audience }) if err then - logger:log(ngx.INFO, "session:open() error : " .. err) + logger:log(INFO, "session:open() error : " .. err) end return _session end @@ -578,7 +659,7 @@ utils.is_banned = function(ip) end -- Connect local clusterstore = require "bunkerweb.clusterstore":new() - local ok, err = clusterstore:connect() + local ok, err = clusterstore:connect(true) if not ok then return nil, "can't connect to redis server : " .. err end @@ -607,7 +688,7 @@ utils.is_banned = function(ip) elseif data.err then clusterstore:close() return nil, "redis script error : " .. data.err - elseif data[1] ~= ngx.null then + elseif data[1] ~= null then clusterstore:close() -- Update local cache ok, err = datastore:set("bans_ip_" .. ip, data[1], data[2]) @@ -649,16 +730,17 @@ utils.add_ban = function(ip, reason, ttl) return true, "success" end -utils.new_cachestore = function() +utils.new_cachestore = function(ctx, pool) -- Check if redis is used local use_redis, err = utils.get_variable("USE_REDIS", false) if not use_redis then - logger:log(ngx.ERR, "can't get USE_REDIS variable : " .. err) + logger:log(ERR, "can't get USE_REDIS variable : " .. err) + use_redis = false else use_redis = use_redis == "yes" end -- Instantiate - return require "bunkerweb.cachestore":new(use_redis, true) + return require "bunkerweb.cachestore":new(use_redis, ctx, pool == nil or pool) end utils.regex_match = function(str, regex, options) @@ -666,9 +748,9 @@ utils.regex_match = function(str, regex, options) if options then all_options = all_options .. options end - local match, err = ngx.re.match(str, regex, all_options) + local match, err = re_match(str, regex, all_options) if err then - logger:log(ngx.ERR, "error while matching regex " .. regex .. "with string " .. str) + logger:log(ERR, "error while matching regex " .. regex .. "with string " .. str) return nil end return match @@ -679,7 +761,10 @@ utils.get_phases = function() "init", "init_worker", "set", + "rewrite", "access", + "content", + "ssl_certificate", "header", "log", "preread", @@ -691,10 +776,13 @@ end utils.is_cosocket_available = function() local phases = { "timer", + "rewrite", "access", + "content", + "ssl_certificate", "preread", } - local current_phase = ngx.get_phase() + local current_phase = get_phase() for _, phase in ipairs(phases) do if current_phase == phase then return true @@ -705,18 +793,32 @@ end utils.kill_all_threads = function(threads) for _, thread in ipairs(threads) do - local ok, err = ngx.thread.kill(thread) + local ok, err = kill(thread) if not ok then - logger:log(ngx.ERR, "error while killing thread : " .. err) + logger:log(ERR, "error while killing thread : " .. err) end end end -utils.get_ctx_obj = function(obj) - if ngx.ctx and ngx.ctx.bw then - return ngx.ctx.bw[obj] +utils.get_ctx_obj = function(obj, ctx) + local vctx = ctx or ngx.ctx + if vctx and vctx.bw then + return vctx.bw[obj] end return nil end +utils.read_files = function(files) + local data = {} + for _, file in ipairs(files) do + local f, err = open(file, "r") + if not f then + return false, file .. " = " .. err + end + table.insert(data, f:read("*a")) + f:close() + end + return true, data +end + return utils diff --git a/src/bw/misc/asn.mmdb b/src/bw/misc/asn.mmdb index abb1d410f..dd1ec81f9 100644 Binary files a/src/bw/misc/asn.mmdb and b/src/bw/misc/asn.mmdb differ diff --git a/src/bw/misc/country.mmdb b/src/bw/misc/country.mmdb index be7e299f1..40b951b6e 100644 Binary files a/src/bw/misc/country.mmdb and b/src/bw/misc/country.mmdb differ diff --git a/src/common/api/API.py b/src/common/api/API.py index 4a94f5474..b5aa3218b 100644 --- a/src/common/api/API.py +++ b/src/common/api/API.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from typing import Literal, Optional, Union from requests import request diff --git a/src/common/cli/CLI.py b/src/common/cli/CLI.py index 507e9488d..b8b6cf754 100644 --- a/src/common/cli/CLI.py +++ b/src/common/cli/CLI.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from dotenv import dotenv_values from os import getenv, sep @@ -6,11 +6,12 @@ from os.path import join from pathlib import Path from redis import StrictRedis from sys import path as sys_path -from typing import Tuple +from typing import Optional, Tuple -if join(sep, "usr", "share", "bunkerweb", "utils") not in sys_path: - sys_path.append(join(sep, "usr", "share", "bunkerweb", "utils")) +for deps_path in [join(sep, "usr", "share", "bunkerweb", *paths) for paths in (("utils",), ("db",))]: + if deps_path not in sys_path: + sys_path.append(deps_path) from API import API # type: ignore from ApiCaller import ApiCaller # type: ignore @@ -40,41 +41,40 @@ def format_remaining_time(seconds): class CLI(ApiCaller): def __init__(self): self.__logger = setup_logger("CLI", getenv("LOG_LEVEL", "INFO")) - db_path = Path(sep, "usr", "share", "bunkerweb", "db") - - if not db_path.is_dir(): - self.__variables = dotenv_values(join(sep, "etc", "nginx", "variables.env")) - else: - if str(db_path) not in sys_path: - sys_path.append(str(db_path)) + variables_path = Path(sep, "etc", "nginx", "variables.env") + self.__variables = {} + if variables_path.is_file(): + self.__variables = dotenv_values(variables_path) + if Path(sep, "usr", "share", "bunkerweb", "db").exists(): from Database import Database # type: ignore - db = Database( - self.__logger, - sqlalchemy_string=getenv("DATABASE_URI", None), - ) + db = Database(self.__logger, sqlalchemy_string=self.__get_variable("DATABASE_URI", None)) self.__variables = db.get_config() + assert isinstance(self.__variables, dict), "Failed to get variables from database" + self.__integration = self.__detect_integration() - self.__use_redis = self.__variables.get("USE_REDIS", "no") == "yes" + self.__use_redis = self.__get_variable("USE_REDIS", "no") == "yes" self.__redis = None if self.__use_redis: - redis_host = self.__variables.get("REDIS_HOST") + redis_host = self.__get_variable("REDIS_HOST") if redis_host: - redis_port = self.__variables.get("REDIS_PORT", "6379") + redis_port = self.__get_variable("REDIS_PORT", "6379") + assert isinstance(redis_port, str), "REDIS_PORT is not a string" if not redis_port.isdigit(): self.__logger.error(f"REDIS_PORT is not a valid port number: {redis_port}, defaulting to 6379") redis_port = "6379" redis_port = int(redis_port) - redis_db = self.__variables.get("REDIS_DB", "0") + redis_db = self.__get_variable("REDIS_DB", "0") + assert isinstance(redis_db, str), "REDIS_DB is not a string" if not redis_db.isdigit(): self.__logger.error(f"REDIS_DB is not a valid database number: {redis_db}, defaulting to 0") redis_db = "0" redis_db = int(redis_db) - redis_timeout = self.__variables.get("REDIS_TIMEOUT", "1000.0") + redis_timeout = self.__get_variable("REDIS_TIMEOUT", "1000.0") if redis_timeout: try: redis_timeout = float(redis_timeout) @@ -82,7 +82,8 @@ class CLI(ApiCaller): self.__logger.error(f"REDIS_TIMEOUT is not a valid timeout: {redis_timeout}, defaulting to 1000 ms") redis_timeout = 1000.0 - redis_keepalive_pool = self.__variables.get("REDIS_KEEPALIVE_POOL", "10") + redis_keepalive_pool = self.__get_variable("REDIS_KEEPALIVE_POOL", "10") + assert isinstance(redis_keepalive_pool, str), "REDIS_KEEPALIVE_POOL is not a string" if not redis_keepalive_pool.isdigit(): self.__logger.error(f"REDIS_KEEPALIVE_POOL is not a valid number of connections: {redis_keepalive_pool}, defaulting to 10") redis_keepalive_pool = "10" @@ -96,23 +97,18 @@ class CLI(ApiCaller): socket_connect_timeout=redis_timeout, socket_keepalive=True, max_connections=redis_keepalive_pool, - ssl=self.__variables.get("REDIS_SSL", "no") == "yes", + ssl=self.__get_variable("REDIS_SSL", "no") == "yes", ) else: self.__logger.error("USE_REDIS is set to yes but REDIS_HOST is not set, disabling redis") self.__use_redis = False - if not db_path.is_dir() or self.__integration not in ( - "kubernetes", - "swarm", - "autoconf", - ): - # Docker & Linux case + if self.__integration == "linux": super().__init__( [ API( - f"http://127.0.0.1:{self.__variables.get('API_HTTP_PORT', '5000')}", - host=self.__variables.get("API_SERVER_NAME", "bwapi"), + f"http://127.0.0.1:{self.__get_variable('API_HTTP_PORT', '5000')}", + host=self.__get_variable("API_SERVER_NAME", "bwapi"), ) ] ) @@ -120,14 +116,20 @@ class CLI(ApiCaller): super().__init__() self.auto_setup(self.__integration) + def __get_variable(self, variable: str, default: Optional[str] = None) -> Optional[str]: + return getenv(variable, self.__variables.get(variable, default)) + def __detect_integration(self) -> str: + if Path(sep, "usr", "sbin", "nginx").exists(): + return "linux" + integration_path = Path(sep, "usr", "share", "bunkerweb", "INTEGRATION") os_release_path = Path(sep, "etc", "os-release") - if self.__variables.get("KUBERNETES_MODE", "no").lower() == "yes": + if self.__get_variable("KUBERNETES_MODE", "no").lower() == "yes": # type: ignore return "kubernetes" - elif self.__variables.get("SWARM_MODE", "no").lower() == "yes": + elif self.__get_variable("SWARM_MODE", "no").lower() == "yes": # type: ignore return "swarm" - elif self.__variables.get("AUTOCONF_MODE", "no").lower() == "yes": + elif self.__get_variable("AUTOCONF_MODE", "no").lower() == "yes": # type: ignore return "autoconf" elif integration_path.is_file(): return integration_path.read_text(encoding="utf-8").strip().lower() @@ -148,19 +150,12 @@ class CLI(ApiCaller): def ban(self, ip: str, exp: float) -> Tuple[bool, str]: if self.__redis: - ok = self.__redis.set( - f"bans_ip_{ip}", - "manual", - ex=exp, - ) + ok = self.__redis.set(f"bans_ip_{ip}", "manual", ex=exp) if not ok: self.__logger.error(f"Failed to ban {ip} in redis") if self.send_to_apis("POST", "/ban", data={"ip": ip, "exp": exp}): - return ( - True, - f"IP {ip} has been banned for {format_remaining_time(exp)}", - ) + return (True, f"IP {ip} has been banned for {format_remaining_time(exp)}") return False, "error" def bans(self) -> Tuple[bool, str]: @@ -178,13 +173,7 @@ class CLI(ApiCaller): for key in self.__redis.scan_iter("bans_ip_*"): ip = key.decode("utf-8").replace("bans_ip_", "") exp = self.__redis.ttl(key) - servers["redis"].append( - { - "ip": ip, - "exp": exp, - "reason": "manual", - } - ) + servers["redis"].append({"ip": ip, "exp": exp, "reason": "manual"}) cli_str = "" for server, bans in servers.items(): diff --git a/src/common/cli/main.py b/src/common/cli/main.py index ad019711e..92473b7c7 100644 --- a/src/common/cli/main.py +++ b/src/common/cli/main.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from argparse import ArgumentParser from os import _exit, getenv, sep diff --git a/src/common/confs/api.conf b/src/common/confs/api.conf index 80b60a0ef..61efdd377 100644 --- a/src/common/confs/api.conf +++ b/src/common/confs/api.conf @@ -17,55 +17,63 @@ server { access_by_lua_block { -- Instantiate objects and import required modules local logger = require "bunkerweb.logger":new("API") - local api = require "bunkerweb.api":new() local helpers = require "bunkerweb.helpers" + local ngx = ngx + local INFO = ngx.INFO + local ERR = ngx.ERR + local WARN = ngx.WARN + local NOTICE = ngx.NOTICE + local HTTP_CLOSE = ngx.HTTP_CLOSE + local exit = ngx.exit + local say = ngx.say + local fill_ctx = helpers.fill_ctx + local tostring = tostring + -- Start API handler - logger:log(ngx.INFO, "API handler started") + logger:log(INFO, "API handler started") -- Fill ctx - logger:log(ngx.INFO, "filling ngx.ctx ...") - local ok, ret, errors, ctx = helpers.fill_ctx() + logger:log(INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = fill_ctx(true) if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + logger:log(ERR, "fill_ctx() failed : " .. ret) elseif errors then for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) + logger:log(ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end - logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") + logger:log(INFO, "ngx.ctx filled (ret = " .. ret .. ")") -- Check host header if not ctx.bw.http_host or ctx.bw.http_host ~= "{{ API_SERVER_NAME }}" then - logger:log(ngx.WARN, "wrong Host header from IP " .. ctx.bw.remote_addr) - return ngx.exit(ngx.HTTP_CLOSE) + logger:log(WARN, "wrong Host header from IP " .. ctx.bw.remote_addr) + return exit(HTTP_CLOSE) end -- Check IP + local api = require "bunkerweb.api":new(ctx) local ok, err = api:is_allowed_ip() if not ok then - logger:log(ngx.WARN, "can't validate access from IP " .. ctx.bw.remote_addr .. " : " .. err) - return ngx.exit(ngx.HTTP_CLOSE) + logger:log(WARN, "can't validate access from IP " .. ctx.bw.remote_addr .. " : " .. err) + return exit(HTTP_CLOSE) end - logger:log(ngx.NOTICE, "validated access from IP " .. ctx.bw.remote_addr) + logger:log(NOTICE, "validated access from IP " .. ctx.bw.remote_addr) -- Do API call local ok, err, status, resp = api:do_api_call() if not ok then - logger:log(ngx.WARN, "call from " .. ctx.bw.remote_addr .. " on " .. ctx.bw.uri .. " failed : " .. err) + logger:log(WARN, "call from " .. ctx.bw.remote_addr .. " on " .. ctx.bw.uri .. " failed : " .. err) else - logger:log(ngx.NOTICE, "successful call from " .. ctx.bw.remote_addr .. " on " .. ctx.bw.uri .. " : " .. err) + logger:log(NOTICE, "successful call from " .. ctx.bw.remote_addr .. " on " .. ctx.bw.uri .. " : " .. err) end - -- Start API handler - logger:log(ngx.INFO, "API handler ended") - - -- Save ctx - ngx.ctx = ctx + -- Stop API handler + logger:log(INFO, "API handler ended") -- Send response ngx.status = status - ngx.say(resp) - return ngx.exit(status) + say(resp) + return exit(status) } } diff --git a/src/common/confs/default-server-http.conf b/src/common/confs/default-server-http.conf index f1d0b06f4..84bc51da4 100644 --- a/src/common/confs/default-server-http.conf +++ b/src/common/confs/default-server-http.conf @@ -45,70 +45,78 @@ server { local helpers = require "bunkerweb.helpers" local cjson = require "cjson" + local ngx = ngx + local INFO = ngx.INFO + local ERR = ngx.ERR + local fill_ctx = helpers.fill_ctx + local tostring = tostring + local get_reason = utils.get_reason + local require_plugin = helpers.require_plugin + local new_plugin = helpers.new_plugin + local call_plugin = helpers.call_plugin + -- Start log phase local logger = clogger:new("LOG-DEFAULT") local datastore = cdatastore:new() - logger:log(ngx.INFO, "log_default phase started") + logger:log(INFO, "log_default phase started") -- Fill ctx - logger:log(ngx.INFO, "filling ngx.ctx ...") - local ok, ret, errors, ctx = helpers.fill_ctx() + logger:log(INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = fill_ctx() if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + logger:log(ERR, "fill_ctx() failed : " .. ret) elseif errors then for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) + logger:log(ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end - logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") + logger:log(INFO, "ngx.ctx filled (ret = " .. ret .. ")") -- Get plugins order local order, err = datastore:get("plugins_order", true) if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + logger:log(ERR, "can't get plugins order from datastore : " .. err) return end -- Call log_default() methods - logger:log(ngx.INFO, "calling log_default() methods of plugins ...") + logger:log(INFO, "calling log_default() methods of plugins ...") for i, plugin_id in ipairs(order.log_default) do -- Require call - local plugin_lua, err = helpers.require_plugin(plugin_id) + local plugin_lua, err = require_plugin(plugin_id) if plugin_lua == false then - logger:log(ngx.ERR, err) + logger:log(ERR, err) elseif plugin_lua == nil then - logger:log(ngx.INFO, err) + logger:log(INFO, err) else -- Check if plugin has log method if plugin_lua.log_default ~= nil then -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua) + local ok, plugin_obj = new_plugin(plugin_lua, ctx) if not ok then - logger:log(ngx.ERR, plugin_obj) + logger:log(ERR, plugin_obj) else - local ok, ret = helpers.call_plugin(plugin_obj, "log_default") + local ok, ret = call_plugin(plugin_obj, "log_default") if not ok then - logger:log(ngx.ERR, ret) + logger:log(ERR, ret) else - logger:log(ngx.INFO, plugin_id .. ":log_default() call successful : " .. ret.msg) + logger:log(INFO, plugin_id .. ":log_default() call successful : " .. ret.msg) end end else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method log_default() is not defined") + logger:log(INFO, "skipped execution of " .. plugin_id .. " because method log_default() is not defined") end end end - logger:log(ngx.INFO, "called log_default() methods of plugins") + logger:log(INFO, "called log_default() methods of plugins") -- Display reason at info level - if ctx.reason then - logger:log(ngx.INFO, "client was denied with reason : " .. reason) + local reason = get_reason(ctx) + if reason then + logger:log(INFO, "client was denied with reason : " .. reason) end - -- Save ctx - ngx.ctx = ctx - - logger:log(ngx.INFO, "log_default phase ended") + logger:log(INFO, "log_default phase ended") } diff --git a/src/common/confs/init-lua.conf b/src/common/confs/init-lua.conf index bdcd80529..a8811b535 100644 --- a/src/common/confs/init-lua.conf +++ b/src/common/confs/init-lua.conf @@ -5,57 +5,71 @@ init_by_lua_block { local cdatastore = require "bunkerweb.datastore" local cjson = require "cjson" + local ngx = ngx + local INFO = ngx.INFO + local ERR = ngx.ERR + local NOTICE = ngx.NOTICE + local popen = io.popen + local open = io.open + local load_plugin = helpers.load_plugin + local load_variables = helpers.load_variables + local order_plugins = helpers.order_plugins + local require_plugin = helpers.require_plugin + local new_plugin = helpers.new_plugin + local call_plugin = helpers.call_plugin + local encode = cjson.encode + -- Start init phase local logger = clogger:new("INIT") local datastore = cdatastore:new() - logger:log(ngx.NOTICE, "init phase started") + logger:log(NOTICE, "init phase started") -- Remove previous data from the datastore - logger:log(ngx.NOTICE, "deleting old keys from datastore ...") + logger:log(NOTICE, "deleting old keys from datastore ...") datastore:flush_lru() local data_keys = { "^plugin", "^misc_" } for i, key in pairs(data_keys) do local ok, err = datastore:delete_all(key) if not ok then - logger:log(ngx.ERR, "can't delete " .. key .. " from datastore : " .. err) + logger:log(ERR, "can't delete " .. key .. " from datastore : " .. err) return false end - logger:log(ngx.INFO, "deleted " .. key .. " from datastore") + logger:log(INFO, "deleted " .. key .. " from datastore") end - logger:log(ngx.NOTICE, "deleted old keys from datastore") + logger:log(NOTICE, "deleted old keys from datastore") -- Load plugins into the datastore - logger:log(ngx.NOTICE, "saving plugins into datastore ...") + logger:log(NOTICE, "saving plugins into datastore ...") local plugins = {} local plugin_paths = { "/usr/share/bunkerweb/core", "/etc/bunkerweb/plugins" } for i, plugin_path in ipairs(plugin_paths) do - local paths = io.popen("find -L " .. plugin_path .. " -maxdepth 1 -type d ! -path " .. plugin_path) + local paths = popen("find -L " .. plugin_path .. " -maxdepth 1 -type d ! -path " .. plugin_path) for path in paths:lines() do - local ok, plugin = helpers.load_plugin(path .. "/plugin.json") + local ok, plugin = load_plugin(path .. "/plugin.json") if not ok then - logger:log(ngx.ERR, plugin) + logger:log(ERR, plugin) else local ok, err = datastore:set("plugin_" .. plugin.id, plugin, nil, true) if not ok then - logger:log(ngx.ERR, "can't save " .. plugin.id .. " into datastore : " .. err) + logger:log(ERR, "can't save " .. plugin.id .. " into datastore : " .. err) else table.insert(plugins, plugin) - logger:log(ngx.NOTICE, "loaded plugin " .. plugin.id .. " v" .. plugin.version) + logger:log(NOTICE, "loaded plugin " .. plugin.id .. " v" .. plugin.version) end end end end local ok, err = datastore:set("plugins", plugins, nil, true) if not ok then - logger:log(ngx.ERR, "can't save plugins into datastore : " .. err) + logger:log(ERR, "can't save plugins into datastore : " .. err) return false end -- Load variables into the datastore - logger:log(ngx.NOTICE, "saving variables into datastore ...") - local file = io.open("/etc/nginx/variables.env") + logger:log(NOTICE, "saving variables into datastore ...") + local file = open("/etc/nginx/variables.env") if not file then - logger:log(ngx.ERR, "can't open /etc/nginx/variables.env file") + logger:log(ERR, "can't open /etc/nginx/variables.env file") return false end file:close() @@ -64,73 +78,73 @@ init_by_lua_block { local variable, value = line:match("^([^=]+)=(.*)$") all_variables[variable] = value end - local ok, variables = helpers.load_variables(all_variables, plugins) + local ok, variables = load_variables(all_variables, plugins) if not ok then - logger:log(ngx.ERR, "error while loading variables : " .. variables) + logger:log(ERR, "error while loading variables : " .. variables) return false end local ok, err = datastore:set("variables", variables, nil, true) if not ok then - logger:log(ngx.ERR, "can't save plugins into datastore : " .. err) + logger:log(ERR, "can't save plugins into datastore : " .. err) return false end - logger:log(ngx.NOTICE, "saved variables into datastore") + logger:log(NOTICE, "saved variables into datastore") -- Purge cache - local cachestore = require "bunkerweb.cachestore":new(false, true) + local cachestore = require "bunkerweb.cachestore":new(false) local ok, err = cachestore:purge() if not ok then - logger:log(ngx.ERR, "can't purge cachestore : " .. err) + logger:log(ERR, "can't purge cachestore : " .. err) end - logger:log(ngx.NOTICE, "saving plugins order into datastore ...") - local ok, order = helpers.order_plugins(plugins) + logger:log(NOTICE, "saving plugins order into datastore ...") + local ok, order = order_plugins(plugins) if not ok then - logger:log(ngx.ERR, "can't compute plugins order : " .. err) + logger:log(ERR, "can't compute plugins order : " .. err) return false end for phase, id_list in pairs(order) do - logger:log(ngx.NOTICE, "plugins order for phase " .. phase .. " : " .. cjson.encode(id_list)) + logger:log(NOTICE, "plugins order for phase " .. phase .. " : " .. encode(id_list)) end local ok, err = datastore:set("plugins_order", order, nil, true) if not ok then - logger:log(ngx.ERR, "can't save plugins order into datastore : " .. err) + logger:log(ERR, "can't save plugins order into datastore : " .. err) return false end - logger:log(ngx.NOTICE, "saved plugins order into datastore") + logger:log(NOTICE, "saved plugins order into datastore") -- Call init() method - logger:log(ngx.NOTICE, "calling init() methods of plugins ...") + logger:log(NOTICE, "calling init() methods of plugins ...") for i, plugin_id in ipairs(order["init"]) do -- Require call - local plugin_lua, err = helpers.require_plugin(plugin_id) + local plugin_lua, err = require_plugin(plugin_id) if plugin_lua == false then - logger:log(ngx.ERR, err) + logger:log(ERR, err) elseif plugin_lua == nil then - logger:log(ngx.NOTICE, err) + logger:log(NOTICE, err) else -- Check if plugin has init method if plugin_lua.init ~= nil then -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua) + local ok, plugin_obj = new_plugin(plugin_lua) if not ok then - logger:log(ngx.ERR, plugin_obj) + logger:log(ERR, plugin_obj) else - local ok, ret = helpers.call_plugin(plugin_obj, "init") + local ok, ret = call_plugin(plugin_obj, "init") if not ok then - logger:log(ngx.ERR, ret) + logger:log(ERR, ret) elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":init() call failed : " .. ret.msg) + logger:log(ERR, plugin_id .. ":init() call failed : " .. ret.msg) else - logger:log(ngx.NOTICE, plugin_id .. ":init() call successful : " .. ret.msg) + logger:log(NOTICE, plugin_id .. ":init() call successful : " .. ret.msg) end end else - logger:log(ngx.NOTICE, "skipped execution of " .. plugin.id .. " because method init() is not defined") + logger:log(NOTICE, "skipped execution of " .. plugin.id .. " because method init() is not defined") end end end - logger:log(ngx.NOTICE, "called init() methods of plugins") + logger:log(NOTICE, "called init() methods of plugins") - logger:log(ngx.NOTICE, "init phase ended") + logger:log(NOTICE, "init phase ended") } diff --git a/src/common/confs/init-stream-lua.conf b/src/common/confs/init-stream-lua.conf index 3598f5bb1..737238cb7 100644 --- a/src/common/confs/init-stream-lua.conf +++ b/src/common/confs/init-stream-lua.conf @@ -5,57 +5,71 @@ init_by_lua_block { local cdatastore = require "bunkerweb.datastore" local cjson = require "cjson" + local ngx = ngx + local INFO = ngx.INFO + local ERR = ngx.ERR + local NOTICE = ngx.NOTICE + local popen = io.popen + local open = io.open + local load_plugin = helpers.load_plugin + local load_variables = helpers.load_variables + local order_plugins = helpers.order_plugins + local require_plugin = helpers.require_plugin + local new_plugin = helpers.new_plugin + local call_plugin = helpers.call_plugin + local encode = cjson.encode + -- Start init phase local logger = clogger:new("INIT") local datastore = cdatastore:new() - logger:log(ngx.NOTICE, "init-stream phase started") + logger:log(NOTICE, "init-stream phase started") -- Remove previous data from the datastore - logger:log(ngx.NOTICE, "deleting old keys from datastore ...") + logger:log(NOTICE, "deleting old keys from datastore ...") datastore:flush_lru() local data_keys = { "^plugin", "^misc_" } for i, key in pairs(data_keys) do local ok, err = datastore:delete_all(key) if not ok then - logger:log(ngx.ERR, "can't delete " .. key .. " from datastore : " .. err) + logger:log(ERR, "can't delete " .. key .. " from datastore : " .. err) return false end - logger:log(ngx.INFO, "deleted " .. key .. " from datastore") + logger:log(INFO, "deleted " .. key .. " from datastore") end - logger:log(ngx.NOTICE, "deleted old keys from datastore") + logger:log(NOTICE, "deleted old keys from datastore") -- Load plugins into the datastore - logger:log(ngx.NOTICE, "saving plugins into datastore ...") + logger:log(NOTICE, "saving plugins into datastore ...") local plugins = {} local plugin_paths = { "/usr/share/bunkerweb/core", "/etc/bunkerweb/plugins" } for i, plugin_path in ipairs(plugin_paths) do - local paths = io.popen("find -L " .. plugin_path .. " -maxdepth 1 -type d ! -path " .. plugin_path) + local paths = popen("find -L " .. plugin_path .. " -maxdepth 1 -type d ! -path " .. plugin_path) for path in paths:lines() do - local ok, plugin = helpers.load_plugin(path .. "/plugin.json") + local ok, plugin = load_plugin(path .. "/plugin.json") if not ok then - logger:log(ngx.ERR, plugin) + logger:log(ERR, plugin) else local ok, err = datastore:set("plugin_" .. plugin.id, plugin, true) if not ok then - logger:log(ngx.ERR, "can't save " .. plugin.id .. " into datastore : " .. err) + logger:log(ERR, "can't save " .. plugin.id .. " into datastore : " .. err) else table.insert(plugins, plugin) - logger:log(ngx.NOTICE, "loaded plugin " .. plugin.id .. " v" .. plugin.version) + logger:log(NOTICE, "loaded plugin " .. plugin.id .. " v" .. plugin.version) end end end end local ok, err = datastore:set("plugins", plugins, nil, true) if not ok then - logger:log(ngx.ERR, "can't save plugins into datastore : " .. err) + logger:log(ERR, "can't save plugins into datastore : " .. err) return false end -- Load variables into the datastore logger:log(ngx.NOTICE, "saving variables into datastore ...") - local file = io.open("/etc/nginx/variables.env") + local file = open("/etc/nginx/variables.env") if not file then - logger:log(ngx.ERR, "can't open /etc/nginx/variables.env file") + logger:log(ERR, "can't open /etc/nginx/variables.env file") return false end file:close() @@ -64,73 +78,73 @@ init_by_lua_block { local variable, value = line:match("^([^=]+)=(.*)$") all_variables[variable] = value end - local ok, variables = helpers.load_variables(all_variables, plugins) + local ok, variables = load_variables(all_variables, plugins) if not ok then - logger:log(ngx.ERR, "error while loading variables : " .. variables) + logger:log(ERR, "error while loading variables : " .. variables) return false end local ok, err = datastore:set("variables", variables, nil, true) if not ok then - logger:log(ngx.ERR, "can't save plugins into datastore : " .. err) + logger:log(ERR, "can't save plugins into datastore : " .. err) return false end - logger:log(ngx.NOTICE, "saved variables into datastore") + logger:log(NOTICE, "saved variables into datastore") -- Purge cache - local cachestore = require "bunkerweb.cachestore":new(false, true) + local cachestore = require "bunkerweb.cachestore":new(false) local ok, err = cachestore:purge() if not ok then - logger:log(ngx.ERR, "can't purge cachestore : " .. err) + logger:log(ERR, "can't purge cachestore : " .. err) end - logger:log(ngx.NOTICE, "saving plugins order into datastore ...") - local ok, order = helpers.order_plugins(plugins) + logger:log(NOTICE, "saving plugins order into datastore ...") + local ok, order = order_plugins(plugins) if not ok then - logger:log(ngx.ERR, "can't compute plugins order : " .. err) + logger:log(ERR, "can't compute plugins order : " .. err) return false end for phase, id_list in pairs(order) do - logger:log(ngx.NOTICE, "plugins order for phase " .. phase .. " : " .. cjson.encode(id_list)) + logger:log(NOTICE, "plugins order for phase " .. phase .. " : " .. encode(id_list)) end local ok, err = datastore:set("plugins_order", order, nil, true) if not ok then - logger:log(ngx.ERR, "can't save plugins order into datastore : " .. err) + logger:log(ERR, "can't save plugins order into datastore : " .. err) return false end - logger:log(ngx.NOTICE, "saved plugins order into datastore") + logger:log(NOTICE, "saved plugins order into datastore") -- Call init() method - logger:log(ngx.NOTICE, "calling init() methods of plugins ...") + logger:log(NOTICE, "calling init() methods of plugins ...") for i, plugin_id in ipairs(order["init"]) do -- Require call - local plugin_lua, err = helpers.require_plugin(plugin_id) + local plugin_lua, err = require_plugin(plugin_id) if plugin_lua == false then - logger:log(ngx.ERR, err) + logger:log(ERR, err) elseif plugin_lua == nil then - logger:log(ngx.NOTICE, err) + logger:log(NOTICE, err) else -- Check if plugin has init method if plugin_lua.init ~= nil then -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua) + local ok, plugin_obj = new_plugin(plugin_lua) if not ok then - logger:log(ngx.ERR, plugin_obj) + logger:log(ERR, plugin_obj) else - local ok, ret = helpers.call_plugin(plugin_obj, "init") + local ok, ret = call_plugin(plugin_obj, "init") if not ok then - logger:log(ngx.ERR, ret) + logger:log(ERR, ret) elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":init() call failed : " .. ret.msg) + logger:log(ERR, plugin_id .. ":init() call failed : " .. ret.msg) else - logger:log(ngx.NOTICE, plugin_id .. ":init() call successful : " .. ret.msg) + logger:log(NOTICE, plugin_id .. ":init() call successful : " .. ret.msg) end end else - logger:log(ngx.NOTICE, "skipped execution of " .. plugin.id .. " because method init() is not defined") + logger:log(NOTICE, "skipped execution of " .. plugin.id .. " because method init() is not defined") end end end - logger:log(ngx.NOTICE, "called init() methods of plugins") + logger:log(NOTICE, "called init() methods of plugins") - logger:log(ngx.NOTICE, "init-stream phase ended") + logger:log(NOTICE, "init-stream phase ended") } diff --git a/src/common/confs/init-worker-lua.conf b/src/common/confs/init-worker-lua.conf index f2a3edf86..01d3f29cc 100644 --- a/src/common/confs/init-worker-lua.conf +++ b/src/common/confs/init-worker-lua.conf @@ -5,16 +5,23 @@ init_worker_by_lua_block { local ready_work = function(premature) -- Libs local helpers = require "bunkerweb.helpers" - local cjson = require "cjson" -- Instantiate objects local logger = require "bunkerweb.logger":new("INIT-WORKER") local datastore = require "bunkerweb.datastore":new() + local ngx = ngx + local INFO = ngx.INFO + local ERR = ngx.ERR + local NOTICE = ngx.NOTICE + local require_plugin = helpers.require_plugin + local new_plugin = helpers.new_plugin + local call_plugin = helpers.call_plugin + -- Don't go further we are in loading state local is_loading, err = require "bunkerweb.utils".get_variable("IS_LOADING", false) if not is_loading then - logger:log(ngx.ERR, "utils.get_variable() failed : " .. err) + logger:log(ERR, "utils.get_variable() failed : " .. err) return elseif is_loading == "yes" then return @@ -23,92 +30,92 @@ init_worker_by_lua_block { -- Instantiate lock local lock = require "resty.lock":new("worker_lock", { timeout = 10 }) if not lock then - logger:log(ngx.ERR, "lock:new() failed : " .. err) + logger:log(ERR, "lock:new() failed : " .. err) return end -- Acquire lock local elapsed, err = lock:lock("ready") if elapsed == nil then - logger:log(ngx.ERR, "lock:lock() failed : " .. err) + logger:log(ERR, "lock:lock() failed : " .. err) return end -- Check if work is done local ok, err = datastore:get("misc_ready") if not ok and err ~= "not found" then - logger:log(ngx.ERR, "datastore:get() failed : " .. err) + logger:log(ERR, "datastore:get() failed : " .. err) local ok, err = lock:unlock() if not ok then - logger:log(ngx.ERR, "lock:unlock() failed : " .. err) + logger:log(ERR, "lock:unlock() failed : " .. err) end return end if ok then local ok, err = lock:unlock() if not ok then - logger:log(ngx.ERR, "lock:unlock() failed : " .. err) + logger:log(ERR, "lock:unlock() failed : " .. err) end return end - logger:log(ngx.INFO, "init_worker phase started") + logger:log(INFO, "init_worker phase started") -- Get plugins order local order, err = datastore:get("plugins_order", true) if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + logger:log(ERR, "can't get plugins order from datastore : " .. err) local ok, err = lock:unlock() if not ok then - logger:log(ngx.ERR, "lock:unlock() failed : " .. err) + logger:log(ERR, "lock:unlock() failed : " .. err) end return end -- Call init_worker() methods - logger:log(ngx.INFO, "calling init_worker() methods of plugins ...") + logger:log(INFO, "calling init_worker() methods of plugins ...") for i, plugin_id in ipairs(order.init_worker) do -- Require call - local plugin_lua, err = helpers.require_plugin(plugin_id) + local plugin_lua, err = require_plugin(plugin_id) if plugin_lua == false then - logger:log(ngx.ERR, err) + logger:log(ERR, err) elseif plugin_lua == nil then - logger:log(ngx.INFO, err) + logger:log(INFO, err) else -- Check if plugin has init_worker method if plugin_lua.init_worker ~= nil then -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua) + local ok, plugin_obj = new_plugin(plugin_lua) if not ok then - logger:log(ngx.ERR, plugin_obj) + logger:log(ERR, plugin_obj) else - local ok, ret = helpers.call_plugin(plugin_obj, "init_worker") + local ok, ret = call_plugin(plugin_obj, "init_worker") if not ok then - logger:log(ngx.ERR, ret) + logger:log(ERR, ret) elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":init_worker() call failed : " .. ret.msg) + logger:log(ERR, plugin_id .. ":init_worker() call failed : " .. ret.msg) else - logger:log(ngx.INFO, plugin_id .. ":init_worker() call successful : " .. ret.msg) + logger:log(INFO, plugin_id .. ":init_worker() call successful : " .. ret.msg) end end else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method init_worker() is not defined") + logger:log(INFO, "skipped execution of " .. plugin_id .. " because method init_worker() is not defined") end end end - logger:log(ngx.INFO, "called init_worker() methods of plugins") + logger:log(INFO, "called init_worker() methods of plugins") -- End local ok, err = datastore:set("misc_ready", "ok") if not ok then - logger:log(ngx.ERR, "datastore:set() failed : " .. err) + logger:log(ERR, "datastore:set() failed : " .. err) end local ok, err = lock:unlock() if not ok then - logger:log(ngx.ERR, "lock:unlock() failed : " .. err) + logger:log(ERR, "lock:unlock() failed : " .. err) end - logger:log(ngx.INFO, "init phase ended") - logger:log(ngx.NOTICE, "BunkerWeb is ready to fool hackers ! πŸš€") + logger:log(INFO, "init phase ended") + logger:log(NOTICE, "BunkerWeb is ready to fool hackers ! πŸš€") end -- Start timer diff --git a/src/common/confs/server-http/access-lua.conf b/src/common/confs/server-http/access-lua.conf index 8d6edc844..a707fcebb 100644 --- a/src/common/confs/server-http/access-lua.conf +++ b/src/common/confs/server-http/access-lua.conf @@ -1,118 +1,138 @@ access_by_lua_block { - local class = require "middleclass" local clogger = require "bunkerweb.logger" local helpers = require "bunkerweb.helpers" local utils = require "bunkerweb.utils" local cdatastore = require "bunkerweb.datastore" - local cclusterstore = require "bunkerweb.clusterstore" - local cjson = require "cjson" + + local ngx = ngx + local ngx_req = ngx.req + local is_internal = ngx_req.is_internal + local exit = ngx.exit + local ngx_redirect = ngx.redirect + local ERR = ngx.ERR + local INFO = ngx.INFO + local WARN = ngx.WARN + local NOTICE = ngx.NOTICE + local fill_ctx = helpers.fill_ctx + local save_ctx = helpers.save_ctx + local require_plugin = helpers.require_plugin + local new_plugin = helpers.new_plugin + local call_plugin = helpers.call_plugin + local is_whitelisted = utils.is_whitelisted + local is_banned = utils.is_banned + local set_reason = utils.set_reason + local get_deny_status = utils.get_deny_status + local tostring = tostring -- Don't process internal requests local logger = clogger:new("ACCESS") - if ngx.req.is_internal() then - logger:log(ngx.INFO, "skipped access phase because request is internal") + if is_internal() then + logger:log(INFO, "skipped access phase because request is internal") return true end -- Start access phase local datastore = cdatastore:new() - logger:log(ngx.INFO, "access phase started") + logger:log(INFO, "access phase started") -- Fill ctx - logger:log(ngx.INFO, "filling ngx.ctx ...") - local ok, ret, errors, ctx = helpers.fill_ctx() + logger:log(INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = fill_ctx() if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + logger:log(ERR, "fill_ctx() failed : " .. ret) elseif errors then for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) + logger:log(ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end - logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") + logger:log(INFO, "ngx.ctx filled (ret = " .. ret .. ")") -- Process bans as soon as possible - if ctx.bw.is_whitelisted ~= "yes" then - local banned, reason, ttl = utils.is_banned(ctx.bw.remote_addr) + if not is_whitelisted(ctx) then + local banned, reason, ttl = is_banned(ctx.bw.remote_addr) if banned == nil then - logger:log(ngx.ERR, "can't check if IP " .. ctx.bw.remote_addr .. " is banned : " .. reason) + logger:log(ERR, "can't check if IP " .. ctx.bw.remote_addr .. " is banned : " .. reason) elseif banned then - logger:log(ngx.WARN, + ctx.bw.is_banned = true + set_reason(reason, {}, ctx) + save_ctx(ctx) + logger:log(WARN, "IP " .. ctx.bw.remote_addr .. " is banned with reason " .. reason .. " (" .. tostring(ttl) .. "s remaining)") - return ngx.exit(utils.get_deny_status(ctx)) + return exit(get_deny_status()) else - logger:log(ngx.INFO, "IP " .. ctx.bw.remote_addr .. " is not banned") + logger:log(INFO, "IP " .. ctx.bw.remote_addr .. " is not banned") end end -- Get plugins order local order, err = datastore:get("plugins_order", true) if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + logger:log(ERR, "can't get plugins order from datastore : " .. err) return end -- Call access() methods - logger:log(ngx.INFO, "calling access() methods of plugins ...") + logger:log(INFO, "calling access() methods of plugins ...") local status = nil local redirect = nil for i, plugin_id in ipairs(order.access) do -- Require call - local plugin_lua, err = helpers.require_plugin(plugin_id) + local plugin_lua, err = require_plugin(plugin_id) if plugin_lua == false then - logger:log(ngx.ERR, err) + logger:log(ERR, err) elseif plugin_lua == nil then - logger:log(ngx.INFO, err) + logger:log(INFO, err) else -- Check if plugin has access method if plugin_lua.access ~= nil then -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) + local ok, plugin_obj = new_plugin(plugin_lua, ctx) if not ok then - logger:log(ngx.ERR, plugin_obj) + logger:log(ERR, plugin_obj) else - local ok, ret = helpers.call_plugin(plugin_obj, "access") + local ok, ret = call_plugin(plugin_obj, "access") if not ok then - logger:log(ngx.ERR, ret) + logger:log(ERR, ret) elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":access() call failed : " .. ret.msg) + logger:log(ERR, plugin_id .. ":access() call failed : " .. ret.msg) else - logger:log(ngx.INFO, plugin_id .. ":access() call successful : " .. ret.msg) + logger:log(INFO, plugin_id .. ":access() call successful : " .. ret.msg) end if ret.status then - if ret.status == utils.get_deny_status(ctx) then - ctx.bw.reason = plugin_id - logger:log(ngx.WARN, "denied access from " .. plugin_id .. " : " .. ret.msg) + if ret.status == get_deny_status() then + set_reason(plugin_id, ret.data, ctx) + logger:log(WARN, "denied access from " .. plugin_id .. " : " .. ret.msg) else - logger:log(ngx.NOTICE, plugin_id .. " returned status " .. tostring(ret.status) .. " : " .. ret.msg) + logger:log(NOTICE, plugin_id .. " returned status " .. tostring(ret.status) .. " : " .. ret.msg) end status = ret.status break elseif ret.redirect then - logger:log(ngx.NOTICE, plugin_id .. " redirect to " .. ret.redirect .. " : " .. ret.msg) + logger:log(NOTICE, plugin_id .. " redirect to " .. ret.redirect .. " : " .. ret.msg) redirect = ret.redirect break end end else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method access() is not defined") + logger:log(INFO, "skipped execution of " .. plugin_id .. " because method access() is not defined") end end end - logger:log(ngx.INFO, "called access() methods of plugins") + logger:log(INFO, "called access() methods of plugins") -- Save ctx - ngx.ctx = ctx + save_ctx(ctx) - logger:log(ngx.INFO, "access phase ended") + logger:log(INFO, "access phase ended") -- Return status if needed if status then - return ngx.exit(status) + return exit(status) end -- Redirect if needed if redirect then - return ngx.redirect(redirect) + return ngx_redirect(redirect) end return true diff --git a/src/common/confs/server-http/header-lua.conf b/src/common/confs/server-http/header-lua.conf index 871f499fe..4e6707624 100644 --- a/src/common/confs/server-http/header-lua.conf +++ b/src/common/confs/server-http/header-lua.conf @@ -1,69 +1,77 @@ header_filter_by_lua_block { - local class = require "middleclass" local clogger = require "bunkerweb.logger" local helpers = require "bunkerweb.helpers" local cdatastore = require "bunkerweb.datastore" - local cjson = require "cjson" + + local ngx = ngx + local ERR = ngx.ERR + local INFO = ngx.INFO + local fill_ctx = helpers.fill_ctx + local save_ctx = helpers.save_ctx + local require_plugin = helpers.require_plugin + local new_plugin = helpers.new_plugin + local call_plugin = helpers.call_plugin + local tostring = tostring -- Start set phase local logger = clogger:new("HEADER") local datastore = cdatastore:new() - logger:log(ngx.INFO, "header phase started") + logger:log(INFO, "header phase started") -- Fill ctx - logger:log(ngx.INFO, "filling ngx.ctx ...") - local ok, ret, errors, ctx = helpers.fill_ctx() + logger:log(INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = fill_ctx() if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + logger:log(ERR, "fill_ctx() failed : " .. ret) elseif errors then for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) + logger:log(ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end - logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") + logger:log(INFO, "ngx.ctx filled (ret = " .. ret .. ")") -- Get plugins order local order, err = datastore:get("plugins_order", true) if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + logger:log(ERR, "can't get plugins order from datastore : " .. err) return end -- Call header() methods - logger:log(ngx.INFO, "calling header() methods of plugins ...") + logger:log(INFO, "calling header() methods of plugins ...") for i, plugin_id in ipairs(order.header) do -- Require call - local plugin_lua, err = helpers.require_plugin(plugin_id) + local plugin_lua, err = require_plugin(plugin_id) if plugin_lua == false then - logger:log(ngx.ERR, err) + logger:log(ERR, err) elseif plugin_lua == nil then - logger:log(ngx.INFO, err) + logger:log(INFO, err) else -- Check if plugin has header method if plugin_lua.header ~= nil then -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) + local ok, plugin_obj = new_plugin(plugin_lua, ctx) if not ok then - logger:log(ngx.ERR, plugin_obj) + logger:log(ERR, plugin_obj) else - local ok, ret = helpers.call_plugin(plugin_obj, "header") + local ok, ret = call_plugin(plugin_obj, "header") if not ok then - logger:log(ngx.ERR, ret) + logger:log(ERR, ret) elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":header() call failed : " .. ret.msg) + logger:log(ERR, plugin_id .. ":header() call failed : " .. ret.msg) else - logger:log(ngx.INFO, plugin_id .. ":header() call successful : " .. ret.msg) + logger:log(INFO, plugin_id .. ":header() call successful : " .. ret.msg) end end else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method header() is not defined") + logger:log(INFO, "skipped execution of " .. plugin_id .. " because method header() is not defined") end end end - logger:log(ngx.INFO, "called header() methods of plugins") + logger:log(INFO, "called header() methods of plugins") -- Save ctx - ngx.ctx = ctx + save_ctx(ctx) return true } diff --git a/src/common/confs/server-http/log-lua.conf b/src/common/confs/server-http/log-lua.conf index 1bac9d896..bc3cafc52 100644 --- a/src/common/confs/server-http/log-lua.conf +++ b/src/common/confs/server-http/log-lua.conf @@ -1,74 +1,83 @@ log_by_lua_block { - local class = require "middleclass" local clogger = require "bunkerweb.logger" local helpers = require "bunkerweb.helpers" local cdatastore = require "bunkerweb.datastore" - local cjson = require "cjson" + local utils = require "bunkerweb.utils" + local cjson = require "cjson" + + local ngx = ngx + local ERR = ngx.ERR + local INFO = ngx.INFO + local fill_ctx = helpers.fill_ctx + local get_reason = utils.get_reason + local require_plugin = helpers.require_plugin + local new_plugin = helpers.new_plugin + local call_plugin = helpers.call_plugin + local tostring = tostring + local encode = cjson.encode -- Start log phase local logger = clogger:new("LOG") local datastore = cdatastore:new() - logger:log(ngx.INFO, "log phase started") + logger:log(INFO, "log phase started") -- Fill ctx - logger:log(ngx.INFO, "filling ngx.ctx ...") - local ok, ret, errors, ctx = helpers.fill_ctx() + logger:log(INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = fill_ctx() if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + logger:log(ERR, "fill_ctx() failed : " .. ret) elseif errors then for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) + logger:log(ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end - logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") + logger:log(INFO, "ngx.ctx filled (ret = " .. ret .. ")") -- Get plugins order local order, err = datastore:get("plugins_order", true) if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + logger:log(ERR, "can't get plugins order from datastore : " .. err) return end -- Call log() methods - logger:log(ngx.INFO, "calling log() methods of plugins ...") + logger:log(INFO, "calling log() methods of plugins ...") for i, plugin_id in ipairs(order.log) do -- Require call - local plugin_lua, err = helpers.require_plugin(plugin_id) + local plugin_lua, err = require_plugin(plugin_id) if plugin_lua == false then - logger:log(ngx.ERR, err) + logger:log(ERR, err) elseif plugin_lua == nil then - logger:log(ngx.INFO, err) + logger:log(INFO, err) else -- Check if plugin has log method if plugin_lua.log ~= nil then -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) + local ok, plugin_obj = new_plugin(plugin_lua, ctx) if not ok then - logger:log(ngx.ERR, plugin_obj) + logger:log(ERR, plugin_obj) else - local ok, ret = helpers.call_plugin(plugin_obj, "log") + local ok, ret = call_plugin(plugin_obj, "log") if not ok then - logger:log(ngx.ERR, ret) + logger:log(ERR, ret) elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":log() call failed : " .. ret.msg) + logger:log(ERR, plugin_id .. ":log() call failed : " .. ret.msg) else - logger:log(ngx.INFO, plugin_id .. ":log() call successful : " .. ret.msg) + logger:log(INFO, plugin_id .. ":log() call successful : " .. ret.msg) end end else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method log() is not defined") + logger:log(INFO, "skipped execution of " .. plugin_id .. " because method log() is not defined") end end end - logger:log(ngx.INFO, "called log() methods of plugins") + logger:log(INFO, "called log() methods of plugins") -- Display reason at info level - if ctx.reason then - logger:log(ngx.INFO, "client was denied with reason : " .. ctx.reason) + local reason, reason_data = get_reason(ctx) + if reason then + logger:log(INFO, "client was denied with reason " .. reason .. " and data = " .. encode(reason_data)) end - -- Save ctx - ngx.ctx = ctx - - logger:log(ngx.INFO, "log phase ended") + logger:log(INFO, "log phase ended") } diff --git a/src/common/confs/server-http/server.conf b/src/common/confs/server-http/server.conf index 4a137ed69..1220c1344 100644 --- a/src/common/confs/server-http/server.conf +++ b/src/common/confs/server-http/server.conf @@ -18,12 +18,16 @@ server { include /etc/bunkerweb/configs/server-http/{{ SERVER_NAME.split(" ")[0] }}/*.conf; {% endif %} - # reason variable + # variables set $reason ''; + set $reason_data ''; + set $ctx_ref ''; # include LUA files include {{ NGINX_PREFIX }}set-lua.conf; + include {{ NGINX_PREFIX }}ssl-certificate-lua.conf; include {{ NGINX_PREFIX }}access-lua.conf; + include {{ NGINX_PREFIX }}header-lua.conf; include {{ NGINX_PREFIX }}log-lua.conf; # include config files diff --git a/src/common/confs/server-http/set-lua.conf b/src/common/confs/server-http/set-lua.conf index b09953ec4..4c9efa7b1 100644 --- a/src/common/confs/server-http/set-lua.conf +++ b/src/common/confs/server-http/set-lua.conf @@ -1,46 +1,56 @@ set $dummy_set ""; set_by_lua_block $dummy_set { - local class = require "middleclass" local clogger = require "bunkerweb.logger" local helpers = require "bunkerweb.helpers" local cdatastore = require "bunkerweb.datastore" local ccachestore = require "bunkerweb.cachestore" - local cjson = require "cjson" + + local ngx = ngx + local ngx_req = ngx.req + local is_internal = ngx_req.is_internal + local ERR = ngx.ERR + local INFO = ngx.INFO + local fill_ctx = helpers.fill_ctx + local save_ctx = helpers.save_ctx + local require_plugin = helpers.require_plugin + local new_plugin = helpers.new_plugin + local call_plugin = helpers.call_plugin + local tostring = tostring -- Don't process internal requests local logger = clogger:new("SET") - if ngx.req.is_internal() then - logger:log(ngx.INFO, "skipped set phase because request is internal") + if is_internal() then + logger:log(INFO, "skipped set phase because request is internal") return true end -- Start set phase local datastore = cdatastore:new() - logger:log(ngx.INFO, "set phase started") + logger:log(INFO, "set phase started") -- Update cachestore only once and before any other code - local cachestore = ccachestore:new() - local ok, err = cachestore.cache:update() + local cachestore = ccachestore:new(false) + local ok, err = cachestore:update() if not ok then - logger:log(ngx.ERR, "can't update cachestore : " .. err) + logger:log(ERR, "can't update cachestore : " .. err) end -- Fill ctx - logger:log(ngx.INFO, "filling ngx.ctx ...") - local ok, ret, errors, ctx = helpers.fill_ctx() + logger:log(INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = fill_ctx() if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + logger:log(ERR, "fill_ctx() failed : " .. ret) elseif errors then for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) + logger:log(ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end - logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") + logger:log(INFO, "ngx.ctx filled (ret = " .. ret .. ")") -- Get plugins order local order, err = datastore:get("plugins_order", true) if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + logger:log(ERR, "can't get plugins order from datastore : " .. err) return end @@ -48,37 +58,37 @@ set_by_lua_block $dummy_set { logger:log(ngx.INFO, "calling set() methods of plugins ...") for i, plugin_id in ipairs(order.set) do -- Require call - local plugin_lua, err = helpers.require_plugin(plugin_id) + local plugin_lua, err = require_plugin(plugin_id) if plugin_lua == false then - logger:log(ngx.ERR, err) + logger:log(ERR, err) elseif plugin_lua == nil then - logger:log(ngx.INFO, err) + logger:log(INFO, err) else -- Check if plugin has set method if plugin_lua.set ~= nil then -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) + local ok, plugin_obj = new_plugin(plugin_lua, ctx) if not ok then - logger:log(ngx.ERR, plugin_obj) + logger:log(ERR, plugin_obj) else - local ok, ret = helpers.call_plugin(plugin_obj, "set") + local ok, ret = call_plugin(plugin_obj, "set") if not ok then - logger:log(ngx.ERR, ret) + logger:log(ERR, ret) elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":set() call failed : " .. ret.msg) + logger:log(ERR, plugin_id .. ":set() call failed : " .. ret.msg) else - logger:log(ngx.INFO, plugin_id .. ":set() call successful : " .. ret.msg) + logger:log(INFO, plugin_id .. ":set() call successful : " .. ret.msg) end end else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method set() is not defined") + logger:log(INFO, "skipped execution of " .. plugin_id .. " because method set() is not defined") end end end - logger:log(ngx.INFO, "called set() methods of plugins") + logger:log(INFO, "called set() methods of plugins") -- Save ctx - ngx.ctx = ctx + save_ctx(ctx) return true } diff --git a/src/common/confs/server-http/ssl-certificate-lua.conf b/src/common/confs/server-http/ssl-certificate-lua.conf new file mode 100644 index 000000000..b4c7ebfef --- /dev/null +++ b/src/common/confs/server-http/ssl-certificate-lua.conf @@ -0,0 +1,104 @@ +ssl_certificate /var/cache/bunkerweb/default-server-cert/cert.pem; +ssl_certificate_key /var/cache/bunkerweb/default-server-cert/cert.key; +ssl_protocols {{ SSL_PROTOCOLS }}; +ssl_prefer_server_ciphers on; +ssl_session_tickets off; +ssl_session_timeout 1d; +ssl_session_cache shared:MozSSL:10m; +{% if "TLSv1.2" in SSL_PROTOCOLS +%} +ssl_dhparam /etc/nginx/dhparam; +ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; +{% endif %} + +{% if AUTO_LETS_ENCRYPT == "yes" or USE_CUSTOM_SSL == "yes" or GENERATE_SELF_SIGNED_SSL == "yes" %} +listen 0.0.0.0:{{ HTTPS_PORT }} ssl {% if HTTP2 == "yes" %}http2{% endif %} {% if USE_PROXY_PROTOCOL == "yes" %}proxy_protocol{% endif %}; +{% if USE_IPV6 == "yes" +%} +listen [::]:{{ HTTPS_PORT }} ssl {% if HTTP2 == "yes" %}http2{% endif %} {% if USE_PROXY_PROTOCOL == "yes" %}proxy_protocol{% endif %}; +{% endif %} +{% endif %} + +ssl_certificate_by_lua_block { + local class = require "middleclass" + local clogger = require "bunkerweb.logger" + local helpers = require "bunkerweb.helpers" + local utils = require "bunkerweb.utils" + local cdatastore = require "bunkerweb.datastore" + local cclusterstore = require "bunkerweb.clusterstore" + local cjson = require "cjson" + local ssl = require "ngx.ssl" + + local ngx = ngx + local ngx_req = ngx.req + local is_internal = ngx_req.is_internal + local ERR = ngx.ERR + local INFO = ngx.INFO + local set_cert = ssl.set_cert + local set_priv_key = ssl.set_priv_key + local require_plugin = helpers.require_plugin + local new_plugin = helpers.new_plugin + local call_plugin = helpers.call_plugin + local tostring = tostring + + -- Start ssl_certificate phase + local logger = clogger:new("SSL-CERTIFICATE") + local datastore = cdatastore:new() + logger:log(INFO, "ssl_certificate phase started") + + -- Get plugins order + local order, err = datastore:get("plugins_order", true) + if not order then + logger:log(ERR, "can't get plugins order from datastore : " .. err) + return + end + + -- Call ssl_certificate() methods + logger:log(INFO, "calling ssl_certificate() methods of plugins ...") + for i, plugin_id in ipairs(order.ssl_certificate) do + -- Require call + local plugin_lua, err = require_plugin(plugin_id) + if plugin_lua == false then + logger:log(ERR, err) + elseif plugin_lua == nil then + logger:log(INFO, err) + else + -- Check if plugin has ssl_certificate method + if plugin_lua.ssl_certificate ~= nil then + -- New call + local ok, plugin_obj = new_plugin(plugin_lua) + if not ok then + logger:log(ERR, plugin_obj) + else + local ok, ret = call_plugin(plugin_obj, "ssl_certificate") + if not ok then + logger:log(ERR, ret) + elseif not ret.ret then + logger:log(ERR, plugin_id .. ":ssl_certificate() call failed : " .. ret.msg) + else + logger:log(INFO, plugin_id .. ":ssl_certificate() call successful : " .. ret.msg) + if ret.status then + logger:log(INFO, plugin_id .. " is setting certificate/key : " .. ret.msg) + local ok, err = set_cert(ret.status[1]) + if not ok then + logger:log(ERR, "error while setting certificate : " .. err) + else + local ok, err = set_priv_key(ret.status[2]) + if not ok then + logger:log(ERR, "error while setting private key : " .. err) + else + return true + end + end + end + end + end + else + logger:log(INFO, "skipped execution of " .. plugin_id .. " because method ssl_certificate() is not defined") + end + end + end + logger:log(INFO, "called ssl_certificate() methods of plugins") + + logger:log(INFO, "ssl_certificate phase ended") + + return true +} diff --git a/src/common/confs/server-stream/log-stream-lua.conf b/src/common/confs/server-stream/log-stream-lua.conf index 73d434dc3..99c9db743 100644 --- a/src/common/confs/server-stream/log-stream-lua.conf +++ b/src/common/confs/server-stream/log-stream-lua.conf @@ -1,74 +1,83 @@ log_by_lua_block { - local class = require "middleclass" local clogger = require "bunkerweb.logger" local helpers = require "bunkerweb.helpers" local cdatastore = require "bunkerweb.datastore" + local utils = require "bunkerweb.utils" local cjson = require "cjson" + local ngx = ngx + local ERR = ngx.ERR + local INFO = ngx.INFO + local fill_ctx = helpers.fill_ctx + local get_reason = utils.get_reason + local require_plugin = helpers.require_plugin + local new_plugin = helpers.new_plugin + local call_plugin = helpers.call_plugin + local tostring = tostring + local encode = cjson.encode + -- Start log phase local logger = clogger:new("LOG") local datastore = cdatastore:new() - logger:log(ngx.INFO, "log phase started") + logger:log(INFO, "log phase started") -- Fill ctx - logger:log(ngx.INFO, "filling ngx.ctx ...") - local ok, ret, errors, ctx = helpers.fill_ctx() + logger:log(INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = fill_ctx() if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + logger:log(ERR, "fill_ctx() failed : " .. ret) elseif errors then for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) + logger:log(ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end - logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") + logger:log(INFO, "ngx.ctx filled (ret = " .. ret .. ")") -- Get plugins order local order, err = datastore:get("plugins_order", true) if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + logger:log(ERR, "can't get plugins order from datastore : " .. err) return end -- Call log_stream() methods - logger:log(ngx.INFO, "calling log_stream() methods of plugins ...") + logger:log(INFO, "calling log_stream() methods of plugins ...") for i, plugin_id in ipairs(order.log_stream) do -- Require call - local plugin_lua, err = helpers.require_plugin(plugin_id) + local plugin_lua, err = require_plugin(plugin_id) if plugin_lua == false then - logger:log(ngx.ERR, err) + logger:log(ERR, err) elseif plugin_lua == nil then - logger:log(ngx.INFO, err) + logger:log(INFO, err) else -- Check if plugin has log_stream method if plugin_lua.log_stream ~= nil then -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) + local ok, plugin_obj = new_plugin(plugin_lua, ctx) if not ok then - logger:log(ngx.ERR, plugin_obj) + logger:log(ERR, plugin_obj) else - local ok, ret = helpers.call_plugin(plugin_obj, "log_stream") + local ok, ret = call_plugin(plugin_obj, "log_stream") if not ok then - logger:log(ngx.ERR, ret) + logger:log(ERR, ret) elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":log_stream() call failed : " .. ret.msg) + logger:log(ERR, plugin_id .. ":log_stream() call failed : " .. ret.msg) else - logger:log(ngx.INFO, plugin_id .. ":log_stream() call successful : " .. ret.msg) + logger:log(INFO, plugin_id .. ":log_stream() call successful : " .. ret.msg) end end else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method log_stream() is not defined") + logger:log(INFO, "skipped execution of " .. plugin_id .. " because method log_stream() is not defined") end end end - logger:log(ngx.INFO, "called log_stream() methods of plugins") + logger:log(INFO, "called log_stream() methods of plugins") -- Display reason at info level - if ctx.reason then - logger:log(ngx.INFO, "client was denied with reason : " .. ctx.reason) + local reason, reason_data = get_reason(ctx) + if reason then + logger:log(INFO, "client was denied with reason " .. reason .. " and data = " .. encode(reason_data)) end - -- Save ctx - ngx.ctx = ctx - - logger:log(ngx.INFO, "log phase ended") + logger:log(INFO, "log phase ended") } diff --git a/src/common/confs/server-stream/preread-stream-lua.conf b/src/common/confs/server-stream/preread-stream-lua.conf index 9337845f8..d059cc86f 100644 --- a/src/common/confs/server-stream/preread-stream-lua.conf +++ b/src/common/confs/server-stream/preread-stream-lua.conf @@ -1,103 +1,119 @@ preread_by_lua_block { - ngx.ctx - local class = require "middleclass" local clogger = require "bunkerweb.logger" local helpers = require "bunkerweb.helpers" local utils = require "bunkerweb.utils" local cdatastore = require "bunkerweb.datastore" - local cclusterstore = require "bunkerweb.clusterstore" - local cjson = require "cjson" + + local ngx = ngx + local exit = ngx.exit + local ERR = ngx.ERR + local INFO = ngx.INFO + local WARN = ngx.WARN + local NOTICE = ngx.NOTICE + local fill_ctx = helpers.fill_ctx + local save_ctx = helpers.save_ctx + local require_plugin = helpers.require_plugin + local new_plugin = helpers.new_plugin + local call_plugin = helpers.call_plugin + local is_whitelisted = utils.is_whitelisted + local is_banned = utils.is_banned + local set_reason = utils.set_reason + local get_deny_status = utils.get_deny_status + local tostring = tostring -- Start preread phase local logger = clogger:new("PREREAD") local datastore = cdatastore:new() - logger:log(ngx.INFO, "preread phase started") + logger:log(INFO, "preread phase started") -- Fill ctx - logger:log(ngx.INFO, "filling ngx.ctx ...") - local ok, ret, errors, ctx = helpers.fill_ctx() + logger:log(INFO, "filling ngx.ctx ...") + local ok, ret, errors, ctx = fill_ctx() if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + logger:log(ERR, "fill_ctx() failed : " .. ret) elseif errors then for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) + logger:log(ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end - logger:log(ngx.INFO, "ngx.ctx filled (ret = " .. ret .. ")") + logger:log(INFO, "ngx.ctx filled (ret = " .. ret .. ")") -- Process bans as soon as possible - if ctx.bw.is_whitelisted ~= "yes" then - local banned, reason, ttl = utils.is_banned(ctx.bw.remote_addr) + if not is_whitelisted(ctx) then + local banned, reason, ttl = is_banned(ctx.bw.remote_addr) if banned == nil then - logger:log(ngx.ERR, "can't check if IP " .. ctx.bw.remote_addr .. " is banned : " .. reason) + logger:log(ERR, "can't check if IP " .. ctx.bw.remote_addr .. " is banned : " .. reason) elseif banned then - logger:log(ngx.WARN, + ctx.bw.is_banned = true + set_reason(reason, {}, ctx) + save_ctx(ctx) + logger:log(WARN, "IP " .. ctx.bw.remote_addr .. " is banned with reason " .. reason .. " (" .. tostring(ttl) .. "s remaining)") - return ngx.exit(utils.get_deny_status()) + return exit(get_deny_status()) else - logger:log(ngx.INFO, "IP " .. ctx.bw.remote_addr .. " is not banned") + logger:log(INFO, "IP " .. ctx.bw.remote_addr .. " is not banned") end end -- Get plugins order local order, err = datastore:get("plugins_order", true) if not order then - logger:log(ngx.ERR, "can't get plugins order from datastore : " .. err) + logger:log(ERR, "can't get plugins order from datastore : " .. err) return end -- Call preread() methods - logger:log(ngx.INFO, "calling preread() methods of plugins ...") + logger:log(INFO, "calling preread() methods of plugins ...") local status = nil for i, plugin_id in ipairs(order.preread) do -- Require call - local plugin_lua, err = helpers.require_plugin(plugin_id) + local plugin_lua, err = require_plugin(plugin_id) if plugin_lua == false then - logger:log(ngx.ERR, err) + logger:log(ERR, err) elseif plugin_lua == nil then - logger:log(ngx.INFO, err) + logger:log(INFO, err) else -- Check if plugin has preread method if plugin_lua.preread ~= nil then -- New call - local ok, plugin_obj = helpers.new_plugin(plugin_lua, ctx) + local ok, plugin_obj = new_plugin(plugin_lua, ctx) if not ok then - logger:log(ngx.ERR, plugin_obj) + logger:log(ERR, plugin_obj) else - local ok, ret = helpers.call_plugin(plugin_obj, "preread") + local ok, ret = call_plugin(plugin_obj, "preread") if not ok then - logger:log(ngx.ERR, ret) + logger:log(ERR, ret) elseif not ret.ret then - logger:log(ngx.ERR, plugin_id .. ":preread() call failed : " .. ret.msg) + logger:log(ERR, plugin_id .. ":preread() call failed : " .. ret.msg) else - logger:log(ngx.INFO, plugin_id .. ":preread() call successful : " .. ret.msg) + logger:log(INFO, plugin_id .. ":preread() call successful : " .. ret.msg) end if ret.status then - if ret.status == utils.get_deny_status(ctx) then - ctx.bw.reason = plugin_id - logger:log(ngx.WARN, "denied preread from " .. plugin_id .. " : " .. ret.msg) + if ret.status == get_deny_status() then + set_reason(plugin_id, ret.data, ctx) + logger:log(WARN, "denied preread from " .. plugin_id .. " : " .. ret.msg) else - logger:log(ngx.NOTICE, plugin_id .. " returned status " .. tostring(ret.status) .. " : " .. ret.msg) + logger:log(NOTICE, plugin_id .. " returned status " .. tostring(ret.status) .. " : " .. ret.msg) end status = ret.status break end end else - logger:log(ngx.INFO, "skipped execution of " .. plugin_id .. " because method preread() is not defined") + logger:log(INFO, "skipped execution of " .. plugin_id .. " because method preread() is not defined") end end end - logger:log(ngx.INFO, "called preread() methods of plugins") + logger:log(INFO, "called preread() methods of plugins") -- Save ctx - ngx.ctx = ctx + save_ctx(ctx) - logger:log(ngx.INFO, "preread phase ended") + logger:log(INFO, "preread phase ended") -- Return status if needed if status then - return ngx.exit(status) + return exit(status) end return true diff --git a/src/common/confs/server-stream/server-stream.conf b/src/common/confs/server-stream/server-stream.conf index 1e2c7dd59..f667dde00 100644 --- a/src/common/confs/server-stream/server-stream.conf +++ b/src/common/confs/server-stream/server-stream.conf @@ -14,13 +14,14 @@ server { include /etc/bunkerweb/configs/server-stream/{{ SERVER_NAME.split(" ")[0] }}/*.conf; {% endif %} - # reason variable + # variables set $reason ''; - - # server_name variable + set $reason_data ''; + set $ctx_ref ''; set $server_name '{{ SERVER_NAME.split(" ")[0] }}'; # include LUA files + include {{ NGINX_PREFIX }}ssl-certificate-stream-lua.conf; include {{ NGINX_PREFIX }}preread-stream-lua.conf; include {{ NGINX_PREFIX }}log-stream-lua.conf; diff --git a/src/common/confs/server-stream/ssl-certificate-stream-lua.conf b/src/common/confs/server-stream/ssl-certificate-stream-lua.conf new file mode 100644 index 000000000..b0e53e1bf --- /dev/null +++ b/src/common/confs/server-stream/ssl-certificate-stream-lua.conf @@ -0,0 +1,104 @@ +ssl_certificate /var/cache/bunkerweb/default-server-cert/cert.pem; +ssl_certificate_key /var/cache/bunkerweb/default-server-cert/cert.key; +ssl_protocols {{ SSL_PROTOCOLS }}; +ssl_prefer_server_ciphers on; +ssl_session_tickets off; +ssl_session_timeout 1d; +ssl_session_cache shared:MozSSL:10m; +{% if "TLSv1.2" in SSL_PROTOCOLS +%} +ssl_dhparam /etc/nginx/dhparam; +ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; +{% endif %} + +{% if AUTO_LETS_ENCRYPT == "yes" or USE_CUSTOM_SSL == "yes" or GENERATE_SELF_SIGNED_SSL == "yes" %} +listen 0.0.0.0:{{ LISTEN_STREAM_PORT_SSL }} ssl {% if USE_UDP == "yes" %} udp {% endif %}{% if USE_PROXY_PROTOCOL == "yes" %} proxy_protocol {% endif %}; +{% if USE_IPV6 == "yes" +%} +listen [::]:{{ LISTEN_STREAM_PORT_SSL }} ssl {% if USE_UDP == "yes" %} udp {% endif %}{% if USE_PROXY_PROTOCOL == "yes" %} proxy_protocol {% endif %}; +{% endif %} +{% endif %} + +ssl_certificate_by_lua_block { + local class = require "middleclass" + local clogger = require "bunkerweb.logger" + local helpers = require "bunkerweb.helpers" + local utils = require "bunkerweb.utils" + local cdatastore = require "bunkerweb.datastore" + local cclusterstore = require "bunkerweb.clusterstore" + local cjson = require "cjson" + local ssl = require "ngx.ssl" + + local ngx = ngx + local ngx_req = ngx.req + local is_internal = ngx_req.is_internal + local ERR = ngx.ERR + local INFO = ngx.INFO + local set_cert = ssl.set_cert + local set_priv_key = ssl.set_priv_key + local require_plugin = helpers.require_plugin + local new_plugin = helpers.new_plugin + local call_plugin = helpers.call_plugin + local tostring = tostring + + -- Start ssl_certificate phase + local logger = clogger:new("SSL-CERTIFICATE") + local datastore = cdatastore:new() + logger:log(INFO, "ssl_certificate phase started") + + -- Get plugins order + local order, err = datastore:get("plugins_order", true) + if not order then + logger:log(ERR, "can't get plugins order from datastore : " .. err) + return + end + + -- Call ssl_certificate() methods + logger:log(INFO, "calling ssl_certificate() methods of plugins ...") + for i, plugin_id in ipairs(order.ssl_certificate) do + -- Require call + local plugin_lua, err = require_plugin(plugin_id) + if plugin_lua == false then + logger:log(ERR, err) + elseif plugin_lua == nil then + logger:log(INFO, err) + else + -- Check if plugin has ssl_certificate method + if plugin_lua.ssl_certificate ~= nil then + -- New call + local ok, plugin_obj = new_plugin(plugin_lua) + if not ok then + logger:log(ERR, plugin_obj) + else + local ok, ret = call_plugin(plugin_obj, "ssl_certificate") + if not ok then + logger:log(ERR, ret) + elseif not ret.ret then + logger:log(ERR, plugin_id .. ":ssl_certificate() call failed : " .. ret.msg) + else + logger:log(INFO, plugin_id .. ":ssl_certificate() call successful : " .. ret.msg) + if ret.status then + logger:log(ngx.INFO, plugin_id .. " is setting certificate/key : " .. ret.msg) + local ok, err = set_cert(ret.status[1]) + if not ok then + logger:log(ERR, "error while setting certificate : " .. err) + else + local ok, err = set_priv_key(ret.status[2]) + if not ok then + logger:log(ERR, "error while setting private key : " .. err) + else + return true + end + end + end + end + end + else + logger:log(INFO, "skipped execution of " .. plugin_id .. " because method ssl_certificate() is not defined") + end + end + end + logger:log(INFO, "called ssl_certificate() methods of plugins") + + logger:log(INFO, "ssl_certificate phase ended") + + return true +} diff --git a/src/common/core/antibot/antibot.lua b/src/common/core/antibot/antibot.lua index fe5b1880f..14cab8f9e 100644 --- a/src/common/core/antibot/antibot.lua +++ b/src/common/core/antibot/antibot.lua @@ -7,9 +7,30 @@ local plugin = require "bunkerweb.plugin" local sha256 = require "resty.sha256" local str = require "resty.string" local utils = require "bunkerweb.utils" -local template = nil -if ngx.shared.datastore then + +local ngx = ngx +local subsystem = ngx.config.subsystem +local HTTP_INTERNAL_SERVER_ERROR = ngx.HTTP_INTERNAL_SERVER_ERROR +local OK = ngx.OK +local tonumber = tonumber +local tostring = tostring +local get_session = utils.get_session +local get_session_data = utils.get_session_data +local set_session_data = utils.set_session_data +local get_deny_status = utils.get_deny_status +local rand = utils.rand +local now = ngx.now +local captcha_new = captcha.new +local base64_encode = base64.encode +local to_hex = str.to_hex +local http_new = http.new +local decode = cjson.decode + +local template +local render = nil +if subsystem == "http" then template = require "resty.template" + render = template.render end local antibot = class("antibot", plugin) @@ -30,12 +51,12 @@ function antibot:header() end -- Get session data - local session, err = utils.get_session("antibot", self.ctx) + local session, err = get_session("antibot", self.ctx) if not session then - return self:ret(false, "can't get session : " .. err, ngx.HTTP_INTERNAL_SERVER_ERROR) + return self:ret(false, "can't get session : " .. err, HTTP_INTERNAL_SERVER_ERROR) end self.session = session - self.session_data = utils.get_session_data(self.session, true, self.ctx) + self.session_data = get_session_data(self.session, true, self.ctx) -- Check if session is valid self:check_session() @@ -48,7 +69,7 @@ function antibot:header() end if self.ctx.bw.uri ~= self.variables["ANTIBOT_URI"] then - return self:ret(true, "Not antibot uri") + return self:ret(true, "not antibot uri") end local header = "Content-Security-Policy" @@ -97,12 +118,12 @@ function antibot:access() end -- Get session data - local session, err = utils.get_session("antibot", self.ctx) + local session, err = get_session("antibot", self.ctx) if not session then - return self:ret(false, "can't get session : " .. err, ngx.HTTP_INTERNAL_SERVER_ERROR) + return self:ret(false, "can't get session : " .. err, HTTP_INTERNAL_SERVER_ERROR) end self.session = session - self.session_data = utils.get_session_data(self.session, true, self.ctx) + self.session_data = get_session_data(self.session, true, self.ctx) -- Check if session is valid self:check_session() @@ -118,7 +139,7 @@ function antibot:access() self:prepare_challenge() local ok, err = self:set_session_data() if not ok then - return self:ret(false, "can't save session : " .. err, ngx.HTTP_INTERNAL_SERVER_ERROR) + return self:ret(false, "can't save session : " .. err, HTTP_INTERNAL_SERVER_ERROR) end -- Redirect to challenge page @@ -143,10 +164,10 @@ function antibot:access() local ok, err, redirect = self:check_challenge() local set_ok, set_err = self:set_session_data() if not set_ok then - return self:ret(false, "can't save session : " .. set_err, ngx.HTTP_INTERNAL_SERVER_ERROR) + return self:ret(false, "can't save session : " .. set_err, HTTP_INTERNAL_SERVER_ERROR) end if ok == nil then - return self:ret(false, "check challenge error : " .. err, ngx.HTTP_INTERNAL_SERVER_ERROR) + return self:ret(false, "check challenge error : " .. err, HTTP_INTERNAL_SERVER_ERROR) elseif not ok then self.logger:log(ngx.WARN, "client failed challenge : " .. err) end @@ -156,14 +177,17 @@ function antibot:access() self:prepare_challenge() ok, err = self:set_session_data() if not ok then - return self:ret(false, "can't save session : " .. err, ngx.HTTP_INTERNAL_SERVER_ERROR) + return self:ret(false, "can't save session : " .. err, HTTP_INTERNAL_SERVER_ERROR) end self.ctx.bw.antibot_display_content = true - return self:ret(true, "displaying challenge to client", ngx.OK) + return self:ret(true, "displaying challenge to client", OK) end -- Method is suspicious, let's deny the request - return self:ret(true, "unsupported HTTP method for antibot", utils.get_deny_status(self.ctx)) + local data = {} + data["id"] = "suspicious-method" + data["method"] = self.ctx.bw.request_method + return self:ret(true, "unsupported HTTP method for antibot", get_deny_status(), nil, data) end function antibot:content() @@ -178,12 +202,12 @@ function antibot:content() end -- Get session data - local session, err = utils.get_session("antibot", self.ctx) + local session, err = get_session("antibot", self.ctx) if not session then - return self:ret(false, "can't get session : " .. err, ngx.HTTP_INTERNAL_SERVER_ERROR) + return self:ret(false, "can't get session : " .. err, HTTP_INTERNAL_SERVER_ERROR) end self.session = session - self.session_data = utils.get_session_data(self.session, true, self.ctx) + self.session_data = get_session_data(self.session, true, self.ctx) -- Direct access without session if not self.session_data.prepared then @@ -228,7 +252,7 @@ end function antibot:set_session_data() if self.session_updated then - local ok, err = utils.set_session_data(self.session, self.session_data, true, self.ctx) + local ok, err = set_session_data(self.session, self.session_data, true, self.ctx) if not ok then return false, err end @@ -246,18 +270,18 @@ function antibot:prepare_challenge() self.session_data.type = self.variables["USE_ANTIBOT"] self.session_data.resolved = false self.session_data.original_uri = self.ctx.bw.request_uri - self.session_data.nonce_script = utils.rand(16) - self.session_data.nonce_style = utils.rand(16) + self.session_data.nonce_script = rand(16) + self.session_data.nonce_style = rand(16) if self.ctx.bw.uri == self.variables["ANTIBOT_URI"] then self.session_data.original_uri = "/" end if self.session_data.type == "cookie" then self.session_data.resolved = true - self.session_data.time_valid = ngx.now() + self.session_data.time_valid = now() elseif self.session_data.type == "javascript" then - self.session_data.random = utils.rand(20) + self.session_data.random = rand(20) elseif self.session_data.type == "captcha" then - self.session_data.captcha = utils.rand(6, true) + self.session_data.captcha = rand(6, true) end end end @@ -282,11 +306,11 @@ function antibot:display_challenge() -- Captcha case if self.session_data.type == "captcha" then - local chall_captcha = captcha.new() + local chall_captcha = captcha_new() chall_captcha:font("/usr/share/bunkerweb/core/antibot/files/font.ttf") chall_captcha:string(self.session_data.captcha) chall_captcha:generate() - template_vars.captcha = base64.encode(chall_captcha:jpegStr(70)) + template_vars.captcha = base64_encode(chall_captcha:jpegStr(70)) end -- reCAPTCHA case @@ -305,7 +329,7 @@ function antibot:display_challenge() end -- Render content - template.render(self.session_data.type .. ".html", template_vars) + render(self.session_data.type .. ".html", template_vars) return true, "displayed challenge" end @@ -317,33 +341,35 @@ function antibot:check_challenge() end local resolved - + local ngx_req = ngx.req + local read_body = ngx_req.read_body + local get_post_args = ngx_req.get_post_args self.session_data.prepared = false self.session_updated = true -- Javascript case if self.session_data.type == "javascript" then - ngx.req.read_body() - local args, err = ngx.req.get_post_args(1) + read_body() + local args, err = get_post_args(1) if err == "truncated" or not args or not args["challenge"] then return nil, "missing challenge arg" end local hash = sha256:new() hash:update(self.session_data.random .. args["challenge"]) local digest = hash:final() - resolved = str.to_hex(digest):find("^0000") ~= nil + resolved = to_hex(digest):find("^0000") ~= nil if not resolved then return false, "wrong value" end self.session_data.resolved = true - self.session_data.time_valid = ngx.now() + self.session_data.time_valid = now() return true, "resolved", self.session_data.original_uri end -- Captcha case if self.session_data.type == "captcha" then - ngx.req.read_body() - local args, err = ngx.req.get_post_args(1) + read_body() + local args, err = get_post_args(1) if err == "truncated" or not args or not args["captcha"] then return nil, "missing challenge arg", nil end @@ -351,18 +377,18 @@ function antibot:check_challenge() return false, "wrong value", nil end self.session_data.resolved = true - self.session_data.time_valid = ngx.now() + self.session_data.time_valid = now() return true, "resolved", self.session_data.original_uri end -- reCAPTCHA case if self.session_data.type == "recaptcha" then - ngx.req.read_body() - local args, err = ngx.req.get_post_args(1) + read_body() + local args, err = get_post_args(1) if err == "truncated" or not args or not args["token"] then return nil, "missing challenge arg", nil end - local httpc, err = http.new() + local httpc, err = http_new() if not httpc then return nil, "can't instantiate http object : " .. err, nil, nil end @@ -382,7 +408,7 @@ function antibot:check_challenge() if not res then return nil, "can't send request to reCAPTCHA API : " .. err, nil end - local ok, rdata = pcall(cjson.decode, res.body) + local ok, rdata = pcall(decode, res.body) if not ok then return nil, "error while decoding JSON from reCAPTCHA API : " .. rdata, nil end @@ -390,18 +416,18 @@ function antibot:check_challenge() return false, "client failed challenge with score " .. tostring(rdata.score), nil end self.session_data.resolved = true - self.session_data.time_valid = ngx.now() + self.session_data.time_valid = now() return true, "resolved", self.session_data.original_uri end -- hCaptcha case if self.session_data.type == "hcaptcha" then - ngx.req.read_body() - local args, err = ngx.req.get_post_args(1) + read_body() + local args, err = get_post_args(1) if err == "truncated" or not args or not args["token"] then return nil, "missing challenge arg", nil end - local httpc, err = http.new() + local httpc, err = http_new() if not httpc then return nil, "can't instantiate http object : " .. err, nil, nil end @@ -421,7 +447,7 @@ function antibot:check_challenge() if not res then return nil, "can't send request to hCaptcha API : " .. err, nil end - local ok, hdata = pcall(cjson.decode, res.body) + local ok, hdata = pcall(decode, res.body) if not ok then return nil, "error while decoding JSON from hCaptcha API : " .. hdata, nil end @@ -429,18 +455,18 @@ function antibot:check_challenge() return false, "client failed challenge", nil end self.session_data.resolved = true - self.session_data.time_valid = ngx.now() + self.session_data.time_valid = now() return true, "resolved", self.session_data.original_uri end -- Turnstile case if self.session_data.type == "turnstile" then - ngx.req.read_body() - local args, err = ngx.req.get_post_args(1) + read_body() + local args, err = get_post_args(1) if err == "truncated" or not args or not args["token"] then return nil, "missing challenge arg", nil end - local httpc, err = http.new() + local httpc, err = http_new() if not httpc then return nil, "can't instantiate http object : " .. err, nil, nil end @@ -460,7 +486,7 @@ function antibot:check_challenge() if not res then return nil, "can't send request to Turnstile API : " .. err, nil end - local ok, tdata = pcall(cjson.decode, res.body) + local ok, tdata = pcall(decode, res.body) if not ok then return nil, "error while decoding JSON from Turnstile API : " .. tdata, nil end @@ -468,7 +494,7 @@ function antibot:check_challenge() return false, "client failed challenge", nil end self.session_data.resolved = true - self.session_data.time_valid = ngx.now() + self.session_data.time_valid = now() return true, "resolved", self.session_data.original_uri end diff --git a/src/common/core/antibot/confs/server-http/antibot.conf b/src/common/core/antibot/confs/server-http/antibot.conf index 2d6601ac4..ab097496c 100644 --- a/src/common/core/antibot/confs/server-http/antibot.conf +++ b/src/common/core/antibot/confs/server-http/antibot.conf @@ -5,22 +5,30 @@ location {{ ANTIBOT_URI }} { content_by_lua_block { local logger = require "bunkerweb.logger":new("ANTIBOT") local helpers = require "bunkerweb.helpers" - local ok, ret, errors, ctx = helpers.fill_ctx() + + local ngx = ngx + local ERR = ngx.ERR + local INFO = ngx.INFO + local fill_ctx = helpers.fill_ctx + local save_ctx = helpers.save_ctx + local tostring = tostring + + local ok, ret, errors, ctx = fill_ctx() if not ok then - logger:log(ngx.ERR, "fill_ctx() failed : " .. ret) + logger:log(ERR, "fill_ctx() failed : " .. ret) elseif errors then for i, error in ipairs(errors) do - logger:log(ngx.ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) + logger:log(ERR, "fill_ctx() error " .. tostring(i) .. " : " .. error) end end local antibot = require "antibot.antibot":new(ctx) local ret = antibot:content() if not ret.ret then - logger:log(ngx.ERR, "antibot:content() failed : " .. ret.msg) + logger:log(ERR, "antibot:content() failed : " .. ret.msg) else - logger:log(ngx.INFO, "antibot:content() success : " .. ret.msg) + logger:log(INFO, "antibot:content() success : " .. ret.msg) end - ngx.ctx = ctx + save_ctx(ctx) } } {% endif %} diff --git a/src/common/core/badbehavior/badbehavior.lua b/src/common/core/badbehavior/badbehavior.lua index 8673aa349..8c0c7e971 100644 --- a/src/common/core/badbehavior/badbehavior.lua +++ b/src/common/core/badbehavior/badbehavior.lua @@ -4,6 +4,16 @@ local utils = require "bunkerweb.utils" local badbehavior = class("badbehavior", plugin) +local ngx = ngx +local ERR = ngx.ERR +local WARN = ngx.WARN +local NOTICE = ngx.NOTICE +local timer_at = ngx.timer.at +local add_ban = utils.add_ban +local is_whitelisted = utils.is_whitelisted +local is_banned = utils.is_banned +local tostring = tostring + function badbehavior:initialize(ctx) -- Call parent initialize plugin.initialize(self, "badbehavior", ctx) @@ -11,7 +21,7 @@ end function badbehavior:log() -- Check if we are whitelisted - if self.ctx.bw.is_whitelisted == "yes" then + if is_whitelisted(self.ctx) == "yes" then return self:ret(true, "client is whitelisted") end -- Check if bad behavior is activated @@ -23,12 +33,11 @@ function badbehavior:log() return self:ret(true, "not increasing counter") end -- Check if we are already banned - local banned, _ = self.datastore:get("bans_ip_" .. self.ctx.bw.remote_addr) - if banned then + if is_banned(self.ctx.bw.remote_addr) then return self:ret(true, "already banned") end -- Call increase function later and with cosocket enabled - local ok, err = ngx.timer.at( + local ok, err = timer_at( 0, badbehavior.increase, self.ctx.bw.remote_addr, @@ -56,13 +65,14 @@ function badbehavior.increase(premature, ip, count_time, ban_time, threshold, us -- Instantiate objects local logger = require "bunkerweb.logger":new("badbehavior") local datastore = require "bunkerweb.datastore":new() + -- Declare counter local counter = false -- Redis case if use_redis then local redis_counter, err = badbehavior.redis_increase(ip, count_time, ban_time) if not redis_counter then - logger:log(ngx.ERR, "(increase) redis_increase failed, falling back to local : " .. err) + logger:log(ERR, "(increase) redis_increase failed, falling back to local : " .. err) else counter = redis_counter end @@ -71,7 +81,7 @@ function badbehavior.increase(premature, ip, count_time, ban_time, threshold, us if not counter then local local_counter, err = datastore:get("plugin_badbehavior_count_" .. ip) if not local_counter and err ~= "not found" then - logger:log(ngx.ERR, "(increase) can't get counts from the datastore : " .. err) + logger:log(ERR, "(increase) can't get counts from the datastore : " .. err) end if local_counter == nil then local_counter = 0 @@ -79,25 +89,25 @@ function badbehavior.increase(premature, ip, count_time, ban_time, threshold, us counter = local_counter + 1 end -- Call decrease later - local ok, err = ngx.timer.at(count_time, badbehavior.decrease, ip, count_time, threshold, use_redis) + local ok, err = timer_at(count_time, badbehavior.decrease, ip, count_time, threshold, use_redis) if not ok then - logger:log(ngx.ERR, "(increase) can't create decrease timer : " .. err) + logger:log(ERR, "(increase) can't create decrease timer : " .. err) end -- Store local counter local ok, err = datastore:set("plugin_badbehavior_count_" .. ip, counter, count_time) if not ok then - logger:log(ngx.ERR, "(increase) can't save counts to the datastore : " .. err) + logger:log(ERR, "(increase) can't save counts to the datastore : " .. err) return end -- Store local ban if counter > threshold then - ok, err = utils.add_ban(ip, "bad behavior", ban_time) + ok, err = add_ban(ip, "bad behavior", ban_time) if not ok then - logger:log(ngx.ERR, "(increase) can't save ban : " .. err) + logger:log(ERR, "(increase) can't save ban : " .. err) return end logger:log( - ngx.WARN, + WARN, "IP " .. ip .. " is banned for " @@ -110,7 +120,7 @@ function badbehavior.increase(premature, ip, count_time, ban_time, threshold, us ) end logger:log( - ngx.NOTICE, + NOTICE, "increased counter for IP " .. ip .. " (" .. tostring(counter) .. "/" .. tostring(threshold) .. ")" ) end @@ -125,7 +135,7 @@ function badbehavior.decrease(premature, ip, count_time, threshold, use_redis) if use_redis then local redis_counter, err = badbehavior.redis_decrease(ip, count_time) if not redis_counter then - logger:log(ngx.ERR, "(decrease) redis_decrease failed, falling back to local : " .. err) + logger:log(ERR, "(decrease) redis_decrease failed, falling back to local : " .. err) else counter = redis_counter end @@ -134,7 +144,7 @@ function badbehavior.decrease(premature, ip, count_time, threshold, use_redis) if not counter then local local_counter, err = datastore:get("plugin_badbehavior_count_" .. ip) if not local_counter and err ~= "not found" then - logger:log(ngx.ERR, "(decrease) can't get counts from the datastore : " .. err) + logger:log(ERR, "(decrease) can't get counts from the datastore : " .. err) end if local_counter == nil or local_counter <= 1 then counter = 0 @@ -149,19 +159,19 @@ function badbehavior.decrease(premature, ip, count_time, threshold, use_redis) else local ok, err = datastore:set("plugin_badbehavior_count_" .. ip, counter, count_time) if not ok then - logger:log(ngx.ERR, "(decrease) can't save counts to the datastore : " .. err) + logger:log(ERR, "(decrease) can't save counts to the datastore : " .. err) return end end logger:log( - ngx.NOTICE, + NOTICE, "decreased counter for IP " .. ip .. " (" .. tostring(counter) .. "/" .. tostring(threshold) .. ")" ) end function badbehavior.redis_increase(ip, count_time, ban_time) -- Instantiate objects - local clusterstore = require "bunkerweb.clusterstore":new(false) + local clusterstore = require "bunkerweb.clusterstore":new() -- Our LUA script to execute on redis local redis_script = [[ local ret_incr = redis.pcall("INCR", KEYS[1]) @@ -202,7 +212,7 @@ end function badbehavior.redis_decrease(ip, count_time) -- Instantiate objects - local clusterstore = require "bunkerweb.clusterstore":new(false) + local clusterstore = require "bunkerweb.clusterstore":new() -- Our LUA script to execute on redis local redis_script = [[ local ret_decr = redis.pcall("DECR", KEYS[1]) diff --git a/src/common/core/blacklist/blacklist.lua b/src/common/core/blacklist/blacklist.lua index 2e082d0ad..63136ed5c 100644 --- a/src/common/core/blacklist/blacklist.lua +++ b/src/common/core/blacklist/blacklist.lua @@ -5,14 +5,26 @@ local utils = require "bunkerweb.utils" local blacklist = class("blacklist", plugin) +local ngx = ngx +local ERR = ngx.ERR +local get_phase = ngx.get_phase +local has_variable = utils.has_variable +local get_deny_status = utils.get_deny_status +local get_rdns = utils.get_rdns +local get_asn = utils.get_asn +local regex_match = utils.regex_match +local ipmatcher_new = ipmatcher.new +local tostring = tostring +local open = io.open + function blacklist:initialize(ctx) -- Call parent initialize plugin.initialize(self, "blacklist", ctx) -- Decode lists - if ngx.get_phase() ~= "init" and self:is_needed() then + if get_phase() ~= "init" and self:is_needed() then local lists, err = self.datastore:get("plugin_blacklist_lists", true) if not lists then - self.logger:log(ngx.ERR, err) + self.logger:log(ERR, err) self.lists = {} else self.lists = lists @@ -50,9 +62,9 @@ function blacklist:is_needed() return self.variables["USE_BLACKLIST"] == "yes" end -- Other cases : at least one service uses it - local is_needed, err = utils.has_variable("USE_BLACKLIST", "yes") + local is_needed, err = has_variable("USE_BLACKLIST", "yes") if is_needed == nil then - self.logger:log(ngx.ERR, "can't check USE_BLACKLIST variable : " .. err) + self.logger:log(ERR, "can't check USE_BLACKLIST variable : " .. err) end return is_needed end @@ -78,7 +90,7 @@ function blacklist:init() } local i = 0 for kind, _ in pairs(blacklists) do - local f, _ = io.open("/var/cache/bunkerweb/blacklist/" .. kind .. ".list", "r") + local f, _ = open("/var/cache/bunkerweb/blacklist/" .. kind .. ".list", "r") if f then for line in f:lines() do table.insert(blacklists[kind], line) @@ -118,12 +130,14 @@ function blacklist:access() for k, v in pairs(checks) do local ok, cached = self:is_in_cache(v) if not ok then - self.logger:log(ngx.ERR, "error while checking cache : " .. cached) + self.logger:log(ERR, "error while checking cache : " .. cached) elseif cached and cached ~= "ok" then return self:ret( true, k .. " is in cached blacklist (info : " .. cached .. ")", - utils.get_deny_status(self.ctx) + get_deny_status(), + nil, + self:get_data(cached) ) end if ok and cached then @@ -139,18 +153,20 @@ function blacklist:access() if not already_cached[k] then local ok, blacklisted = self:is_blacklisted(k) if ok == nil then - self.logger:log(ngx.ERR, "error while checking if " .. k .. " is blacklisted : " .. blacklisted) + self.logger:log(ERR, "error while checking if " .. k .. " is blacklisted : " .. blacklisted) else -- luacheck: ignore 421 local ok, err = self:add_to_cache(self:kind_to_ele(k), blacklisted) if not ok then - self.logger:log(ngx.ERR, "error while adding element to cache : " .. err) + self.logger:log(ERR, "error while adding element to cache : " .. err) end if blacklisted ~= "ok" then return self:ret( true, k .. " is blacklisted (info : " .. blacklisted .. ")", - utils.get_deny_status(self.ctx) + get_deny_status(), + nil, + self:get_data(blacklisted) ) end end @@ -176,7 +192,7 @@ function blacklist:kind_to_ele(kind) end function blacklist:is_in_cache(ele) - local ok, data = self.cachestore:get("plugin_blacklist_" .. self.ctx.bw.server_name .. ele) + local ok, data = self.cachestore_local:get("plugin_blacklist_" .. self.ctx.bw.server_name .. ele) if not ok then return false, data end @@ -184,7 +200,7 @@ function blacklist:is_in_cache(ele) end function blacklist:add_to_cache(ele, value) - local ok, err = self.cachestore:set("plugin_blacklist_" .. self.ctx.bw.server_name .. ele, value, 86400) + local ok, err = self.cachestore_local:set("plugin_blacklist_" .. self.ctx.bw.server_name .. ele, value, 86400) if not ok then return false, err end @@ -204,7 +220,7 @@ end function blacklist:is_blacklisted_ip() -- Check if IP is in ignore list - local ipm, err = ipmatcher.new(self.lists["IGNORE_IP"]) + local ipm, err = ipmatcher_new(self.lists["IGNORE_IP"]) if not ipm then return nil, err end @@ -235,7 +251,7 @@ function blacklist:is_blacklisted_ip() if check_rdns then -- Get rDNS -- luacheck: ignore 421 - local rdns_list, err = utils.get_rdns(self.ctx.bw.remote_addr) + local rdns_list, err = get_rdns(self.ctx.bw.remote_addr, self.ctx, true) if rdns_list then -- Check if rDNS is in ignore list local ignore = false @@ -258,13 +274,13 @@ function blacklist:is_blacklisted_ip() end end else - self.logger:log(ngx.ERR, "error while getting rdns : " .. err) + self.logger:log(ERR, "error while getting rdns : " .. err) end end -- Check if ASN is in ignore list if self.ctx.bw.ip_is_global then - local asn, err = utils.get_asn(self.ctx.bw.remote_addr) + local asn, err = get_asn(self.ctx.bw.remote_addr) if not asn then self.logger:log(ngx.ERR, "can't get ASN of IP " .. self.ctx.bw.remote_addr .. " : " .. err) else @@ -294,7 +310,7 @@ function blacklist:is_blacklisted_uri() -- Check if URI is in ignore list local ignore = false for _, ignore_uri in ipairs(self.lists["IGNORE_URI"]) do - if utils.regex_match(self.ctx.bw.uri, ignore_uri) then + if regex_match(self.ctx.bw.uri, ignore_uri) then ignore = true break end @@ -302,7 +318,7 @@ function blacklist:is_blacklisted_uri() -- Check if URI is in blacklist if not ignore then for _, uri in ipairs(self.lists["URI"]) do - if utils.regex_match(self.ctx.bw.uri, uri) then + if regex_match(self.ctx.bw.uri, uri) then return true, "URI " .. uri end end @@ -315,7 +331,7 @@ function blacklist:is_blacklisted_ua() -- Check if UA is in ignore list local ignore = false for _, ignore_ua in ipairs(self.lists["IGNORE_USER_AGENT"]) do - if utils.regex_match(self.ctx.bw.http_user_agent, ignore_ua) then + if regex_match(self.ctx.bw.http_user_agent, ignore_ua) then ignore = true break end @@ -323,7 +339,7 @@ function blacklist:is_blacklisted_ua() -- Check if UA is in blacklist if not ignore then for _, ua in ipairs(self.lists["USER_AGENT"]) do - if utils.regex_match(self.ctx.bw.http_user_agent, ua) then + if regex_match(self.ctx.bw.http_user_agent, ua) then return true, "UA " .. ua end end @@ -332,4 +348,20 @@ function blacklist:is_blacklisted_ua() return false, "ok" end +-- luacheck: ignore 212 +function blacklist:get_data(blacklisted) + local data = {} + if blacklisted == "ip" then + data["id"] = "ip" + else + local id, value = blacklisted:match("^(.+) (.+)$") + if id and value then + id = id:lower() + data["id"] = id + data[id] = value + end + end + return data +end + return blacklist diff --git a/src/common/core/blacklist/jobs/blacklist-download.py b/src/common/core/blacklist/jobs/blacklist-download.py index 29eee550f..2bc5434b8 100755 --- a/src/common/core/blacklist/jobs/blacklist-download.py +++ b/src/common/core/blacklist/jobs/blacklist-download.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from contextlib import suppress from ipaddress import ip_address, ip_network diff --git a/src/common/core/bunkernet/bunkernet.lua b/src/common/core/bunkernet/bunkernet.lua index 6b603492e..fb030b0af 100644 --- a/src/common/core/bunkernet/bunkernet.lua +++ b/src/common/core/bunkernet/bunkernet.lua @@ -6,18 +6,41 @@ local utils = require "bunkerweb.utils" local bunkernet = class("bunkernet", plugin) +local ngx = ngx +local ERR = ngx.ERR +local NOTICE = ngx.NOTICE +local WARN = ngx.WARN +local timer_at = ngx.timer.at +local get_phase = ngx.get_phase +local get_version = utils.get_version +local get_integration = utils.get_integration +local get_deny_status = utils.get_deny_status +local is_ipv4 = utils.is_ipv4 +local is_ipv6 = utils.is_ipv6 +local ip_is_global = utils.ip_is_global +local has_variable = utils.has_variable +local is_whitelisted = utils.is_whitelisted +local is_ip_in_networks = utils.is_ip_in_networks +local get_reason = utils.get_reason +local get_variable = utils.get_variable +local tostring = tostring +local open = io.open +local encode = cjson.encode +local decode = cjson.decode +local http_new = http.new + function bunkernet:initialize(ctx) -- Call parent initialize plugin.initialize(self, "bunkernet", ctx) -- Get BunkerNet ID and save info - if ngx.get_phase() ~= "init" and self:is_needed() then + if get_phase() ~= "init" and self:is_needed() then local id, err = self.datastore:get("plugin_bunkernet_id", true) if id then self.bunkernet_id = id - self.version = (self.ctx and self.ctx.bw.version) or utils.get_version() - self.integration = (self.ctx and self.ctx.bw.integration) or utils.get_integration() + self.version = get_version(self.ctx) + self.integration = get_integration(self.ctx) else - self.logger:log(ngx.ERR, "can't get BunkerNet ID from datastore : " .. err) + self.logger:log(ERR, "can't get BunkerNet ID from datastore : " .. err) end end end @@ -32,9 +55,9 @@ function bunkernet:is_needed() return self.variables["USE_BUNKERNET"] == "yes" end -- Other cases : at least one service uses it - local is_needed, err = utils.has_variable("USE_BUNKERNET", "yes") + local is_needed, err = has_variable("USE_BUNKERNET", "yes") if is_needed == nil then - self.logger:log(ngx.ERR, "can't check USE_BUNKERNET variable : " .. err) + self.logger:log(ERR, "can't check USE_BUNKERNET variable : " .. err) end return is_needed end @@ -59,7 +82,7 @@ function bunkernet:init_worker() "received status " .. tostring(status) .. " from API using instance ID " .. self.bunkernet_id ) end - self.logger:log(ngx.NOTICE, "connectivity with API using instance ID " .. self.bunkernet_id .. " is successful") + self.logger:log(NOTICE, "connectivity with API using instance ID " .. self.bunkernet_id .. " is successful") return self:ret(true, "connectivity with API using instance ID " .. self.bunkernet_id .. " is successful") end @@ -69,7 +92,7 @@ function bunkernet:init() return self:ret(true, "no service uses BunkerNet, skipping init") end -- Check if instance ID is present - local f, err = io.open("/var/cache/bunkerweb/bunkernet/instance.id", "r") + local f, err = open("/var/cache/bunkerweb/bunkernet/instance.id", "r") if not f then return self:ret(false, "can't read instance id : " .. err) end @@ -87,12 +110,12 @@ function bunkernet:init() local db = { ip = {}, } - local f, err = io.open("/var/cache/bunkerweb/bunkernet/ip.list", "r") + local f, err = open("/var/cache/bunkerweb/bunkernet/ip.list", "r") if not f then ret = false else for line in f:lines() do - if (utils.is_ipv4(line) or utils.is_ipv6(line)) and utils.ip_is_global(line) then + if (is_ipv4(line) or is_ipv6(line)) and ip_is_global(line) then table.insert(db.ip, line) i = i + 1 end @@ -123,7 +146,7 @@ function bunkernet:access() return self:ret(true, "IP is not global") end -- Check if whitelisted - if self.ctx.bw.is_whitelisted == "yes" then + if is_whitelisted(self.ctx) then return self:ret(true, "client is whitelisted") end -- Extract DB @@ -132,12 +155,12 @@ function bunkernet:access() -- Check if is IP is present if #db.ip > 0 then -- luacheck: ignore 421 - local present, err = utils.is_ip_in_networks(self.ctx.bw.remote_addr, db.ip) + local present, err = is_ip_in_networks(self.ctx.bw.remote_addr, db.ip) if present == nil then return self:ret(false, "can't check if ip is in db : " .. err) end if present then - return self:ret(true, "ip is in db", utils.get_deny_status(self.ctx)) + return self:ret(true, "ip is in db", get_deny_status()) end end else @@ -158,7 +181,7 @@ function bunkernet:log(bypass_checks) end end -- Check if IP has been blocked - local reason = utils.get_reason(self.ctx) + local reason, reason_data = get_reason(self.ctx) if not reason then return self:ret(true, "ip is not blocked") end @@ -169,25 +192,38 @@ function bunkernet:log(bypass_checks) if not self.ctx.bw.ip_is_global then return self:ret(true, "IP is not global") end - -- TODO : check if IP has been reported recently + -- Check if IP has been reported recently + local ok, data = self.cachestore:get("plugin_bunkernet_" .. self.ctx.bw.remote_addr .. "_" .. reason) + if not ok then + self.logger:log(ERR, "can't check cachestore : " .. data) + elseif data then + return self:ret(true, "already reported recently") + end + local ok, err -- luacheck: ignore 212 431 - local function report_callback(premature, obj, ip, reason, method, url, headers) - local ok, err, status, _ = obj:report(ip, reason, method, url, headers) + local function report_callback(premature, obj, ip, reason, reason_data, method, url, headers, use_redis) + local status, _ + ok, err, status, _ = obj:report(ip, reason, reason_data, method, url, headers) if status == 429 then - obj.logger:log(ngx.WARN, "bunkernet API is rate limiting us") + obj.logger:log(WARN, "bunkernet API is rate limiting us") elseif not ok then - obj.logger:log(ngx.ERR, "can't report IP : " .. err) + obj.logger:log(ERR, "can't report IP : " .. err) else - obj.logger:log(ngx.NOTICE, "successfully reported IP " .. ip .. " (reason : " .. reason .. ")") + obj.logger:log(NOTICE, "successfully reported IP " .. ip .. " (reason : " .. reason .. ")") + local cachestore = require "bunkerweb.cachestore":new(use_redis, nil, true) + local ok, err = cachestore:set("plugin_bunkernet_" .. ip .. "_" .. reason, "reported", 3600) + if not ok then + obj.logger:log(ERR, "error from cachestore : " .. err) + end end end - - local hdr, err = ngx.timer.at( + local hdr, err = timer_at( 0, report_callback, self, self.ctx.bw.remote_addr, reason, + reason_data, self.ctx.bw.request_method, self.ctx.bw.request_uri, ngx.req.get_headers() @@ -208,7 +244,7 @@ function bunkernet:log_default() return self:ret(false, "missing instance ID") end -- Check if default server is disabled - local check, err = utils.get_variable("DISABLE_DEFAULT_SERVER", false) + local check, err = get_variable("DISABLE_DEFAULT_SERVER", false) if check == nil then return self:ret(false, "error while getting variable DISABLE_DEFAULT_SERVER : " .. err) end @@ -224,7 +260,7 @@ function bunkernet:log_stream() end function bunkernet:request(method, url, data) - local httpc, err = http.new() + local httpc, err = http_new() if not httpc then return false, "can't instantiate http object : " .. err end @@ -240,7 +276,7 @@ function bunkernet:request(method, url, data) end local res, err = httpc:request_uri(self.variables["BUNKERNET_SERVER"] .. url, { method = method, - body = cjson.encode(all_data), + body = encode(all_data), headers = { ["Content-Type"] = "application/json", ["User-Agent"] = "BunkerWeb/" .. self.version, @@ -253,7 +289,7 @@ function bunkernet:request(method, url, data) if res.status ~= 200 then return false, "status code != 200", res.status, nil end - local ok, ret = pcall(cjson.decode, res.body) + local ok, ret = pcall(decode, res.body) if not ok then return false, "error while decoding json : " .. ret end @@ -264,10 +300,11 @@ function bunkernet:ping() return self:request("GET", "/ping", {}) end -function bunkernet:report(ip, reason, method, url, headers) +function bunkernet:report(ip, reason, reason_data, method, url, headers) local data = { ip = ip, reason = reason, + data = reason_data, method = method, url = url, headers = headers, diff --git a/src/common/core/bunkernet/jobs/bunkernet-data.py b/src/common/core/bunkernet/jobs/bunkernet-data.py index a3515c7a6..d79b3377e 100755 --- a/src/common/core/bunkernet/jobs/bunkernet-data.py +++ b/src/common/core/bunkernet/jobs/bunkernet-data.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from os import _exit, getenv, sep from os.path import join @@ -57,7 +57,7 @@ try: db = Database(logger, sqlalchemy_string=getenv("DATABASE_URI", None), pool=False) bunkernet_id = get_file_in_db("instance.id", db) if bunkernet_id: - bunkernet_path.joinpath("bunkernet.id").write_bytes(bunkernet_id) + bunkernet_path.joinpath("instance.id").write_bytes(bunkernet_id) logger.info("Successfully retrieved BunkerNet ID from db cache") else: logger.info("No BunkerNet ID found in db cache") diff --git a/src/common/core/bunkernet/jobs/bunkernet-register.py b/src/common/core/bunkernet/jobs/bunkernet-register.py index ed63963c8..b9803e84f 100755 --- a/src/common/core/bunkernet/jobs/bunkernet-register.py +++ b/src/common/core/bunkernet/jobs/bunkernet-register.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from os import _exit, getenv, sep from os.path import join @@ -58,7 +58,7 @@ try: db = Database(logger, sqlalchemy_string=getenv("DATABASE_URI", None), pool=False) bunkernet_id = get_file_in_db("instance.id", db) if bunkernet_id: - bunkernet_path.joinpath("bunkernet.id").write_bytes(bunkernet_id) + bunkernet_path.joinpath("instance.id").write_bytes(bunkernet_id) logger.info("Successfully retrieved BunkerNet ID from db cache") else: logger.info("No BunkerNet ID found in db cache") diff --git a/src/common/core/bunkernet/jobs/bunkernet.py b/src/common/core/bunkernet/jobs/bunkernet.py index e976b4555..23983afba 100644 --- a/src/common/core/bunkernet/jobs/bunkernet.py +++ b/src/common/core/bunkernet/jobs/bunkernet.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from os import getenv, sep from pathlib import Path diff --git a/src/common/core/cors/cors.lua b/src/common/core/cors/cors.lua index fc2e1a00f..814d1150e 100644 --- a/src/common/core/cors/cors.lua +++ b/src/common/core/cors/cors.lua @@ -4,6 +4,12 @@ local utils = require "bunkerweb.utils" local cors = class("cors", plugin) +local ngx = ngx +local HTTP_NO_CONTENT = ngx.HTTP_NO_CONTENT +local WARN = ngx.WARN +local regex_match = utils.regex_match +local get_deny_status = utils.get_deny_status + function cors:initialize(ctx) -- Call parent initialize plugin.initialize(self, "cors", ctx) @@ -31,50 +37,51 @@ function cors:header() return self:ret(true, "origin header not present") end -- Always include Vary header to prevent caching - local vary = ngx.header.Vary + local ngx_header = ngx.header + local vary = ngx_header.Vary if vary then if type(vary) == "string" then - ngx.header.Vary = { vary, "Origin" } + ngx_header.Vary = { vary, "Origin" } else table.insert(vary, "Origin") - ngx.header.Vary = vary + ngx_header.Vary = vary end else - ngx.header.Vary = "Origin" + ngx_header.Vary = "Origin" end -- Check if Origin is allowed if self.ctx.bw.http_origin and self.variables["CORS_DENY_REQUEST"] == "yes" and self.variables["CORS_ALLOW_ORIGIN"] ~= "*" - and not utils.regex_match(self.ctx.bw.http_origin, self.variables["CORS_ALLOW_ORIGIN"]) + and not regex_match(self.ctx.bw.http_origin, self.variables["CORS_ALLOW_ORIGIN"]) then - self.logger:log(ngx.WARN, "origin " .. self.ctx.bw.http_origin .. " is not allowed") + self.logger:log(WARN, "origin " .. self.ctx.bw.http_origin .. " is not allowed") return self:ret(true, "origin " .. self.ctx.bw.http_origin .. " is not allowed") end -- Set headers if self.variables["CORS_ALLOW_ORIGIN"] == "*" then - ngx.header["Access-Control-Allow-Origin"] = "*" + ngx_header["Access-Control-Allow-Origin"] = "*" else - ngx.header["Access-Control-Allow-Origin"] = self.ctx.bw.http_origin + ngx_header["Access-Control-Allow-Origin"] = self.ctx.bw.http_origin end for variable, header in pairs(self.all_headers) do if self.variables[variable] ~= "" then - ngx.header[header] = self.variables[variable] + ngx_header[header] = self.variables[variable] end end if self.ctx.bw.request_method == "OPTIONS" then for variable, header in pairs(self.preflight_headers) do if variable == "CORS_ALLOW_CREDENTIALS" then if self.variables["CORS_ALLOW_CREDENTIALS"] == "yes" then - ngx.header[header] = "true" + ngx_header[header] = "true" end elseif self.variables[variable] ~= "" then - ngx.header[header] = self.variables[variable] + ngx_header[header] = self.variables[variable] end end - ngx.header["Content-Type"] = "text/html; charset=UTF-8" - ngx.header["Content-Length"] = "0" + ngx_header["Content-Type"] = "text/html; charset=UTF-8" + ngx_header["Content-Length"] = "0" return self:ret(true, "edited headers for preflight request") end return self:ret(true, "edited headers for standard request") @@ -90,17 +97,22 @@ function cors:access() self.ctx.bw.http_origin and self.variables["CORS_DENY_REQUEST"] == "yes" and self.variables["CORS_ALLOW_ORIGIN"] ~= "*" - and not utils.regex_match(self.ctx.bw.http_origin, self.variables["CORS_ALLOW_ORIGIN"]) + and not regex_match(self.ctx.bw.http_origin, self.variables["CORS_ALLOW_ORIGIN"]) then return self:ret( true, "origin " .. self.ctx.bw.http_origin .. " is not allowed, denying access", - utils.get_deny_status(self.ctx) + get_deny_status(), + nil, + { + id = "origin", + origin = self.ctx.bw.http_origin, + } ) end -- Send CORS policy with a 204 (no content) status if self.ctx.bw.request_method == "OPTIONS" and self.ctx.bw.http_origin then - return self:ret(true, "preflight request", ngx.HTTP_NO_CONTENT) + return self:ret(true, "preflight request", HTTP_NO_CONTENT) end return self:ret(true, "standard request") end diff --git a/src/common/core/country/country.lua b/src/common/core/country/country.lua index 6f697b154..8bb767fd6 100644 --- a/src/common/core/country/country.lua +++ b/src/common/core/country/country.lua @@ -5,6 +5,11 @@ local utils = require "bunkerweb.utils" local country = class("country", plugin) +local get_country = utils.get_country +local get_deny_status = utils.get_deny_status +local decode = cjson.decode +local encode = cjson.encode + function country:initialize(ctx) -- Call parent initialize plugin.initialize(self, "country", ctx) @@ -18,7 +23,7 @@ function country:access() -- Check if IP is in cache local _, data = self:is_in_cache(self.ctx.bw.remote_addr) if data then - data = cjson.decode(data) + data = decode(data) if data.result == "ok" then return self:ret( true, @@ -36,7 +41,12 @@ function country:access() .. " is in country cache (blacklisted, country = " .. data.country .. ")", - utils.get_deny_status(self.ctx) + get_deny_status(), + nil, + { + id = "country", + country = data.country, + } ) end @@ -50,7 +60,7 @@ function country:access() end -- Get the country of client - local country_data, err = utils.get_country(self.ctx.bw.remote_addr) + local country_data, err = get_country(self.ctx.bw.remote_addr) if not country_data then return self:ret(false, "can't get country of client IP " .. self.ctx.bw.remote_addr .. " : " .. err) end @@ -78,7 +88,12 @@ function country:access() return self:ret( true, "client IP " .. self.ctx.bw.remote_addr .. " is not whitelisted (country = " .. country_data .. ")", - utils.get_deny_status(self.ctx) + get_deny_status(), + nil, + { + id = "country", + country = country_data, + } ) end @@ -93,7 +108,12 @@ function country:access() return self:ret( true, "client IP " .. self.ctx.bw.remote_addr .. " is blacklisted (country = " .. country_data .. ")", - utils.get_deny_status(self.ctx) + get_deny_status(), + nil, + { + id = "country", + country = country_data, + } ) end end @@ -115,7 +135,7 @@ function country:preread() end function country:is_in_cache(ip) - local ok, data = self.cachestore:get("plugin_country_" .. self.ctx.bw.server_name .. ip) + local ok, data = self.cachestore_local:get("plugin_country_" .. self.ctx.bw.server_name .. ip) if not ok then return false, data end @@ -123,9 +143,9 @@ function country:is_in_cache(ip) end function country:add_to_cache(ip, country_data, result) - local ok, err = self.cachestore:set( + local ok, err = self.cachestore_local:set( "plugin_country_" .. self.ctx.bw.server_name .. ip, - cjson.encode { country = country_data, result = result }, + encode({ country = country_data, result = result }), 86400 ) if not ok then diff --git a/src/common/core/customcert/confs/server-http/custom-cert.conf b/src/common/core/customcert/confs/server-http/custom-cert.conf deleted file mode 100644 index 623fc48a7..000000000 --- a/src/common/core/customcert/confs/server-http/custom-cert.conf +++ /dev/null @@ -1,34 +0,0 @@ -{% set os_path = import("os.path") %} - -{% if USE_CUSTOM_SSL == "yes" %} -{% if os_path.isfile("/var/cache/bunkerweb/customcert/cert.pem") and os_path.isfile("/var/cache/bunkerweb/customcert/key.pem") or os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/cert.pem") and os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/key.pem") +%} - -# listen on HTTPS PORT -listen 0.0.0.0:{{ HTTPS_PORT }} ssl {% if HTTP2 == "yes" %}http2{% endif %} {% if USE_PROXY_PROTOCOL == "yes" %}proxy_protocol{% endif %}; -{% if USE_IPV6 == "yes" +%} -listen [::]:{{ HTTPS_PORT }} ssl {% if HTTP2 == "yes" %}http2{% endif %} {% if USE_PROXY_PROTOCOL == "yes" %}proxy_protocol{% endif %}; -{% endif %} - -# TLS config -{% if os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/cert.pem") %} -ssl_certificate /var/cache/bunkerweb/customcert/{{ SERVER_NAME.split(" ")[0] }}/cert.pem; -{% else %} -ssl_certificate /var/cache/bunkerweb/customcert/cert.pem; -{% endif %} -{% if os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/key.pem") %} -ssl_certificate_key /var/cache/bunkerweb/customcert/{{ SERVER_NAME.split(" ")[0] }}/key.pem; -{% else %} -ssl_certificate_key /var/cache/bunkerweb/customcert/key.pem; -{% endif %} -ssl_protocols {{ SSL_PROTOCOLS }}; -ssl_prefer_server_ciphers on; -ssl_session_tickets off; -ssl_session_timeout 1d; -ssl_session_cache shared:MozSSL:10m; -{% if "TLSv1.2" in SSL_PROTOCOLS +%} -ssl_dhparam /etc/nginx/dhparam; -ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; -{% endif %} - -{% endif %} -{% endif %} diff --git a/src/common/core/customcert/confs/server-stream/custom-cert.conf b/src/common/core/customcert/confs/server-stream/custom-cert.conf deleted file mode 100644 index b7395a723..000000000 --- a/src/common/core/customcert/confs/server-stream/custom-cert.conf +++ /dev/null @@ -1,34 +0,0 @@ -{% set os_path = import("os.path") %} - -{% if USE_CUSTOM_SSL == "yes" %} -{% if os_path.isfile("/var/cache/bunkerweb/customcert/cert.pem") and os_path.isfile("/var/cache/bunkerweb/customcert/key.pem") or os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/cert.pem") and os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/key.pem") +%} - -# listen -listen 0.0.0.0:{{ LISTEN_STREAM_PORT_SSL }} ssl {% if USE_UDP == "yes" %} udp {% endif %}{% if USE_PROXY_PROTOCOL == "yes" %} proxy_protocol {% endif %}; -{% if USE_IPV6 == "yes" +%} -listen [::]:{{ LISTEN_STREAM_PORT_SSL }} ssl {% if USE_UDP == "yes" %} udp {% endif %}{% if USE_PROXY_PROTOCOL == "yes" %} proxy_protocol {% endif %}; -{% endif %} - -# TLS config -{% if os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/cert.pem") %} -ssl_certificate /var/cache/bunkerweb/customcert/{{ SERVER_NAME.split(" ")[0] }}/cert.pem; -{% else %} -ssl_certificate /var/cache/bunkerweb/customcert/cert.pem; -{% endif %} -{% if os_path.isfile("/var/cache/bunkerweb/customcert/" + SERVER_NAME.split(" ")[0] + "/key.pem") %} -ssl_certificate_key /var/cache/bunkerweb/customcert/{{ SERVER_NAME.split(" ")[0] }}/key.pem; -{% else %} -ssl_certificate_key /var/cache/bunkerweb/customcert/key.pem; -{% endif %} -ssl_protocols {{ SSL_PROTOCOLS }}; -ssl_prefer_server_ciphers on; -ssl_session_tickets off; -ssl_session_timeout 1d; -ssl_session_cache shared:MozSSLStream:10m; -{% if "TLSv1.2" in SSL_PROTOCOLS +%} -ssl_dhparam /etc/nginx/dhparam; -ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; -{% endif %} - -{% endif %} -{% endif %} diff --git a/src/common/core/customcert/customcert.lua b/src/common/core/customcert/customcert.lua new file mode 100644 index 000000000..76655c1f9 --- /dev/null +++ b/src/common/core/customcert/customcert.lua @@ -0,0 +1,127 @@ +local class = require "middleclass" +local plugin = require "bunkerweb.plugin" +local ssl = require "ngx.ssl" +local utils = require "bunkerweb.utils" + +local customcert = class("customcert", plugin) + +local ngx = ngx +local ERR = ngx.ERR +local parse_pem_cert = ssl.parse_pem_cert +local parse_pem_priv_key = ssl.parse_pem_priv_key +local ssl_server_name = ssl.server_name +local get_variable = utils.get_variable +local get_multiple_variables = utils.get_multiple_variables +local has_variable = utils.has_variable +local read_files = utils.read_files + +function customcert:initialize(ctx) + -- Call parent initialize + plugin.initialize(self, "customcert", ctx) +end + +function customcert:init() + local ret_ok, ret_err = true, "success" + if has_variable("USE_CUSTOM_SSL", "yes") then + local multisite, err = get_variable("MULTISITE", false) + if not multisite then + return self:ret(false, "can't get MULTISITE variable : " .. err) + end + if multisite == "yes" then + local vars + vars, err = get_multiple_variables({ "USE_CUSTOM_SSL", "SERVER_NAME" }) + if not vars then + return self:ret(false, "can't get USE_CUSTOM_SSL variables : " .. err) + end + for server_name, multisite_vars in pairs(vars) do + if multisite_vars["USE_CUSTOM_SSL"] == "yes" and server_name ~= "global" then + local check, data = read_files({ + "/var/cache/bunkerweb/customcert/" .. server_name .. "/cert.pem", + "/var/cache/bunkerweb/customcert/" .. server_name .. "/key.pem", + }) + if not check then + self.logger:log(ERR, "error while reading files : " .. data) + ret_ok = false + ret_err = "error reading files" + else + check, err = self:load_data(data, multisite_vars["SERVER_NAME"]) + if not check then + self.logger:log(ERR, "error while loading data : " .. err) + ret_ok = false + ret_err = "error loading data" + end + end + end + end + else + local server_name + server_name, err = get_variable("SERVER_NAME", false) + if not server_name then + return self:ret(false, "can't get SERVER_NAME variable : " .. err) + end + local check, data = read_files({ + "/var/cache/bunkerweb/customcert/" .. server_name:match("%S+") .. "/cert.pem", + "/var/cache/bunkerweb/customcert/" .. server_name:match("%S+") .. "/key.pem", + }) + if not check then + self.logger:log(ERR, "error while reading files : " .. data) + ret_ok = false + ret_err = "error reading files" + else + check, err = self:load_data(data, server_name) + if not check then + self.logger:log(ERR, "error while loading data : " .. err) + ret_ok = false + ret_err = "error loading data" + end + end + end + else + ret_err = "custom cert is not used" + end + return self:ret(ret_ok, ret_err) +end + +function customcert:ssl_certificate() + local server_name, err = ssl_server_name() + if not server_name then + return self:ret(false, "can't get server_name : " .. err) + end + if self.variables["USE_CUSTOM_SSL"] == "yes" then + local data + data, err = self.datastore:get("plugin_customcert_" .. server_name, true) + if not data then + return self:ret( + false, + "error while getting plugin_customcert_" .. server_name .. " from datastore : " .. err + ) + end + return self:ret(true, "certificate/key data found", data) + end + return self:ret(true, "custom certificate is not used") +end + +function customcert:load_data(data, server_name) + -- Load certificate + local cert_chain, err = parse_pem_cert(data[1]) + if not cert_chain then + return false, "error while parsing pem cert : " .. err + end + -- Load key + local priv_key, err = parse_pem_priv_key(data[2]) + if not priv_key then + return false, "error while parsing pem priv key : " .. err + end + -- Cache data + for key in server_name:gmatch("%S+") do + local cache_key = "plugin_customcert_" .. key + local ok + ok, err = self.datastore:set(cache_key, { cert_chain, priv_key }, nil, true) + if not ok then + return false, "error while setting data into datastore : " .. err + end + end + return true +end + +return customcert diff --git a/src/common/core/customcert/jobs/custom-cert.py b/src/common/core/customcert/jobs/custom-cert.py index b6a2e5a5b..7377305b9 100644 --- a/src/common/core/customcert/jobs/custom-cert.py +++ b/src/common/core/customcert/jobs/custom-cert.py @@ -1,11 +1,11 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from os import getenv, sep from os.path import join, normpath from pathlib import Path from sys import exit as sys_exit, path as sys_path from traceback import format_exc -from typing import Optional +from base64 import b64decode for deps_path in [ join(sep, "usr", "share", "bunkerweb", *paths) @@ -26,7 +26,7 @@ logger = setup_logger("CUSTOM-CERT", getenv("LOG_LEVEL", "INFO")) db = None -def check_cert(cert_path: str, key_path: str, first_server: Optional[str] = None) -> bool: +def check_cert(cert_path: str, key_path: str, first_server: str) -> bool: try: if not cert_path or not key_path: logger.warning("Both variables CUSTOM_SSL_CERT and CUSTOM_SSL_KEY have to be set to use custom certificates") @@ -48,7 +48,7 @@ def check_cert(cert_path: str, key_path: str, first_server: Optional[str] = None "cache", "bunkerweb", "customcert", - first_server or "", + first_server, "cert.pem", ) cert_cache_path.parent.mkdir(parents=True, exist_ok=True) @@ -68,7 +68,7 @@ def check_cert(cert_path: str, key_path: str, first_server: Optional[str] = None "cache", "bunkerweb", "customcert", - first_server or "", + first_server, "key.pem", ) key_cache_path.parent.mkdir(parents=True, exist_ok=True) @@ -93,22 +93,35 @@ status = 0 try: Path(sep, "var", "cache", "bunkerweb", "customcert").mkdir(parents=True, exist_ok=True) - if getenv("USE_CUSTOM_SSL", "no") == "yes" and getenv("SERVER_NAME", "") != "": + if getenv("MULTISITE", "no") == "no" and getenv("USE_CUSTOM_SSL", "no") == "yes" and getenv("SERVER_NAME", "") != "": db = Database(logger, sqlalchemy_string=getenv("DATABASE_URI", None), pool=False) cert_path = getenv("CUSTOM_SSL_CERT", "") key_path = getenv("CUSTOM_SSL_KEY", "") + first_server = getenv("SERVER_NAME").split(" ")[0] + + cert_data = b64decode(getenv("CUSTOM_SSL_CERT_DATA", "")) + key_data = b64decode(getenv("CUSTOM_SSL_KEY_DATA", "")) + for file, data in (("cert.pem", cert_data), ("key.pem", key_data)): + if data != b"": + file_path = Path(sep, "var", "tmp", "bunkerweb", "customcert", first_server, file) + file_path.parent.mkdir(parents=True, exist_ok=True) + file_path.write_bytes(data) + if file == "cert.pem": + cert_path = str(file_path) + else: + key_path = str(file_path) if cert_path and key_path: logger.info(f"Checking certificate {cert_path} ...") - need_reload = check_cert(cert_path, key_path) + need_reload = check_cert(cert_path, key_path, first_server) if need_reload: logger.info(f"Detected change for certificate {cert_path}") status = 1 else: logger.info(f"No change for certificate {cert_path}") - if getenv("MULTISITE", "no") == "yes": + elif getenv("MULTISITE", "no") == "yes": servers = getenv("SERVER_NAME") or [] if isinstance(servers, str): @@ -124,6 +137,18 @@ try: cert_path = getenv(f"{first_server}_CUSTOM_SSL_CERT", "") key_path = getenv(f"{first_server}_CUSTOM_SSL_KEY", "") + cert_data = b64decode(getenv(f"{first_server}_CUSTOM_SSL_CERT_DATA", "")) + key_data = b64decode(getenv(f"{first_server}_CUSTOM_SSL_KEY_DATA", "")) + for file, data in (("cert.pem", cert_data), ("key.pem", key_data)): + if data != b"": + file_path = Path(sep, "var", "tmp", "bunkerweb", "customcert", first_server, file) + file_path.parent.mkdir(parents=True, exist_ok=True) + file_path.write_bytes(data) + if file == "cert.pem": + cert_path = str(file_path) + else: + key_path = str(file_path) + if cert_path and key_path: logger.info( f"Checking certificate {cert_path} ...", diff --git a/src/common/core/customcert/plugin.json b/src/common/core/customcert/plugin.json index 0016ee42a..c6366f368 100644 --- a/src/common/core/customcert/plugin.json +++ b/src/common/core/customcert/plugin.json @@ -31,6 +31,24 @@ "label": "Key path", "regex": "^(/[\\w. \\-]+)*/?$", "type": "text" + }, + "CUSTOM_SSL_CERT_DATA": { + "context": "multisite", + "default": "", + "help": "Certificate data encoded in base64.", + "id": "custom-https-cert-data", + "label": "Certificate data (base64)", + "regex": "^.*$", + "type": "text" + }, + "CUSTOM_SSL_KEY_DATA": { + "context": "multisite", + "default": "", + "help": "Key data encoded in base64.", + "id": "custom-https-key-data", + "label": "Key data (base64)", + "regex": "^.*$", + "type": "text" } }, "jobs": [ diff --git a/src/common/core/dnsbl/dnsbl.lua b/src/common/core/dnsbl/dnsbl.lua index 90bca0e60..545c9a1b9 100644 --- a/src/common/core/dnsbl/dnsbl.lua +++ b/src/common/core/dnsbl/dnsbl.lua @@ -5,9 +5,20 @@ local utils = require "bunkerweb.utils" local dnsbl = class("dnsbl", plugin) +local ngx = ngx +local ERR = ngx.ERR +local NOTICE = ngx.NOTICE +local spawn = ngx.thread.spawn +local wait = ngx.thread.wait +local arpa_str = resolver.arpa_str +local get_ips = utils.get_ips +local has_variable = utils.has_variable +local get_deny_status = utils.get_deny_status +local kill_all_threads = utils.kill_all_threads + local is_in_dnsbl = function(addr, server) - local request = resolver.arpa_str(addr):gsub("%.in%-addr%.arpa", ""):gsub("%.ip6%.arpa", "") .. "." .. server - local ips, err = utils.get_ips(request, false) + local request = arpa_str(addr):gsub("%.in%-addr%.arpa", ""):gsub("%.ip6%.arpa", "") .. "." .. server + local ips, err = get_ips(request, false, nil, true) if not ips then return nil, server, err end @@ -30,7 +41,7 @@ function dnsbl:init_worker() return self:ret(false, "BW is loading") end -- Check if at least one service uses it - local is_needed, err = utils.has_variable("USE_DNSBL", "yes") + local is_needed, err = has_variable("USE_DNSBL", "yes") if is_needed == nil then return self:ret(false, "can't check USE_DNSBL variable : " .. err) elseif not is_needed then @@ -40,21 +51,21 @@ function dnsbl:init_worker() local threads = {} for server in self.variables["DNSBL_LIST"]:gmatch("%S+") do -- Create thread - local thread = ngx.thread.spawn(is_in_dnsbl, "127.0.0.2", server) + local thread = spawn(is_in_dnsbl, "127.0.0.2", server) threads[server] = thread end -- Wait for threads for data, thread in pairs(threads) do -- luacheck: ignore 421 - local ok, result, server, err = ngx.thread.wait(thread) + local ok, result, server, err = wait(thread) if not ok then - self.logger:log(ngx.ERR, "error while waiting thread of " .. data .. " check : " .. result) + self.logger:log(ERR, "error while waiting thread of " .. data .. " check : " .. result) elseif result == nil then - self.logger:log(ngx.ERR, "error while sending DNS request to " .. server .. " : " .. err) + self.logger:log(ERR, "error while sending DNS request to " .. server .. " : " .. err) elseif not result then - self.logger:log(ngx.ERR, "dnsbl check for " .. server .. " failed") + self.logger:log(ERR, "dnsbl check for " .. server .. " failed") else - self.logger:log(ngx.NOTICE, "dnsbl check for " .. server .. " is successful") + self.logger:log(NOTICE, "dnsbl check for " .. server .. " is successful") end end return self:ret(true, "success") @@ -83,14 +94,19 @@ function dnsbl:access() return self:ret( true, "client IP " .. self.ctx.bw.remote_addr .. " is in DNSBL cache (server = " .. cached .. ")", - utils.get_deny_status(self.ctx) + get_deny_status(), + nil, + { + id = "dnsbl", + dnsbl = cached, + } ) end -- Loop on DNSBL list local threads = {} for server in self.variables["DNSBL_LIST"]:gmatch("%S+") do -- Create thread - local thread = ngx.thread.spawn(is_in_dnsbl, self.ctx.bw.remote_addr, server) + local thread = spawn(is_in_dnsbl, self.ctx.bw.remote_addr, server) threads[server] = thread end -- Wait for threads @@ -109,7 +125,7 @@ function dnsbl:access() end -- Wait for first thread -- luacheck: ignore 421 - local ok, result, server, err = ngx.thread.wait(unpack(wait_threads)) + local ok, result, server, err = wait(unpack(wait_threads)) -- Error case if not ok then ret_threads = false @@ -120,7 +136,7 @@ function dnsbl:access() threads[server] = nil -- DNS error if result == nil then - self.logger:log(ngx.ERR, "error while sending DNS request to " .. server .. " : " .. err) + self.logger:log(ERR, "error while sending DNS request to " .. server .. " : " .. err) end -- IP is in DNSBL if result then @@ -137,7 +153,7 @@ function dnsbl:access() for _, thread in pairs(threads) do table.insert(wait_threads, thread) end - utils.kill_all_threads(wait_threads) + kill_all_threads(wait_threads) end -- Blacklisted by a server : add to cache and deny access if ret_threads then @@ -145,7 +161,13 @@ function dnsbl:access() if not ok then return self:ret(false, "error while adding element to cache : " .. err) end - return self:ret(true, "IP is blacklisted by " .. ret_server, utils.get_deny_status(self.ctx)) + return self:ret( + true, + "IP is blacklisted by " .. ret_server, + get_deny_status(), + nil, + { id = "dnsbl", dnsbl = ret_server } + ) end -- Error case return self:ret(false, ret_err) @@ -163,7 +185,7 @@ function dnsbl:preread() end function dnsbl:is_in_cache(ip) - local ok, data = self.cachestore:get("plugin_dnsbl_" .. self.ctx.bw.server_name .. ip) + local ok, data = self.cachestore_local:get("plugin_dnsbl_" .. self.ctx.bw.server_name .. ip) if not ok then return false, data end @@ -171,7 +193,7 @@ function dnsbl:is_in_cache(ip) end function dnsbl:add_to_cache(ip, value) - local ok, err = self.cachestore:set("plugin_dnsbl_" .. self.ctx.bw.server_name .. ip, value, 86400) + local ok, err = self.cachestore_local:set("plugin_dnsbl_" .. self.ctx.bw.server_name .. ip, value, 86400) if not ok then return false, err end diff --git a/src/common/core/errors/errors.lua b/src/common/core/errors/errors.lua index 05aea4bc5..8692d3a3d 100644 --- a/src/common/core/errors/errors.lua +++ b/src/common/core/errors/errors.lua @@ -1,8 +1,14 @@ local class = require "middleclass" local plugin = require "bunkerweb.plugin" -local template = nil -if ngx.shared.datastore then + +local ngx = ngx +local subsystem = ngx.config.subsystem + +local template +local render = nil +if subsystem == "http" then template = require "resty.template" + render = template.render end local errors = class("errors", plugin) @@ -65,7 +71,7 @@ end function errors:render_template(code) -- Render template - template.render("error.html", { + render("error.html", { title = code .. " - " .. self.default_errors[code].title, error_title = self.default_errors[code].title, error_code = code, diff --git a/src/common/core/errors/files/error.html b/src/common/core/errors/files/error.html index 6cad45f33..7b76f4f56 100644 --- a/src/common/core/errors/files/error.html +++ b/src/common/core/errors/files/error.html @@ -13,23 +13,26 @@ /> - + + + + + + + + + -
/ / / / / / / / / / / / / / / / / / / / / / / / / / @@ -38,10 +41,10 @@
/ / / / / / / / / / / / / / / / / / / / / / / / / / @@ -53,7 +56,7 @@ class="-z-10 fixed hidden lg:flex justify-start w-full -translate-x-56 top-1/2" >
@@ -65,7 +68,7 @@ >
-
-
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {-raw-} - privacy policy + >privacy policy +
+ + + + +
+ + +
+ + + + +
+ +
+
+
+ USERNAME +
+
+ +
+ + + + +
+
Username
+ + +
+ + +
+
Password
+ + +
+ + +
+
+ + +
+ +
+
+ +
+ + + + +
+ +{% endblock %} diff --git a/src/ui/templates/services.html b/src/ui/templates/services.html index 0ba989f5f..be41a27e6 100644 --- a/src/ui/templates/services.html +++ b/src/ui/templates/services.html @@ -38,23 +38,22 @@
{{ service["SERVER_NAME"]['method'] }}
- - -
-
-

+

Reverse proxy

-

{% if service['USE_REVERSE_PROXY']['value'] == 'yes' %} + yes {% else %} + no -

-

+

Serve files

-

{% if service['SERVE_FILES']['value'] == 'yes' %} + yes + {% else %} + no + -

-

+

Remote PHP

-

{% if service['REMOTE_PHP']['value'] != '' %} + yes {% else %} + no -

-

+

HTTPS

-

{% if service['AUTO_LETS_ENCRYPT']['value'] == 'yes' or service['USE_CUSTOM_SSL']['value'] == 'yes' or service['GENERATE_SELF_SIGNED_SSL']['value'] == 'yes' %} + yes {% else %} + no -

-

+

ModSecurity

-

{% if service['USE_MODSECURITY']['value'] == 'yes' %} + yes {% else %} + no -

-

+

Bad Behavior

-

{% if service['USE_BAD_BEHAVIOR']['value'] == 'yes' %} + yes {% else %} + no -

-

+

Limit req

-

{% if service['USE_LIMIT_REQ']['value'] == 'yes' %} + yes + {% else %} + no + -

-

+

DNSBL

-

{% if service['USE_DNSBL']['value'] == 'yes' %} + yes {% else %} + no

{%endif%} @@ -92,7 +93,7 @@ data-plugin-item="{{plugin['id']}}" id="{{setting}}" name="{{setting}}" data-setting-select-default="{{value['id']}}" data-type="form-select" id="{{setting}}" name="{{setting}}" class="hidden"> {% for item in value['select'] %} - + {% endfor %} @@ -103,6 +104,7 @@ data-plugin-item="{{plugin['id']}}" {% if global_config[setting]['method'] != 'ui' and global_config[setting]['method'] != 'default' %} disabled {% endif %} data-setting-select="{{value['id']}}" data-default-value="{{global_config[setting]['value']}}" data-default-method="{{global_config[setting]['method']}}" + aria-controls="{{value['id']}}-dropdown" type="button" class="custom-select-btn" > @@ -114,7 +116,7 @@ data-plugin-item="{{plugin['id']}}" >{{global_config[setting]['value']}} {% elif not global_config[setting]['value'] and value['default'] == item %} - {{value['default']}} {%endif%} @@ -305,7 +309,7 @@ data-plugin-item="{{plugin['id']}}" id="{{setting}}_SCHEMA" name="{{setting}}_SCHEMA" data-select-default="{{value['id']}}" data-type="form-select" id="{{setting}}" name="{{setting}}" class="hidden"> {% for item in value['select'] %} - + {% endfor %} @@ -315,11 +319,12 @@ data-plugin-item="{{plugin['id']}}" - + {% endfor %} + + {% endif %} + {% endwith %}

Setup Wizard

@@ -1339,7 +264,7 @@ class="col-span-12 disabled:opacity-75 focus:valid:border-green-500 focus:invalid:border-red-500 outline-none focus:border-primary text-sm leading-5.6 ease block w-full appearance-none rounded-lg border border-solid border-gray-300 bg-white bg-clip-padding px-4 py-2 font-normal text-gray-700 transition-all placeholder:text-gray-500" placeholder="/admin" value="{{ random_url }}" - pattern="\/(.*[a-z])" + pattern="\/[a-zA-Z0-9-]{1,255}$" required />
@@ -1411,7 +336,7 @@ type="checkbox" id="auto_lets_encrypt" name="auto_lets_encrypt" - aria-checked="false" + data-checked="false" class="checkbox" value="no" /> @@ -1483,7 +408,7 @@ this.updateCheck("unknown"); // get resume const api = `http${ - this.sslCheck.getAttribute("aria-checked") === "true" ? "s" : "" + this.sslCheck.getAttribute("data-checked") === "true" ? "s" : "" }://${this.servInp.value}/setup/check`; fetch(api) .then((res) => { @@ -1552,7 +477,7 @@ updateResume() { this.resumeEl.textContent = `http${ - this.sslCheck.getAttribute("aria-checked") === "true" ? "s" : "" + this.sslCheck.getAttribute("data-checked") === "true" ? "s" : "" }://${this.servInp.value}${this.urlInp.value}`; } } @@ -1624,8 +549,8 @@ //set custom input hidden value const newValue = checkboxEl.getAttribute("value"); newValue === "yes" - ? checkboxEl.setAttribute("aria-checked", "true") - : checkboxEl.setAttribute("aria-checked", "false"); + ? checkboxEl.setAttribute("data-checked", "true") + : checkboxEl.setAttribute("data-checked", "false"); //force checked for submit checkboxEl.checked = true; @@ -1648,7 +573,7 @@ this.logoEl = document.querySelector("[data-loader-img]"); this.loaderMsg = document.querySelector("[data-loader-msg]"); this.isLoading = false; - this.flashMsg = document.querySelector("[data-flash-message]"); + this.flashMsg = document.querySelector("[data-error-setup]"); this.init(); } @@ -1669,7 +594,7 @@ if ( e.target .closest("button") - .hasAttribute("data-close-flash-message") + .hasAttribute("data-close-error-setup") ) { this.hideErrMsg(); } @@ -1690,14 +615,16 @@ // Else, send form and wait for response const api = `http${ - this.sslCheck.getAttribute("aria-checked") === "true" ? "s" : "" + this.sslCheck.getAttribute("data-checked") === "true" ? "s" : "" }://${this.servInp.value}${this.urlInp.value}`; fetch(window.location.href, { method: "POST", body: new FormData(this.formEl), + redirect: "error", }) .then((res) => { + console.log(res); if (res.status === 200) { setTimeout(() => { window.open(`${api}/login`, "_self"); @@ -1720,6 +647,9 @@ this.stopLoader(); this.showErrMsg(); }, 400); + setTimeout(() => { + location.reload(); + }, 2500); }); }); } @@ -1794,6 +724,33 @@ } } + class FlashMsg { + constructor() { + this.delayHide = 15000; + this.init(); + } + + init() { + window.addEventListener('click', (e) => { + try { + if(!e.target.hasAttribute('data-close-flash-message')) return; + e.target.closest('div[data-flash-message]').remove() + }catch(err) { + + } + }) + window.addEventListener('load', () => { + // Hide flash message after an amount of time + setTimeout(() => { + document.querySelectorAll('div[data-flash-message]').forEach(alert => { + alert.remove(); + }) + }, this.delayHide); + }) + } + } + + const setFlash = new FlashMsg() const setLoader = new Loader(); const setResume = new Resume(); const setCheck = new Checkbox(); diff --git a/src/ui/templates/totp.html b/src/ui/templates/totp.html new file mode 100644 index 000000000..92c48d379 --- /dev/null +++ b/src/ui/templates/totp.html @@ -0,0 +1,214 @@ + +{% block content %} + + + + + + + BunkerWeb UI | Log in + + + + + +
+ main logo +
+ {% with messages = get_flashed_messages(with_categories=true) %} {% if + messages %} + + {% for category, message in messages %} + + {% endfor %} + + {% endif %} {% endwith %} + + +
+ +
+
+
+ logo +
+

+ Log in +

+
+ + + +
+
+ 2FA +
+ + +
+ +
+ +
+
+
+
+ + +
+ +
+
+ + + + + +{% endblock %} diff --git a/src/ui/utils.py b/src/ui/utils.py index 2c93a4f35..3c5032b99 100644 --- a/src/ui/utils.py +++ b/src/ui/utils.py @@ -1,8 +1,12 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 +from base64 import b64encode +from io import BytesIO from os.path import join from typing import List, Optional +from qrcode.main import QRCode + def path_to_dict( path: str, @@ -130,3 +134,13 @@ def path_to_dict( def check_settings(settings: dict, check: str) -> bool: return any(setting["context"] == check for setting in settings.values()) + + +def get_b64encoded_qr_image(data: str): + qr = QRCode(version=1, box_size=10, border=5) + qr.add_data(data) + qr.make(fit=True) + img = qr.make_image(fill_color="#0b5577", back_color="white") + buffered = BytesIO() + img.save(buffered) + return b64encode(buffered.getvalue()).decode("utf-8") diff --git a/tests/Test.py b/tests/Test.py index 5e872e2d9..811938271 100644 --- a/tests/Test.py +++ b/tests/Test.py @@ -10,6 +10,9 @@ from subprocess import run from logger import log from string import ascii_lowercase, digits from random import choice +from ssl import SSLContext, create_connection +import OpenSSL.crypto as crypto +from urllib.parse import urlparse class Test(ABC): @@ -126,6 +129,7 @@ class Test(ABC): # run a single test def __run_test(self, test): try: + ok = False ex_url = test["url"] for ex_domain, test_domain in self._domains.items(): if search(ex_domain, ex_url): @@ -133,10 +137,20 @@ class Test(ABC): break if test["type"] == "string": r = get(ex_url, timeout=10, verify=False) - return test["string"].casefold() in r.text.casefold() + ok = test["string"].casefold() in r.text.casefold() elif test["type"] == "status": r = get(ex_url, timeout=10, verify=False) - return test["status"] == r.status_code + ok = test["status"] == r.status_code + if ok and "tls" in test: + connection = create_connection((urlparse(ex_url).netloc, 443)) + context = SSLContext() + sock = context.wrap_socket(connection, server_hostname=urlparse(ex_url).netloc) + cert = sock.getpeercert(True) + sock.close() + x509 = crypto.load_certificate(crypto.FILETYPE_ASN1, cert) + if x509.get_subject().CN != test["tls"]: + ok = False + log("TEST", "⚠️", f"wrong cert CN : {x509.get_subject().CN}") except: return False raise (Exception(f"unknown test type {test['type']}")) diff --git a/tests/core/antibot/Dockerfile b/tests/core/antibot/Dockerfile index eccea2e09..e5e0eeed5 100644 --- a/tests/core/antibot/Dockerfile +++ b/tests/core/antibot/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Install firefox and geckodriver RUN apk add --no-cache --virtual .build-deps curl grep zip wget && \ diff --git a/tests/core/antibot/docker-compose.yml b/tests/core/antibot/docker-compose.yml index 5343ec772..8a3b2cb62 100644 --- a/tests/core/antibot/docker-compose.yml +++ b/tests/core/antibot/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -35,7 +35,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/antibot/requirements.txt b/tests/core/antibot/requirements.txt index 39c0b1ea3..d8525371f 100644 --- a/tests/core/antibot/requirements.txt +++ b/tests/core/antibot/requirements.txt @@ -4,9 +4,9 @@ # # pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in # -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via # outcome # trio @@ -149,9 +149,9 @@ sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via trio -trio==0.23.1 \ - --hash=sha256:16f89f7dcc8f7b9dcdec1fcd863e0c039af6d0f9a22f8dfd56f75d75ec73fd48 \ - --hash=sha256:bb4abb3f4af23f96679e7c8cdabb8b234520f2498550d2cf63ebfd95f2ce27fe +trio==0.23.2 \ + --hash=sha256:5a0b566fa5d50cf231cfd6b08f3b03aa4179ff004b8f3144059587039e2b26d3 \ + --hash=sha256:da1d35b9a2b17eb32cae2e763b16551f9aa6703634735024e32f325c9285069e # via # selenium # trio-websocket diff --git a/tests/core/authbasic/Dockerfile b/tests/core/authbasic/Dockerfile index eccea2e09..e5e0eeed5 100644 --- a/tests/core/authbasic/Dockerfile +++ b/tests/core/authbasic/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Install firefox and geckodriver RUN apk add --no-cache --virtual .build-deps curl grep zip wget && \ diff --git a/tests/core/authbasic/docker-compose.yml b/tests/core/authbasic/docker-compose.yml index 94454044a..dc4145138 100644 --- a/tests/core/authbasic/docker-compose.yml +++ b/tests/core/authbasic/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -37,7 +37,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/authbasic/requirements.txt b/tests/core/authbasic/requirements.txt index 39c0b1ea3..d8525371f 100644 --- a/tests/core/authbasic/requirements.txt +++ b/tests/core/authbasic/requirements.txt @@ -4,9 +4,9 @@ # # pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in # -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via # outcome # trio @@ -149,9 +149,9 @@ sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via trio -trio==0.23.1 \ - --hash=sha256:16f89f7dcc8f7b9dcdec1fcd863e0c039af6d0f9a22f8dfd56f75d75ec73fd48 \ - --hash=sha256:bb4abb3f4af23f96679e7c8cdabb8b234520f2498550d2cf63ebfd95f2ce27fe +trio==0.23.2 \ + --hash=sha256:5a0b566fa5d50cf231cfd6b08f3b03aa4179ff004b8f3144059587039e2b26d3 \ + --hash=sha256:da1d35b9a2b17eb32cae2e763b16551f9aa6703634735024e32f325c9285069e # via # selenium # trio-websocket diff --git a/tests/core/badbehavior/Dockerfile b/tests/core/badbehavior/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/badbehavior/Dockerfile +++ b/tests/core/badbehavior/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/badbehavior/docker-compose.yml b/tests/core/badbehavior/docker-compose.yml index 776de7a9f..db6446791 100644 --- a/tests/core/badbehavior/docker-compose.yml +++ b/tests/core/badbehavior/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -37,7 +37,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/badbehavior/requirements.in b/tests/core/badbehavior/requirements.in index 0aa9a6b38..87bc072d9 100644 --- a/tests/core/badbehavior/requirements.in +++ b/tests/core/badbehavior/requirements.in @@ -1,2 +1,2 @@ -docker==6.1.3 +docker==7.0.0 requests==2.31.0 diff --git a/tests/core/badbehavior/requirements.txt b/tests/core/badbehavior/requirements.txt index f83005ee2..ca98425ae 100644 --- a/tests/core/badbehavior/requirements.txt +++ b/tests/core/badbehavior/requirements.txt @@ -100,9 +100,9 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests -docker==6.1.3 \ - --hash=sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20 \ - --hash=sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9 +docker==7.0.0 \ + --hash=sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b \ + --hash=sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3 # via -r requirements.in idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ @@ -124,7 +124,3 @@ urllib3==2.1.0 \ # via # docker # requests -websocket-client==1.7.0 \ - --hash=sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6 \ - --hash=sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588 - # via docker diff --git a/tests/core/blacklist/Dockerfile b/tests/core/blacklist/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/blacklist/Dockerfile +++ b/tests/core/blacklist/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/blacklist/api/Dockerfile b/tests/core/blacklist/api/Dockerfile index 8358cd780..91a0f42ed 100644 --- a/tests/core/blacklist/api/Dockerfile +++ b/tests/core/blacklist/api/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/blacklist/api/requirements.in b/tests/core/blacklist/api/requirements.in index b04d6bd60..9945aad2d 100644 --- a/tests/core/blacklist/api/requirements.in +++ b/tests/core/blacklist/api/requirements.in @@ -1,2 +1,2 @@ -fastapi==0.104.1 -uvicorn[standard]==0.24.0 +fastapi==0.108.0 +uvicorn[standard]==0.25.0 diff --git a/tests/core/blacklist/api/requirements.txt b/tests/core/blacklist/api/requirements.txt index b52ef7152..4b2d26b89 100644 --- a/tests/core/blacklist/api/requirements.txt +++ b/tests/core/blacklist/api/requirements.txt @@ -8,11 +8,10 @@ annotated-types==0.6.0 \ --hash=sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 \ --hash=sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d # via pydantic -anyio==3.7.1 \ - --hash=sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780 \ - --hash=sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5 +anyio==4.2.0 \ + --hash=sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee \ + --hash=sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f # via - # fastapi # starlette # watchfiles click==8.1.7 \ @@ -23,9 +22,9 @@ exceptiongroup==1.2.0 \ --hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \ --hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68 # via anyio -fastapi==0.104.1 \ - --hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \ - --hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae +fastapi==0.108.0 \ + --hash=sha256:5056e504ac6395bf68493d71fcfc5352fdbd5fda6f88c21f6420d80d81163296 \ + --hash=sha256:8c7bc6d315da963ee4cdb605557827071a9a7f95aeb8fcdd3bde48cdc8764dd7 # via -r requirements.in h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ @@ -73,116 +72,116 @@ idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via anyio -pydantic==2.5.2 \ - --hash=sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0 \ - --hash=sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd +pydantic==2.5.3 \ + --hash=sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a \ + --hash=sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4 # via fastapi -pydantic-core==2.14.5 \ - --hash=sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b \ - --hash=sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b \ - --hash=sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d \ - --hash=sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8 \ - --hash=sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124 \ - --hash=sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189 \ - --hash=sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c \ - --hash=sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d \ - --hash=sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f \ - --hash=sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520 \ - --hash=sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4 \ - --hash=sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6 \ - --hash=sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955 \ - --hash=sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3 \ - --hash=sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b \ - --hash=sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a \ - --hash=sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68 \ - --hash=sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3 \ - --hash=sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd \ - --hash=sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de \ - --hash=sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b \ - --hash=sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634 \ - --hash=sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7 \ - --hash=sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459 \ - --hash=sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7 \ - --hash=sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3 \ - --hash=sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331 \ - --hash=sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf \ - --hash=sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d \ - --hash=sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36 \ - --hash=sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59 \ - --hash=sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937 \ - --hash=sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc \ - --hash=sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093 \ - --hash=sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753 \ - --hash=sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706 \ - --hash=sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca \ - --hash=sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260 \ - --hash=sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997 \ - --hash=sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588 \ - --hash=sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71 \ - --hash=sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb \ - --hash=sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e \ - --hash=sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69 \ - --hash=sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5 \ - --hash=sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07 \ - --hash=sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1 \ - --hash=sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0 \ - --hash=sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd \ - --hash=sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8 \ - --hash=sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944 \ - --hash=sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26 \ - --hash=sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda \ - --hash=sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4 \ - --hash=sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9 \ - --hash=sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00 \ - --hash=sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe \ - --hash=sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6 \ - --hash=sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada \ - --hash=sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4 \ - --hash=sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7 \ - --hash=sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325 \ - --hash=sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4 \ - --hash=sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b \ - --hash=sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88 \ - --hash=sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04 \ - --hash=sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863 \ - --hash=sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0 \ - --hash=sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911 \ - --hash=sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b \ - --hash=sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e \ - --hash=sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144 \ - --hash=sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5 \ - --hash=sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720 \ - --hash=sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab \ - --hash=sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d \ - --hash=sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789 \ - --hash=sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec \ - --hash=sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2 \ - --hash=sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db \ - --hash=sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f \ - --hash=sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef \ - --hash=sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3 \ - --hash=sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209 \ - --hash=sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc \ - --hash=sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651 \ - --hash=sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8 \ - --hash=sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e \ - --hash=sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66 \ - --hash=sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7 \ - --hash=sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550 \ - --hash=sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd \ - --hash=sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405 \ - --hash=sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27 \ - --hash=sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093 \ - --hash=sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077 \ - --hash=sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113 \ - --hash=sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3 \ - --hash=sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6 \ - --hash=sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf \ - --hash=sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed \ - --hash=sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88 \ - --hash=sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe \ - --hash=sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18 \ - --hash=sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867 +pydantic-core==2.14.6 \ + --hash=sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556 \ + --hash=sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e \ + --hash=sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411 \ + --hash=sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245 \ + --hash=sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c \ + --hash=sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66 \ + --hash=sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd \ + --hash=sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d \ + --hash=sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b \ + --hash=sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06 \ + --hash=sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948 \ + --hash=sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341 \ + --hash=sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0 \ + --hash=sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f \ + --hash=sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a \ + --hash=sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2 \ + --hash=sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51 \ + --hash=sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80 \ + --hash=sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8 \ + --hash=sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d \ + --hash=sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8 \ + --hash=sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb \ + --hash=sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590 \ + --hash=sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87 \ + --hash=sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534 \ + --hash=sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b \ + --hash=sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145 \ + --hash=sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba \ + --hash=sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b \ + --hash=sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2 \ + --hash=sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e \ + --hash=sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052 \ + --hash=sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622 \ + --hash=sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab \ + --hash=sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b \ + --hash=sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66 \ + --hash=sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e \ + --hash=sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4 \ + --hash=sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e \ + --hash=sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec \ + --hash=sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c \ + --hash=sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed \ + --hash=sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937 \ + --hash=sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f \ + --hash=sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9 \ + --hash=sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4 \ + --hash=sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96 \ + --hash=sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277 \ + --hash=sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23 \ + --hash=sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7 \ + --hash=sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b \ + --hash=sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91 \ + --hash=sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d \ + --hash=sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e \ + --hash=sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1 \ + --hash=sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2 \ + --hash=sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160 \ + --hash=sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9 \ + --hash=sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670 \ + --hash=sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7 \ + --hash=sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c \ + --hash=sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb \ + --hash=sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42 \ + --hash=sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d \ + --hash=sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8 \ + --hash=sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1 \ + --hash=sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6 \ + --hash=sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8 \ + --hash=sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf \ + --hash=sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e \ + --hash=sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a \ + --hash=sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9 \ + --hash=sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1 \ + --hash=sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40 \ + --hash=sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2 \ + --hash=sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d \ + --hash=sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f \ + --hash=sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f \ + --hash=sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af \ + --hash=sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7 \ + --hash=sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda \ + --hash=sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a \ + --hash=sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95 \ + --hash=sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0 \ + --hash=sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60 \ + --hash=sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149 \ + --hash=sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975 \ + --hash=sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4 \ + --hash=sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe \ + --hash=sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94 \ + --hash=sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03 \ + --hash=sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c \ + --hash=sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b \ + --hash=sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a \ + --hash=sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24 \ + --hash=sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391 \ + --hash=sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c \ + --hash=sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab \ + --hash=sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd \ + --hash=sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786 \ + --hash=sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08 \ + --hash=sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8 \ + --hash=sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6 \ + --hash=sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0 \ + --hash=sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421 # via pydantic python-dotenv==1.0.0 \ --hash=sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba \ @@ -244,22 +243,23 @@ sniffio==1.3.0 \ --hash=sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101 \ --hash=sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384 # via anyio -starlette==0.27.0 \ - --hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \ - --hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91 +starlette==0.32.0.post1 \ + --hash=sha256:cd0cb10ddb49313f609cedfac62c8c12e56c7314b66d89bb077ba228bada1b09 \ + --hash=sha256:e54e2b7e2fb06dff9eac40133583f10dfa05913f5a85bf26f427c7a40a9a3d02 # via fastapi -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via + # anyio # fastapi # pydantic # pydantic-core # starlette # uvicorn -uvicorn==0.24.0 \ - --hash=sha256:368d5d81520a51be96431845169c225d771c9dd22a58613e1a181e6c4512ac33 \ - --hash=sha256:3d19f13dfd2c2af1bfe34dd0f7155118ce689425fdf931177abe832ca44b8a04 +uvicorn==0.25.0 \ + --hash=sha256:6dddbad1d7ee0f5140aba5ec138ddc9612c5109399903828b4874c9937f009c2 \ + --hash=sha256:ce107f5d9bd02b4636001a77a4e74aab5e1e2b146868ebbad565237145af444c # via # -r requirements.in # uvicorn diff --git a/tests/core/blacklist/docker-compose.yml b/tests/core/blacklist/docker-compose.yml index 4b0a780e0..c7f7c9412 100644 --- a/tests/core/blacklist/docker-compose.yml +++ b/tests/core/blacklist/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -55,7 +55,7 @@ services: ipv4_address: 1.0.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/blacklist/init/Dockerfile b/tests/core/blacklist/init/Dockerfile index 658fde955..337a70388 100644 --- a/tests/core/blacklist/init/Dockerfile +++ b/tests/core/blacklist/init/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/blacklist/init/requirements.txt b/tests/core/blacklist/init/requirements.txt index 87dd7e4e5..53d7e6b8e 100644 --- a/tests/core/blacklist/init/requirements.txt +++ b/tests/core/blacklist/init/requirements.txt @@ -160,9 +160,9 @@ requests==2.31.0 \ # via requests # The following packages are considered to be unsafe in a requirements file: -setuptools==69.0.2 \ - --hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \ - --hash=sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6 +setuptools==69.0.3 \ + --hash=sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05 \ + --hash=sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78 # via -r requirements.in urllib3==2.1.0 \ --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \ diff --git a/tests/core/brotli/Dockerfile b/tests/core/brotli/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/brotli/Dockerfile +++ b/tests/core/brotli/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/brotli/docker-compose.yml b/tests/core/brotli/docker-compose.yml index 5f2b6c0ae..7b5b67784 100644 --- a/tests/core/brotli/docker-compose.yml +++ b/tests/core/brotli/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -34,7 +34,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/bunkernet/Dockerfile b/tests/core/bunkernet/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/bunkernet/Dockerfile +++ b/tests/core/bunkernet/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/bunkernet/api/Dockerfile b/tests/core/bunkernet/api/Dockerfile index 8358cd780..91a0f42ed 100644 --- a/tests/core/bunkernet/api/Dockerfile +++ b/tests/core/bunkernet/api/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/bunkernet/api/requirements.in b/tests/core/bunkernet/api/requirements.in index b04d6bd60..9945aad2d 100644 --- a/tests/core/bunkernet/api/requirements.in +++ b/tests/core/bunkernet/api/requirements.in @@ -1,2 +1,2 @@ -fastapi==0.104.1 -uvicorn[standard]==0.24.0 +fastapi==0.108.0 +uvicorn[standard]==0.25.0 diff --git a/tests/core/bunkernet/api/requirements.txt b/tests/core/bunkernet/api/requirements.txt index b52ef7152..4b2d26b89 100644 --- a/tests/core/bunkernet/api/requirements.txt +++ b/tests/core/bunkernet/api/requirements.txt @@ -8,11 +8,10 @@ annotated-types==0.6.0 \ --hash=sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 \ --hash=sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d # via pydantic -anyio==3.7.1 \ - --hash=sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780 \ - --hash=sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5 +anyio==4.2.0 \ + --hash=sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee \ + --hash=sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f # via - # fastapi # starlette # watchfiles click==8.1.7 \ @@ -23,9 +22,9 @@ exceptiongroup==1.2.0 \ --hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \ --hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68 # via anyio -fastapi==0.104.1 \ - --hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \ - --hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae +fastapi==0.108.0 \ + --hash=sha256:5056e504ac6395bf68493d71fcfc5352fdbd5fda6f88c21f6420d80d81163296 \ + --hash=sha256:8c7bc6d315da963ee4cdb605557827071a9a7f95aeb8fcdd3bde48cdc8764dd7 # via -r requirements.in h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ @@ -73,116 +72,116 @@ idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via anyio -pydantic==2.5.2 \ - --hash=sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0 \ - --hash=sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd +pydantic==2.5.3 \ + --hash=sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a \ + --hash=sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4 # via fastapi -pydantic-core==2.14.5 \ - --hash=sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b \ - --hash=sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b \ - --hash=sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d \ - --hash=sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8 \ - --hash=sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124 \ - --hash=sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189 \ - --hash=sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c \ - --hash=sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d \ - --hash=sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f \ - --hash=sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520 \ - --hash=sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4 \ - --hash=sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6 \ - --hash=sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955 \ - --hash=sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3 \ - --hash=sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b \ - --hash=sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a \ - --hash=sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68 \ - --hash=sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3 \ - --hash=sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd \ - --hash=sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de \ - --hash=sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b \ - --hash=sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634 \ - --hash=sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7 \ - --hash=sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459 \ - --hash=sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7 \ - --hash=sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3 \ - --hash=sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331 \ - --hash=sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf \ - --hash=sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d \ - --hash=sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36 \ - --hash=sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59 \ - --hash=sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937 \ - --hash=sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc \ - --hash=sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093 \ - --hash=sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753 \ - --hash=sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706 \ - --hash=sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca \ - --hash=sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260 \ - --hash=sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997 \ - --hash=sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588 \ - --hash=sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71 \ - --hash=sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb \ - --hash=sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e \ - --hash=sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69 \ - --hash=sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5 \ - --hash=sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07 \ - --hash=sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1 \ - --hash=sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0 \ - --hash=sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd \ - --hash=sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8 \ - --hash=sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944 \ - --hash=sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26 \ - --hash=sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda \ - --hash=sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4 \ - --hash=sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9 \ - --hash=sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00 \ - --hash=sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe \ - --hash=sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6 \ - --hash=sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada \ - --hash=sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4 \ - --hash=sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7 \ - --hash=sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325 \ - --hash=sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4 \ - --hash=sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b \ - --hash=sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88 \ - --hash=sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04 \ - --hash=sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863 \ - --hash=sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0 \ - --hash=sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911 \ - --hash=sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b \ - --hash=sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e \ - --hash=sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144 \ - --hash=sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5 \ - --hash=sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720 \ - --hash=sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab \ - --hash=sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d \ - --hash=sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789 \ - --hash=sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec \ - --hash=sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2 \ - --hash=sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db \ - --hash=sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f \ - --hash=sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef \ - --hash=sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3 \ - --hash=sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209 \ - --hash=sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc \ - --hash=sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651 \ - --hash=sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8 \ - --hash=sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e \ - --hash=sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66 \ - --hash=sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7 \ - --hash=sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550 \ - --hash=sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd \ - --hash=sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405 \ - --hash=sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27 \ - --hash=sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093 \ - --hash=sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077 \ - --hash=sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113 \ - --hash=sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3 \ - --hash=sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6 \ - --hash=sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf \ - --hash=sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed \ - --hash=sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88 \ - --hash=sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe \ - --hash=sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18 \ - --hash=sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867 +pydantic-core==2.14.6 \ + --hash=sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556 \ + --hash=sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e \ + --hash=sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411 \ + --hash=sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245 \ + --hash=sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c \ + --hash=sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66 \ + --hash=sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd \ + --hash=sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d \ + --hash=sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b \ + --hash=sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06 \ + --hash=sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948 \ + --hash=sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341 \ + --hash=sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0 \ + --hash=sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f \ + --hash=sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a \ + --hash=sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2 \ + --hash=sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51 \ + --hash=sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80 \ + --hash=sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8 \ + --hash=sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d \ + --hash=sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8 \ + --hash=sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb \ + --hash=sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590 \ + --hash=sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87 \ + --hash=sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534 \ + --hash=sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b \ + --hash=sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145 \ + --hash=sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba \ + --hash=sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b \ + --hash=sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2 \ + --hash=sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e \ + --hash=sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052 \ + --hash=sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622 \ + --hash=sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab \ + --hash=sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b \ + --hash=sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66 \ + --hash=sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e \ + --hash=sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4 \ + --hash=sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e \ + --hash=sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec \ + --hash=sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c \ + --hash=sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed \ + --hash=sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937 \ + --hash=sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f \ + --hash=sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9 \ + --hash=sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4 \ + --hash=sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96 \ + --hash=sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277 \ + --hash=sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23 \ + --hash=sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7 \ + --hash=sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b \ + --hash=sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91 \ + --hash=sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d \ + --hash=sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e \ + --hash=sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1 \ + --hash=sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2 \ + --hash=sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160 \ + --hash=sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9 \ + --hash=sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670 \ + --hash=sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7 \ + --hash=sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c \ + --hash=sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb \ + --hash=sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42 \ + --hash=sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d \ + --hash=sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8 \ + --hash=sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1 \ + --hash=sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6 \ + --hash=sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8 \ + --hash=sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf \ + --hash=sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e \ + --hash=sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a \ + --hash=sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9 \ + --hash=sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1 \ + --hash=sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40 \ + --hash=sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2 \ + --hash=sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d \ + --hash=sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f \ + --hash=sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f \ + --hash=sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af \ + --hash=sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7 \ + --hash=sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda \ + --hash=sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a \ + --hash=sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95 \ + --hash=sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0 \ + --hash=sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60 \ + --hash=sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149 \ + --hash=sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975 \ + --hash=sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4 \ + --hash=sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe \ + --hash=sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94 \ + --hash=sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03 \ + --hash=sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c \ + --hash=sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b \ + --hash=sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a \ + --hash=sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24 \ + --hash=sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391 \ + --hash=sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c \ + --hash=sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab \ + --hash=sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd \ + --hash=sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786 \ + --hash=sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08 \ + --hash=sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8 \ + --hash=sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6 \ + --hash=sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0 \ + --hash=sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421 # via pydantic python-dotenv==1.0.0 \ --hash=sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba \ @@ -244,22 +243,23 @@ sniffio==1.3.0 \ --hash=sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101 \ --hash=sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384 # via anyio -starlette==0.27.0 \ - --hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \ - --hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91 +starlette==0.32.0.post1 \ + --hash=sha256:cd0cb10ddb49313f609cedfac62c8c12e56c7314b66d89bb077ba228bada1b09 \ + --hash=sha256:e54e2b7e2fb06dff9eac40133583f10dfa05913f5a85bf26f427c7a40a9a3d02 # via fastapi -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via + # anyio # fastapi # pydantic # pydantic-core # starlette # uvicorn -uvicorn==0.24.0 \ - --hash=sha256:368d5d81520a51be96431845169c225d771c9dd22a58613e1a181e6c4512ac33 \ - --hash=sha256:3d19f13dfd2c2af1bfe34dd0f7155118ce689425fdf931177abe832ca44b8a04 +uvicorn==0.25.0 \ + --hash=sha256:6dddbad1d7ee0f5140aba5ec138ddc9612c5109399903828b4874c9937f009c2 \ + --hash=sha256:ce107f5d9bd02b4636001a77a4e74aab5e1e2b146868ebbad565237145af444c # via # -r requirements.in # uvicorn diff --git a/tests/core/bunkernet/docker-compose.yml b/tests/core/bunkernet/docker-compose.yml index a0c610b5b..fff72b80f 100644 --- a/tests/core/bunkernet/docker-compose.yml +++ b/tests/core/bunkernet/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -33,7 +33,7 @@ services: ipv4_address: 1.0.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/bwcli/Dockerfile b/tests/core/bwcli/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/bwcli/Dockerfile +++ b/tests/core/bwcli/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/bwcli/docker-compose.yml b/tests/core/bwcli/docker-compose.yml index 2b952eb89..b1ec8a26f 100644 --- a/tests/core/bwcli/docker-compose.yml +++ b/tests/core/bwcli/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never depends_on: - bw-redis @@ -29,7 +29,7 @@ services: - bw-universe bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/bwcli/requirements.in b/tests/core/bwcli/requirements.in index 23b7591c4..901105d06 100644 --- a/tests/core/bwcli/requirements.in +++ b/tests/core/bwcli/requirements.in @@ -1 +1 @@ -docker==6.1.3 +docker==7.0.0 diff --git a/tests/core/bwcli/requirements.txt b/tests/core/bwcli/requirements.txt index e535176b7..de920371a 100644 --- a/tests/core/bwcli/requirements.txt +++ b/tests/core/bwcli/requirements.txt @@ -100,9 +100,9 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests -docker==6.1.3 \ - --hash=sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20 \ - --hash=sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9 +docker==7.0.0 \ + --hash=sha256:12ba681f2777a0ad28ffbcc846a69c31b4dfd9752b47eb425a274ee269c5e14b \ + --hash=sha256:323736fb92cd9418fc5e7133bc953e11a9da04f4483f828b527db553f1e7e5a3 # via -r requirements.in idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ @@ -122,7 +122,3 @@ urllib3==2.1.0 \ # via # docker # requests -websocket-client==1.7.0 \ - --hash=sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6 \ - --hash=sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588 - # via docker diff --git a/tests/core/clientcache/Dockerfile b/tests/core/clientcache/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/clientcache/Dockerfile +++ b/tests/core/clientcache/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/clientcache/docker-compose.yml b/tests/core/clientcache/docker-compose.yml index d7aba269c..fe33a9c4d 100644 --- a/tests/core/clientcache/docker-compose.yml +++ b/tests/core/clientcache/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -36,7 +36,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/cors/Dockerfile b/tests/core/cors/Dockerfile index eccea2e09..e5e0eeed5 100644 --- a/tests/core/cors/Dockerfile +++ b/tests/core/cors/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Install firefox and geckodriver RUN apk add --no-cache --virtual .build-deps curl grep zip wget && \ diff --git a/tests/core/cors/docker-compose.yml b/tests/core/cors/docker-compose.yml index 0d9f71b78..f98e65acb 100644 --- a/tests/core/cors/docker-compose.yml +++ b/tests/core/cors/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -46,7 +46,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/cors/requirements.txt b/tests/core/cors/requirements.txt index 39c0b1ea3..d8525371f 100644 --- a/tests/core/cors/requirements.txt +++ b/tests/core/cors/requirements.txt @@ -4,9 +4,9 @@ # # pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in # -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via # outcome # trio @@ -149,9 +149,9 @@ sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via trio -trio==0.23.1 \ - --hash=sha256:16f89f7dcc8f7b9dcdec1fcd863e0c039af6d0f9a22f8dfd56f75d75ec73fd48 \ - --hash=sha256:bb4abb3f4af23f96679e7c8cdabb8b234520f2498550d2cf63ebfd95f2ce27fe +trio==0.23.2 \ + --hash=sha256:5a0b566fa5d50cf231cfd6b08f3b03aa4179ff004b8f3144059587039e2b26d3 \ + --hash=sha256:da1d35b9a2b17eb32cae2e763b16551f9aa6703634735024e32f325c9285069e # via # selenium # trio-websocket diff --git a/tests/core/country/Dockerfile b/tests/core/country/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/country/Dockerfile +++ b/tests/core/country/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/country/docker-compose.test.yml b/tests/core/country/docker-compose.test.yml index a748f4b77..6c2c64d71 100644 --- a/tests/core/country/docker-compose.test.yml +++ b/tests/core/country/docker-compose.test.yml @@ -1,17 +1,17 @@ version: "3.5" services: - tests-fr: + tests-gb: build: . environment: PYTHONUNBUFFERED: "1" - COUNTRY: "FR" + COUNTRY: "GB" BLACKLIST_COUNTRY: "" WHITELIST_COUNTRY: "" extra_hosts: - "www.example.com:2.0.0.2" networks: - bw-fr-network: + bw-gb-network: ipv4_address: 2.0.0.3 tests-us: @@ -28,7 +28,7 @@ services: ipv4_address: 8.0.0.3 networks: - bw-fr-network: + bw-gb-network: external: true bw-us-network: external: true diff --git a/tests/core/country/docker-compose.yml b/tests/core/country/docker-compose.yml index 9c1b0a1ab..2117509f0 100644 --- a/tests/core/country/docker-compose.yml +++ b/tests/core/country/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -32,11 +32,11 @@ services: bw-universe: bw-us-network: ipv4_address: 8.0.0.2 - bw-fr-network: + bw-gb-network: ipv4_address: 2.0.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw @@ -70,8 +70,8 @@ networks: driver: default config: - subnet: 8.0.0.0/8 - bw-fr-network: - name: bw-fr-network + bw-gb-network: + name: bw-gb-network ipam: driver: default config: diff --git a/tests/core/country/main.py b/tests/core/country/main.py index 1e0470f54..ccc2c2a08 100644 --- a/tests/core/country/main.py +++ b/tests/core/country/main.py @@ -39,7 +39,7 @@ try: status_code = get( "http://www.example.com", - headers={"Host": "www.example.com"} | ({"X-Forwarded-For": "2.0.0.3" if country == "FR" else "8.0.0.3"} if getenv("TEST_TYPE", "docker") == "linux" else {}), + headers={"Host": "www.example.com"} | ({"X-Forwarded-For": "2.0.0.3" if country == "GB" else "8.0.0.3"} if getenv("TEST_TYPE", "docker") == "linux" else {}), ).status_code if status_code == 403: diff --git a/tests/core/country/test.sh b/tests/core/country/test.sh index ff98ae3c8..f0b6a65c6 100755 --- a/tests/core/country/test.sh +++ b/tests/core/country/test.sh @@ -46,7 +46,7 @@ cleanup_stack () { if [[ $end -eq 1 || $exit_code = 1 ]] || [[ $end -eq 0 && $exit_code = 0 ]] && [ $manual = 0 ] ; then if [ "$integration" == "docker" ] ; then find . -type f -name 'docker-compose.*' -exec sed -i 's@BLACKLIST_COUNTRY: "US"@BLACKLIST_COUNTRY: ""@' {} \; - find . -type f -name 'docker-compose.*' -exec sed -i 's@WHITELIST_COUNTRY: "FR"@WHITELIST_COUNTRY: ""@' {} \; + find . -type f -name 'docker-compose.*' -exec sed -i 's@WHITELIST_COUNTRY: "GB"@WHITELIST_COUNTRY: ""@' {} \; else sudo sed -i 's@BLACKLIST_COUNTRY=.*$@BLACKLIST_COUNTRY=@' /etc/bunkerweb/variables.env sudo sed -i 's@WHITELIST_COUNTRY=.*$@WHITELIST_COUNTRY=@' /etc/bunkerweb/variables.env @@ -92,15 +92,15 @@ do export BLACKLIST_COUNTRY="US" fi elif [ "$test" = "whitelist" ] ; then - echo "🌍 Running tests when whitelisting France ..." + echo "🌍 Running tests when whitelisting England ..." if [ "$integration" == "docker" ] ; then find . -type f -name 'docker-compose.*' -exec sed -i 's@BLACKLIST_COUNTRY: "US"@BLACKLIST_COUNTRY: ""@' {} \; - find . -type f -name 'docker-compose.*' -exec sed -i 's@WHITELIST_COUNTRY: ""@WHITELIST_COUNTRY: "FR"@' {} \; + find . -type f -name 'docker-compose.*' -exec sed -i 's@WHITELIST_COUNTRY: ""@WHITELIST_COUNTRY: "GB"@' {} \; else sudo sed -i 's@BLACKLIST_COUNTRY=.*$@BLACKLIST_COUNTRY=@' /etc/bunkerweb/variables.env - sudo sed -i 's@WHITELIST_COUNTRY=.*$@WHITELIST_COUNTRY=FR@' /etc/bunkerweb/variables.env + sudo sed -i 's@WHITELIST_COUNTRY=.*$@WHITELIST_COUNTRY=GB@' /etc/bunkerweb/variables.env unset BLACKLIST_COUNTRY - export WHITELIST_COUNTRY="FR" + export WHITELIST_COUNTRY="GB" fi fi @@ -198,17 +198,17 @@ do # Start tests - echo "🌍 Starting the FR country" + echo "🌍 Starting the GB country" if [ "$integration" == "docker" ] ; then - docker compose -f docker-compose.test.yml up tests-fr --abort-on-container-exit --exit-code-from tests-fr + docker compose -f docker-compose.test.yml up tests-gb --abort-on-container-exit --exit-code-from tests-gb else - export COUNTRY="FR" + export COUNTRY="GB" python3 main.py fi # shellcheck disable=SC2181 if [ $? -ne 0 ] ; then - echo "🌍 Test \"$test\" failed for the FR country ❌" + echo "🌍 Test \"$test\" failed for the GB country ❌" echo "πŸ›‘οΈ Showing BunkerWeb and BunkerWeb Scheduler logs ..." if [ "$integration" == "docker" ] ; then docker compose logs bw bw-scheduler @@ -223,20 +223,20 @@ do fi exit 1 else - echo "🌍 Test \"$test\" succeeded for the FR country βœ…" + echo "🌍 Test \"$test\" succeeded for the GB country βœ…" fi - echo "🌍 Starting the US country" + echo "🌍 Starting the GB country" if [ "$integration" == "docker" ] ; then docker compose -f docker-compose.test.yml up tests-us --abort-on-container-exit --exit-code-from tests-us else - export COUNTRY="US" + export COUNTRY="GB" python3 main.py fi # shellcheck disable=SC2181 if [ $? -ne 0 ] ; then - echo "🌍 Test \"$test\" failed for the US country ❌" + echo "🌍 Test \"$test\" failed for the GB country ❌" echo "πŸ›‘οΈ Showing BunkerWeb and BunkerWeb Scheduler logs ..." if [ "$integration" == "docker" ] ; then docker compose logs bw bw-scheduler @@ -251,7 +251,7 @@ do fi exit 1 else - echo "🌍 Test \"$test\" succeeded for the US country βœ…" + echo "🌍 Test \"$test\" succeeded for the GB country βœ…" fi manual=1 diff --git a/tests/core/customcert/Dockerfile b/tests/core/customcert/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/customcert/Dockerfile +++ b/tests/core/customcert/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/customcert/docker-compose.yml b/tests/core/customcert/docker-compose.yml index 91f51100e..be9363f5a 100644 --- a/tests/core/customcert/docker-compose.yml +++ b/tests/core/customcert/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -36,7 +36,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/customcert/requirements.txt b/tests/core/customcert/requirements.txt index 39c0b1ea3..d8525371f 100644 --- a/tests/core/customcert/requirements.txt +++ b/tests/core/customcert/requirements.txt @@ -4,9 +4,9 @@ # # pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in # -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via # outcome # trio @@ -149,9 +149,9 @@ sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via trio -trio==0.23.1 \ - --hash=sha256:16f89f7dcc8f7b9dcdec1fcd863e0c039af6d0f9a22f8dfd56f75d75ec73fd48 \ - --hash=sha256:bb4abb3f4af23f96679e7c8cdabb8b234520f2498550d2cf63ebfd95f2ce27fe +trio==0.23.2 \ + --hash=sha256:5a0b566fa5d50cf231cfd6b08f3b03aa4179ff004b8f3144059587039e2b26d3 \ + --hash=sha256:da1d35b9a2b17eb32cae2e763b16551f9aa6703634735024e32f325c9285069e # via # selenium # trio-websocket diff --git a/tests/core/db/Dockerfile b/tests/core/db/Dockerfile index 4b72178ce..0ccd03dd1 100644 --- a/tests/core/db/Dockerfile +++ b/tests/core/db/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/db/docker-compose.yml b/tests/core/db/docker-compose.yml index 24ab44d3b..bb0c2b008 100644 --- a/tests/core/db/docker-compose.yml +++ b/tests/core/db/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -34,7 +34,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/db/requirements.in b/tests/core/db/requirements.in index c4e5787e0..d1975bf13 100644 --- a/tests/core/db/requirements.in +++ b/tests/core/db/requirements.in @@ -1,4 +1,4 @@ cryptography==41.0.7 psycopg2-binary==2.9.9 PyMySQL==1.1.0 -sqlalchemy==2.0.23 +sqlalchemy==2.0.25 diff --git a/tests/core/db/requirements.txt b/tests/core/db/requirements.txt index 7408a4e2e..38958f334 100644 --- a/tests/core/db/requirements.txt +++ b/tests/core/db/requirements.txt @@ -83,64 +83,65 @@ cryptography==41.0.7 \ --hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \ --hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d # via -r requirements.in -greenlet==3.0.1 \ - --hash=sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174 \ - --hash=sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd \ - --hash=sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa \ - --hash=sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a \ - --hash=sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec \ - --hash=sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565 \ - --hash=sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d \ - --hash=sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c \ - --hash=sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234 \ - --hash=sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d \ - --hash=sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546 \ - --hash=sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2 \ - --hash=sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74 \ - --hash=sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de \ - --hash=sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd \ - --hash=sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9 \ - --hash=sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3 \ - --hash=sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846 \ - --hash=sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2 \ - --hash=sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353 \ - --hash=sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8 \ - --hash=sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166 \ - --hash=sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206 \ - --hash=sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b \ - --hash=sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d \ - --hash=sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe \ - --hash=sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997 \ - --hash=sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445 \ - --hash=sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0 \ - --hash=sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96 \ - --hash=sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884 \ - --hash=sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6 \ - --hash=sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1 \ - --hash=sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619 \ - --hash=sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94 \ - --hash=sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4 \ - --hash=sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1 \ - --hash=sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63 \ - --hash=sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd \ - --hash=sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a \ - --hash=sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376 \ - --hash=sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57 \ - --hash=sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16 \ - --hash=sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e \ - --hash=sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc \ - --hash=sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a \ - --hash=sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c \ - --hash=sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5 \ - --hash=sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a \ - --hash=sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72 \ - --hash=sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9 \ - --hash=sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9 \ - --hash=sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e \ - --hash=sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8 \ - --hash=sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65 \ - --hash=sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064 \ - --hash=sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36 +greenlet==3.0.3 \ + --hash=sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67 \ + --hash=sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6 \ + --hash=sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257 \ + --hash=sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4 \ + --hash=sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676 \ + --hash=sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61 \ + --hash=sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc \ + --hash=sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca \ + --hash=sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7 \ + --hash=sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728 \ + --hash=sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305 \ + --hash=sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6 \ + --hash=sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379 \ + --hash=sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414 \ + --hash=sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04 \ + --hash=sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a \ + --hash=sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf \ + --hash=sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491 \ + --hash=sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559 \ + --hash=sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e \ + --hash=sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274 \ + --hash=sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb \ + --hash=sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b \ + --hash=sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9 \ + --hash=sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b \ + --hash=sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be \ + --hash=sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506 \ + --hash=sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405 \ + --hash=sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113 \ + --hash=sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f \ + --hash=sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5 \ + --hash=sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230 \ + --hash=sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d \ + --hash=sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f \ + --hash=sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a \ + --hash=sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e \ + --hash=sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61 \ + --hash=sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6 \ + --hash=sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d \ + --hash=sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71 \ + --hash=sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22 \ + --hash=sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2 \ + --hash=sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3 \ + --hash=sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067 \ + --hash=sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc \ + --hash=sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881 \ + --hash=sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3 \ + --hash=sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e \ + --hash=sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac \ + --hash=sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53 \ + --hash=sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0 \ + --hash=sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b \ + --hash=sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83 \ + --hash=sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41 \ + --hash=sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c \ + --hash=sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf \ + --hash=sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da \ + --hash=sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33 # via sqlalchemy psycopg2-binary==2.9.9 \ --hash=sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9 \ @@ -224,58 +225,58 @@ pymysql==1.1.0 \ --hash=sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96 \ --hash=sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7 # via -r requirements.in -sqlalchemy==2.0.23 \ - --hash=sha256:0666031df46b9badba9bed00092a1ffa3aa063a5e68fa244acd9f08070e936d3 \ - --hash=sha256:0a8c6aa506893e25a04233bc721c6b6cf844bafd7250535abb56cb6cc1368884 \ - --hash=sha256:0e680527245895aba86afbd5bef6c316831c02aa988d1aad83c47ffe92655e74 \ - --hash=sha256:14aebfe28b99f24f8a4c1346c48bc3d63705b1f919a24c27471136d2f219f02d \ - --hash=sha256:1e018aba8363adb0599e745af245306cb8c46b9ad0a6fc0a86745b6ff7d940fc \ - --hash=sha256:227135ef1e48165f37590b8bfc44ed7ff4c074bf04dc8d6f8e7f1c14a94aa6ca \ - --hash=sha256:31952bbc527d633b9479f5f81e8b9dfada00b91d6baba021a869095f1a97006d \ - --hash=sha256:3e983fa42164577d073778d06d2cc5d020322425a509a08119bdcee70ad856bf \ - --hash=sha256:42d0b0290a8fb0165ea2c2781ae66e95cca6e27a2fbe1016ff8db3112ac1e846 \ - --hash=sha256:42ede90148b73fe4ab4a089f3126b2cfae8cfefc955c8174d697bb46210c8306 \ - --hash=sha256:4895a63e2c271ffc7a81ea424b94060f7b3b03b4ea0cd58ab5bb676ed02f4221 \ - --hash=sha256:4af79c06825e2836de21439cb2a6ce22b2ca129bad74f359bddd173f39582bf5 \ - --hash=sha256:5f94aeb99f43729960638e7468d4688f6efccb837a858b34574e01143cf11f89 \ - --hash=sha256:616fe7bcff0a05098f64b4478b78ec2dfa03225c23734d83d6c169eb41a93e55 \ - --hash=sha256:62d9e964870ea5ade4bc870ac4004c456efe75fb50404c03c5fd61f8bc669a72 \ - --hash=sha256:638c2c0b6b4661a4fd264f6fb804eccd392745c5887f9317feb64bb7cb03b3ea \ - --hash=sha256:63bfc3acc970776036f6d1d0e65faa7473be9f3135d37a463c5eba5efcdb24c8 \ - --hash=sha256:6463aa765cf02b9247e38b35853923edbf2f6fd1963df88706bc1d02410a5577 \ - --hash=sha256:64ac935a90bc479fee77f9463f298943b0e60005fe5de2aa654d9cdef46c54df \ - --hash=sha256:683ef58ca8eea4747737a1c35c11372ffeb84578d3aab8f3e10b1d13d66f2bc4 \ - --hash=sha256:75eefe09e98043cff2fb8af9796e20747ae870c903dc61d41b0c2e55128f958d \ - --hash=sha256:787af80107fb691934a01889ca8f82a44adedbf5ef3d6ad7d0f0b9ac557e0c34 \ - --hash=sha256:7c424983ab447dab126c39d3ce3be5bee95700783204a72549c3dceffe0fc8f4 \ - --hash=sha256:7e0dc9031baa46ad0dd5a269cb7a92a73284d1309228be1d5935dac8fb3cae24 \ - --hash=sha256:87a3d6b53c39cd173990de2f5f4b83431d534a74f0e2f88bd16eabb5667e65c6 \ - --hash=sha256:89a01238fcb9a8af118eaad3ffcc5dedaacbd429dc6fdc43fe430d3a941ff965 \ - --hash=sha256:9585b646ffb048c0250acc7dad92536591ffe35dba624bb8fd9b471e25212a35 \ - --hash=sha256:964971b52daab357d2c0875825e36584d58f536e920f2968df8d581054eada4b \ - --hash=sha256:967c0b71156f793e6662dd839da54f884631755275ed71f1539c95bbada9aaab \ - --hash=sha256:9ca922f305d67605668e93991aaf2c12239c78207bca3b891cd51a4515c72e22 \ - --hash=sha256:a86cb7063e2c9fb8e774f77fbf8475516d270a3e989da55fa05d08089d77f8c4 \ - --hash=sha256:aeb397de65a0a62f14c257f36a726945a7f7bb60253462e8602d9b97b5cbe204 \ - --hash=sha256:b41f5d65b54cdf4934ecede2f41b9c60c9f785620416e8e6c48349ab18643855 \ - --hash=sha256:bd45a5b6c68357578263d74daab6ff9439517f87da63442d244f9f23df56138d \ - --hash=sha256:c14eba45983d2f48f7546bb32b47937ee2cafae353646295f0e99f35b14286ab \ - --hash=sha256:c1bda93cbbe4aa2aa0aa8655c5aeda505cd219ff3e8da91d1d329e143e4aff69 \ - --hash=sha256:c4722f3bc3c1c2fcc3702dbe0016ba31148dd6efcd2a2fd33c1b4897c6a19693 \ - --hash=sha256:c80c38bd2ea35b97cbf7c21aeb129dcbebbf344ee01a7141016ab7b851464f8e \ - --hash=sha256:cabafc7837b6cec61c0e1e5c6d14ef250b675fa9c3060ed8a7e38653bd732ff8 \ - --hash=sha256:cc1d21576f958c42d9aec68eba5c1a7d715e5fc07825a629015fe8e3b0657fb0 \ - --hash=sha256:d0f7fb0c7527c41fa6fcae2be537ac137f636a41b4c5a4c58914541e2f436b45 \ - --hash=sha256:d4041ad05b35f1f4da481f6b811b4af2f29e83af253bf37c3c4582b2c68934ab \ - --hash=sha256:d5578e6863eeb998980c212a39106ea139bdc0b3f73291b96e27c929c90cd8e1 \ - --hash=sha256:e3b5036aa326dc2df50cba3c958e29b291a80f604b1afa4c8ce73e78e1c9f01d \ - --hash=sha256:e599a51acf3cc4d31d1a0cf248d8f8d863b6386d2b6782c5074427ebb7803bda \ - --hash=sha256:f3420d00d2cb42432c1d0e44540ae83185ccbbc67a6054dcc8ab5387add6620b \ - --hash=sha256:f48ed89dd11c3c586f45e9eec1e437b355b3b6f6884ea4a4c3111a3358fd0c18 \ - --hash=sha256:f508ba8f89e0a5ecdfd3761f82dda2a3d7b678a626967608f4273e0dba8f07ac \ - --hash=sha256:fd54601ef9cc455a0c61e5245f690c8a3ad67ddb03d3b91c361d076def0b4c60 +sqlalchemy==2.0.25 \ + --hash=sha256:0d3cab3076af2e4aa5693f89622bef7fa770c6fec967143e4da7508b3dceb9b9 \ + --hash=sha256:0dacf67aee53b16f365c589ce72e766efaabd2b145f9de7c917777b575e3659d \ + --hash=sha256:10331f129982a19df4284ceac6fe87353ca3ca6b4ca77ff7d697209ae0a5915e \ + --hash=sha256:14a6f68e8fc96e5e8f5647ef6cda6250c780612a573d99e4d881581432ef1669 \ + --hash=sha256:1b1180cda6df7af84fe72e4530f192231b1f29a7496951db4ff38dac1687202d \ + --hash=sha256:29049e2c299b5ace92cbed0c1610a7a236f3baf4c6b66eb9547c01179f638ec5 \ + --hash=sha256:342d365988ba88ada8af320d43df4e0b13a694dbd75951f537b2d5e4cb5cd002 \ + --hash=sha256:420362338681eec03f53467804541a854617faed7272fe71a1bfdb07336a381e \ + --hash=sha256:4344d059265cc8b1b1be351bfb88749294b87a8b2bbe21dfbe066c4199541ebd \ + --hash=sha256:4f7a7d7fcc675d3d85fbf3b3828ecd5990b8d61bd6de3f1b260080b3beccf215 \ + --hash=sha256:555651adbb503ac7f4cb35834c5e4ae0819aab2cd24857a123370764dc7d7e24 \ + --hash=sha256:59a21853f5daeb50412d459cfb13cb82c089ad4c04ec208cd14dddd99fc23b39 \ + --hash=sha256:5fdd402169aa00df3142149940b3bf9ce7dde075928c1886d9a1df63d4b8de62 \ + --hash=sha256:605b6b059f4b57b277f75ace81cc5bc6335efcbcc4ccb9066695e515dbdb3900 \ + --hash=sha256:665f0a3954635b5b777a55111ababf44b4fc12b1f3ba0a435b602b6387ffd7cf \ + --hash=sha256:6f9e2e59cbcc6ba1488404aad43de005d05ca56e069477b33ff74e91b6319735 \ + --hash=sha256:736ea78cd06de6c21ecba7416499e7236a22374561493b456a1f7ffbe3f6cdb4 \ + --hash=sha256:74b080c897563f81062b74e44f5a72fa44c2b373741a9ade701d5f789a10ba23 \ + --hash=sha256:75432b5b14dc2fff43c50435e248b45c7cdadef73388e5610852b95280ffd0e9 \ + --hash=sha256:75f99202324383d613ddd1f7455ac908dca9c2dd729ec8584c9541dd41822a2c \ + --hash=sha256:790f533fa5c8901a62b6fef5811d48980adeb2f51f1290ade8b5e7ba990ba3de \ + --hash=sha256:798f717ae7c806d67145f6ae94dc7c342d3222d3b9a311a784f371a4333212c7 \ + --hash=sha256:7c88f0c7dcc5f99bdb34b4fd9b69b93c89f893f454f40219fe923a3a2fd11625 \ + --hash=sha256:7d505815ac340568fd03f719446a589162d55c52f08abd77ba8964fbb7eb5b5f \ + --hash=sha256:84daa0a2055df9ca0f148a64fdde12ac635e30edbca80e87df9b3aaf419e144a \ + --hash=sha256:87d91043ea0dc65ee583026cb18e1b458d8ec5fc0a93637126b5fc0bc3ea68c4 \ + --hash=sha256:87f6e732bccd7dcf1741c00f1ecf33797383128bd1c90144ac8adc02cbb98643 \ + --hash=sha256:884272dcd3ad97f47702965a0e902b540541890f468d24bd1d98bcfe41c3f018 \ + --hash=sha256:8b8cb63d3ea63b29074dcd29da4dc6a97ad1349151f2d2949495418fd6e48db9 \ + --hash=sha256:91f7d9d1c4dd1f4f6e092874c128c11165eafcf7c963128f79e28f8445de82d5 \ + --hash=sha256:a2c69a7664fb2d54b8682dd774c3b54f67f84fa123cf84dda2a5f40dcaa04e08 \ + --hash=sha256:a3be4987e3ee9d9a380b66393b77a4cd6d742480c951a1c56a23c335caca4ce3 \ + --hash=sha256:a86b4240e67d4753dc3092d9511886795b3c2852abe599cffe108952f7af7ac3 \ + --hash=sha256:aa9373708763ef46782d10e950b49d0235bfe58facebd76917d3f5cbf5971aed \ + --hash=sha256:b64b183d610b424a160b0d4d880995e935208fc043d0302dd29fee32d1ee3f95 \ + --hash=sha256:b801154027107461ee992ff4b5c09aa7cc6ec91ddfe50d02bca344918c3265c6 \ + --hash=sha256:bb209a73b8307f8fe4fe46f6ad5979649be01607f11af1eb94aa9e8a3aaf77f0 \ + --hash=sha256:bc8b7dabe8e67c4832891a5d322cec6d44ef02f432b4588390017f5cec186a84 \ + --hash=sha256:c51db269513917394faec5e5c00d6f83829742ba62e2ac4fa5c98d58be91662f \ + --hash=sha256:c55731c116806836a5d678a70c84cb13f2cedba920212ba7dcad53260997666d \ + --hash=sha256:cf18ff7fc9941b8fc23437cc3e68ed4ebeff3599eec6ef5eebf305f3d2e9a7c2 \ + --hash=sha256:d24f571990c05f6b36a396218f251f3e0dda916e0c687ef6fdca5072743208f5 \ + --hash=sha256:db854730a25db7c956423bb9fb4bdd1216c839a689bf9cc15fada0a7fb2f4570 \ + --hash=sha256:dc55990143cbd853a5d038c05e79284baedf3e299661389654551bd02a6a68d7 \ + --hash=sha256:e607cdd99cbf9bb80391f54446b86e16eea6ad309361942bf88318bcd452363c \ + --hash=sha256:ecf6d4cda1f9f6cb0b45803a01ea7f034e2f1aed9475e883410812d9f9e3cfcf \ + --hash=sha256:f2a159111a0f58fb034c93eeba211b4141137ec4b0a6e75789ab7a3ef3c7e7e3 \ + --hash=sha256:f37c0caf14b9e9b9e8f6dbc81bc56db06acb4363eba5a633167781a48ef036ed \ + --hash=sha256:f5693145220517b5f42393e07a6898acdfe820e136c98663b971906120549da5 # via -r requirements.in -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via sqlalchemy diff --git a/tests/core/dnsbl/Dockerfile b/tests/core/dnsbl/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/dnsbl/Dockerfile +++ b/tests/core/dnsbl/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/dnsbl/docker-compose.yml b/tests/core/dnsbl/docker-compose.yml index 60865a48c..ba2c07e94 100644 --- a/tests/core/dnsbl/docker-compose.yml +++ b/tests/core/dnsbl/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -34,7 +34,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/dnsbl/init/Dockerfile b/tests/core/dnsbl/init/Dockerfile index eccea2e09..e5e0eeed5 100644 --- a/tests/core/dnsbl/init/Dockerfile +++ b/tests/core/dnsbl/init/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Install firefox and geckodriver RUN apk add --no-cache --virtual .build-deps curl grep zip wget && \ diff --git a/tests/core/dnsbl/init/requirements.txt b/tests/core/dnsbl/init/requirements.txt index 53b522518..c0adfbce3 100644 --- a/tests/core/dnsbl/init/requirements.txt +++ b/tests/core/dnsbl/init/requirements.txt @@ -4,9 +4,9 @@ # # pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in # -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via # outcome # trio @@ -49,9 +49,9 @@ sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via trio -trio==0.23.1 \ - --hash=sha256:16f89f7dcc8f7b9dcdec1fcd863e0c039af6d0f9a22f8dfd56f75d75ec73fd48 \ - --hash=sha256:bb4abb3f4af23f96679e7c8cdabb8b234520f2498550d2cf63ebfd95f2ce27fe +trio==0.23.2 \ + --hash=sha256:5a0b566fa5d50cf231cfd6b08f3b03aa4179ff004b8f3144059587039e2b26d3 \ + --hash=sha256:da1d35b9a2b17eb32cae2e763b16551f9aa6703634735024e32f325c9285069e # via # selenium # trio-websocket diff --git a/tests/core/errors/Dockerfile b/tests/core/errors/Dockerfile index eccea2e09..e5e0eeed5 100644 --- a/tests/core/errors/Dockerfile +++ b/tests/core/errors/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Install firefox and geckodriver RUN apk add --no-cache --virtual .build-deps curl grep zip wget && \ diff --git a/tests/core/errors/docker-compose.yml b/tests/core/errors/docker-compose.yml index bd4afa86c..6c426233b 100644 --- a/tests/core/errors/docker-compose.yml +++ b/tests/core/errors/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -35,7 +35,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/errors/requirements.txt b/tests/core/errors/requirements.txt index 39c0b1ea3..d8525371f 100644 --- a/tests/core/errors/requirements.txt +++ b/tests/core/errors/requirements.txt @@ -4,9 +4,9 @@ # # pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in # -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via # outcome # trio @@ -149,9 +149,9 @@ sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via trio -trio==0.23.1 \ - --hash=sha256:16f89f7dcc8f7b9dcdec1fcd863e0c039af6d0f9a22f8dfd56f75d75ec73fd48 \ - --hash=sha256:bb4abb3f4af23f96679e7c8cdabb8b234520f2498550d2cf63ebfd95f2ce27fe +trio==0.23.2 \ + --hash=sha256:5a0b566fa5d50cf231cfd6b08f3b03aa4179ff004b8f3144059587039e2b26d3 \ + --hash=sha256:da1d35b9a2b17eb32cae2e763b16551f9aa6703634735024e32f325c9285069e # via # selenium # trio-websocket diff --git a/tests/core/greylist/Dockerfile b/tests/core/greylist/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/greylist/Dockerfile +++ b/tests/core/greylist/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/greylist/api/Dockerfile b/tests/core/greylist/api/Dockerfile index 91408af0f..aba06a1e0 100644 --- a/tests/core/greylist/api/Dockerfile +++ b/tests/core/greylist/api/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/greylist/api/requirements.in b/tests/core/greylist/api/requirements.in index b04d6bd60..9945aad2d 100644 --- a/tests/core/greylist/api/requirements.in +++ b/tests/core/greylist/api/requirements.in @@ -1,2 +1,2 @@ -fastapi==0.104.1 -uvicorn[standard]==0.24.0 +fastapi==0.108.0 +uvicorn[standard]==0.25.0 diff --git a/tests/core/greylist/api/requirements.txt b/tests/core/greylist/api/requirements.txt index b52ef7152..4b2d26b89 100644 --- a/tests/core/greylist/api/requirements.txt +++ b/tests/core/greylist/api/requirements.txt @@ -8,11 +8,10 @@ annotated-types==0.6.0 \ --hash=sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 \ --hash=sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d # via pydantic -anyio==3.7.1 \ - --hash=sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780 \ - --hash=sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5 +anyio==4.2.0 \ + --hash=sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee \ + --hash=sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f # via - # fastapi # starlette # watchfiles click==8.1.7 \ @@ -23,9 +22,9 @@ exceptiongroup==1.2.0 \ --hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \ --hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68 # via anyio -fastapi==0.104.1 \ - --hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \ - --hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae +fastapi==0.108.0 \ + --hash=sha256:5056e504ac6395bf68493d71fcfc5352fdbd5fda6f88c21f6420d80d81163296 \ + --hash=sha256:8c7bc6d315da963ee4cdb605557827071a9a7f95aeb8fcdd3bde48cdc8764dd7 # via -r requirements.in h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ @@ -73,116 +72,116 @@ idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via anyio -pydantic==2.5.2 \ - --hash=sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0 \ - --hash=sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd +pydantic==2.5.3 \ + --hash=sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a \ + --hash=sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4 # via fastapi -pydantic-core==2.14.5 \ - --hash=sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b \ - --hash=sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b \ - --hash=sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d \ - --hash=sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8 \ - --hash=sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124 \ - --hash=sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189 \ - --hash=sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c \ - --hash=sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d \ - --hash=sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f \ - --hash=sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520 \ - --hash=sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4 \ - --hash=sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6 \ - --hash=sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955 \ - --hash=sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3 \ - --hash=sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b \ - --hash=sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a \ - --hash=sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68 \ - --hash=sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3 \ - --hash=sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd \ - --hash=sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de \ - --hash=sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b \ - --hash=sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634 \ - --hash=sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7 \ - --hash=sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459 \ - --hash=sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7 \ - --hash=sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3 \ - --hash=sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331 \ - --hash=sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf \ - --hash=sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d \ - --hash=sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36 \ - --hash=sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59 \ - --hash=sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937 \ - --hash=sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc \ - --hash=sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093 \ - --hash=sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753 \ - --hash=sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706 \ - --hash=sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca \ - --hash=sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260 \ - --hash=sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997 \ - --hash=sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588 \ - --hash=sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71 \ - --hash=sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb \ - --hash=sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e \ - --hash=sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69 \ - --hash=sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5 \ - --hash=sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07 \ - --hash=sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1 \ - --hash=sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0 \ - --hash=sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd \ - --hash=sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8 \ - --hash=sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944 \ - --hash=sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26 \ - --hash=sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda \ - --hash=sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4 \ - --hash=sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9 \ - --hash=sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00 \ - --hash=sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe \ - --hash=sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6 \ - --hash=sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada \ - --hash=sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4 \ - --hash=sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7 \ - --hash=sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325 \ - --hash=sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4 \ - --hash=sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b \ - --hash=sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88 \ - --hash=sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04 \ - --hash=sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863 \ - --hash=sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0 \ - --hash=sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911 \ - --hash=sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b \ - --hash=sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e \ - --hash=sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144 \ - --hash=sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5 \ - --hash=sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720 \ - --hash=sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab \ - --hash=sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d \ - --hash=sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789 \ - --hash=sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec \ - --hash=sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2 \ - --hash=sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db \ - --hash=sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f \ - --hash=sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef \ - --hash=sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3 \ - --hash=sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209 \ - --hash=sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc \ - --hash=sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651 \ - --hash=sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8 \ - --hash=sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e \ - --hash=sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66 \ - --hash=sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7 \ - --hash=sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550 \ - --hash=sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd \ - --hash=sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405 \ - --hash=sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27 \ - --hash=sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093 \ - --hash=sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077 \ - --hash=sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113 \ - --hash=sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3 \ - --hash=sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6 \ - --hash=sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf \ - --hash=sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed \ - --hash=sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88 \ - --hash=sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe \ - --hash=sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18 \ - --hash=sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867 +pydantic-core==2.14.6 \ + --hash=sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556 \ + --hash=sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e \ + --hash=sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411 \ + --hash=sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245 \ + --hash=sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c \ + --hash=sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66 \ + --hash=sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd \ + --hash=sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d \ + --hash=sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b \ + --hash=sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06 \ + --hash=sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948 \ + --hash=sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341 \ + --hash=sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0 \ + --hash=sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f \ + --hash=sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a \ + --hash=sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2 \ + --hash=sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51 \ + --hash=sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80 \ + --hash=sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8 \ + --hash=sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d \ + --hash=sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8 \ + --hash=sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb \ + --hash=sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590 \ + --hash=sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87 \ + --hash=sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534 \ + --hash=sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b \ + --hash=sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145 \ + --hash=sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba \ + --hash=sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b \ + --hash=sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2 \ + --hash=sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e \ + --hash=sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052 \ + --hash=sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622 \ + --hash=sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab \ + --hash=sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b \ + --hash=sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66 \ + --hash=sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e \ + --hash=sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4 \ + --hash=sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e \ + --hash=sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec \ + --hash=sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c \ + --hash=sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed \ + --hash=sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937 \ + --hash=sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f \ + --hash=sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9 \ + --hash=sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4 \ + --hash=sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96 \ + --hash=sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277 \ + --hash=sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23 \ + --hash=sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7 \ + --hash=sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b \ + --hash=sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91 \ + --hash=sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d \ + --hash=sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e \ + --hash=sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1 \ + --hash=sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2 \ + --hash=sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160 \ + --hash=sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9 \ + --hash=sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670 \ + --hash=sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7 \ + --hash=sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c \ + --hash=sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb \ + --hash=sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42 \ + --hash=sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d \ + --hash=sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8 \ + --hash=sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1 \ + --hash=sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6 \ + --hash=sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8 \ + --hash=sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf \ + --hash=sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e \ + --hash=sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a \ + --hash=sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9 \ + --hash=sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1 \ + --hash=sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40 \ + --hash=sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2 \ + --hash=sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d \ + --hash=sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f \ + --hash=sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f \ + --hash=sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af \ + --hash=sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7 \ + --hash=sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda \ + --hash=sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a \ + --hash=sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95 \ + --hash=sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0 \ + --hash=sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60 \ + --hash=sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149 \ + --hash=sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975 \ + --hash=sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4 \ + --hash=sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe \ + --hash=sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94 \ + --hash=sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03 \ + --hash=sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c \ + --hash=sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b \ + --hash=sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a \ + --hash=sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24 \ + --hash=sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391 \ + --hash=sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c \ + --hash=sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab \ + --hash=sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd \ + --hash=sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786 \ + --hash=sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08 \ + --hash=sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8 \ + --hash=sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6 \ + --hash=sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0 \ + --hash=sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421 # via pydantic python-dotenv==1.0.0 \ --hash=sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba \ @@ -244,22 +243,23 @@ sniffio==1.3.0 \ --hash=sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101 \ --hash=sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384 # via anyio -starlette==0.27.0 \ - --hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \ - --hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91 +starlette==0.32.0.post1 \ + --hash=sha256:cd0cb10ddb49313f609cedfac62c8c12e56c7314b66d89bb077ba228bada1b09 \ + --hash=sha256:e54e2b7e2fb06dff9eac40133583f10dfa05913f5a85bf26f427c7a40a9a3d02 # via fastapi -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via + # anyio # fastapi # pydantic # pydantic-core # starlette # uvicorn -uvicorn==0.24.0 \ - --hash=sha256:368d5d81520a51be96431845169c225d771c9dd22a58613e1a181e6c4512ac33 \ - --hash=sha256:3d19f13dfd2c2af1bfe34dd0f7155118ce689425fdf931177abe832ca44b8a04 +uvicorn==0.25.0 \ + --hash=sha256:6dddbad1d7ee0f5140aba5ec138ddc9612c5109399903828b4874c9937f009c2 \ + --hash=sha256:ce107f5d9bd02b4636001a77a4e74aab5e1e2b146868ebbad565237145af444c # via # -r requirements.in # uvicorn diff --git a/tests/core/greylist/docker-compose.yml b/tests/core/greylist/docker-compose.yml index 146c475eb..47b58eec3 100644 --- a/tests/core/greylist/docker-compose.yml +++ b/tests/core/greylist/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -45,7 +45,7 @@ services: ipv4_address: 1.0.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/greylist/init/Dockerfile b/tests/core/greylist/init/Dockerfile index 658fde955..337a70388 100644 --- a/tests/core/greylist/init/Dockerfile +++ b/tests/core/greylist/init/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/greylist/init/requirements.txt b/tests/core/greylist/init/requirements.txt index 87dd7e4e5..53d7e6b8e 100644 --- a/tests/core/greylist/init/requirements.txt +++ b/tests/core/greylist/init/requirements.txt @@ -160,9 +160,9 @@ requests==2.31.0 \ # via requests # The following packages are considered to be unsafe in a requirements file: -setuptools==69.0.2 \ - --hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \ - --hash=sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6 +setuptools==69.0.3 \ + --hash=sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05 \ + --hash=sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78 # via -r requirements.in urllib3==2.1.0 \ --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \ diff --git a/tests/core/gzip/Dockerfile b/tests/core/gzip/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/gzip/Dockerfile +++ b/tests/core/gzip/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/gzip/docker-compose.yml b/tests/core/gzip/docker-compose.yml index c32141c85..b3c980a56 100644 --- a/tests/core/gzip/docker-compose.yml +++ b/tests/core/gzip/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never ports: - 80:8080 @@ -36,7 +36,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/headers/Dockerfile b/tests/core/headers/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/headers/Dockerfile +++ b/tests/core/headers/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/headers/docker-compose.yml b/tests/core/headers/docker-compose.yml index 72ddfd577..c6400150d 100644 --- a/tests/core/headers/docker-compose.yml +++ b/tests/core/headers/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -48,7 +48,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/inject/Dockerfile b/tests/core/inject/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/inject/Dockerfile +++ b/tests/core/inject/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/inject/docker-compose.yml b/tests/core/inject/docker-compose.yml index 05fe00869..d5294295d 100644 --- a/tests/core/inject/docker-compose.yml +++ b/tests/core/inject/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -33,7 +33,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/limit/Dockerfile b/tests/core/limit/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/limit/Dockerfile +++ b/tests/core/limit/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/limit/docker-compose.yml b/tests/core/limit/docker-compose.yml index 71282c8d5..305766651 100644 --- a/tests/core/limit/docker-compose.yml +++ b/tests/core/limit/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -38,7 +38,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/limit/requirements.in b/tests/core/limit/requirements.in index 8d4184f74..405574c14 100644 --- a/tests/core/limit/requirements.in +++ b/tests/core/limit/requirements.in @@ -1,2 +1,2 @@ -httpx==0.25.2 +httpx==0.26.0 requests==2.31.0 diff --git a/tests/core/limit/requirements.txt b/tests/core/limit/requirements.txt index 661d6a83e..46da66762 100644 --- a/tests/core/limit/requirements.txt +++ b/tests/core/limit/requirements.txt @@ -4,9 +4,9 @@ # # pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in # -anyio==4.1.0 \ - --hash=sha256:56a415fbc462291813a94528a779597226619c8e78af7de0507333f700011e5f \ - --hash=sha256:5a0bec7085176715be77df87fc66d6c9d70626bd752fcc85f57cdbee5b3760da +anyio==4.2.0 \ + --hash=sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee \ + --hash=sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f # via httpx certifi==2023.11.17 \ --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ @@ -119,9 +119,9 @@ httpcore==1.0.2 \ --hash=sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7 \ --hash=sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535 # via httpx -httpx==0.25.2 \ - --hash=sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8 \ - --hash=sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118 +httpx==0.26.0 \ + --hash=sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf \ + --hash=sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd # via -r requirements.in idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ @@ -140,6 +140,10 @@ sniffio==1.3.0 \ # via # anyio # httpx +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd + # via anyio urllib3==2.1.0 \ --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \ --hash=sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54 diff --git a/tests/core/misc/Dockerfile b/tests/core/misc/Dockerfile index 02e476134..825bc5f32 100644 --- a/tests/core/misc/Dockerfile +++ b/tests/core/misc/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/misc/docker-compose.yml b/tests/core/misc/docker-compose.yml index 8ba416245..b0698c357 100644 --- a/tests/core/misc/docker-compose.yml +++ b/tests/core/misc/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -45,7 +45,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/modsecurity/Dockerfile b/tests/core/modsecurity/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/modsecurity/Dockerfile +++ b/tests/core/modsecurity/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/modsecurity/docker-compose.yml b/tests/core/modsecurity/docker-compose.yml index af788b9e2..f6e3b66f0 100644 --- a/tests/core/modsecurity/docker-compose.yml +++ b/tests/core/modsecurity/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -37,7 +37,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/redirect/Dockerfile b/tests/core/redirect/Dockerfile index eccea2e09..e5e0eeed5 100644 --- a/tests/core/redirect/Dockerfile +++ b/tests/core/redirect/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Install firefox and geckodriver RUN apk add --no-cache --virtual .build-deps curl grep zip wget && \ diff --git a/tests/core/redirect/docker-compose.yml b/tests/core/redirect/docker-compose.yml index 571d52ce3..0c8719f77 100644 --- a/tests/core/redirect/docker-compose.yml +++ b/tests/core/redirect/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -34,7 +34,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/redirect/requirements.txt b/tests/core/redirect/requirements.txt index 39c0b1ea3..d8525371f 100644 --- a/tests/core/redirect/requirements.txt +++ b/tests/core/redirect/requirements.txt @@ -4,9 +4,9 @@ # # pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in # -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via # outcome # trio @@ -149,9 +149,9 @@ sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via trio -trio==0.23.1 \ - --hash=sha256:16f89f7dcc8f7b9dcdec1fcd863e0c039af6d0f9a22f8dfd56f75d75ec73fd48 \ - --hash=sha256:bb4abb3f4af23f96679e7c8cdabb8b234520f2498550d2cf63ebfd95f2ce27fe +trio==0.23.2 \ + --hash=sha256:5a0b566fa5d50cf231cfd6b08f3b03aa4179ff004b8f3144059587039e2b26d3 \ + --hash=sha256:da1d35b9a2b17eb32cae2e763b16551f9aa6703634735024e32f325c9285069e # via # selenium # trio-websocket diff --git a/tests/core/redis/Dockerfile b/tests/core/redis/Dockerfile index 47c290c7e..847ea4e7c 100644 --- a/tests/core/redis/Dockerfile +++ b/tests/core/redis/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Install firefox and geckodriver RUN apk add --no-cache --virtual .build-deps curl grep zip wget && \ diff --git a/tests/core/redis/docker-compose.yml b/tests/core/redis/docker-compose.yml index 138d4258c..4b2c73559 100644 --- a/tests/core/redis/docker-compose.yml +++ b/tests/core/redis/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never depends_on: - bw-redis @@ -45,7 +45,7 @@ services: ipv4_address: 1.0.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/redis/main.py b/tests/core/redis/main.py index f8fc250c5..de7a0ff38 100644 --- a/tests/core/redis/main.py +++ b/tests/core/redis/main.py @@ -280,113 +280,113 @@ try: flush=True, ) - print( - "ℹ️ Checking if the country key was created and has the correct value ...", - flush=True, - ) + # print( + # "ℹ️ Checking if the country key was created and has the correct value ...", + # flush=True, + # ) - key_value = redis_client.get(f"plugin_country_www.example.com{ip_to_check}") + # key_value = redis_client.get(f"plugin_country_www.example.com{ip_to_check}") - if key_value is None: - print( - f'❌ The country key ("plugin_country_www.example.com{ip_to_check}") was not found, exiting ...\nkeys: {redis_client.keys()}', - flush=True, - ) - exit(1) + # if key_value is None: + # print( + # f'❌ The country key ("plugin_country_www.example.com{ip_to_check}") was not found, exiting ...\nkeys: {redis_client.keys()}', + # flush=True, + # ) + # exit(1) - print( - f"βœ… The country key was found, the value is {key_value.decode()}", - flush=True, - ) + # print( + # f"βœ… The country key was found, the value is {key_value.decode()}", + # flush=True, + # ) - print( - "ℹ️ Checking if the whitelist key was created and has the correct value ...", - flush=True, - ) + # print( + # "ℹ️ Checking if the whitelist key was created and has the correct value ...", + # flush=True, + # ) - key_value = redis_client.get(f"plugin_whitelist_www.example.comip{ip_to_check}") + # key_value = redis_client.get(f"plugin_whitelist_www.example.comip{ip_to_check}") - if key_value is None: - print( - f'❌ The whitelist key ("plugin_whitelist_www.example.comip{ip_to_check}") was not found, exiting ...\nkeys: {redis_client.keys()}', - flush=True, - ) - exit(1) - if key_value != b"ok": - print( - f'❌ The whitelist key ("plugin_whitelist_www.example.comip{ip_to_check}") was found, but the value is not "ok" ({key_value.decode()}), exiting ...\nkeys: {redis_client.keys()}', - ) + # if key_value is None: + # print( + # f'❌ The whitelist key ("plugin_whitelist_www.example.comip{ip_to_check}") was not found, exiting ...\nkeys: {redis_client.keys()}', + # flush=True, + # ) + # exit(1) + # if key_value != b"ok": + # print( + # f'❌ The whitelist key ("plugin_whitelist_www.example.comip{ip_to_check}") was found, but the value is not "ok" ({key_value.decode()}), exiting ...\nkeys: {redis_client.keys()}', + # ) - print( - f"βœ… The whitelist key was found, the value is {key_value.decode()}", - flush=True, - ) + # print( + # f"βœ… The whitelist key was found, the value is {key_value.decode()}", + # flush=True, + # ) - print( - "ℹ️ Checking if the blacklist key was created and has the correct value ...", - flush=True, - ) + # print( + # "ℹ️ Checking if the blacklist key was created and has the correct value ...", + # flush=True, + # ) - key_value = redis_client.get(f"plugin_blacklist_www.example.comip{ip_to_check}") + # key_value = redis_client.get(f"plugin_blacklist_www.example.comip{ip_to_check}") - if key_value is None: - print( - f'❌ The blacklist key ("plugin_blacklist_www.example.comip{ip_to_check}") was not found, exiting ...\nkeys: {redis_client.keys()}', - flush=True, - ) - exit(1) - if key_value != b"ok": - print( - f'❌ The blacklist key ("plugin_blacklist_www.example.comip{ip_to_check}") was found, but the value is not "ok" ({key_value.decode()}), exiting ...\nkeys: {redis_client.keys()}', - ) + # if key_value is None: + # print( + # f'❌ The blacklist key ("plugin_blacklist_www.example.comip{ip_to_check}") was not found, exiting ...\nkeys: {redis_client.keys()}', + # flush=True, + # ) + # exit(1) + # if key_value != b"ok": + # print( + # f'❌ The blacklist key ("plugin_blacklist_www.example.comip{ip_to_check}") was found, but the value is not "ok" ({key_value.decode()}), exiting ...\nkeys: {redis_client.keys()}', + # ) - print( - f"βœ… The blacklist key was found, the value is {key_value.decode()}", - flush=True, - ) + # print( + # f"βœ… The blacklist key was found, the value is {key_value.decode()}", + # flush=True, + # ) - print( - "ℹ️ Checking if the greylist key was created and has the correct value ...", - flush=True, - ) + # print( + # "ℹ️ Checking if the greylist key was created and has the correct value ...", + # flush=True, + # ) - key_value = redis_client.get(f"plugin_greylist_www.example.comip{ip_to_check}") + # key_value = redis_client.get(f"plugin_greylist_www.example.comip{ip_to_check}") - if key_value is None: - print( - f'❌ The greylist key ("plugin_greylist_www.example.comip{ip_to_check}") was not found, exiting ...\nkeys: {redis_client.keys()}', - flush=True, - ) - exit(1) - if key_value != b"ip": - print( - f'❌ The greylist key ("plugin_greylist_www.example.comip{ip_to_check}") was found, but the value is not "ip" ({key_value.decode()}), exiting ...\nkeys: {redis_client.keys()}', - ) + # if key_value is None: + # print( + # f'❌ The greylist key ("plugin_greylist_www.example.comip{ip_to_check}") was not found, exiting ...\nkeys: {redis_client.keys()}', + # flush=True, + # ) + # exit(1) + # if key_value != b"ip": + # print( + # f'❌ The greylist key ("plugin_greylist_www.example.comip{ip_to_check}") was found, but the value is not "ip" ({key_value.decode()}), exiting ...\nkeys: {redis_client.keys()}', + # ) - print( - f"βœ… The greylist key was found, the value is {key_value.decode()}", - flush=True, - ) + # print( + # f"βœ… The greylist key was found, the value is {key_value.decode()}", + # flush=True, + # ) - if ip_to_check == "1.0.0.3": - print( - "ℹ️ Checking if the dnsbl keys were created ...", - flush=True, - ) + # if ip_to_check == "1.0.0.3": + # print( + # "ℹ️ Checking if the dnsbl keys were created ...", + # flush=True, + # ) - key_value = redis_client.get(f"plugin_dnsbl_www.example.com{ip_to_check}") + # key_value = redis_client.get(f"plugin_dnsbl_www.example.com{ip_to_check}") - if key_value is None: - print( - f'❌ The dnsbl key ("plugin_dnsbl_www.example.com{ip_to_check}") was not found, exiting ...\nkeys: {redis_client.keys()}', - flush=True, - ) - exit(1) + # if key_value is None: + # print( + # f'❌ The dnsbl key ("plugin_dnsbl_www.example.com{ip_to_check}") was not found, exiting ...\nkeys: {redis_client.keys()}', + # flush=True, + # ) + # exit(1) - print( - f"βœ… The dnsbl key was found, the value is {key_value.decode()}", - flush=True, - ) + # print( + # f"βœ… The dnsbl key was found, the value is {key_value.decode()}", + # flush=True, + # ) except SystemExit as e: exit(e.code) except: diff --git a/tests/core/redis/requirements.in b/tests/core/redis/requirements.in index 117888c95..819a03740 100644 --- a/tests/core/redis/requirements.in +++ b/tests/core/redis/requirements.in @@ -1,5 +1,5 @@ -fastapi==0.104.1 +fastapi==0.108.0 redis==5.0.1 requests==2.31.0 selenium==4.16.0 -uvicorn[standard]==0.24.0 +uvicorn[standard]==0.25.0 diff --git a/tests/core/redis/requirements.txt b/tests/core/redis/requirements.txt index 477b4b9cc..92e3e23e8 100644 --- a/tests/core/redis/requirements.txt +++ b/tests/core/redis/requirements.txt @@ -8,20 +8,19 @@ annotated-types==0.6.0 \ --hash=sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 \ --hash=sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d # via pydantic -anyio==3.7.1 \ - --hash=sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780 \ - --hash=sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5 +anyio==4.2.0 \ + --hash=sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee \ + --hash=sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f # via - # fastapi # starlette # watchfiles async-timeout==4.0.3 \ --hash=sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f \ --hash=sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028 # via redis -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via # outcome # trio @@ -134,9 +133,9 @@ exceptiongroup==1.2.0 \ # anyio # trio # trio-websocket -fastapi==0.104.1 \ - --hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \ - --hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae +fastapi==0.108.0 \ + --hash=sha256:5056e504ac6395bf68493d71fcfc5352fdbd5fda6f88c21f6420d80d81163296 \ + --hash=sha256:8c7bc6d315da963ee4cdb605557827071a9a7f95aeb8fcdd3bde48cdc8764dd7 # via -r requirements.in h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ @@ -193,116 +192,116 @@ outcome==1.3.0.post0 \ --hash=sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8 \ --hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b # via trio -pydantic==2.5.2 \ - --hash=sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0 \ - --hash=sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd +pydantic==2.5.3 \ + --hash=sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a \ + --hash=sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4 # via fastapi -pydantic-core==2.14.5 \ - --hash=sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b \ - --hash=sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b \ - --hash=sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d \ - --hash=sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8 \ - --hash=sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124 \ - --hash=sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189 \ - --hash=sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c \ - --hash=sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d \ - --hash=sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f \ - --hash=sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520 \ - --hash=sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4 \ - --hash=sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6 \ - --hash=sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955 \ - --hash=sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3 \ - --hash=sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b \ - --hash=sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a \ - --hash=sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68 \ - --hash=sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3 \ - --hash=sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd \ - --hash=sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de \ - --hash=sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b \ - --hash=sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634 \ - --hash=sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7 \ - --hash=sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459 \ - --hash=sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7 \ - --hash=sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3 \ - --hash=sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331 \ - --hash=sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf \ - --hash=sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d \ - --hash=sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36 \ - --hash=sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59 \ - --hash=sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937 \ - --hash=sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc \ - --hash=sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093 \ - --hash=sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753 \ - --hash=sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706 \ - --hash=sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca \ - --hash=sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260 \ - --hash=sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997 \ - --hash=sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588 \ - --hash=sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71 \ - --hash=sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb \ - --hash=sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e \ - --hash=sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69 \ - --hash=sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5 \ - --hash=sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07 \ - --hash=sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1 \ - --hash=sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0 \ - --hash=sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd \ - --hash=sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8 \ - --hash=sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944 \ - --hash=sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26 \ - --hash=sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda \ - --hash=sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4 \ - --hash=sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9 \ - --hash=sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00 \ - --hash=sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe \ - --hash=sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6 \ - --hash=sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada \ - --hash=sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4 \ - --hash=sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7 \ - --hash=sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325 \ - --hash=sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4 \ - --hash=sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b \ - --hash=sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88 \ - --hash=sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04 \ - --hash=sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863 \ - --hash=sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0 \ - --hash=sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911 \ - --hash=sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b \ - --hash=sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e \ - --hash=sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144 \ - --hash=sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5 \ - --hash=sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720 \ - --hash=sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab \ - --hash=sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d \ - --hash=sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789 \ - --hash=sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec \ - --hash=sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2 \ - --hash=sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db \ - --hash=sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f \ - --hash=sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef \ - --hash=sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3 \ - --hash=sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209 \ - --hash=sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc \ - --hash=sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651 \ - --hash=sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8 \ - --hash=sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e \ - --hash=sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66 \ - --hash=sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7 \ - --hash=sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550 \ - --hash=sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd \ - --hash=sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405 \ - --hash=sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27 \ - --hash=sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093 \ - --hash=sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077 \ - --hash=sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113 \ - --hash=sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3 \ - --hash=sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6 \ - --hash=sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf \ - --hash=sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed \ - --hash=sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88 \ - --hash=sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe \ - --hash=sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18 \ - --hash=sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867 +pydantic-core==2.14.6 \ + --hash=sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556 \ + --hash=sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e \ + --hash=sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411 \ + --hash=sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245 \ + --hash=sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c \ + --hash=sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66 \ + --hash=sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd \ + --hash=sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d \ + --hash=sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b \ + --hash=sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06 \ + --hash=sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948 \ + --hash=sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341 \ + --hash=sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0 \ + --hash=sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f \ + --hash=sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a \ + --hash=sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2 \ + --hash=sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51 \ + --hash=sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80 \ + --hash=sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8 \ + --hash=sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d \ + --hash=sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8 \ + --hash=sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb \ + --hash=sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590 \ + --hash=sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87 \ + --hash=sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534 \ + --hash=sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b \ + --hash=sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145 \ + --hash=sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba \ + --hash=sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b \ + --hash=sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2 \ + --hash=sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e \ + --hash=sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052 \ + --hash=sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622 \ + --hash=sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab \ + --hash=sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b \ + --hash=sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66 \ + --hash=sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e \ + --hash=sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4 \ + --hash=sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e \ + --hash=sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec \ + --hash=sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c \ + --hash=sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed \ + --hash=sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937 \ + --hash=sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f \ + --hash=sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9 \ + --hash=sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4 \ + --hash=sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96 \ + --hash=sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277 \ + --hash=sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23 \ + --hash=sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7 \ + --hash=sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b \ + --hash=sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91 \ + --hash=sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d \ + --hash=sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e \ + --hash=sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1 \ + --hash=sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2 \ + --hash=sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160 \ + --hash=sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9 \ + --hash=sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670 \ + --hash=sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7 \ + --hash=sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c \ + --hash=sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb \ + --hash=sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42 \ + --hash=sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d \ + --hash=sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8 \ + --hash=sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1 \ + --hash=sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6 \ + --hash=sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8 \ + --hash=sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf \ + --hash=sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e \ + --hash=sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a \ + --hash=sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9 \ + --hash=sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1 \ + --hash=sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40 \ + --hash=sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2 \ + --hash=sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d \ + --hash=sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f \ + --hash=sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f \ + --hash=sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af \ + --hash=sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7 \ + --hash=sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda \ + --hash=sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a \ + --hash=sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95 \ + --hash=sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0 \ + --hash=sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60 \ + --hash=sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149 \ + --hash=sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975 \ + --hash=sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4 \ + --hash=sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe \ + --hash=sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94 \ + --hash=sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03 \ + --hash=sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c \ + --hash=sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b \ + --hash=sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a \ + --hash=sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24 \ + --hash=sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391 \ + --hash=sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c \ + --hash=sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab \ + --hash=sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd \ + --hash=sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786 \ + --hash=sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08 \ + --hash=sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8 \ + --hash=sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6 \ + --hash=sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0 \ + --hash=sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421 # via pydantic pysocks==1.7.1 \ --hash=sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299 \ @@ -387,13 +386,13 @@ sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via trio -starlette==0.27.0 \ - --hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \ - --hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91 +starlette==0.32.0.post1 \ + --hash=sha256:cd0cb10ddb49313f609cedfac62c8c12e56c7314b66d89bb077ba228bada1b09 \ + --hash=sha256:e54e2b7e2fb06dff9eac40133583f10dfa05913f5a85bf26f427c7a40a9a3d02 # via fastapi -trio==0.23.1 \ - --hash=sha256:16f89f7dcc8f7b9dcdec1fcd863e0c039af6d0f9a22f8dfd56f75d75ec73fd48 \ - --hash=sha256:bb4abb3f4af23f96679e7c8cdabb8b234520f2498550d2cf63ebfd95f2ce27fe +trio==0.23.2 \ + --hash=sha256:5a0b566fa5d50cf231cfd6b08f3b03aa4179ff004b8f3144059587039e2b26d3 \ + --hash=sha256:da1d35b9a2b17eb32cae2e763b16551f9aa6703634735024e32f325c9285069e # via # selenium # trio-websocket @@ -401,10 +400,11 @@ trio-websocket==0.11.1 \ --hash=sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f \ --hash=sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638 # via selenium -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via + # anyio # fastapi # pydantic # pydantic-core @@ -416,9 +416,9 @@ urllib3==2.1.0 \ # via # requests # selenium -uvicorn==0.24.0 \ - --hash=sha256:368d5d81520a51be96431845169c225d771c9dd22a58613e1a181e6c4512ac33 \ - --hash=sha256:3d19f13dfd2c2af1bfe34dd0f7155118ce689425fdf931177abe832ca44b8a04 +uvicorn==0.25.0 \ + --hash=sha256:6dddbad1d7ee0f5140aba5ec138ddc9612c5109399903828b4874c9937f009c2 \ + --hash=sha256:ce107f5d9bd02b4636001a77a4e74aab5e1e2b146868ebbad565237145af444c # via # -r requirements.in # uvicorn diff --git a/tests/core/reversescan/Dockerfile b/tests/core/reversescan/Dockerfile index 69a366d9e..901d9763f 100644 --- a/tests/core/reversescan/Dockerfile +++ b/tests/core/reversescan/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Install firefox and geckodriver RUN apk add --no-cache --virtual .build-deps curl grep zip wget && \ diff --git a/tests/core/reversescan/docker-compose.yml b/tests/core/reversescan/docker-compose.yml index 2e08f28e4..f63293e4a 100644 --- a/tests/core/reversescan/docker-compose.yml +++ b/tests/core/reversescan/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -35,7 +35,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/reversescan/requirements.in b/tests/core/reversescan/requirements.in index 22cca2ade..ddf7c36a9 100644 --- a/tests/core/reversescan/requirements.in +++ b/tests/core/reversescan/requirements.in @@ -1,3 +1,3 @@ -fastapi==0.104.1 +fastapi==0.108.0 requests==2.31.0 -uvicorn[standard]==0.24.0 +uvicorn[standard]==0.25.0 diff --git a/tests/core/reversescan/requirements.txt b/tests/core/reversescan/requirements.txt index f46853cb0..d74b6c256 100644 --- a/tests/core/reversescan/requirements.txt +++ b/tests/core/reversescan/requirements.txt @@ -8,11 +8,10 @@ annotated-types==0.6.0 \ --hash=sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 \ --hash=sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d # via pydantic -anyio==3.7.1 \ - --hash=sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780 \ - --hash=sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5 +anyio==4.2.0 \ + --hash=sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee \ + --hash=sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f # via - # fastapi # starlette # watchfiles certifi==2023.11.17 \ @@ -119,9 +118,9 @@ exceptiongroup==1.2.0 \ --hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \ --hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68 # via anyio -fastapi==0.104.1 \ - --hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \ - --hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae +fastapi==0.108.0 \ + --hash=sha256:5056e504ac6395bf68493d71fcfc5352fdbd5fda6f88c21f6420d80d81163296 \ + --hash=sha256:8c7bc6d315da963ee4cdb605557827071a9a7f95aeb8fcdd3bde48cdc8764dd7 # via -r requirements.in h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ @@ -171,116 +170,116 @@ idna==3.6 \ # via # anyio # requests -pydantic==2.5.2 \ - --hash=sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0 \ - --hash=sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd +pydantic==2.5.3 \ + --hash=sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a \ + --hash=sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4 # via fastapi -pydantic-core==2.14.5 \ - --hash=sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b \ - --hash=sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b \ - --hash=sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d \ - --hash=sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8 \ - --hash=sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124 \ - --hash=sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189 \ - --hash=sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c \ - --hash=sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d \ - --hash=sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f \ - --hash=sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520 \ - --hash=sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4 \ - --hash=sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6 \ - --hash=sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955 \ - --hash=sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3 \ - --hash=sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b \ - --hash=sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a \ - --hash=sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68 \ - --hash=sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3 \ - --hash=sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd \ - --hash=sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de \ - --hash=sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b \ - --hash=sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634 \ - --hash=sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7 \ - --hash=sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459 \ - --hash=sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7 \ - --hash=sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3 \ - --hash=sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331 \ - --hash=sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf \ - --hash=sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d \ - --hash=sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36 \ - --hash=sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59 \ - --hash=sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937 \ - --hash=sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc \ - --hash=sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093 \ - --hash=sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753 \ - --hash=sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706 \ - --hash=sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca \ - --hash=sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260 \ - --hash=sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997 \ - --hash=sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588 \ - --hash=sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71 \ - --hash=sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb \ - --hash=sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e \ - --hash=sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69 \ - --hash=sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5 \ - --hash=sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07 \ - --hash=sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1 \ - --hash=sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0 \ - --hash=sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd \ - --hash=sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8 \ - --hash=sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944 \ - --hash=sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26 \ - --hash=sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda \ - --hash=sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4 \ - --hash=sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9 \ - --hash=sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00 \ - --hash=sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe \ - --hash=sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6 \ - --hash=sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada \ - --hash=sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4 \ - --hash=sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7 \ - --hash=sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325 \ - --hash=sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4 \ - --hash=sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b \ - --hash=sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88 \ - --hash=sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04 \ - --hash=sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863 \ - --hash=sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0 \ - --hash=sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911 \ - --hash=sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b \ - --hash=sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e \ - --hash=sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144 \ - --hash=sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5 \ - --hash=sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720 \ - --hash=sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab \ - --hash=sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d \ - --hash=sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789 \ - --hash=sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec \ - --hash=sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2 \ - --hash=sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db \ - --hash=sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f \ - --hash=sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef \ - --hash=sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3 \ - --hash=sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209 \ - --hash=sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc \ - --hash=sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651 \ - --hash=sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8 \ - --hash=sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e \ - --hash=sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66 \ - --hash=sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7 \ - --hash=sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550 \ - --hash=sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd \ - --hash=sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405 \ - --hash=sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27 \ - --hash=sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093 \ - --hash=sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077 \ - --hash=sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113 \ - --hash=sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3 \ - --hash=sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6 \ - --hash=sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf \ - --hash=sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed \ - --hash=sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88 \ - --hash=sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe \ - --hash=sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18 \ - --hash=sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867 +pydantic-core==2.14.6 \ + --hash=sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556 \ + --hash=sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e \ + --hash=sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411 \ + --hash=sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245 \ + --hash=sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c \ + --hash=sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66 \ + --hash=sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd \ + --hash=sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d \ + --hash=sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b \ + --hash=sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06 \ + --hash=sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948 \ + --hash=sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341 \ + --hash=sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0 \ + --hash=sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f \ + --hash=sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a \ + --hash=sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2 \ + --hash=sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51 \ + --hash=sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80 \ + --hash=sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8 \ + --hash=sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d \ + --hash=sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8 \ + --hash=sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb \ + --hash=sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590 \ + --hash=sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87 \ + --hash=sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534 \ + --hash=sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b \ + --hash=sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145 \ + --hash=sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba \ + --hash=sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b \ + --hash=sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2 \ + --hash=sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e \ + --hash=sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052 \ + --hash=sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622 \ + --hash=sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab \ + --hash=sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b \ + --hash=sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66 \ + --hash=sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e \ + --hash=sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4 \ + --hash=sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e \ + --hash=sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec \ + --hash=sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c \ + --hash=sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed \ + --hash=sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937 \ + --hash=sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f \ + --hash=sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9 \ + --hash=sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4 \ + --hash=sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96 \ + --hash=sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277 \ + --hash=sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23 \ + --hash=sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7 \ + --hash=sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b \ + --hash=sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91 \ + --hash=sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d \ + --hash=sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e \ + --hash=sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1 \ + --hash=sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2 \ + --hash=sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160 \ + --hash=sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9 \ + --hash=sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670 \ + --hash=sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7 \ + --hash=sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c \ + --hash=sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb \ + --hash=sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42 \ + --hash=sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d \ + --hash=sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8 \ + --hash=sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1 \ + --hash=sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6 \ + --hash=sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8 \ + --hash=sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf \ + --hash=sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e \ + --hash=sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a \ + --hash=sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9 \ + --hash=sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1 \ + --hash=sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40 \ + --hash=sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2 \ + --hash=sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d \ + --hash=sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f \ + --hash=sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f \ + --hash=sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af \ + --hash=sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7 \ + --hash=sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda \ + --hash=sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a \ + --hash=sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95 \ + --hash=sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0 \ + --hash=sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60 \ + --hash=sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149 \ + --hash=sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975 \ + --hash=sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4 \ + --hash=sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe \ + --hash=sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94 \ + --hash=sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03 \ + --hash=sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c \ + --hash=sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b \ + --hash=sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a \ + --hash=sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24 \ + --hash=sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391 \ + --hash=sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c \ + --hash=sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab \ + --hash=sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd \ + --hash=sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786 \ + --hash=sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08 \ + --hash=sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8 \ + --hash=sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6 \ + --hash=sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0 \ + --hash=sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421 # via pydantic python-dotenv==1.0.0 \ --hash=sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba \ @@ -346,14 +345,15 @@ sniffio==1.3.0 \ --hash=sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101 \ --hash=sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384 # via anyio -starlette==0.27.0 \ - --hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \ - --hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91 +starlette==0.32.0.post1 \ + --hash=sha256:cd0cb10ddb49313f609cedfac62c8c12e56c7314b66d89bb077ba228bada1b09 \ + --hash=sha256:e54e2b7e2fb06dff9eac40133583f10dfa05913f5a85bf26f427c7a40a9a3d02 # via fastapi -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via + # anyio # fastapi # pydantic # pydantic-core @@ -363,9 +363,9 @@ urllib3==2.1.0 \ --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \ --hash=sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54 # via requests -uvicorn==0.24.0 \ - --hash=sha256:368d5d81520a51be96431845169c225d771c9dd22a58613e1a181e6c4512ac33 \ - --hash=sha256:3d19f13dfd2c2af1bfe34dd0f7155118ce689425fdf931177abe832ca44b8a04 +uvicorn==0.25.0 \ + --hash=sha256:6dddbad1d7ee0f5140aba5ec138ddc9612c5109399903828b4874c9937f009c2 \ + --hash=sha256:ce107f5d9bd02b4636001a77a4e74aab5e1e2b146868ebbad565237145af444c # via # -r requirements.in # uvicorn diff --git a/tests/core/selfsigned/Dockerfile b/tests/core/selfsigned/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/selfsigned/Dockerfile +++ b/tests/core/selfsigned/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/selfsigned/docker-compose.yml b/tests/core/selfsigned/docker-compose.yml index a16aa20cc..9bd484c7c 100644 --- a/tests/core/selfsigned/docker-compose.yml +++ b/tests/core/selfsigned/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -36,7 +36,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/sessions/Dockerfile b/tests/core/sessions/Dockerfile index eccea2e09..e5e0eeed5 100644 --- a/tests/core/sessions/Dockerfile +++ b/tests/core/sessions/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Install firefox and geckodriver RUN apk add --no-cache --virtual .build-deps curl grep zip wget && \ diff --git a/tests/core/sessions/docker-compose.yml b/tests/core/sessions/docker-compose.yml index d37e16fc8..5dd7e90f1 100644 --- a/tests/core/sessions/docker-compose.yml +++ b/tests/core/sessions/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -35,7 +35,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/sessions/requirements.txt b/tests/core/sessions/requirements.txt index 39c0b1ea3..d8525371f 100644 --- a/tests/core/sessions/requirements.txt +++ b/tests/core/sessions/requirements.txt @@ -4,9 +4,9 @@ # # pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in # -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via # outcome # trio @@ -149,9 +149,9 @@ sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via trio -trio==0.23.1 \ - --hash=sha256:16f89f7dcc8f7b9dcdec1fcd863e0c039af6d0f9a22f8dfd56f75d75ec73fd48 \ - --hash=sha256:bb4abb3f4af23f96679e7c8cdabb8b234520f2498550d2cf63ebfd95f2ce27fe +trio==0.23.2 \ + --hash=sha256:5a0b566fa5d50cf231cfd6b08f3b03aa4179ff004b8f3144059587039e2b26d3 \ + --hash=sha256:da1d35b9a2b17eb32cae2e763b16551f9aa6703634735024e32f325c9285069e # via # selenium # trio-websocket diff --git a/tests/core/whitelist/Dockerfile b/tests/core/whitelist/Dockerfile index ffbc49a30..fe3cea3e7 100644 --- a/tests/core/whitelist/Dockerfile +++ b/tests/core/whitelist/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/whitelist/api/Dockerfile b/tests/core/whitelist/api/Dockerfile index 91408af0f..aba06a1e0 100644 --- a/tests/core/whitelist/api/Dockerfile +++ b/tests/core/whitelist/api/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/whitelist/api/requirements.in b/tests/core/whitelist/api/requirements.in index b04d6bd60..9945aad2d 100644 --- a/tests/core/whitelist/api/requirements.in +++ b/tests/core/whitelist/api/requirements.in @@ -1,2 +1,2 @@ -fastapi==0.104.1 -uvicorn[standard]==0.24.0 +fastapi==0.108.0 +uvicorn[standard]==0.25.0 diff --git a/tests/core/whitelist/api/requirements.txt b/tests/core/whitelist/api/requirements.txt index b52ef7152..4b2d26b89 100644 --- a/tests/core/whitelist/api/requirements.txt +++ b/tests/core/whitelist/api/requirements.txt @@ -8,11 +8,10 @@ annotated-types==0.6.0 \ --hash=sha256:0641064de18ba7a25dee8f96403ebc39113d0cb953a01429249d5c7564666a43 \ --hash=sha256:563339e807e53ffd9c267e99fc6d9ea23eb8443c08f112651963e24e22f84a5d # via pydantic -anyio==3.7.1 \ - --hash=sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780 \ - --hash=sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5 +anyio==4.2.0 \ + --hash=sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee \ + --hash=sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f # via - # fastapi # starlette # watchfiles click==8.1.7 \ @@ -23,9 +22,9 @@ exceptiongroup==1.2.0 \ --hash=sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14 \ --hash=sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68 # via anyio -fastapi==0.104.1 \ - --hash=sha256:752dc31160cdbd0436bb93bad51560b57e525cbb1d4bbf6f4904ceee75548241 \ - --hash=sha256:e5e4540a7c5e1dcfbbcf5b903c234feddcdcd881f191977a1c5dfd917487e7ae +fastapi==0.108.0 \ + --hash=sha256:5056e504ac6395bf68493d71fcfc5352fdbd5fda6f88c21f6420d80d81163296 \ + --hash=sha256:8c7bc6d315da963ee4cdb605557827071a9a7f95aeb8fcdd3bde48cdc8764dd7 # via -r requirements.in h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ @@ -73,116 +72,116 @@ idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via anyio -pydantic==2.5.2 \ - --hash=sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0 \ - --hash=sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd +pydantic==2.5.3 \ + --hash=sha256:b3ef57c62535b0941697cce638c08900d87fcb67e29cfa99e8a68f747f393f7a \ + --hash=sha256:d0caf5954bee831b6bfe7e338c32b9e30c85dfe080c843680783ac2b631673b4 # via fastapi -pydantic-core==2.14.5 \ - --hash=sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b \ - --hash=sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b \ - --hash=sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d \ - --hash=sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8 \ - --hash=sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124 \ - --hash=sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189 \ - --hash=sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c \ - --hash=sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d \ - --hash=sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f \ - --hash=sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520 \ - --hash=sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4 \ - --hash=sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6 \ - --hash=sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955 \ - --hash=sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3 \ - --hash=sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b \ - --hash=sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a \ - --hash=sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68 \ - --hash=sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3 \ - --hash=sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd \ - --hash=sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de \ - --hash=sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b \ - --hash=sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634 \ - --hash=sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7 \ - --hash=sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459 \ - --hash=sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7 \ - --hash=sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3 \ - --hash=sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331 \ - --hash=sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf \ - --hash=sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d \ - --hash=sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36 \ - --hash=sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59 \ - --hash=sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937 \ - --hash=sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc \ - --hash=sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093 \ - --hash=sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753 \ - --hash=sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706 \ - --hash=sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca \ - --hash=sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260 \ - --hash=sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997 \ - --hash=sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588 \ - --hash=sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71 \ - --hash=sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb \ - --hash=sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e \ - --hash=sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69 \ - --hash=sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5 \ - --hash=sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07 \ - --hash=sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1 \ - --hash=sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0 \ - --hash=sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd \ - --hash=sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8 \ - --hash=sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944 \ - --hash=sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26 \ - --hash=sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda \ - --hash=sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4 \ - --hash=sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9 \ - --hash=sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00 \ - --hash=sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe \ - --hash=sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6 \ - --hash=sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada \ - --hash=sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4 \ - --hash=sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7 \ - --hash=sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325 \ - --hash=sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4 \ - --hash=sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b \ - --hash=sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88 \ - --hash=sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04 \ - --hash=sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863 \ - --hash=sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0 \ - --hash=sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911 \ - --hash=sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b \ - --hash=sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e \ - --hash=sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144 \ - --hash=sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5 \ - --hash=sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720 \ - --hash=sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab \ - --hash=sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d \ - --hash=sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789 \ - --hash=sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec \ - --hash=sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2 \ - --hash=sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db \ - --hash=sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f \ - --hash=sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef \ - --hash=sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3 \ - --hash=sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209 \ - --hash=sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc \ - --hash=sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651 \ - --hash=sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8 \ - --hash=sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e \ - --hash=sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66 \ - --hash=sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7 \ - --hash=sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550 \ - --hash=sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd \ - --hash=sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405 \ - --hash=sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27 \ - --hash=sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093 \ - --hash=sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077 \ - --hash=sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113 \ - --hash=sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3 \ - --hash=sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6 \ - --hash=sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf \ - --hash=sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed \ - --hash=sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88 \ - --hash=sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe \ - --hash=sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18 \ - --hash=sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867 +pydantic-core==2.14.6 \ + --hash=sha256:00646784f6cd993b1e1c0e7b0fdcbccc375d539db95555477771c27555e3c556 \ + --hash=sha256:00b1087dabcee0b0ffd104f9f53d7d3eaddfaa314cdd6726143af6bc713aa27e \ + --hash=sha256:0348b1dc6b76041516e8a854ff95b21c55f5a411c3297d2ca52f5528e49d8411 \ + --hash=sha256:036137b5ad0cb0004c75b579445a1efccd072387a36c7f217bb8efd1afbe5245 \ + --hash=sha256:095b707bb287bfd534044166ab767bec70a9bba3175dcdc3371782175c14e43c \ + --hash=sha256:0c08de15d50fa190d577e8591f0329a643eeaed696d7771760295998aca6bc66 \ + --hash=sha256:1302a54f87b5cd8528e4d6d1bf2133b6aa7c6122ff8e9dc5220fbc1e07bffebd \ + --hash=sha256:172de779e2a153d36ee690dbc49c6db568d7b33b18dc56b69a7514aecbcf380d \ + --hash=sha256:1b027c86c66b8627eb90e57aee1f526df77dc6d8b354ec498be9a757d513b92b \ + --hash=sha256:1ce830e480f6774608dedfd4a90c42aac4a7af0a711f1b52f807130c2e434c06 \ + --hash=sha256:1fd0c1d395372843fba13a51c28e3bb9d59bd7aebfeb17358ffaaa1e4dbbe948 \ + --hash=sha256:23598acb8ccaa3d1d875ef3b35cb6376535095e9405d91a3d57a8c7db5d29341 \ + --hash=sha256:24368e31be2c88bd69340fbfe741b405302993242ccb476c5c3ff48aeee1afe0 \ + --hash=sha256:26a92ae76f75d1915806b77cf459811e772d8f71fd1e4339c99750f0e7f6324f \ + --hash=sha256:27e524624eace5c59af499cd97dc18bb201dc6a7a2da24bfc66ef151c69a5f2a \ + --hash=sha256:2b8719037e570639e6b665a4050add43134d80b687288ba3ade18b22bbb29dd2 \ + --hash=sha256:2c5bcf3414367e29f83fd66f7de64509a8fd2368b1edf4351e862910727d3e51 \ + --hash=sha256:2dbe357bc4ddda078f79d2a36fc1dd0494a7f2fad83a0a684465b6f24b46fe80 \ + --hash=sha256:2f5fa187bde8524b1e37ba894db13aadd64faa884657473b03a019f625cee9a8 \ + --hash=sha256:2f6ffc6701a0eb28648c845f4945a194dc7ab3c651f535b81793251e1185ac3d \ + --hash=sha256:314ccc4264ce7d854941231cf71b592e30d8d368a71e50197c905874feacc8a8 \ + --hash=sha256:36026d8f99c58d7044413e1b819a67ca0e0b8ebe0f25e775e6c3d1fabb3c38fb \ + --hash=sha256:36099c69f6b14fc2c49d7996cbf4f87ec4f0e66d1c74aa05228583225a07b590 \ + --hash=sha256:36fa402dcdc8ea7f1b0ddcf0df4254cc6b2e08f8cd80e7010d4c4ae6e86b2a87 \ + --hash=sha256:370ffecb5316ed23b667d99ce4debe53ea664b99cc37bfa2af47bc769056d534 \ + --hash=sha256:3860c62057acd95cc84044e758e47b18dcd8871a328ebc8ccdefd18b0d26a21b \ + --hash=sha256:399ac0891c284fa8eb998bcfa323f2234858f5d2efca3950ae58c8f88830f145 \ + --hash=sha256:3a0b5db001b98e1c649dd55afa928e75aa4087e587b9524a4992316fa23c9fba \ + --hash=sha256:3dcf1978be02153c6a31692d4fbcc2a3f1db9da36039ead23173bc256ee3b91b \ + --hash=sha256:4241204e4b36ab5ae466ecec5c4c16527a054c69f99bba20f6f75232a6a534e2 \ + --hash=sha256:438027a975cc213a47c5d70672e0d29776082155cfae540c4e225716586be75e \ + --hash=sha256:43e166ad47ba900f2542a80d83f9fc65fe99eb63ceec4debec160ae729824052 \ + --hash=sha256:478e9e7b360dfec451daafe286998d4a1eeaecf6d69c427b834ae771cad4b622 \ + --hash=sha256:4ce8299b481bcb68e5c82002b96e411796b844d72b3e92a3fbedfe8e19813eab \ + --hash=sha256:4f86f1f318e56f5cbb282fe61eb84767aee743ebe32c7c0834690ebea50c0a6b \ + --hash=sha256:55a23dcd98c858c0db44fc5c04fc7ed81c4b4d33c653a7c45ddaebf6563a2f66 \ + --hash=sha256:599c87d79cab2a6a2a9df4aefe0455e61e7d2aeede2f8577c1b7c0aec643ee8e \ + --hash=sha256:5aa90562bc079c6c290f0512b21768967f9968e4cfea84ea4ff5af5d917016e4 \ + --hash=sha256:64634ccf9d671c6be242a664a33c4acf12882670b09b3f163cd00a24cffbd74e \ + --hash=sha256:667aa2eac9cd0700af1ddb38b7b1ef246d8cf94c85637cbb03d7757ca4c3fdec \ + --hash=sha256:6a31d98c0d69776c2576dda4b77b8e0c69ad08e8b539c25c7d0ca0dc19a50d6c \ + --hash=sha256:6af4b3f52cc65f8a0bc8b1cd9676f8c21ef3e9132f21fed250f6958bd7223bed \ + --hash=sha256:6c8edaea3089bf908dd27da8f5d9e395c5b4dc092dbcce9b65e7156099b4b937 \ + --hash=sha256:71d72ca5eaaa8d38c8df16b7deb1a2da4f650c41b58bb142f3fb75d5ad4a611f \ + --hash=sha256:72f9a942d739f09cd42fffe5dc759928217649f070056f03c70df14f5770acf9 \ + --hash=sha256:747265448cb57a9f37572a488a57d873fd96bf51e5bb7edb52cfb37124516da4 \ + --hash=sha256:75ec284328b60a4e91010c1acade0c30584f28a1f345bc8f72fe8b9e46ec6a96 \ + --hash=sha256:78d0768ee59baa3de0f4adac9e3748b4b1fffc52143caebddfd5ea2961595277 \ + --hash=sha256:78ee52ecc088c61cce32b2d30a826f929e1708f7b9247dc3b921aec367dc1b23 \ + --hash=sha256:7be719e4d2ae6c314f72844ba9d69e38dff342bc360379f7c8537c48e23034b7 \ + --hash=sha256:7e1f4744eea1501404b20b0ac059ff7e3f96a97d3e3f48ce27a139e053bb370b \ + --hash=sha256:7e90d6cc4aad2cc1f5e16ed56e46cebf4877c62403a311af20459c15da76fd91 \ + --hash=sha256:7ebe3416785f65c28f4f9441e916bfc8a54179c8dea73c23023f7086fa601c5d \ + --hash=sha256:7f41533d7e3cf9520065f610b41ac1c76bc2161415955fbcead4981b22c7611e \ + --hash=sha256:7f5025db12fc6de7bc1104d826d5aee1d172f9ba6ca936bf6474c2148ac336c1 \ + --hash=sha256:86c963186ca5e50d5c8287b1d1c9d3f8f024cbe343d048c5bd282aec2d8641f2 \ + --hash=sha256:86ce5fcfc3accf3a07a729779d0b86c5d0309a4764c897d86c11089be61da160 \ + --hash=sha256:8a14c192c1d724c3acbfb3f10a958c55a2638391319ce8078cb36c02283959b9 \ + --hash=sha256:8b93785eadaef932e4fe9c6e12ba67beb1b3f1e5495631419c784ab87e975670 \ + --hash=sha256:8ed1af8692bd8d2a29d702f1a2e6065416d76897d726e45a1775b1444f5928a7 \ + --hash=sha256:92879bce89f91f4b2416eba4429c7b5ca22c45ef4a499c39f0c5c69257522c7c \ + --hash=sha256:94fc0e6621e07d1e91c44e016cc0b189b48db053061cc22d6298a611de8071bb \ + --hash=sha256:982487f8931067a32e72d40ab6b47b1628a9c5d344be7f1a4e668fb462d2da42 \ + --hash=sha256:9862bf828112e19685b76ca499b379338fd4c5c269d897e218b2ae8fcb80139d \ + --hash=sha256:99b14dbea2fdb563d8b5a57c9badfcd72083f6006caf8e126b491519c7d64ca8 \ + --hash=sha256:9c6a5c79b28003543db3ba67d1df336f253a87d3112dac3a51b94f7d48e4c0e1 \ + --hash=sha256:a19b794f8fe6569472ff77602437ec4430f9b2b9ec7a1105cfd2232f9ba355e6 \ + --hash=sha256:a306cdd2ad3a7d795d8e617a58c3a2ed0f76c8496fb7621b6cd514eb1532cae8 \ + --hash=sha256:a3dde6cac75e0b0902778978d3b1646ca9f438654395a362cb21d9ad34b24acf \ + --hash=sha256:a874f21f87c485310944b2b2734cd6d318765bcbb7515eead33af9641816506e \ + --hash=sha256:a983cca5ed1dd9a35e9e42ebf9f278d344603bfcb174ff99a5815f953925140a \ + --hash=sha256:aca48506a9c20f68ee61c87f2008f81f8ee99f8d7f0104bff3c47e2d148f89d9 \ + --hash=sha256:b2602177668f89b38b9f84b7b3435d0a72511ddef45dc14446811759b82235a1 \ + --hash=sha256:b3e5fe4538001bb82e2295b8d2a39356a84694c97cb73a566dc36328b9f83b40 \ + --hash=sha256:b6ca36c12a5120bad343eef193cc0122928c5c7466121da7c20f41160ba00ba2 \ + --hash=sha256:b89f4477d915ea43b4ceea6756f63f0288941b6443a2b28c69004fe07fde0d0d \ + --hash=sha256:b9a9d92f10772d2a181b5ca339dee066ab7d1c9a34ae2421b2a52556e719756f \ + --hash=sha256:c99462ffc538717b3e60151dfaf91125f637e801f5ab008f81c402f1dff0cd0f \ + --hash=sha256:cb92f9061657287eded380d7dc455bbf115430b3aa4741bdc662d02977e7d0af \ + --hash=sha256:cdee837710ef6b56ebd20245b83799fce40b265b3b406e51e8ccc5b85b9099b7 \ + --hash=sha256:cf10b7d58ae4a1f07fccbf4a0a956d705356fea05fb4c70608bb6fa81d103cda \ + --hash=sha256:d15687d7d7f40333bd8266f3814c591c2e2cd263fa2116e314f60d82086e353a \ + --hash=sha256:d5c28525c19f5bb1e09511669bb57353d22b94cf8b65f3a8d141c389a55dec95 \ + --hash=sha256:d5f916acf8afbcab6bacbb376ba7dc61f845367901ecd5e328fc4d4aef2fcab0 \ + --hash=sha256:dab03ed811ed1c71d700ed08bde8431cf429bbe59e423394f0f4055f1ca0ea60 \ + --hash=sha256:db453f2da3f59a348f514cfbfeb042393b68720787bbef2b4c6068ea362c8149 \ + --hash=sha256:de2a0645a923ba57c5527497daf8ec5df69c6eadf869e9cd46e86349146e5975 \ + --hash=sha256:dea7fcd62915fb150cdc373212141a30037e11b761fbced340e9db3379b892d4 \ + --hash=sha256:dfcbebdb3c4b6f739a91769aea5ed615023f3c88cb70df812849aef634c25fbe \ + --hash=sha256:dfcebb950aa7e667ec226a442722134539e77c575f6cfaa423f24371bb8d2e94 \ + --hash=sha256:e0641b506486f0b4cd1500a2a65740243e8670a2549bb02bc4556a83af84ae03 \ + --hash=sha256:e33b0834f1cf779aa839975f9d8755a7c2420510c0fa1e9fa0497de77cd35d2c \ + --hash=sha256:e4ace1e220b078c8e48e82c081e35002038657e4b37d403ce940fa679e57113b \ + --hash=sha256:e4cf2d5829f6963a5483ec01578ee76d329eb5caf330ecd05b3edd697e7d768a \ + --hash=sha256:e574de99d735b3fc8364cba9912c2bec2da78775eba95cbb225ef7dda6acea24 \ + --hash=sha256:e646c0e282e960345314f42f2cea5e0b5f56938c093541ea6dbf11aec2862391 \ + --hash=sha256:e8a5ac97ea521d7bde7621d86c30e86b798cdecd985723c4ed737a2aa9e77d0c \ + --hash=sha256:eedf97be7bc3dbc8addcef4142f4b4164066df0c6f36397ae4aaed3eb187d8ab \ + --hash=sha256:ef633add81832f4b56d3b4c9408b43d530dfca29e68fb1b797dcb861a2c734cd \ + --hash=sha256:f27207e8ca3e5e021e2402ba942e5b4c629718e665c81b8b306f3c8b1ddbb786 \ + --hash=sha256:f85f3843bdb1fe80e8c206fe6eed7a1caeae897e496542cee499c374a85c6e08 \ + --hash=sha256:f8e81e4b55930e5ffab4a68db1af431629cf2e4066dbdbfef65348b8ab804ea8 \ + --hash=sha256:f96ae96a060a8072ceff4cfde89d261837b4294a4f28b84a28765470d502ccc6 \ + --hash=sha256:fd9e98b408384989ea4ab60206b8e100d8687da18b5c813c11e92fd8212a98e0 \ + --hash=sha256:ffff855100bc066ff2cd3aa4a60bc9534661816b110f0243e59503ec2df38421 # via pydantic python-dotenv==1.0.0 \ --hash=sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba \ @@ -244,22 +243,23 @@ sniffio==1.3.0 \ --hash=sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101 \ --hash=sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384 # via anyio -starlette==0.27.0 \ - --hash=sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75 \ - --hash=sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91 +starlette==0.32.0.post1 \ + --hash=sha256:cd0cb10ddb49313f609cedfac62c8c12e56c7314b66d89bb077ba228bada1b09 \ + --hash=sha256:e54e2b7e2fb06dff9eac40133583f10dfa05913f5a85bf26f427c7a40a9a3d02 # via fastapi -typing-extensions==4.8.0 \ - --hash=sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0 \ - --hash=sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef +typing-extensions==4.9.0 \ + --hash=sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783 \ + --hash=sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd # via + # anyio # fastapi # pydantic # pydantic-core # starlette # uvicorn -uvicorn==0.24.0 \ - --hash=sha256:368d5d81520a51be96431845169c225d771c9dd22a58613e1a181e6c4512ac33 \ - --hash=sha256:3d19f13dfd2c2af1bfe34dd0f7155118ce689425fdf931177abe832ca44b8a04 +uvicorn==0.25.0 \ + --hash=sha256:6dddbad1d7ee0f5140aba5ec138ddc9612c5109399903828b4874c9937f009c2 \ + --hash=sha256:ce107f5d9bd02b4636001a77a4e74aab5e1e2b146868ebbad565237145af444c # via # -r requirements.in # uvicorn diff --git a/tests/core/whitelist/docker-compose.yml b/tests/core/whitelist/docker-compose.yml index 25990be7b..ae0a32c0b 100644 --- a/tests/core/whitelist/docker-compose.yml +++ b/tests/core/whitelist/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never labels: - "bunkerweb.INSTANCE=yes" @@ -48,7 +48,7 @@ services: ipv4_address: 1.0.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw diff --git a/tests/core/whitelist/init/Dockerfile b/tests/core/whitelist/init/Dockerfile index 658fde955..337a70388 100644 --- a/tests/core/whitelist/init/Dockerfile +++ b/tests/core/whitelist/init/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 WORKDIR /tmp diff --git a/tests/core/whitelist/init/requirements.txt b/tests/core/whitelist/init/requirements.txt index 87dd7e4e5..53d7e6b8e 100644 --- a/tests/core/whitelist/init/requirements.txt +++ b/tests/core/whitelist/init/requirements.txt @@ -160,9 +160,9 @@ requests==2.31.0 \ # via requests # The following packages are considered to be unsafe in a requirements file: -setuptools==69.0.2 \ - --hash=sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2 \ - --hash=sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6 +setuptools==69.0.3 \ + --hash=sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05 \ + --hash=sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78 # via -r requirements.in urllib3==2.1.0 \ --hash=sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3 \ diff --git a/tests/requirements.in b/tests/requirements.in index 332fdbdeb..c3b5ded76 100644 --- a/tests/requirements.in +++ b/tests/requirements.in @@ -1,2 +1,3 @@ +pyOpenSSL==23.3.0 pyyaml==6.0.1 requests==2.31.0 diff --git a/tests/requirements.txt b/tests/requirements.txt index c9454d9bf..c28f9b3fa 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -8,6 +8,60 @@ certifi==2023.11.17 \ --hash=sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1 \ --hash=sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474 # via requests +cffi==1.16.0 \ + --hash=sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc \ + --hash=sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a \ + --hash=sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417 \ + --hash=sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab \ + --hash=sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520 \ + --hash=sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36 \ + --hash=sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743 \ + --hash=sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8 \ + --hash=sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed \ + --hash=sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684 \ + --hash=sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56 \ + --hash=sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324 \ + --hash=sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d \ + --hash=sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235 \ + --hash=sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e \ + --hash=sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088 \ + --hash=sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000 \ + --hash=sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7 \ + --hash=sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e \ + --hash=sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673 \ + --hash=sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c \ + --hash=sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe \ + --hash=sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2 \ + --hash=sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098 \ + --hash=sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8 \ + --hash=sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a \ + --hash=sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0 \ + --hash=sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b \ + --hash=sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896 \ + --hash=sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e \ + --hash=sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9 \ + --hash=sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2 \ + --hash=sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b \ + --hash=sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6 \ + --hash=sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404 \ + --hash=sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f \ + --hash=sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0 \ + --hash=sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4 \ + --hash=sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc \ + --hash=sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936 \ + --hash=sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba \ + --hash=sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872 \ + --hash=sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb \ + --hash=sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614 \ + --hash=sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1 \ + --hash=sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d \ + --hash=sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969 \ + --hash=sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b \ + --hash=sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4 \ + --hash=sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627 \ + --hash=sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956 \ + --hash=sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357 + # via cryptography charset-normalizer==3.3.2 \ --hash=sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027 \ --hash=sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087 \ @@ -100,10 +154,43 @@ charset-normalizer==3.3.2 \ --hash=sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519 \ --hash=sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561 # via requests +cryptography==41.0.7 \ + --hash=sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960 \ + --hash=sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a \ + --hash=sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc \ + --hash=sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a \ + --hash=sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf \ + --hash=sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1 \ + --hash=sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39 \ + --hash=sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406 \ + --hash=sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a \ + --hash=sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a \ + --hash=sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c \ + --hash=sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be \ + --hash=sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15 \ + --hash=sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2 \ + --hash=sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d \ + --hash=sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157 \ + --hash=sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003 \ + --hash=sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248 \ + --hash=sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a \ + --hash=sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec \ + --hash=sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309 \ + --hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \ + --hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d + # via pyopenssl idna==3.6 \ --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via requests +pycparser==2.21 \ + --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ + --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 + # via cffi +pyopenssl==23.3.0 \ + --hash=sha256:6756834481d9ed5470f4a9393455154bc92fe7a64b7bc6ee2c804e78c52099b2 \ + --hash=sha256:6b2cba5cc46e822750ec3e5a81ee12819850b11303630d575e98108a079c2b12 + # via -r requirements.in pyyaml==6.0.1 \ --hash=sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5 \ --hash=sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc \ diff --git a/tests/terraform/providers.tf b/tests/terraform/providers.tf index 7f95ab487..d3ffccfd3 100644 --- a/tests/terraform/providers.tf +++ b/tests/terraform/providers.tf @@ -2,7 +2,7 @@ terraform { required_providers { scaleway = { source = "scaleway/scaleway" - version = "2.31.0" + version = "2.35.0" } kubectl = { source = "gavinbunney/kubectl" @@ -10,7 +10,7 @@ terraform { } kubernetes = { source = "hashicorp/kubernetes" - version = "2.23.0" + version = "2.24.0" } } } \ No newline at end of file diff --git a/tests/ui/Dockerfile b/tests/ui/Dockerfile index 161d09d0f..6d17f25f4 100644 --- a/tests/ui/Dockerfile +++ b/tests/ui/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.12.0-alpine3.18@sha256:f1d0d03700fb2d4480e89fb807e7346c14b88952f7bd58d56de54a24817cc2e8 +FROM python:3.12.1-alpine3.18@sha256:af0d8da43677e3000ebdf4045508d891a87e7bd2d3ec87bc6e40403be97291b8 # Install firefox and geckodriver RUN apk add --no-cache --virtual .build-deps curl grep zip wget && \ diff --git a/tests/ui/docker-compose.dev.yml b/tests/ui/docker-compose.dev.yml index f23574816..c7b5d6db1 100644 --- a/tests/ui/docker-compose.dev.yml +++ b/tests/ui/docker-compose.dev.yml @@ -7,25 +7,19 @@ services: dockerfile: src/bw/Dockerfile ports: - 80:80 - - 443:8443 environment: - SERVER_NAME: "www.example.com" + SERVER_NAME: "" MULTISITE: "yes" HTTP_PORT: "80" API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24" USE_BUNKERNET: "no" USE_BLACKLIST: "no" + SEND_ANONYMOUS_REPORT: "no" DISABLE_DEFAULT_SERVER: "yes" USE_CLIENT_CACHE: "yes" USE_GZIP: "yes" DATASTORE_MEMORY_SIZE: "384m" - www.example.com_USE_UI: "yes" - www.example.com_SERVE_FILES: "no" - www.example.com_USE_REVERSE_PROXY: "yes" - www.example.com_REVERSE_PROXY_URL: "/admin/" - www.example.com_REVERSE_PROXY_HOST: "http://bw-ui:7000" - www.example.com_REVERSE_PROXY_KEEPALIVE: "yes" - www.example.com_INTERCEPTED_ERROR_CODES: "400 405 413 429 500 501 502 503 504" + UI_HOST: "http://bw-ui:7000" labels: - "bunkerweb.INSTANCE=yes" networks: @@ -57,8 +51,6 @@ services: volumes: - bw-data:/data environment: - ADMIN_USERNAME: "admin" - ADMIN_PASSWORD: "S$$cr3tP@ssw0rd" DOCKER_HOST: "tcp://docker-proxy:2375" networks: - net-docker @@ -78,17 +70,16 @@ services: networks: bw-services: ipv4_address: 192.168.0.4 - - ui-tests: - build: . - environment: - - PYTHONUNBUFFERED=1 - extra_hosts: - - "www.example.com:192.168.0.2" - - "app1.example.com:192.168.0.2" - networks: - bw-services: - ipv4_address: 192.168.0.3 + # ui-tests: + # build: . + # environment: + # - PYTHONUNBUFFERED=1 + # extra_hosts: + # - "www.example.com:192.168.0.2" + # - "app1.example.com:192.168.0.2" + # networks: + # bw-services: + # ipv4_address: 192.168.0.3 volumes: bw-data: diff --git a/tests/ui/docker-compose.yml b/tests/ui/docker-compose.yml index dff2b5ae3..d1970b80f 100644 --- a/tests/ui/docker-compose.yml +++ b/tests/ui/docker-compose.yml @@ -2,30 +2,25 @@ version: "3.5" services: bw: - image: bunkerity/bunkerweb:1.5.4 + image: bunkerity/bunkerweb:1.5.5 pull_policy: never ports: - 80:80 - - 443:8443 environment: - SERVER_NAME: "www.example.com" + SERVER_NAME: "" MULTISITE: "yes" HTTP_PORT: "80" API_WHITELIST_IP: "127.0.0.0/8 10.20.30.0/24" LOG_LEVEL: "info" USE_BUNKERNET: "no" USE_BLACKLIST: "no" + SEND_ANONYMOUS_REPORT: "no" DISABLE_DEFAULT_SERVER: "yes" USE_CLIENT_CACHE: "yes" USE_GZIP: "yes" DATASTORE_MEMORY_SIZE: "384m" - www.example.com_USE_UI: "yes" - www.example.com_SERVE_FILES: "no" - www.example.com_USE_REVERSE_PROXY: "yes" - www.example.com_REVERSE_PROXY_URL: "/admin" - www.example.com_REVERSE_PROXY_HOST: "http://bw-ui:7000" - www.example.com_INTERCEPTED_ERROR_CODES: "400 405 413 429 500 501 502 503 504" CUSTOM_CONF_SERVER_HTTP_port-redirect: "port_in_redirect on;" + UI_HOST: "http://bw-ui:7000" labels: - "bunkerweb.INSTANCE=yes" networks: @@ -34,7 +29,7 @@ services: ipv4_address: 192.168.0.2 bw-scheduler: - image: bunkerity/bunkerweb-scheduler:1.5.4 + image: bunkerity/bunkerweb-scheduler:1.5.5 pull_policy: never depends_on: - bw @@ -47,14 +42,12 @@ services: - bw-docker bw-ui: - image: bunkerity/bunkerweb-ui:1.5.4 + image: bunkerity/bunkerweb-ui:1.5.5 pull_policy: never depends_on: - bw - bw-docker-proxy environment: - ADMIN_USERNAME: "admin" - ADMIN_PASSWORD: "S$$cr3tP@ssw0rd" DOCKER_HOST: "tcp://bw-docker-proxy:2375" volumes: - bw-data:/data diff --git a/tests/ui/main.py b/tests/ui/main.py index 150e27782..a6019087e 100644 --- a/tests/ui/main.py +++ b/tests/ui/main.py @@ -1,12 +1,13 @@ from contextlib import suppress from datetime import datetime, timedelta from functools import partial -from os import getenv, listdir +from os import getenv, listdir, sep from os.path import join from pathlib import Path from time import sleep from traceback import format_exc from typing import List, Union +from pyotp import TOTP from requests import get from requests.exceptions import RequestException from selenium import webdriver @@ -19,11 +20,17 @@ from selenium.webdriver.remote.webelement import WebElement from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import ElementClickInterceptedException, TimeoutException, WebDriverException +default_server = "127.0.0.1" + +os_release_path = Path(sep, "etc", "os-release") +if os_release_path.is_file() and "Alpine" in os_release_path.read_text(encoding="utf-8"): + default_server = "192.168.0.2" + ready = False retries = 0 while not ready: with suppress(RequestException): - status_code = get("http://www.example.com/admin").status_code + status_code = get(f"http://{default_server}/setup").status_code if status_code > 500 and status_code != 502: print("An error occurred with the server, exiting ...", flush=True) @@ -116,7 +123,7 @@ def assert_alert_message(driver, message: str): print(f'Message "{message}" found in one of the messages in the list', flush=True) - assert_button_click(driver, "//aside[@data-flash-sidebar='']/*[local-name() = 'svg']") + assert_button_click(driver, "//button[@data-flash-sidebar-close='']/*[local-name() = 'svg']") def access_page( @@ -178,9 +185,41 @@ with driver_func() as driver: driver.maximize_window() driver_wait = WebDriverWait(driver, 60) - print("Navigating to http://www.example.com/admin ...", flush=True) + print(f"Navigating to http://{default_server}/setup ...", flush=True) - driver.get("http://www.example.com/admin") + driver.get(f"http://{default_server}/setup") + + ### WIZARD PAGE + + try: + title = driver_wait.until(EC.presence_of_element_located((By.XPATH, "/html/body/main/div/div/h1"))) + + if title.text != "Setup Wizard": + print("Didn't get redirected to setup page, exiting ...", flush=True) + exit(1) + except TimeoutException: + print("Didn't get redirected to setup page, exiting ...", flush=True) + exit(1) + + print("Setup page loaded successfully, filling the form ...", flush=True) + + admin_username_input = safe_get_element(driver, By.ID, "admin_username") + password_input = safe_get_element(driver, By.ID, "admin_password") + password_check_input = safe_get_element(driver, By.ID, "admin_password_check") + ui_url = safe_get_element(driver, By.ID, "ui_url").get_attribute("value") + + admin_username_input.send_keys("admin") + password_input.send_keys("S$cr3tP@ssw0rd") + password_check_input.send_keys("S$cr3tP@ssw0rd") + + assert_button_click(driver, "//button[@id='setup-button']") + + print("Submitted the form, waiting for the wizard to finish ...", flush=True) + + current_time = datetime.now() + + while current_time + timedelta(minutes=5) > datetime.now() and not driver.current_url.endswith("/login"): + sleep(1) ### LOGIN PAGE @@ -197,7 +236,7 @@ with driver_func() as driver: flush=True, ) - driver.get("http://www.example.com/admin/home") + driver.get(f"http://www.example.com{ui_url}/home") print("Waiting for toast ...", flush=True) @@ -508,9 +547,9 @@ with driver_func() as driver: print("The service is not present, exiting ...", flush=True) exit(1) - if service.find_element(By.TAG_NAME, "h6").text.strip() != "scheduler": + if service.find_element(By.TAG_NAME, "h6").text.strip() != "ui": print( - "The service should have been created by the scheduler, exiting ...", + "The service should have been created by the ui, exiting ...", flush=True, ) exit(1) @@ -1171,7 +1210,7 @@ location /hello { exit(1) assert_button_click(driver, instances[0]) - assert_button_click(driver, safe_get_element(driver, By.ID, "submit-settings")) + assert_button_click(driver, safe_get_element(driver, By.ID, "submit-data")) sleep(3) @@ -1184,7 +1223,7 @@ location /hello { print("Logs found, trying auto refresh ...", flush=True) assert_button_click(driver, safe_get_element(driver, By.ID, "live-update")) - assert_button_click(driver, "//button[@id='submit-settings' and contains(text(), 'Go Live')]") + assert_button_click(driver, safe_get_element(driver, By.ID, "submit-live")) sleep(3) @@ -1202,7 +1241,7 @@ location /hello { print("Auto refresh is working, deactivating it ...", flush=True) assert_button_click(driver, safe_get_element(driver, By.ID, "live-update")) - assert_button_click(driver, safe_get_element(driver, By.ID, "submit-settings")) + assert_button_click(driver, safe_get_element(driver, By.ID, "submit-data")) sleep(3) @@ -1260,8 +1299,8 @@ location /hello { current_date = datetime.now() resp = get( - f"http://www.example.com/admin/logs/{first_instance}?from_date={int(current_date.timestamp() - 86400000)}&to_date={int((current_date - timedelta(days=1)).timestamp())}", - headers={"Host": "www.example.com"}, + f"http://www.example.com{ui_url}/logs/{first_instance}?from_date={int(current_date.timestamp() - 86400000)}&to_date={int((current_date - timedelta(days=1)).timestamp())}", + headers={"Host": "www.example.com", "User-Agent": driver.execute_script("return navigator.userAgent;")}, cookies={"session": driver.get_cookies()[0]["value"]}, ) @@ -1396,13 +1435,164 @@ location /hello { sleep(0.3) - resp = get("http://www.example.com/admin/jobs/download?job_name=mmdb-country&file_name=country.mmdb") + resp = get(f"http://www.example.com{ui_url}/jobs/download?job_name=mmdb-country&file_name=country.mmdb") if resp.status_code != 200: print("The cache download is not working, exiting ...", flush=True) exit(1) - print("Cache download is working, trying to log out ...", flush=True) + print("Cache download is working, trying profile page ...", flush=True) + + access_page(driver, driver_wait, "/html/body/aside[1]/div[1]/div[2]/ul/li[10]/a", "profile") + + ### PROFILE PAGE + + username_input = safe_get_element(driver, By.ID, "admin_username") + + if username_input.get_attribute("value") != "admin": + print("The username is not correct, exiting ...", flush=True) + exit(1) + + username_input.clear() + username_input.send_keys("admin2") + + password_input = safe_get_element(driver, By.ID, "curr_password") + + if password_input.get_attribute("value") != "": + print("The current password is not empty, exiting ...", flush=True) + exit(1) + + password_input.send_keys("S$cr3tP@ssw0rd") + + assert_button_click(driver, "//button[@id='username-button' and @class='edit-btn']") + + try: + title = driver_wait.until(EC.presence_of_element_located((By.XPATH, "/html/body/main/div[1]/div/h1"))) + + if title.text != "Log in": + print("Didn't get redirected to login page, exiting ...", flush=True) + exit(1) + except TimeoutException: + print("Login page didn't load in time, exiting ...", flush=True) + exit(1) + + print("Successfully changed username, trying to log in with new username ...", flush=True) + + username_input = safe_get_element(driver, By.ID, "username") + password_input = safe_get_element(driver, By.ID, "password") + username_input.send_keys("admin2") + password_input.send_keys("S$cr3tP@ssw0rd") + + access_page(driver, driver_wait, "//button[@value='login']", "home") + + access_page(driver, driver_wait, "/html/body/aside[1]/div[1]/div[2]/ul/li[10]/a", "profile") + + username_input = safe_get_element(driver, By.ID, "admin_username") + + if username_input.get_attribute("value") != "admin2": + print("The username is not correct, exiting ...", flush=True) + exit(1) + + print("Successfully logged in with new username, trying to change password ...", flush=True) + + assert_button_click(driver, "//button[@data-tab-handler='password']") + + password_input = safe_get_element(driver, By.XPATH, "//form[@data-plugin-item='password']//input[@id='curr_password']") + + if password_input.get_attribute("value") != "": + print("The current password is not empty, exiting ...", flush=True) + exit(1) + + password_input.send_keys("S$cr3tP@ssw0rd") + + new_password_input = safe_get_element(driver, By.ID, "admin_password") + + if new_password_input.get_attribute("value") != "": + print("The new password is not empty, exiting ...", flush=True) + exit(1) + + new_password_input.send_keys("P@ssw0rd") + + new_password_check_input = safe_get_element(driver, By.ID, "admin_password_check") + + if new_password_check_input.get_attribute("value") != "": + print("The new password check is not empty, exiting ...", flush=True) + exit(1) + + new_password_check_input.send_keys("P@ssw0rd") + + assert_button_click(driver, "//button[@id='pw-button' and @class='edit-btn']") + + try: + title = driver_wait.until(EC.presence_of_element_located((By.XPATH, "/html/body/main/div[1]/div/h1"))) + + if title.text != "Log in": + print("Didn't get redirected to login page, exiting ...", flush=True) + exit(1) + except TimeoutException: + print("Login page didn't load in time, exiting ...", flush=True) + exit(1) + + print("Successfully changed username, trying to log in with new password ...", flush=True) + + username_input = safe_get_element(driver, By.ID, "username") + password_input = safe_get_element(driver, By.ID, "password") + username_input.send_keys("admin2") + password_input.send_keys("P@ssw0rd") + + access_page(driver, driver_wait, "//button[@value='login']", "home") + + access_page(driver, driver_wait, "/html/body/aside[1]/div[1]/div[2]/ul/li[10]/a", "profile") + + print("Successfully logged in with new password, trying 2FA ...", flush=True) + + assert_button_click(driver, "//button[@data-tab-handler='totp']") + + secret_token_input = safe_get_element(driver, By.ID, "secret_token") + secret_token = secret_token_input.get_attribute("value") + + driver.refresh() + + driver_wait.until(EC.presence_of_element_located((By.XPATH, "/html/body/div/header/div/nav/h6"))) + + assert_button_click(driver, "//button[@data-tab-handler='totp']") + + secret_token_input = safe_get_element(driver, By.ID, "secret_token") + new_secret_token = secret_token_input.get_attribute("value") + + if new_secret_token == secret_token: + print("The secret token hasn't been changed, exiting ...", flush=True) + exit(1) + + print("The secret token has been changed, trying to activate 2FA ...", flush=True) + + totp = TOTP(new_secret_token) + totp_input = safe_get_element(driver, By.ID, "totp_token") + totp_input.send_keys(totp.now()) + + password_input = safe_get_element(driver, By.XPATH, "//form[@data-plugin-item='totp']//input[@id='curr_password']") + + if password_input.get_attribute("value") != "": + print("The new password check is not empty, exiting ...", flush=True) + exit(1) + + password_input.send_keys("P@ssw0rd") + + access_page(driver, driver_wait, "//button[@id='totp-button' and @class='valid-btn']", "profile") + + assert_button_click(driver, "//button[@data-tab-handler='totp']") + + try: + totp_state = safe_get_element(driver, By.XPATH, "/html/body/main/div/div/form[2]/h5") + + if totp_state.text != "TOTP IS CURRENTLY ON": + print("TOTP is not activated, exiting ...", flush=True) + exit(1) + except TimeoutException: + print("TOTP has not been activated, exiting ...", flush=True) + exit(1) + + print("2FA has been activated, trying to log out ...", flush=True) assert_button_click(driver, "//a[@href='logout']") @@ -1416,7 +1606,100 @@ location /hello { print("Login page didn't load in time, exiting ...", flush=True) exit(1) - print("Successfully logged out, tests are done", flush=True) + print("Successfully logged out, trying to log in with 2FA ...", flush=True) + + username_input = safe_get_element(driver, By.ID, "username") + password_input = safe_get_element(driver, By.ID, "password") + username_input.send_keys("admin2") + password_input.send_keys("P@ssw0rd") + + assert_button_click(driver, "//button[@value='login']") + + try: + totp_input = safe_get_element(driver, By.ID, "totp_token") + except TimeoutException: + print("Didn't get redirected to 2FA page, exiting ...", flush=True) + exit(1) + + totp_input.send_keys("0000000") + assert_button_click(driver, "//button[@value='login']") + + sleep(5) + + if not driver.current_url.endswith("/totp"): + print("Didn't get redirected back to 2FA page, exiting ...", flush=True) + exit(1) + + totp_input = safe_get_element(driver, By.ID, "totp_token") + totp_input.send_keys(totp.now()) + + access_page( + driver, + driver_wait, + "//button[@value='login']", + "home", + ) + + print("Successfully logged in with 2FA, trying to deactivate 2FA ...", flush=True) + + access_page(driver, driver_wait, "/html/body/aside[1]/div[1]/div[2]/ul/li[10]/a", "profile") + + assert_button_click(driver, "//button[@data-tab-handler='totp']") + + totp_input = safe_get_element(driver, By.ID, "totp_token") + totp_input.send_keys(totp.now()) + + password_input = safe_get_element(driver, By.XPATH, "//form[@data-plugin-item='totp']//input[@id='curr_password']") + password_input.send_keys("P@ssw0rd") + + access_page( + driver, + driver_wait, + "//button[@id='totp-button' and @class='delete-btn']", + "profile", + ) + + assert_button_click(driver, "//button[@data-tab-handler='totp']") + + try: + totp_state = safe_get_element(driver, By.XPATH, "/html/body/main/div/div/form[2]/h5") + + if totp_state.text != "TOTP IS CURRENTLY OFF": + print("TOTP is not deactivated, exiting ...", flush=True) + exit(1) + except TimeoutException: + print("TOTP has not been deactivated, exiting ...", flush=True) + exit(1) + + print("2FA has been deactivated, trying to log out ...", flush=True) + + assert_button_click(driver, "//a[@href='logout']") + + try: + title = driver_wait.until(EC.presence_of_element_located((By.XPATH, "/html/body/main/div[1]/div/h1"))) + + if title.text != "Log in": + print("Didn't get redirected to login page, exiting ...", flush=True) + exit(1) + except TimeoutException: + print("Login page didn't load in time, exiting ...", flush=True) + exit(1) + + print("Successfully logged out, trying to log in without 2FA ...", flush=True) + + username_input = safe_get_element(driver, By.ID, "username") + password_input = safe_get_element(driver, By.ID, "password") + username_input.send_keys("admin2") + password_input.send_keys("P@ssw0rd") + + access_page( + driver, + driver_wait, + "//button[@value='login']", + "home", + ) + + print("Successfully logged in without 2FA, tests are done, exiting ...", flush=True) except SystemExit: exit(1) except: diff --git a/tests/ui/requirements.in b/tests/ui/requirements.in index 49cb1341f..c215e69bd 100644 --- a/tests/ui/requirements.in +++ b/tests/ui/requirements.in @@ -1,2 +1,3 @@ +pyotp==2.9.0 requests==2.31.0 selenium==4.16.0 diff --git a/tests/ui/requirements.txt b/tests/ui/requirements.txt index 39c0b1ea3..a77569db7 100644 --- a/tests/ui/requirements.txt +++ b/tests/ui/requirements.txt @@ -4,9 +4,9 @@ # # pip-compile --allow-unsafe --generate-hashes --strip-extras requirements.in # -attrs==23.1.0 \ - --hash=sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04 \ - --hash=sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015 +attrs==23.2.0 \ + --hash=sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30 \ + --hash=sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1 # via # outcome # trio @@ -128,6 +128,10 @@ outcome==1.3.0.post0 \ --hash=sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8 \ --hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b # via trio +pyotp==2.9.0 \ + --hash=sha256:346b6642e0dbdde3b4ff5a930b664ca82abfa116356ed48cc42c7d6590d36f63 \ + --hash=sha256:81c2e5865b8ac55e825b0358e496e1d9387c811e85bb40e71a3b29b288963612 + # via -r requirements.in pysocks==1.7.1 \ --hash=sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299 \ --hash=sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5 \ @@ -149,9 +153,9 @@ sortedcontainers==2.4.0 \ --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 # via trio -trio==0.23.1 \ - --hash=sha256:16f89f7dcc8f7b9dcdec1fcd863e0c039af6d0f9a22f8dfd56f75d75ec73fd48 \ - --hash=sha256:bb4abb3f4af23f96679e7c8cdabb8b234520f2498550d2cf63ebfd95f2ce27fe +trio==0.23.2 \ + --hash=sha256:5a0b566fa5d50cf231cfd6b08f3b03aa4179ff004b8f3144059587039e2b26d3 \ + --hash=sha256:da1d35b9a2b17eb32cae2e763b16551f9aa6703634735024e32f325c9285069e # via # selenium # trio-websocket