From 80b26a39c6a1e175dded0f81fa05cc224d71d3c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vir=C3=A1g=20G=C3=A1bor?= Date: Wed, 6 Nov 2024 11:01:28 +0100 Subject: [PATCH] upload --- .DS_Store | Bin 0 -> 6148 bytes .dockerignore | 3 + .github/FUNDING.yml | 9 + .github/ISSUE_TEMPLATE/bug_report.md | 45 + .github/ISSUE_TEMPLATE/feature_request.md | 20 + .github/ISSUE_TEMPLATE/new-theme.md | 38 + .github/ISSUE_TEMPLATE/question.md | 10 + .github/workflows/buildx.yml | 59 + .github/workflows/docker_main.yml | 28 + .github/workflows/docker_tests.yml | 26 + .github/workflows/pypi.yml | 67 + .github/workflows/scan.yml | 19 + .github/workflows/tests.yml | 17 + .gitignore | 27 + .replit | 1 + Dockerfile | 103 ++ LICENSE | 21 + MANIFEST.in | 6 + app.json | 194 +++ app/.DS_Store | Bin 0 -> 8196 bytes app/__init__.py | 199 +++ app/__main__.py | 3 + app/filter.py | 785 ++++++++++ app/models/.DS_Store | Bin 0 -> 6148 bytes app/models/__init__.py | 0 app/models/config.py | 267 ++++ app/models/endpoint.py | 22 + app/models/g_classes.py | 48 + app/request.py | 352 +++++ app/routes.py | 726 +++++++++ app/static/.DS_Store | Bin 0 -> 10244 bytes app/static/bangs/00-whoogle.json | 14 + app/static/build/.gitignore | 2 + app/static/css/dark-theme.css | 864 +++++++++++ app/static/css/error.css | 9 + app/static/css/header.css | 284 ++++ app/static/css/input.css | 48 + app/static/css/light-theme.css | 205 +++ app/static/css/logo.css | 30 + app/static/css/main.css | 380 +++++ app/static/css/search.css | 185 +++ app/static/css/variables.css | 81 + app/static/img/.DS_Store | Bin 0 -> 6148 bytes app/static/img/favicon.ico | Bin 0 -> 15086 bytes app/static/img/favicon/.DS_Store | Bin 0 -> 6148 bytes .../img/favicon/android-chrome-192x192.png | Bin 0 -> 20111 bytes .../img/favicon/android-chrome-256x256.png | Bin 0 -> 32527 bytes app/static/img/favicon/apple-touch-icon.png | Bin 0 -> 17945 bytes app/static/img/favicon/browserconfig.xml | 9 + app/static/img/favicon/favicon-16x16.png | Bin 0 -> 833 bytes app/static/img/favicon/favicon-32x32.png | Bin 0 -> 1967 bytes app/static/img/favicon/favicon.ico | Bin 0 -> 15086 bytes app/static/img/favicon/manifest.json | 44 + app/static/img/favicon/mstile-150x150.png | Bin 0 -> 10602 bytes app/static/img/favicon/safari-pinned-tab.svg | 523 +++++++ app/static/img/favicon/site.webmanifest | 19 + app/static/img/rp/.DS_Store | Bin 0 -> 6148 bytes app/static/img/rp/rpdiscordsearch.png | Bin 0 -> 20188 bytes app/static/img/rp/rpgiteasearch.png | Bin 0 -> 20238 bytes app/static/img/rp/rpkicksearch.png | Bin 0 -> 13689 bytes app/static/img/rp/rptwitchsearch.png | Bin 0 -> 16236 bytes app/static/img/rp/rpwebsearch.png | Bin 0 -> 40823 bytes app/static/img/rp/rpyoutubesearch.png | Bin 0 -> 37905 bytes app/static/img/rplogo.webp | Bin 0 -> 67326 bytes app/static/js/autocomplete.js | 127 ++ app/static/js/controller.js | 88 ++ app/static/js/currency.js | 9 + app/static/js/header.js | 67 + app/static/js/keyboard.js | 62 + app/static/js/utils.js | 76 + app/static/settings/countries.json | 978 ++++++++++++ app/static/settings/header_tabs.json | 32 + app/static/settings/languages.json | 210 +++ app/static/settings/themes.json | 5 + app/static/settings/time_periods.json | 8 + app/static/settings/translations.json | 1348 +++++++++++++++++ app/static/widgets/calculator.html | 260 ++++ app/templates/display.html | 40 + app/templates/error.html | 106 ++ app/templates/footer.html | 18 + app/templates/header.html | 89 ++ app/templates/header2.html | 210 +++ app/templates/imageresults.html | 451 ++++++ app/templates/index.html | 303 ++++ app/templates/logo.html | 8 + app/templates/opensearch.xml | 25 + app/templates/search.html | 15 + app/utils/.DS_Store | Bin 0 -> 6148 bytes app/utils/__init__.py | 0 app/utils/bangs.py | 146 ++ app/utils/misc.py | 137 ++ app/utils/results.py | 466 ++++++ app/utils/search.py | 194 +++ app/utils/session.py | 39 + app/utils/widgets.py | 71 + app/version.py | 7 + charts/whoogle/.helmignore | 23 + charts/whoogle/Chart.yaml | 23 + charts/whoogle/templates/NOTES.txt | 22 + charts/whoogle/templates/_helpers.tpl | 62 + charts/whoogle/templates/deployment.yaml | 82 + charts/whoogle/templates/hpa.yaml | 28 + charts/whoogle/templates/ingress.yaml | 61 + charts/whoogle/templates/service.yaml | 15 + charts/whoogle/templates/serviceaccount.yaml | 12 + .../templates/tests/test-connection.yaml | 15 + charts/whoogle/values.yaml | 115 ++ docker-compose-traefik.yaml | 81 + docker-compose.yml | 49 + docs/banner.png | Bin 0 -> 23518 bytes docs/screenshot_desktop.png | Bin 0 -> 219667 bytes docs/screenshot_mobile.png | Bin 0 -> 62670 bytes heroku.yml | 4 + letsencrypt/acme.json | 0 misc/heroku-regen.sh | 29 + misc/instances.txt | 24 + misc/replit.py | 5 + misc/tor/start-tor.sh | 33 + misc/tor/torrc | 12 + misc/update-translations.py | 67 + pyproject.toml | 3 + requirements.txt | 37 + run | 37 + setup.cfg | 45 + test/__init__.py | 0 test/conftest.py | 24 + test/test_autocomplete.py | 16 + test/test_misc.py | 70 + test/test_results.py | 158 ++ test/test_routes.py | 91 ++ whoogle.template.env | 94 ++ 131 files changed, 12724 insertions(+) create mode 100644 .DS_Store create mode 100644 .dockerignore create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/new-theme.md create mode 100644 .github/ISSUE_TEMPLATE/question.md create mode 100644 .github/workflows/buildx.yml create mode 100644 .github/workflows/docker_main.yml create mode 100644 .github/workflows/docker_tests.yml create mode 100644 .github/workflows/pypi.yml create mode 100644 .github/workflows/scan.yml create mode 100644 .github/workflows/tests.yml create mode 100644 .gitignore create mode 100644 .replit create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 app.json create mode 100644 app/.DS_Store create mode 100755 app/__init__.py create mode 100755 app/__main__.py create mode 100755 app/filter.py create mode 100755 app/models/.DS_Store create mode 100755 app/models/__init__.py create mode 100755 app/models/config.py create mode 100755 app/models/endpoint.py create mode 100755 app/models/g_classes.py create mode 100755 app/request.py create mode 100755 app/routes.py create mode 100755 app/static/.DS_Store create mode 100644 app/static/bangs/00-whoogle.json create mode 100755 app/static/build/.gitignore create mode 100755 app/static/css/dark-theme.css create mode 100755 app/static/css/error.css create mode 100755 app/static/css/header.css create mode 100755 app/static/css/input.css create mode 100755 app/static/css/light-theme.css create mode 100755 app/static/css/logo.css create mode 100755 app/static/css/main.css create mode 100755 app/static/css/search.css create mode 100755 app/static/css/variables.css create mode 100755 app/static/img/.DS_Store create mode 100755 app/static/img/favicon.ico create mode 100755 app/static/img/favicon/.DS_Store create mode 100755 app/static/img/favicon/android-chrome-192x192.png create mode 100755 app/static/img/favicon/android-chrome-256x256.png create mode 100755 app/static/img/favicon/apple-touch-icon.png create mode 100755 app/static/img/favicon/browserconfig.xml create mode 100755 app/static/img/favicon/favicon-16x16.png create mode 100755 app/static/img/favicon/favicon-32x32.png create mode 100755 app/static/img/favicon/favicon.ico create mode 100755 app/static/img/favicon/manifest.json create mode 100755 app/static/img/favicon/mstile-150x150.png create mode 100755 app/static/img/favicon/safari-pinned-tab.svg create mode 100755 app/static/img/favicon/site.webmanifest create mode 100755 app/static/img/rp/.DS_Store create mode 100755 app/static/img/rp/rpdiscordsearch.png create mode 100755 app/static/img/rp/rpgiteasearch.png create mode 100755 app/static/img/rp/rpkicksearch.png create mode 100755 app/static/img/rp/rptwitchsearch.png create mode 100755 app/static/img/rp/rpwebsearch.png create mode 100755 app/static/img/rp/rpyoutubesearch.png create mode 100755 app/static/img/rplogo.webp create mode 100755 app/static/js/autocomplete.js create mode 100755 app/static/js/controller.js create mode 100755 app/static/js/currency.js create mode 100755 app/static/js/header.js create mode 100755 app/static/js/keyboard.js create mode 100755 app/static/js/utils.js create mode 100755 app/static/settings/countries.json create mode 100755 app/static/settings/header_tabs.json create mode 100755 app/static/settings/languages.json create mode 100755 app/static/settings/themes.json create mode 100755 app/static/settings/time_periods.json create mode 100755 app/static/settings/translations.json create mode 100755 app/static/widgets/calculator.html create mode 100755 app/templates/display.html create mode 100755 app/templates/error.html create mode 100755 app/templates/footer.html create mode 100755 app/templates/header.html create mode 100755 app/templates/header2.html create mode 100755 app/templates/imageresults.html create mode 100755 app/templates/index.html create mode 100755 app/templates/logo.html create mode 100755 app/templates/opensearch.xml create mode 100755 app/templates/search.html create mode 100755 app/utils/.DS_Store create mode 100755 app/utils/__init__.py create mode 100755 app/utils/bangs.py create mode 100755 app/utils/misc.py create mode 100755 app/utils/results.py create mode 100755 app/utils/search.py create mode 100755 app/utils/session.py create mode 100755 app/utils/widgets.py create mode 100755 app/version.py create mode 100644 charts/whoogle/.helmignore create mode 100644 charts/whoogle/Chart.yaml create mode 100644 charts/whoogle/templates/NOTES.txt create mode 100644 charts/whoogle/templates/_helpers.tpl create mode 100644 charts/whoogle/templates/deployment.yaml create mode 100644 charts/whoogle/templates/hpa.yaml create mode 100644 charts/whoogle/templates/ingress.yaml create mode 100644 charts/whoogle/templates/service.yaml create mode 100644 charts/whoogle/templates/serviceaccount.yaml create mode 100644 charts/whoogle/templates/tests/test-connection.yaml create mode 100644 charts/whoogle/values.yaml create mode 100644 docker-compose-traefik.yaml create mode 100644 docker-compose.yml create mode 100644 docs/banner.png create mode 100644 docs/screenshot_desktop.png create mode 100644 docs/screenshot_mobile.png create mode 100644 heroku.yml create mode 100644 letsencrypt/acme.json create mode 100755 misc/heroku-regen.sh create mode 100644 misc/instances.txt create mode 100644 misc/replit.py create mode 100755 misc/tor/start-tor.sh create mode 100644 misc/tor/torrc create mode 100644 misc/update-translations.py create mode 100644 pyproject.toml create mode 100644 requirements.txt create mode 100755 run create mode 100644 setup.cfg create mode 100644 test/__init__.py create mode 100644 test/conftest.py create mode 100644 test/test_autocomplete.py create mode 100644 test/test_misc.py create mode 100644 test/test_results.py create mode 100644 test/test_routes.py create mode 100644 whoogle.template.env diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..51b2d84ef3bfde5b9afcd57888ea072d2136722d GIT binary patch literal 6148 zcmeHKPfNov6i>G4I)>1L!j1v213R69cqw&$0V{e?nXMgKtW8-vdl-YB^$Yn){5-yw zq~LJiO~kzi$?xU;Ns}Km$zzOhZx#(0vl(L+G(?Wd3PJNqSHlE10Xfc*XJH~k7`=y? z@%?qcwKrM7GM0tq*YziHUO3JNZ!}vQn{BIYb*)?fQI>uY6tmn5rq?*SkTMBtJqR!3 zNjbK+Pi0yJaXOi*ggBZ&$jw!pMzZweERAxN>uZPAu{vYBH=hrkL0=4phl{?LAMZPT zF+4b0EIQWC?%v7y_$hf#<*TNX1KUcr4A$@lirGz+-zOog4qe9d;!o2=rVn7LCqOR= zF+dCu1H{0ZF<>qMtGj0VrtJ~~#K6xC;Q1h+A-V=Djq2!tPL%+FEifwq9cu~95e8j@ zl}7M@aGeUMQ@JTIxK0PVFmbNIN~2C^+!P<&e7P=OxcWNGFH|_=u14yK0b*d80jzyN zY`p)^;Fnoh" +labels: bug +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Deployment Method** +- [ ] Heroku (one-click deploy) +- [ ] Docker +- [ ] `run` executable +- [ ] pip/pipx +- [ ] Other: [describe setup] + +**Version of Whoogle Search** +- [ ] Latest build from [source] (i.e. GitHub, Docker Hub, pip, etc) +- [ ] Version [version number] +- [ ] Not sure + + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..f91a033 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest a feature that would improve Whoogle +title: "[FEATURE] " +labels: enhancement +assignees: '' + +--- + + + +**Describe the feature you'd like to see added** +A short description of the feature, and what it would accomplish. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/new-theme.md b/.github/ISSUE_TEMPLATE/new-theme.md new file mode 100644 index 0000000..9653b09 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/new-theme.md @@ -0,0 +1,38 @@ +--- +name: New theme +about: Create a new theme for Whoogle +title: "[THEME] " +labels: theme +assignees: benbusby + +--- + +Use the following template to design your theme, replacing the blank spaces with the colors of your choice. + +```css +:root { + /* LIGHT THEME COLORS */ + --whoogle-logo: #______; + --whoogle-page-bg: #______; + --whoogle-element-bg: #______; + --whoogle-text: #______; + --whoogle-contrast-text: #______; + --whoogle-secondary-text: #______; + --whoogle-result-bg: #______; + --whoogle-result-title: #______; + --whoogle-result-url: #______; + --whoogle-result-visited: #______; + + /* DARK THEME COLORS */ + --whoogle-dark-logo: #______; + --whoogle-dark-page-bg: #______; + --whoogle-dark-element-bg: #______; + --whoogle-dark-text: #______; + --whoogle-dark-contrast-text: #______; + --whoogle-dark-secondary-text: #______; + --whoogle-dark-result-bg: #______; + --whoogle-dark-result-title: #______; + --whoogle-dark-result-url: #______; + --whoogle-dark-result-visited: #______; +} +``` diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md new file mode 100644 index 0000000..a1d9b21 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.md @@ -0,0 +1,10 @@ +--- +name: Question +about: Ask a (simple) question about Whoogle +title: "[QUESTION] " +labels: question +assignees: '' + +--- + +Type out your question here. Please make sure that this is a topic that isn't already covered in the README. diff --git a/.github/workflows/buildx.yml b/.github/workflows/buildx.yml new file mode 100644 index 0000000..b08826d --- /dev/null +++ b/.github/workflows/buildx.yml @@ -0,0 +1,59 @@ +name: buildx + +on: + workflow_run: + workflows: ["docker_main"] + branches: [main] + types: + - completed + push: + tags: + - '*' + +jobs: + on-success: + runs-on: ubuntu-latest + steps: + - name: Wait for tests to succeed + if: ${{ github.event.workflow_run.conclusion != 'success' && startsWith(github.ref, 'refs/tags') != true }} + run: exit 1 + - name: checkout code + uses: actions/checkout@v2 + - name: install buildx + id: buildx + uses: crazy-max/ghaction-docker-buildx@v1 + with: + version: latest + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Login to ghcr.io + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: build and push the image + if: startsWith(github.ref, 'refs/heads/main') && github.actor == 'benbusby' + run: | + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + docker buildx ls + docker buildx build --push \ + --tag benbusby/whoogle-search:latest \ + --platform linux/amd64,linux/arm64 . + docker buildx build --push \ + --tag ghcr.io/benbusby/whoogle-search:latest \ + --platform linux/amd64,linux/arm64 . + - name: build and push tag + if: startsWith(github.ref, 'refs/tags') + run: | + docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + docker buildx ls + docker buildx build --push \ + --tag benbusby/whoogle-search:${GITHUB_REF#refs/*/v}\ + --platform linux/amd64,linux/arm/v7,linux/arm64 . + docker buildx build --push \ + --tag ghcr.io/benbusby/whoogle-search:${GITHUB_REF#refs/*/v}\ + --platform linux/amd64,linux/arm/v7,linux/arm64 . diff --git a/.github/workflows/docker_main.yml b/.github/workflows/docker_main.yml new file mode 100644 index 0000000..f369f47 --- /dev/null +++ b/.github/workflows/docker_main.yml @@ -0,0 +1,28 @@ +name: docker_main + +on: + workflow_run: + workflows: ["tests"] + branches: [main] + types: + - completed + +# TODO: Needs refactoring to use reusable workflows and share w/ docker_tests +jobs: + on-success: + runs-on: ubuntu-latest + steps: + - name: checkout code + uses: actions/checkout@v2 + - name: build and test (docker) + run: | + docker build --tag whoogle-search:test . + docker run --publish 5000:5000 --detach --name whoogle-search-nocompose whoogle-search:test + sleep 15 + docker exec whoogle-search-nocompose curl -f http://localhost:5000/healthz || exit 1 + - name: build and test (docker-compose) + run: | + docker rm -f whoogle-search-nocompose + WHOOGLE_IMAGE="whoogle-search:test" docker compose up --detach + sleep 15 + docker exec whoogle-search curl -f http://localhost:5000/healthz || exit 1 diff --git a/.github/workflows/docker_tests.yml b/.github/workflows/docker_tests.yml new file mode 100644 index 0000000..fd96b9d --- /dev/null +++ b/.github/workflows/docker_tests.yml @@ -0,0 +1,26 @@ +name: docker_tests + +on: + push: + branches: main + pull_request: + branches: main + +jobs: + docker: + runs-on: ubuntu-latest + steps: + - name: checkout code + uses: actions/checkout@v2 + - name: build and test (docker) + run: | + docker build --tag whoogle-search:test . + docker run --publish 5000:5000 --detach --name whoogle-search-nocompose whoogle-search:test + sleep 15 + docker exec whoogle-search-nocompose curl -f http://localhost:5000/healthz || exit 1 + - name: build and test (docker compose) + run: | + docker rm -f whoogle-search-nocompose + WHOOGLE_IMAGE="whoogle-search:test" docker compose up --detach + sleep 15 + docker exec whoogle-search curl -f http://localhost:5000/healthz || exit 1 diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml new file mode 100644 index 0000000..80486f2 --- /dev/null +++ b/.github/workflows/pypi.yml @@ -0,0 +1,67 @@ +name: pypi + +on: + push: + branches: main + tags: v* + +jobs: + publish-test: + name: Build and publish to TestPyPI + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Python 3.9 + uses: actions/setup-python@v5 + with: + python-version: 3.9 + - name: Install pypa/build + run: >- + python -m + pip install + build + setuptools + --user + - name: Set dev timestamp + run: echo "DEV_BUILD=$(date +%s)" >> $GITHUB_ENV + - name: Build binary wheel and source tarball + run: >- + python -m + build + --sdist + --wheel + --outdir dist/ + . + - name: Publish distribution to TestPyPI + uses: pypa/gh-action-pypi-publish@master + with: + password: ${{ secrets.TEST_PYPI_API_TOKEN }} + repository_url: https://test.pypi.org/legacy/ + publish: + name: Build and publish to PyPI + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Python 3.9 + uses: actions/setup-python@v5 + with: + python-version: 3.9 + - name: Install pypa/build + run: >- + python -m + pip install + build + --user + - name: Build binary wheel and source tarball + run: >- + python -m + build + --sdist + --wheel + --outdir dist/ + . + - name: Publish distribution to PyPI + if: startsWith(github.ref, 'refs/tags') + uses: pypa/gh-action-pypi-publish@master + with: + password: ${{ secrets.PYPI_API_TOKEN }} diff --git a/.github/workflows/scan.yml b/.github/workflows/scan.yml new file mode 100644 index 0000000..8790e89 --- /dev/null +++ b/.github/workflows/scan.yml @@ -0,0 +1,19 @@ +name: scan + +on: + schedule: + - cron: '0 0 * * *' + +jobs: + scan: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build the container image + run: | + docker build --tag whoogle-search:test . + - name: Initiate grype scan + run: | + curl -sSfL https://raw.githubusercontent.com/anchore/grype/main/install.sh | sh -s -- -b . + chmod +x ./grype + ./grype whoogle-search:test --only-fixed diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..97573fc --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,17 @@ +name: tests + +on: [push, pull_request] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + - name: Install dependencies + run: pip install --upgrade pip && pip install -r requirements.txt + - name: Run tests + run: ./run test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6b3be3e --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +venv/ +.venv/ +.idea/ +__pycache__/ +*.pyc +*.pem +*.conf +*.key +config.json +test/static +flask_session/ +app/static/config +app/static/custom_config +app/static/bangs/* +!app/static/bangs/00-whoogle.json + +# pip stuff +/build/ +dist/ +*.egg-info/ + +# env +whoogle.env + +# vim +*~ +*.swp diff --git a/.replit b/.replit new file mode 100644 index 0000000..d1c9f6f --- /dev/null +++ b/.replit @@ -0,0 +1 @@ +entrypoint = "misc/replit.py" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..dcaf27c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,103 @@ +FROM python:3.12.6-alpine3.20 AS builder + +RUN apk --update add \ + build-base \ + libxml2-dev \ + libxslt-dev \ + openssl-dev \ + libffi-dev + +COPY requirements.txt . + +RUN pip install --upgrade pip +RUN pip install --prefix /install --no-warn-script-location --no-cache-dir -r requirements.txt + +FROM python:3.12.6-alpine3.20 + +RUN apk add --update --no-cache tor curl openrc libstdc++ +# git go //for obfs4proxy +# libcurl4-openssl-dev + +RUN apk -U upgrade + +# uncomment to build obfs4proxy +# RUN git clone https://gitlab.com/yawning/obfs4.git +# WORKDIR /obfs4 +# RUN go build -o obfs4proxy/obfs4proxy ./obfs4proxy +# RUN cp ./obfs4proxy/obfs4proxy /usr/bin/obfs4proxy + +ARG DOCKER_USER=whoogle +ARG DOCKER_USERID=927 +ARG config_dir=/config +RUN mkdir -p $config_dir +RUN chmod a+w $config_dir +VOLUME $config_dir + +ARG url_prefix='' +ARG username='' +ARG password='' +ARG proxyuser='' +ARG proxypass='' +ARG proxytype='' +ARG proxyloc='' +ARG whoogle_dotenv='' +ARG use_https='' +ARG whoogle_port=5000 +ARG twitter_alt='farside.link/nitter' +ARG youtube_alt='farside.link/invidious' +ARG reddit_alt='farside.link/libreddit' +ARG medium_alt='farside.link/scribe' +ARG translate_alt='farside.link/lingva' +ARG imgur_alt='farside.link/rimgo' +ARG wikipedia_alt='farside.link/wikiless' +ARG imdb_alt='farside.link/libremdb' +ARG quora_alt='farside.link/quetre' +ARG so_alt='farside.link/anonymousoverflow' + +ENV CONFIG_VOLUME=$config_dir \ + WHOOGLE_URL_PREFIX=$url_prefix \ + WHOOGLE_USER=$username \ + WHOOGLE_PASS=$password \ + WHOOGLE_PROXY_USER=$proxyuser \ + WHOOGLE_PROXY_PASS=$proxypass \ + WHOOGLE_PROXY_TYPE=$proxytype \ + WHOOGLE_PROXY_LOC=$proxyloc \ + WHOOGLE_DOTENV=$whoogle_dotenv \ + HTTPS_ONLY=$use_https \ + EXPOSE_PORT=$whoogle_port \ + WHOOGLE_ALT_TW=$twitter_alt \ + WHOOGLE_ALT_YT=$youtube_alt \ + WHOOGLE_ALT_RD=$reddit_alt \ + WHOOGLE_ALT_MD=$medium_alt \ + WHOOGLE_ALT_TL=$translate_alt \ + WHOOGLE_ALT_IMG=$imgur_alt \ + WHOOGLE_ALT_WIKI=$wikipedia_alt \ + WHOOGLE_ALT_IMDB=$imdb_alt \ + WHOOGLE_ALT_QUORA=$quora_alt \ + WHOOGLE_ALT_SO=$so_alt + +WORKDIR /whoogle + +COPY --from=builder /install /usr/local +COPY misc/tor/torrc /etc/tor/torrc +COPY misc/tor/start-tor.sh misc/tor/start-tor.sh +COPY app/ app/ +COPY run whoogle.env* ./ + +# Create user/group to run as +RUN adduser -D -g $DOCKER_USERID -u $DOCKER_USERID $DOCKER_USER + +# Fix ownership / permissions +RUN chown -R ${DOCKER_USER}:${DOCKER_USER} /whoogle /var/lib/tor + +# Allow writing symlinks to build dir +RUN chown $DOCKER_USERID:$DOCKER_USERID app/static/build + +USER $DOCKER_USER:$DOCKER_USER + +EXPOSE $EXPOSE_PORT + +HEALTHCHECK --interval=30s --timeout=5s \ + CMD curl -f http://localhost:${EXPOSE_PORT}/healthz || exit 1 + +CMD misc/tor/start-tor.sh & ./run diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c8b71df --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Ben Busby + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..c853358 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,6 @@ +graft app/static +graft app/templates +graft app/misc +include requirements.txt +recursive-include test +global-exclude *.pyc diff --git a/app.json b/app.json new file mode 100644 index 0000000..6a9b7e8 --- /dev/null +++ b/app.json @@ -0,0 +1,194 @@ +{ + "name": "Whoogle Search", + "description": "A lightweight, privacy-oriented, containerized Google search proxy for desktop/mobile that removes Javascript, AMP links, tracking, and ads/sponsored content", + "repository": "https://github.com/benbusby/whoogle-search", + "logo": "https://raw.githubusercontent.com/benbusby/whoogle-search/master/app/static/img/favicon/ms-icon-150x150.png", + "keywords": [ + "search", + "metasearch", + "flask", + "docker", + "heroku", + "adblock", + "degoogle", + "privacy" + ], + "stack": "container", + "env": { + "WHOOGLE_URL_PREFIX": { + "description": "The URL prefix to use for the whoogle instance (i.e. \"/whoogle\")", + "value": "", + "required": false + }, + "WHOOGLE_USER": { + "description": "The username for basic auth. WHOOGLE_PASS must also be set if used. Leave empty to disable.", + "value": "", + "required": false + }, + "WHOOGLE_PASS": { + "description": "The password for basic auth. WHOOGLE_USER must also be set if used. Leave empty to disable.", + "value": "", + "required": false + }, + "WHOOGLE_PROXY_USER": { + "description": "The username of the proxy server. Leave empty to disable.", + "value": "", + "required": false + }, + "WHOOGLE_PROXY_PASS": { + "description": "The password of the proxy server. Leave empty to disable.", + "value": "", + "required": false + }, + "WHOOGLE_PROXY_TYPE": { + "description": "The type of the proxy server. For example \"socks5\". Leave empty to disable.", + "value": "", + "required": false + }, + "WHOOGLE_PROXY_LOC": { + "description": "The location of the proxy server (host or ip). Leave empty to disable.", + "value": "", + "required": false + }, + "WHOOGLE_ALT_TW": { + "description": "The site to use as a replacement for twitter.com when site alternatives are enabled in the config.", + "value": "farside.link/nitter", + "required": false + }, + "WHOOGLE_ALT_YT": { + "description": "The site to use as a replacement for youtube.com when site alternatives are enabled in the config.", + "value": "farside.link/invidious", + "required": false + }, + "WHOOGLE_ALT_RD": { + "description": "The site to use as a replacement for reddit.com when site alternatives are enabled in the config.", + "value": "farside.link/libreddit", + "required": false + }, + "WHOOGLE_ALT_MD": { + "description": "The site to use as a replacement for medium.com when site alternatives are enabled in the config.", + "value": "farside.link/scribe", + "required": false + }, + "WHOOGLE_ALT_TL": { + "description": "The Google Translate alternative to use for all searches following the 'translate ___' structure.", + "value": "farside.link/lingva", + "required": false + }, + "WHOOGLE_ALT_IMG": { + "description": "The site to use as a replacement for imgur.com when site alternatives are enabled in the config.", + "value": "farside.link/rimgo", + "required": false + }, + "WHOOGLE_ALT_WIKI": { + "description": "The site to use as a replacement for wikipedia.com when site alternatives are enabled in the config.", + "value": "farside.link/wikiless", + "required": false + }, + "WHOOGLE_ALT_IMDB": { + "description": "The site to use as a replacement for imdb.com when site alternatives are enabled in the config.", + "value": "farside.link/libremdb", + "required": false + }, + "WHOOGLE_ALT_QUORA": { + "description": "The site to use as a replacement for quora.com when site alternatives are enabled in the config.", + "value": "farside.link/quetre", + "required": false + }, + "WHOOGLE_ALT_SO": { + "description": "The site to use as a replacement for stackoverflow.com when site alternatives are enabled in the config.", + "value": "farside.link/anonymousoverflow", + "required": false + }, + "WHOOGLE_MINIMAL": { + "description": "Remove everything except basic result cards from all search queries (set to 1 or leave blank)", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_COUNTRY": { + "description": "[CONFIG] The country to use for restricting search results (use values from https://raw.githubusercontent.com/benbusby/whoogle-search/develop/app/static/settings/countries.json)", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_TIME_PERIOD" : { + "description": "[CONFIG] The time period to use for restricting search results", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_LANGUAGE": { + "description": "[CONFIG] The language to use for the interface (use values from https://raw.githubusercontent.com/benbusby/whoogle-search/develop/app/static/settings/languages.json)", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_SEARCH_LANGUAGE": { + "description": "[CONFIG] The language to use for search results (use values from https://raw.githubusercontent.com/benbusby/whoogle-search/develop/app/static/settings/languages.json)", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_DISABLE": { + "description": "[CONFIG] Disable ability for client to change config (set to 1 or leave blank)", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_BLOCK": { + "description": "[CONFIG] Block websites from search results (comma-separated list)", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_THEME": { + "description": "[CONFIG] Set theme to 'dark', 'light', or 'system'", + "value": "system", + "required": false + }, + "WHOOGLE_CONFIG_SAFE": { + "description": "[CONFIG] Use safe mode for searches (set to 1 or leave blank)", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_ALTS": { + "description": "[CONFIG] Use social media alternatives (set to 1 or leave blank)", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_NEAR": { + "description": "[CONFIG] Restrict results to only those near a particular city", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_TOR": { + "description": "[CONFIG] Use Tor, if available (set to 1 or leave blank)", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_NEW_TAB": { + "description": "[CONFIG] Always open results in new tab (set to 1 or leave blank)", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_VIEW_IMAGE": { + "description": "[CONFIG] Enable View Image option (set to 1 or leave blank)", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_GET_ONLY": { + "description": "[CONFIG] Search using GET requests only (set to 1 or leave blank)", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_STYLE": { + "description": "[CONFIG] Custom CSS styling (paste in CSS or leave blank)", + "value": ":root { /* LIGHT THEME COLORS */ --whoogle-background: #d8dee9; --whoogle-accent: #2e3440; --whoogle-text: #3B4252; --whoogle-contrast-text: #eceff4; --whoogle-secondary-text: #70757a; --whoogle-result-bg: #fff; --whoogle-result-title: #4c566a; --whoogle-result-url: #81a1c1; --whoogle-result-visited: #a3be8c; /* DARK THEME COLORS */ --whoogle-dark-background: #222; --whoogle-dark-accent: #685e79; --whoogle-dark-text: #fff; --whoogle-dark-contrast-text: #000; --whoogle-dark-secondary-text: #bbb; --whoogle-dark-result-bg: #000; --whoogle-dark-result-title: #1967d2; --whoogle-dark-result-url: #4b11a8; --whoogle-dark-result-visited: #bbbbff; }", + "required": false + }, + "WHOOGLE_CONFIG_PREFERENCES_ENCRYPTED": { + "description": "[CONFIG] Encrypt preferences token, requires WHOOGLE_CONFIG_PREFERENCES_KEY to be set", + "value": "", + "required": false + }, + "WHOOGLE_CONFIG_PREFERENCES_KEY": { + "description": "[CONFIG] Key to encrypt preferences", + "value": "NEEDS_TO_BE_MODIFIED", + "required": false + } + } +} diff --git a/app/.DS_Store b/app/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d96c6e69eab2a0fe5584737032fbe8fffc0bc23a GIT binary patch literal 8196 zcmeI1-)_?|6vmIYu1i%RdI3_oi^OdulBR#fO;yGVPy`o%LeoSnB1@_!r9xGuUIPyV zFT(Ti+0LdUZ6q|%T7)gxUuOFx_OHirjz>gnymU>XCJ|}KTpM*1dlGNwc_*EuHTR(m z_Czz9B43h6_D*kAp$I4fihv@Z2q*%_KmdC-Pg=>oFI!cq2q*&oB?10^(2=>0Qr$`w zuMQL<1b|jhEfTH~2M8NI)lsTjslpWZl+goAO<5XZFlmlNf3t9b4Nk%J!Joq6ELiDCR?C#RLO z>bZ8V)wOq%%V;%8rpYoMPZw|aUoWF5aIUYX&MV(r*^LL!qA;2Ip|=nQzU!gO+t+^R zMyqkO4Bc4RPGo~t(`t63xn5h{VM}kD#-^pO2Lr36cZY+`rlvi7{N(8i`(tnwMqlKF zSo%_+dxZ&pEuWnm&jJUd}(Xo03 z5WnLlRm#jM4cBKta35A7~@XYpV7se@>p9(evix(@3)mIOi+k$94f+b=*>S2ajl~(w;83nm5Lgq ZJ3k1(r}FK-5HlOS+W*CGr;2} str: + """Tries to extract known args that explain the location in the url. If a + location is found, returns the default url with it. Otherwise, returns the + url unchanged. + + Args: + href: The full url to check. + + Returns: + str: The parsed url, or the url unchanged. + """ + # parse the url + parsed_url = parse_qs(href) + # iterate through the known parameters and try build the url + for param in MAPS_ARGS: + if param in parsed_url: + return MAPS_URL + "?q=" + parsed_url[param][0] + + # query could not be extracted returning unchanged url + return href + + +def clean_query(query: str) -> str: + """Strips the blocked site list from the query, if one is being + used. + + Args: + query: The query string + + Returns: + str: The query string without any "-site:..." filters + """ + return query[:query.find('-site:')] if '-site:' in query else query + + +def clean_css(css: str, page_url: str) -> str: + """Removes all remote URLs from a CSS string. + + Args: + css: The CSS string + + Returns: + str: The filtered CSS, with URLs proxied through Whoogle + """ + sheet = cssutils.parseString(css) + urls = cssutils.getUrls(sheet) + + for url in urls: + abs_url = get_abs_url(url, page_url) + if abs_url.startswith('data:'): + continue + css = css.replace( + url, + f'{Endpoint.element}?type=image/png&url={abs_url}' + ) + + return css + + +class Filter: + # Limit used for determining if a result is a "regular" result or a list + # type result (such as "people also asked", "related searches", etc) + RESULT_CHILD_LIMIT = 7 + + def __init__( + self, + user_key: str, + config: Config, + root_url='', + page_url='', + query='', + mobile=False) -> None: + self.soup = None + self.config = config + self.mobile = mobile + self.user_key = user_key + self.page_url = page_url + self.query = query + self.main_divs = ResultSet('') + self._elements = 0 + self._av = set() + + self.root_url = root_url[:-1] if root_url.endswith('/') else root_url + + def __getitem__(self, name): + return getattr(self, name) + + @property + def elements(self): + return self._elements + + def encrypt_path(self, path, is_element=False) -> str: + # Encrypts path to avoid plaintext results in logs + if is_element: + # Element paths are encrypted separately from text, to allow key + # regeneration once all items have been served to the user + enc_path = Fernet(self.user_key).encrypt(path.encode()).decode() + self._elements += 1 + return enc_path + + return Fernet(self.user_key).encrypt(path.encode()).decode() + + def clean(self, soup) -> BeautifulSoup: + self.soup = soup + self.main_divs = self.soup.find('div', {'id': 'main'}) + self.remove_ads() + self.remove_block_titles() + self.remove_block_url() + self.collapse_sections() + self.update_css() + self.update_styling() + self.remove_block_tabs() + + # self.main_divs is only populated for the main page of search results + # (i.e. not images/news/etc). + if self.main_divs: + for div in self.main_divs: + self.sanitize_div(div) + + for img in [_ for _ in self.soup.find_all('img') if 'src' in _.attrs]: + self.update_element_src(img, 'image/png') + + for audio in [_ for _ in self.soup.find_all('audio') if 'src' in _.attrs]: + self.update_element_src(audio, 'audio/mpeg') + audio['controls'] = '' + + for link in self.soup.find_all('a', href=True): + self.update_link(link) + self.add_favicon(link) + + if self.config.alts: + self.site_alt_swap() + + input_form = self.soup.find('form') + if input_form is not None: + input_form['method'] = 'GET' if self.config.get_only else 'POST' + # Use a relative URI for submissions + input_form['action'] = 'search' + + # Ensure no extra scripts passed through + for script in self.soup('script'): + script.decompose() + + # Update default footer and header + footer = self.soup.find('footer') + if footer: + # Remove divs that have multiple links beyond just page navigation + [_.decompose() for _ in footer.find_all('div', recursive=False) + if len(_.find_all('a', href=True)) > 3] + for link in footer.find_all('a', href=True): + link['href'] = f'{link["href"]}&preferences={self.config.preferences}' + + header = self.soup.find('header') + if header: + header.decompose() + self.remove_site_blocks(self.soup) + return self.soup + + def sanitize_div(self, div) -> None: + """Removes escaped script and iframe tags from results + + Returns: + None (The soup object is modified directly) + """ + if not div: + return + + for d in div.find_all('div', recursive=True): + d_text = d.find(text=True, recursive=False) + + # Ensure we're working with tags that contain text content + if not d_text or not d.string: + continue + + d.string = html.unescape(d_text) + div_soup = BeautifulSoup(d.string, 'html.parser') + + # Remove all valid script or iframe tags in the div + for script in div_soup.find_all('script'): + script.decompose() + + for iframe in div_soup.find_all('iframe'): + iframe.decompose() + + d.string = str(div_soup) + + def add_favicon(self, link) -> None: + """Adds icons for each returned result, using the result site's favicon + + Returns: + None (The soup object is modified directly) + """ + # Skip empty, parentless, or internal links + show_favicons = read_config_bool('WHOOGLE_SHOW_FAVICONS', True) + is_valid_link = link and link.parent and link['href'].startswith('http') + if not show_favicons or not is_valid_link: + return + + parent = link.parent + is_result_div = False + + # Check each parent to make sure that the div doesn't already have a + # favicon attached, and that the div is a result div + while parent: + p_cls = parent.attrs.get('class') or [] + if 'has-favicon' in p_cls or GClasses.scroller_class in p_cls: + return + elif GClasses.result_class_a not in p_cls: + parent = parent.parent + else: + is_result_div = True + break + + if not is_result_div: + return + + # Construct the html for inserting the icon into the parent div + parsed = urlparse.urlparse(link['href']) + favicon = self.encrypt_path( + f'{parsed.scheme}://{parsed.netloc}/favicon.ico', + is_element=True) + src = f'{self.root_url}/{Endpoint.element}?url={favicon}' + \ + '&type=image/x-icon' + html = f'' + + favicon = BeautifulSoup(html, 'html.parser') + link.parent.insert(0, favicon) + + # Update all parents to indicate that a favicon has been attached + parent = link.parent + while parent: + p_cls = parent.get('class') or [] + p_cls.append('has-favicon') + parent['class'] = p_cls + parent = parent.parent + + if GClasses.result_class_a in p_cls: + break + + def remove_site_blocks(self, soup) -> None: + if not self.config.block or not soup.body: + return + search_string = ' '.join(['-site:' + + _ for _ in self.config.block.split(',')]) + selected = soup.body.findAll(text=re.compile(search_string)) + + for result in selected: + result.string.replace_with(result.string.replace( + search_string, '')) + + def remove_ads(self) -> None: + """Removes ads found in the list of search result divs + + Returns: + None (The soup object is modified directly) + """ + if not self.main_divs: + return + + for div in [_ for _ in self.main_divs.find_all('div', recursive=True)]: + div_ads = [_ for _ in div.find_all('span', recursive=True) + if has_ad_content(_.text)] + _ = div.decompose() if len(div_ads) else None + + def remove_block_titles(self) -> None: + if not self.main_divs or not self.config.block_title: + return + block_title = re.compile(self.config.block_title) + for div in [_ for _ in self.main_divs.find_all('div', recursive=True)]: + block_divs = [_ for _ in div.find_all('h3', recursive=True) + if block_title.search(_.text) is not None] + _ = div.decompose() if len(block_divs) else None + + def remove_block_url(self) -> None: + if not self.main_divs or not self.config.block_url: + return + block_url = re.compile(self.config.block_url) + for div in [_ for _ in self.main_divs.find_all('div', recursive=True)]: + block_divs = [_ for _ in div.find_all('a', recursive=True) + if block_url.search(_.attrs['href']) is not None] + _ = div.decompose() if len(block_divs) else None + + def remove_block_tabs(self) -> None: + if self.main_divs: + for div in self.main_divs.find_all( + 'div', + attrs={'class': f'{GClasses.main_tbm_tab}'} + ): + _ = div.decompose() + else: + # when in images tab + for div in self.soup.find_all( + 'div', + attrs={'class': f'{GClasses.images_tbm_tab}'} + ): + _ = div.decompose() + + def collapse_sections(self) -> None: + """Collapses long result sections ("people also asked", "related + searches", etc) into "details" elements + + These sections are typically the only sections in the results page that + have more than ~5 child divs within a primary result div. + + Returns: + None (The soup object is modified directly) + """ + minimal_mode = read_config_bool('WHOOGLE_MINIMAL') + + def pull_child_divs(result_div: BeautifulSoup): + try: + return result_div.findChildren( + 'div', recursive=False + )[0].findChildren( + 'div', recursive=False) + except IndexError: + return [] + + if not self.main_divs: + return + #töörölni kell People also ask, + search_terms = ["People also search for", "Related searches", "Kapcsolódó keresések", "Mások ezeket keresték még"] + details_list = [] + + # Loop through results and check for the number of child divs in each + for result in self.main_divs.find_all(): + result_children = pull_child_divs(result) + if minimal_mode: + if any(f">{x} 1: + subtitle = ' (' + \ + ''.join(content[1:]) + ')' + elem.decompose() + break + + # Determine the class based on the label content + if any(term in label for term in search_terms): + details_class = 'search-recommendations' + details_attrs = {'class': details_class, 'open': 'true'} + else: + details_class = 'other-results' + details_attrs = {'class': details_class} + + + # Create the new details element to wrap around the result's + # first parent + parent = None + idx = 0 + while not parent and idx < len(result_children): + parent = result_children[idx].parent + idx += 1 + + details = BeautifulSoup(features='html.parser').new_tag('details', attrs=details_attrs) + summary = BeautifulSoup(features='html.parser').new_tag('summary', attrs={'class': "summary_div"}) + summary.string = label + + if subtitle: + soup = BeautifulSoup(subtitle, 'html.parser') + summary.append(soup) + + details.append(summary) + + if parent and not minimal_mode: + parent.wrap(details) + elif parent and minimal_mode: + # Remove parent element from document if "minimal mode" is + # enabled + parent.decompose() + + for details in details_list: + self.main_divs.append(details) + + def update_element_src(self, element: Tag, mime: str, attr='src') -> None: + """Encrypts the original src of an element and rewrites the element src + to use the "/element?src=" pass-through. + + Returns: + None (The soup element is modified directly) + + """ + src = element[attr].split(' ')[0] + + if src.startswith('//'): + src = 'https:' + src + elif src.startswith('data:'): + return + + if src.startswith(LOGO_URL): + # Re-brand with Whoogle logo + element.replace_with(BeautifulSoup( + render_template('logo.html'), + features='html.parser')) + return + elif src.startswith(G_M_LOGO_URL): + # Re-brand with single-letter Whoogle logo + element['src'] = 'static/img/favicon/apple-icon.png' + element.parent['href'] = 'home' + return + elif src.startswith(GOOG_IMG) or GOOG_STATIC in src: + element['src'] = BLANK_B64 + return + + element[attr] = f'{self.root_url}/{Endpoint.element}?url=' + ( + self.encrypt_path( + src, + is_element=True + ) + '&type=' + urlparse.quote(mime) + ) + + def update_css(self) -> None: + """Updates URLs used in inline styles to be proxied by Whoogle + using the /element endpoint. + + Returns: + None (The soup element is modified directly) + + """ + # Filter all +

+
+

0

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ diff --git a/app/templates/display.html b/app/templates/display.html new file mode 100755 index 0000000..a09a58e --- /dev/null +++ b/app/templates/display.html @@ -0,0 +1,40 @@ + + + + + {% if not search_type %} + + {% else %} + + {% endif %} + + + + + + + + + + {{ clean_query(query) }} - RaveSearch + + +{{ search_header|safe }} +{% if is_translation %} + +{% endif %} +{{ response|safe }} + +{% include 'footer.html' %} +{% if autocomplete_enabled == '1' %} + +{% endif %} + + + + diff --git a/app/templates/error.html b/app/templates/error.html new file mode 100755 index 0000000..dcaf3cf --- /dev/null +++ b/app/templates/error.html @@ -0,0 +1,106 @@ +{% if config.theme %} + {% if config.theme == 'system' %} + + {% else %} + + {% endif %} +{% else %} + +{% endif %} + + + +
+

Error

+

+ {{ error_message }} +

+
+ {% if query and translation %} +

+

{{ translation['continue-search'] }}

+ +
+

Other options:

+ +
+

+ {% endif %} + Return Home +
diff --git a/app/templates/footer.html b/app/templates/footer.html new file mode 100755 index 0000000..821a67e --- /dev/null +++ b/app/templates/footer.html @@ -0,0 +1,18 @@ + + + diff --git a/app/templates/header.html b/app/templates/header.html new file mode 100755 index 0000000..b488b39 --- /dev/null +++ b/app/templates/header.html @@ -0,0 +1,89 @@ + +
+ + + + +
+
+ {% for tab_id, tab_content in tabs.items() %} + {% if tab_content['selected'] %} + + {% else %} + + {% endif %} + {% endfor %} + + +
+
+
+
+ +
+
+ + +

+ + +
+
+ + diff --git a/app/templates/header2.html b/app/templates/header2.html new file mode 100755 index 0000000..959adc0 --- /dev/null +++ b/app/templates/header2.html @@ -0,0 +1,210 @@ +{% if mobile %} +
+
+
+ +
+
+ {% if config.preferences %} + + {% endif %} + + + + + +
+
+
+
+
+
+
+
+
+
+ {% for tab_id, tab_content in tabs.items() %} + {% if tab_content['selected'] %} + {{ tab_content['name'] }} + {% else %} + {{ tab_content['name'] }} + {% endif %} + {% endfor %} + + +
+
+
+
+
+
+
+
+{% else %} +
+ +
+
+
+
+ {% if config.preferences %} + + {% endif %} + + + + + +
+
+
+
+
+
+
+
+
+
+
+ {% for tab_id, tab_content in tabs.items() %} + {% if tab_content['selected'] %} + {{ tab_content['name'] }} + {% else %} + {{ tab_content['name'] }} + {% endif %} + {% endfor %} + + +
+
+
+
+
+
+{% endif %} +
+
+ + +
+ + +
+
+ + + + + + + + + +
+ +
+ {% set display_tooltip = true %} + {% include 'simple/categories.html' %} +
+ +
+ {% include 'simple/filters/languages.html' %} + {% include 'simple/filters/time_range.html' %} + {% include 'simple/filters/safesearch.html' %} +
+ + {% if timeout_limit %}{% endif %} + + + + +
{{- '' -}} +
+ {%- if not search_on_category_select or not display_tooltip -%} + {%- for category in categories_as_tabs -%} +
{{- '' -}} + + +
+ {%- endfor -%} + {%- if display_tooltip %}
{{ _('Click on the magnifier to perform search') }}
{% endif -%} + {%- else -%} + {%- for category in categories_as_tabs -%}{{- '\n' -}} + {{- '' -}} + {%- endfor -%} + {{- '\n' -}} + {%- endif -%} +
{{- '' -}} +
diff --git a/app/templates/imageresults.html b/app/templates/imageresults.html new file mode 100755 index 0000000..2df3a76 --- /dev/null +++ b/app/templates/imageresults.html @@ -0,0 +1,451 @@ +
+ + +
+ {% for result in results %} + + {% endfor %} +
+ +
+ +
+
+ + +
+
+ +
+
+ +
\ No newline at end of file diff --git a/app/templates/index.html b/app/templates/index.html new file mode 100755 index 0000000..31d0ccc --- /dev/null +++ b/app/templates/index.html @@ -0,0 +1,303 @@ + + + + + + + + + + + + + + {% if autocomplete_enabled == '1' %} + + {% endif %} + + + + + + + + + + RaveSearch + + +
+
+ {{ logo|safe }} +
+
+
+
+ {% if config.preferences %} + + {% endif %} + +
+ +
+ +
+ + {% if not config_disabled %} + +
+
+
+
+ + +
+ + +
+
+ + +
+ + + + + +
+ + +
+
+ + +
+ + + + + +
+ + +
+
+ + +
— {{ translation['config-alts-help'] }}
+
+
+ + +
+ +
+ + +
+
+ + +
+ +
+ + +
+
+ + {{ translation['config-css'] }}: + + +
+
+ + +
— {{ translation['config-pref-help'] }}
+ + +
+
+
+   +   + +
+
+
+
+ {% endif %} + + + +
+{% include 'footer.html' %} + + + diff --git a/app/templates/logo.html b/app/templates/logo.html new file mode 100755 index 0000000..af64c22 --- /dev/null +++ b/app/templates/logo.html @@ -0,0 +1,8 @@ + diff --git a/app/templates/opensearch.xml b/app/templates/opensearch.xml new file mode 100755 index 0000000..856a6db --- /dev/null +++ b/app/templates/opensearch.xml @@ -0,0 +1,25 @@ + + + {% if not search_type %} + RaveSearch + {% else %} + RaveSearch {{ search_name }} + {% endif %} + RaveSearch: A self-hosted, ad-free, privacy-respecting metasearch engine + UTF-8 + + data:image/png;base64,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o2z1LfT1DtJ3fSBR0oPAsyjVhIgpTc+uA6jR0VGx293AAVJYsJYMDMOgq+M6TqeD0vLimP7X6UqnpGwVLU0djAyPJUL6OCL/iUjoyM+fMwnX1FZTufsgiAwC9wN58b5yMyAihMM67W095OZlsap4ZUx3lpnlIic3m4b61nhr5QngWUyXRM35UzPz1bNzP2K19mMYOcB+lknKIkLAH6S9rZvi0pXkF8Qe+0L3CjIznTQ3thPwB+cj/Q4iP0YkMLUxPk24prYaz9a9AO2YSb1FW+xUkPZ6J+nrHaSsojimjxYRClfm09PdT1fH9ViEe4F/AS7Z3W7OnD4GzA40LBYwjJZI0dfgchEG0801N7bz5mvvMDgwPOd+wB+k+vdnqL/chMxVxhDwEpr2O0T4yY/+fobijU/V1Fbj2bkfoBkzCNnDMqk2mFIc6B/G651kw8YKbJF6EZ/Pz9u/fp/33q7G552MJd33gGdQajxuyUPN+VN4tu8zEKkHtmDmc5cVvT39WKwWVlcUMzo8zltv/o6PPqwhHIoZddUh8o+I1E8ZqgUJA1TuOgC6PoZILbAVKGMZoesG7S1d+LyTfHSyhnM1ddOVQ7PQBnxn5I03Tjq2bk28bAmm6z0A9gIvY27HLDvmIQowgMj3gZ+hlJqvon7e1dGRV58HTYOXn/s/RL6NWfS17JiHbDsi30fkF4iohY4PLBg319RW4+nSQal24DRmBe0altGQxUAd8B3gKEoZ8UqJ4y4Uamqrqdx1AKXrA6Jpp4EsTEO23EWmIcyw8Xtit1ejlEqkbjq5AnFzXrswkwX/DKSkCGMR6AVeAo4A/RCZggkgadW84azDDsw6zMf44uqnJ4D3gZfRtBMoFUr27MPiD3mYxwHsGMYdwCHgIGY4ejPm9xBQDfwSkeNK10cdbjc/+fF3k/7Q0o/xPP40mBtVm1Hqy5jnIHaw9NMtQaABOAH8FpFPEfFiGAmr700hPE185gCIG7OA5DbMQpm1mEnCDMyyCuusdnXMJLkPM5XaDnwGnEXkLCLti1Hdm044irwpdUEpJ5APFKNUKSK3RDbgZ47iwRjQjUgX0AFcR2QcMBI5tJEs/h/GMBxGKn9DKwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMC0wNC0xMlQyMDoyMDo0OSswMDowME0is3UAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjAtMDQtMTJUMjA6MjA6NDkrMDA6MDA8fwvJAAAARnRFWHRzb2Z0d2FyZQBJbWFnZU1hZ2ljayA2LjcuOC05IDIwMTQtMDUtMTIgUTE2IGh0dHA6Ly93d3cuaW1hZ2VtYWdpY2sub3Jn3IbtAAAAABh0RVh0VGh1bWI6OkRvY3VtZW50OjpQYWdlcwAxp/+7LwAAABh0RVh0VGh1bWI6OkltYWdlOjpoZWlnaHQAMTkyDwByhQAAABd0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAAxOTLTrCEIAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADE1ODY3MjI4NDlV2OpiAAAAD3RFWHRUaHVtYjo6U2l6ZQAwQkKUoj7sAAAAVnRFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vbW50bG9nL2Zhdmljb25zLzIwMjAtMDQtMTIvNTdhMDYyNGFhNzAyYzk3ZWU1YTE5MjgwYWEwNTkwZDMuaWNvLnBuZ1EXWHMAAAAASUVORK5CYII= + + + + {% if search_type %} + + {% endif %} + + + + + {{ main_url }}/search + + diff --git a/app/templates/search.html b/app/templates/search.html new file mode 100755 index 0000000..634b707 --- /dev/null +++ b/app/templates/search.html @@ -0,0 +1,15 @@ +
+ + +
diff --git a/app/utils/.DS_Store b/app/utils/.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..8942dfbe3eea7a471faa05c75ee3536ea464202a GIT binary patch literal 6148 zcmeHKQA+|r5S~@b6A64M@NuD6Ax#3Km&5E2bWsl#*PSPIblr-lNr-UI^@sW;{hnra z*CNcfh>RJS{q|v9S3nb80myK8X)EBB2FVU?W#!{Wjfb015U-M z__g|M);>6F$o*Dx-jK6Sr`?bThn@Mn;_U419i963$wR81jids9ecHAxF5m?_D^?d} z{UpS%CF%;wqc=(umEIy_F#)mJSOHdm6-Xx!`iS}4oAda93lZt3kg)K3JNyoUfJlA4w(4>Q~#fPvn3tOQG zJv+W%YB~tlAh)alEAUkTs{PPvbpM~MuKzWO8&-f7_@4@hQqSvkac%Z)U0NmGwG#aX qos4+7!H*Q|=&KmHbQRapwP9RR2hp{d8^j12{}IqKaKj4xssiu)sa3`R literal 0 HcmV?d00001 diff --git a/app/utils/__init__.py b/app/utils/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/app/utils/bangs.py b/app/utils/bangs.py new file mode 100755 index 0000000..4e7a82f --- /dev/null +++ b/app/utils/bangs.py @@ -0,0 +1,146 @@ +import json +import requests +import urllib.parse as urlparse +import os +import glob + +bangs_dict = {} +DDG_BANGS = 'https://duckduckgo.com/bang.js' + + +def load_all_bangs(ddg_bangs_file: str, ddg_bangs: dict = {}): + """Loads all the bang files in alphabetical order + Args: + ddg_bangs_file: The str path to the new DDG bangs json file + ddg_bangs: The dict of ddg bangs. If this is empty, it will load the + bangs from the file + Returns: + None + """ + global bangs_dict + ddg_bangs_file = os.path.normpath(ddg_bangs_file) + + if (bangs_dict and not ddg_bangs) or os.path.getsize(ddg_bangs_file) <= 4: + return + + bangs = {} + bangs_dir = os.path.dirname(ddg_bangs_file) + bang_files = glob.glob(os.path.join(bangs_dir, '*.json')) + + # Normalize the paths + bang_files = [os.path.normpath(f) for f in bang_files] + + # Move the ddg bangs file to the beginning + bang_files = sorted([f for f in bang_files if f != ddg_bangs_file]) + + if ddg_bangs: + bangs |= ddg_bangs + else: + bang_files.insert(0, ddg_bangs_file) + + for i, bang_file in enumerate(bang_files): + try: + bangs |= json.load(open(bang_file)) + except json.decoder.JSONDecodeError: + # Ignore decoding error only for the ddg bangs file, since this can + # occur if file is still being written + if i != 0: + raise + + bangs_dict = dict(sorted(bangs.items())) + + +def gen_bangs_json(bangs_file: str) -> None: + """Generates a json file from the DDG bangs list + + Args: + bangs_file: The str path to the new DDG bangs json file + + Returns: + None + + """ + try: + # Request full list from DDG + r = requests.get(DDG_BANGS) + r.raise_for_status() + except requests.exceptions.HTTPError as err: + raise SystemExit(err) + + # Convert to json + data = json.loads(r.text) + + # Set up a json object (with better formatting) for all available bangs + bangs_data = {} + + for row in data: + bang_command = '!' + row['t'] + bangs_data[bang_command] = { + 'url': row['u'].replace('{{{s}}}', '{}'), + 'suggestion': bang_command + ' (' + row['s'] + ')' + } + + json.dump(bangs_data, open(bangs_file, 'w')) + print('* Finished creating ddg bangs json') + load_all_bangs(bangs_file, bangs_data) + + +def suggest_bang(query: str) -> list[str]: + """Suggests bangs for a user's query + Args: + query: The search query + Returns: + list[str]: A list of bang suggestions + """ + global bangs_dict + return [bangs_dict[_]['suggestion'] for _ in bangs_dict if _.startswith(query)] + + +def resolve_bang(query: str) -> str: + """Transform's a user's query to a bang search, if an operator is found + + Args: + query: The search query + + Returns: + str: A formatted redirect for a bang search, or an empty str if there + wasn't a match or didn't contain a bang operator + + """ + + global bangs_dict + + #if ! not in query simply return (speed up processing) + if '!' not in query: + return '' + + split_query = query.strip().split(' ') + + # look for operator in query if one is found, list operator should be of + # length 1, operator should not be case-sensitive here to remove it later + operator = [ + word + for word in split_query + if word.lower() in bangs_dict + ] + if len(operator) == 1: + # get operator + operator = operator[0] + + # removes operator from query + split_query.remove(operator) + + # rebuild the query string + bang_query = ' '.join(split_query).strip() + + # Check if operator is a key in bangs and get bang if exists + bang = bangs_dict.get(operator.lower(), None) + if bang: + bang_url = bang['url'] + + if bang_query: + return bang_url.replace('{}', bang_query, 1) + else: + parsed_url = urlparse.urlparse(bang_url) + return f'{parsed_url.scheme}://{parsed_url.netloc}' + return '' diff --git a/app/utils/misc.py b/app/utils/misc.py new file mode 100755 index 0000000..ee6d62e --- /dev/null +++ b/app/utils/misc.py @@ -0,0 +1,137 @@ +import base64 +import hashlib +import contextlib +import io +import os +import re + +from requests import exceptions, get +from urllib.parse import urlparse +from bs4 import BeautifulSoup as bsoup +from cryptography.fernet import Fernet +from flask import Request + +ddg_favicon_site = 'http://icons.duckduckgo.com/ip2' + +empty_gif = base64.b64decode( + 'R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==') + +placeholder_img = base64.b64decode( + 'iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAABF0lEQVRIS8XWPw9EMBQA8Eok' \ + 'JBKrMFqMBt//GzAYLTZ/VomExPDu6uLiaPteqVynBn0/75W2Vp7nEIYhe6p1XcespmmAd7Is' \ + 'M+4URcGiKPogvMMvmIS2eN9MOMKbKWgf54SYgI4vKkTuQKJKSJErkKzUSkQHUs0lilAg7GMh' \ + 'ISoIA/hYMiKCKIA2soeowCWEMkfHtUmrXLcyGYYBfN9HF8djiaglWzNZlgVs21YisoAUaEXG' \ + 'cQTP86QIFgi7vyLzPIPjOEIEC7ANQv/4aZrAdd0TUtc1i+MYnSsMWjPp+x6CIPgJVlUVS5KE' \ + 'DKig/+wnVzM4pnzaGeHd+ENlWbI0TbVLJBtw2uMfP63wc9d2kDCWxi5Q27bsBerSJ9afJbeL' \ + 'AAAAAElFTkSuQmCC' +) + + +def fetch_favicon(url: str) -> bytes: + """Fetches a favicon using DuckDuckGo's favicon retriever + + Args: + url: The url to fetch the favicon from + Returns: + bytes - the favicon bytes, or a placeholder image if one + was not returned + """ + response = get(f'{ddg_favicon_site}/{urlparse(url).netloc}.ico') + + if response.status_code == 200 and len(response.content) > 0: + tmp_mem = io.BytesIO() + tmp_mem.write(response.content) + tmp_mem.seek(0) + + return tmp_mem.read() + return placeholder_img + + +def gen_file_hash(path: str, static_file: str) -> str: + file_contents = open(os.path.join(path, static_file), 'rb').read() + file_hash = hashlib.md5(file_contents).hexdigest()[:8] + filename_split = os.path.splitext(static_file) + + return f'{filename_split[0]}.{file_hash}{filename_split[-1]}' + + +def read_config_bool(var: str, default: bool=False) -> bool: + val = os.getenv(var, '1' if default else '0') + # user can specify one of the following values as 'true' inputs (all + # variants with upper case letters will also work): + # ('true', 't', '1', 'yes', 'y') + return val.lower() in ('true', 't', '1', 'yes', 'y') + + +def get_client_ip(r: Request) -> str: + if r.environ.get('HTTP_X_FORWARDED_FOR') is None: + return r.environ['REMOTE_ADDR'] + return r.environ['HTTP_X_FORWARDED_FOR'] + + +def get_request_url(url: str) -> str: + if os.getenv('HTTPS_ONLY', False): + return url.replace('http://', 'https://', 1) + + return url + + +def get_proxy_host_url(r: Request, default: str, root=False) -> str: + scheme = r.headers.get('X-Forwarded-Proto', 'https') + http_host = r.headers.get('X-Forwarded-Host') + + full_path = r.full_path if not root else '' + if full_path.startswith('/'): + full_path = f'/{full_path}' + + if http_host: + prefix = os.environ.get('WHOOGLE_URL_PREFIX', '') + if prefix: + prefix = f'/{re.sub("[^0-9a-zA-Z]+", "", prefix)}' + return f'{scheme}://{http_host}{prefix}{full_path}' + + return default + + +def check_for_update(version_url: str, current: str) -> int: + # Check for the latest version of Whoogle + has_update = '' + with contextlib.suppress(exceptions.ConnectionError, AttributeError): + update = bsoup(get(version_url).text, 'html.parser') + latest = update.select_one('[class="Link--primary"]').string[1:] + current = int(''.join(filter(str.isdigit, current))) + latest = int(''.join(filter(str.isdigit, latest))) + has_update = '' if current >= latest else latest + + return has_update + + +def get_abs_url(url, page_url): + # Creates a valid absolute URL using a partial or relative URL + urls = { + "//": f"https:{url}", + "/": f"{urlparse(page_url).netloc}{url}", + "./": f"{page_url}{url[2:]}" + } + for start in urls: + if url.startswith(start): + return urls[start] + + return url + + +def list_to_dict(lst: list) -> dict: + if len(lst) < 2: + return {} + return {lst[i].replace(' ', ''): lst[i+1].replace(' ', '') + for i in range(0, len(lst), 2)} + + +def encrypt_string(key: bytes, string: str) -> str: + cipher_suite = Fernet(key) + return cipher_suite.encrypt(string.encode()).decode() + + +def decrypt_string(key: bytes, string: str) -> str: + cipher_suite = Fernet(g.session_key) + return cipher_suite.decrypt(string.encode()).decode() diff --git a/app/utils/results.py b/app/utils/results.py new file mode 100755 index 0000000..c87defd --- /dev/null +++ b/app/utils/results.py @@ -0,0 +1,466 @@ +from app.models.config import Config +from app.models.endpoint import Endpoint +from app.utils.misc import list_to_dict +from bs4 import BeautifulSoup, NavigableString +import copy +from flask import current_app +import html +import os +import urllib.parse as urlparse +from urllib.parse import parse_qs +import re +import warnings + +SKIP_ARGS = ['ref_src', 'utm'] +SKIP_PREFIX = ['//www.', '//mobile.', '//m.'] +GOOG_STATIC = 'www.gstatic.com' +G_M_LOGO_URL = 'https://www.gstatic.com/m/images/icons/googleg.gif' +GOOG_IMG = '/images/branding/searchlogo/1x/googlelogo' +LOGO_URL = GOOG_IMG + '_desk' +BLANK_B64 = ('data:image/png;base64,' + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAQAAAAnOwc2AAAAD0lEQVR42mNkw' + 'AIYh7IgAAVVAAuInjI5AAAAAElFTkSuQmCC') + +# Ad keywords +BLACKLIST = [ + 'ad', 'ads', 'anuncio', 'annuncio', 'annonce', 'Anzeige', '广告', '廣告', + 'Reklama', 'Реклама', 'Anunț', '광고', 'annons', 'Annonse', 'Iklan', + '広告', 'Augl.', 'Mainos', 'Advertentie', 'إعلان', 'Գովազդ', 'विज्ञापन', + 'Reklam', 'آگهی', 'Reklāma', 'Reklaam', 'Διαφήμιση', 'מודעה', 'Hirdetés', 'Szponzorált', + 'Anúncio', 'Quảng cáo','โฆษณา', 'sponsored', 'patrocinado', 'gesponsert', 'Sponzorováno', '스폰서', 'Gesponsord' +] + +SITE_ALTS = { + 'twitter.com': os.getenv('WHOOGLE_ALT_TW', 'farside.link/nitter'), + 'youtube.com': os.getenv('WHOOGLE_ALT_YT', 'farside.link/invidious'), + 'reddit.com': os.getenv('WHOOGLE_ALT_RD', 'farside.link/libreddit'), + **dict.fromkeys([ + 'medium.com', + 'levelup.gitconnected.com' + ], os.getenv('WHOOGLE_ALT_MD', 'farside.link/scribe')), + 'imgur.com': os.getenv('WHOOGLE_ALT_IMG', 'farside.link/rimgo'), + 'wikipedia.org': os.getenv('WHOOGLE_ALT_WIKI', 'farside.link/wikiless'), + 'imdb.com': os.getenv('WHOOGLE_ALT_IMDB', 'farside.link/libremdb'), + 'quora.com': os.getenv('WHOOGLE_ALT_QUORA', 'farside.link/quetre'), + 'stackoverflow.com': os.getenv('WHOOGLE_ALT_SO', 'farside.link/anonymousoverflow') +} + +# Include custom site redirects from WHOOGLE_REDIRECTS +SITE_ALTS.update(list_to_dict(re.split(',|:', os.getenv('WHOOGLE_REDIRECTS', '')))) + + +def contains_cjko(s: str) -> bool: + """This function check whether or not a string contains Chinese, Japanese, + or Korean characters. It employs regex and uses the u escape sequence to + match any character in a set of Unicode ranges. + + Args: + s (str): string to be checked + + Returns: + bool: True if the input s contains the characters and False otherwise + """ + unicode_ranges = ('\u4e00-\u9fff' # Chinese characters + '\u3040-\u309f' # Japanese hiragana + '\u30a0-\u30ff' # Japanese katakana + '\u4e00-\u9faf' # Japanese kanji + '\uac00-\ud7af' # Korean hangul syllables + '\u1100-\u11ff' # Korean hangul jamo + ) + return bool(re.search(fr'[{unicode_ranges}]', s)) + + +def bold_search_terms(response: str, query: str) -> BeautifulSoup: + """Wraps all search terms in bold tags (). If any terms are wrapped + in quotes, only that exact phrase will be made bold. + + Args: + response: The initial response body for the query + query: The original search query + + Returns: + BeautifulSoup: modified soup object with bold items + """ + response = BeautifulSoup(response, 'html.parser') + + def replace_any_case(element: NavigableString, target_word: str) -> None: + # Replace all instances of the word, but maintaining the same case in + # the replacement + if len(element) == len(target_word): + return + + # Ensure target word is escaped for regex + target_word = re.escape(target_word) + + # Check if the word contains Chinese, Japanese, or Korean characters + if contains_cjko(target_word): + reg_pattern = fr'((?![{{}}<>-]){target_word}(?![{{}}<>-]))' + else: + reg_pattern = fr'\b((?![{{}}<>-]){target_word}(?![{{}}<>-]))\b' + + if re.match(r'.*[@_!#$%^&*()<>?/\|}{~:].*', target_word) or ( + element.parent and element.parent.name == 'style'): + return + + element.replace_with(BeautifulSoup( + re.sub(reg_pattern, + r'\1', + element, + flags=re.I), 'html.parser') + ) + + # Split all words out of query, grouping the ones wrapped in quotes + for word in re.split(r'\s+(?=[^"]*(?:"[^"]*"[^"]*)*$)', query): + word = re.sub(r'[@_!#$%^&*()<>?/\|}{~:]+', '', word) + target = response.find_all( + text=re.compile(r'' + re.escape(word), re.I)) + for nav_str in target: + replace_any_case(nav_str, word) + + return response + + +def has_ad_content(element: str) -> bool: + """Inspects an HTML element for ad related content + + Args: + element: The HTML element to inspect + + Returns: + bool: True/False for the element containing an ad + + """ + element_str = ''.join(filter(str.isalpha, element)) + return (element_str.upper() in (value.upper() for value in BLACKLIST) + or 'ⓘ' in element) + + +def get_first_link(soup: BeautifulSoup) -> str: + """Retrieves the first result link from the query response + + Args: + soup: The BeautifulSoup response body + + Returns: + str: A str link to the first result + + """ + first_link = '' + orig_details = [] + + # Temporarily remove details so we don't grab those links + for details in soup.find_all('details'): + temp_details = soup.new_tag('removed_details') + orig_details.append(details.replace_with(temp_details)) + + # Replace hrefs with only the intended destination (no "utm" type tags) + for a in soup.find_all('a', href=True): + # Return the first search result URL + if a['href'].startswith('http://') or a['href'].startswith('https://'): + first_link = a['href'] + break + + # Add the details back + for orig_detail, details in zip(orig_details, soup.find_all('removed_details')): + details.replace_with(orig_detail) + + return first_link + + +def get_site_alt(link: str, site_alts: dict = SITE_ALTS) -> str: + """Returns an alternative to a particular site, if one is configured + + Args: + link: A string result URL to check against the site_alts map + site_alts: A map of site alternatives to replace with. defaults to SITE_ALTS + + Returns: + str: An updated (or ignored) result link + + """ + # Need to replace full hostname with alternative to encapsulate + # subdomains as well + parsed_link = urlparse.urlparse(link) + + # Extract subdomain separately from the domain+tld. The subdomain + # is used for wikiless translations. + split_host = parsed_link.netloc.split('.') + subdomain = split_host[0] if len(split_host) > 2 else '' + hostname = '.'.join(split_host[-2:]) + + # The full scheme + hostname is used when comparing against the list of + # available alternative services, due to how Medium links are constructed. + # (i.e. for medium.com: "https://something.medium.com" should match, + # "https://medium.com/..." should match, but "philomedium.com" should not) + hostcomp = f'{parsed_link.scheme}://{hostname}' + + for site_key in site_alts.keys(): + site_alt = f'{parsed_link.scheme}://{site_key}' + if not hostname or site_alt not in hostcomp or not site_alts[site_key]: + continue + + # Wikipedia -> Wikiless replacements require the subdomain (if it's + # a 2-char language code) to be passed as a URL param to Wikiless + # in order to preserve the language setting. + params = '' + if 'wikipedia' in hostname and len(subdomain) == 2: + hostname = f'{subdomain}.{hostname}' + params = f'?lang={subdomain}' + elif 'medium' in hostname and len(subdomain) > 0: + hostname = f'{subdomain}.{hostname}' + + parsed_alt = urlparse.urlparse(site_alts[site_key]) + link = link.replace(hostname, site_alts[site_key]) + params + # If a scheme is specified in the alternative, this results in a + # replaced link that looks like "https://http://altservice.tld". + # In this case, we can remove the original scheme from the result + # and use the one specified for the alt. + if parsed_alt.scheme: + link = '//'.join(link.split('//')[1:]) + + for prefix in SKIP_PREFIX: + if parsed_alt.scheme: + # If a scheme is specified, remove everything before the + # first occurence of it + link = f'{parsed_alt.scheme}{link.split(parsed_alt.scheme, 1)[-1]}' + else: + # Otherwise, replace the first occurrence of the prefix + link = link.replace(prefix, '//', 1) + break + + return link + + +def filter_link_args(link: str) -> str: + """Filters out unnecessary URL args from a result link + + Args: + link: The string result link to check for extraneous URL params + + Returns: + str: An updated (or ignored) result link + + """ + parsed_link = urlparse.urlparse(link) + link_args = parse_qs(parsed_link.query) + safe_args = {} + + if len(link_args) == 0 and len(parsed_link) > 0: + return link + + for arg in link_args.keys(): + if arg in SKIP_ARGS: + continue + + safe_args[arg] = link_args[arg] + + # Remove original link query and replace with filtered args + link = link.replace(parsed_link.query, '') + if len(safe_args) > 0: + link = link + urlparse.urlencode(safe_args, doseq=True) + else: + link = link.replace('?', '') + + return link + + +def append_nojs(result: BeautifulSoup) -> None: + """Appends a no-Javascript alternative for a search result + + Args: + result: The search result to append a no-JS link to + + Returns: + None + + """ + nojs_link = BeautifulSoup(features='html.parser').new_tag('a') + nojs_link['href'] = f'{Endpoint.window}?nojs=1&location=' + result['href'] + nojs_link.string = ' NoJS Link' + result.append(nojs_link) + + +def append_anon_view(result: BeautifulSoup, config: Config) -> None: + """Appends an 'anonymous view' for a search result, where all site + contents are viewed through Whoogle as a proxy. + + Args: + result: The search result to append an anon view link to + nojs: Remove Javascript from Anonymous View + + Returns: + None + + """ + av_link = BeautifulSoup(features='html.parser').new_tag('a') + nojs = 'nojs=1' if config.nojs else 'nojs=0' + location = f'location={result["href"]}' + av_link['href'] = f'{Endpoint.window}?{nojs}&{location}' + translation = current_app.config['TRANSLATIONS'][ + config.get_localization_lang() + ] + av_link.string = f'{translation["anon-view"]}' + av_link['class'] = 'anon-view' + result.append(av_link) + +def check_currency(response: str) -> dict: + """Check whether the results have currency conversion + + Args: + response: Search query Result + + Returns: + dict: Consists of currency names and values + + """ + soup = BeautifulSoup(response, 'html.parser') + currency_link = soup.find('a', {'href': 'https://g.co/gfd'}) + if currency_link: + while 'class' not in currency_link.attrs or \ + 'ZINbbc' not in currency_link.attrs['class']: + if currency_link.parent: + currency_link = currency_link.parent + else: + return {} + currency_link = currency_link.find_all(class_='BNeawe') + currency1 = currency_link[0].text + currency2 = currency_link[1].text + currency1 = currency1.rstrip('=').split(' ', 1) + currency2 = currency2.split(' ', 1) + + # Handle differences in currency formatting + # i.e. "5.000" vs "5,000" + if currency2[0][-3] == ',': + currency1[0] = currency1[0].replace('.', '') + currency1[0] = currency1[0].replace(',', '.') + currency2[0] = currency2[0].replace('.', '') + currency2[0] = currency2[0].replace(',', '.') + else: + currency1[0] = currency1[0].replace(',', '') + currency2[0] = currency2[0].replace(',', '') + + currency1_value = float(re.sub(r'[^\d\.]', '', currency1[0])) + currency1_label = currency1[1] + + currency2_value = float(re.sub(r'[^\d\.]', '', currency2[0])) + currency2_label = currency2[1] + + return {'currencyValue1': currency1_value, + 'currencyLabel1': currency1_label, + 'currencyValue2': currency2_value, + 'currencyLabel2': currency2_label + } + return {} + + +def add_currency_card(soup: BeautifulSoup, + conversion_details: dict) -> BeautifulSoup: + """Adds the currency conversion boxes + to response of the search query + + Args: + soup: Parsed search result + conversion_details: Dictionary of currency + related information + + Returns: + BeautifulSoup + """ + # Element before which the code will be changed + # (This is the 'disclaimer' link) + element1 = soup.find('a', {'href': 'https://g.co/gfd'}) + + while 'class' not in element1.attrs or \ + 'nXE3Ob' not in element1.attrs['class']: + element1 = element1.parent + + # Creating the conversion factor + conversion_factor = (conversion_details['currencyValue1'] / + conversion_details['currencyValue2']) + + # Creating a new div for the input boxes + conversion_box = soup.new_tag('div') + conversion_box['class'] = 'conversion_box' + + # Currency to be converted from + input_box1 = soup.new_tag('input') + input_box1['id'] = 'cb1' + input_box1['type'] = 'number' + input_box1['class'] = 'cb' + input_box1['value'] = conversion_details['currencyValue1'] + input_box1['oninput'] = f'convert(1, 2, {1 / conversion_factor})' + + label_box1 = soup.new_tag('label') + label_box1['for'] = 'cb1' + label_box1['class'] = 'cb_label' + label_box1.append(conversion_details['currencyLabel1']) + + br = soup.new_tag('br') + + # Currency to be converted to + input_box2 = soup.new_tag('input') + input_box2['id'] = 'cb2' + input_box2['type'] = 'number' + input_box2['class'] = 'cb' + input_box2['value'] = conversion_details['currencyValue2'] + input_box2['oninput'] = f'convert(2, 1, {conversion_factor})' + + label_box2 = soup.new_tag('label') + label_box2['for'] = 'cb2' + label_box2['class'] = 'cb_label' + label_box2.append(conversion_details['currencyLabel2']) + + conversion_box.append(input_box1) + conversion_box.append(label_box1) + conversion_box.append(br) + conversion_box.append(input_box2) + conversion_box.append(label_box2) + + element1.insert_before(conversion_box) + return soup + + +def get_tabs_content(tabs: dict, + full_query: str, + search_type: str, + preferences: str, + translation: dict) -> dict: + """Takes the default tabs content and updates it according to the query. + + Args: + tabs: The default content for the tabs + full_query: The original search query + search_type: The current search_type + translation: The translation to get the names of the tabs + + Returns: + dict: contains the name, the href and if the tab is selected or not + """ + map_query = full_query + if '-site:' in full_query: + block_idx = full_query.index('-site:') + map_query = map_query[:block_idx] + tabs = copy.deepcopy(tabs) + for tab_id, tab_content in tabs.items(): + # update name to desired language + if tab_id in translation: + tab_content['name'] = translation[tab_id] + + # update href with query + query = full_query.replace(f'&tbm={search_type}', '') + + if tab_content['tbm'] is not None: + query = f"{query}&tbm={tab_content['tbm']}" + + if preferences: + query = f"{query}&preferences={preferences}" + + tab_content['href'] = tab_content['href'].format( + query=query, + map_query=map_query) + + # update if selected tab (default all tab is selected) + if tab_content['tbm'] == search_type: + tabs['all']['selected'] = False + tab_content['selected'] = True + return tabs diff --git a/app/utils/search.py b/app/utils/search.py new file mode 100755 index 0000000..e76eee8 --- /dev/null +++ b/app/utils/search.py @@ -0,0 +1,194 @@ +import os +import re +from typing import Any +from app.filter import Filter +from app.request import gen_query +from app.utils.misc import get_proxy_host_url +from app.utils.results import get_first_link +from bs4 import BeautifulSoup as bsoup +from cryptography.fernet import Fernet, InvalidToken +from flask import g + +TOR_BANNER = '

You are using Tor


' +CAPTCHA = 'div class="g-recaptcha"' + + +def needs_https(url: str) -> bool: + """Checks if the current instance needs to be upgraded to HTTPS + + Note that all Heroku instances are available by default over HTTPS, but + do not automatically set up a redirect when visited over HTTP. + + Args: + url: The instance url + + Returns: + bool: True/False representing the need to upgrade + + """ + https_only = bool(os.getenv('HTTPS_ONLY', 0)) + is_heroku = url.endswith('.herokuapp.com') + is_http = url.startswith('http://') + + return (is_heroku and is_http) or (https_only and is_http) + + +def has_captcha(results: str) -> bool: + """Checks to see if the search results are blocked by a captcha + + Args: + results: The search page html as a string + + Returns: + bool: True/False indicating if a captcha element was found + + """ + return CAPTCHA in results + + +class Search: + """Search query preprocessor - used before submitting the query or + redirecting to another site + + Attributes: + request: the incoming flask request + config: the current user config settings + session_key: the flask user fernet key + """ + def __init__(self, request, config, session_key, cookies_disabled=False): + method = request.method + self.request = request + self.request_params = request.args if method == 'GET' else request.form + self.user_agent = request.headers.get('User-Agent') + self.feeling_lucky = False + self.config = config + self.session_key = session_key + self.query = '' + self.widget = '' + self.view_image = True + self.cookies_disabled = cookies_disabled + self.search_type = self.request_params.get( + 'tbm') if 'tbm' in self.request_params else '' + + def __getitem__(self, name) -> Any: + return getattr(self, name) + + def __setitem__(self, name, value) -> None: + return setattr(self, name, value) + + def __delitem__(self, name) -> None: + return delattr(self, name) + + def __contains__(self, name) -> bool: + return hasattr(self, name) + + def new_search_query(self) -> str: + """Parses a plaintext query into a valid string for submission + + Also decrypts the query string, if encrypted (in the case of + paginated results). + + Returns: + str: A valid query string + + """ + q = self.request_params.get('q') + + if q is None or len(q) == 0: + return '' + else: + # Attempt to decrypt if this is an internal link + try: + q = Fernet(self.session_key).decrypt(q.encode()).decode() + except InvalidToken: + pass + + # Strip '!' for "feeling lucky" queries + if match := re.search(r"(^|\s)!($|\s)", q): + self.feeling_lucky = True + start, end = match.span() + self.query = " ".join([seg for seg in [q[:start], q[end:]] if seg]) + else: + self.feeling_lucky = False + self.query = q + + # Check for possible widgets + self.widget = "ip" if re.search("([^a-z0-9]|^)my *[^a-z0-9] *(ip|internet protocol)" + + "($|( *[^a-z0-9] *(((addres|address|adres|" + + "adress)|a)? *$)))", self.query.lower()) else self.widget + self.widget = 'calculator' if re.search( + r"\bcalculator\b|\bcalc\b|\bcalclator\b|\bmath\b", + self.query.lower()) else self.widget + return self.query + + def generate_response(self) -> str: + """Generates a response for the user's query + + Returns: + str: A string response to the search query, in the form of a URL + or string representation of HTML content. + + """ + mobile = 'Android' in self.user_agent or 'iPhone' in self.user_agent + # reconstruct url if X-Forwarded-Host header present + root_url = get_proxy_host_url( + self.request, + self.request.url_root, + root=True) + + content_filter = Filter(self.session_key, + root_url=root_url, + mobile=mobile, + config=self.config, + query=self.query) + full_query = gen_query(self.query, + self.request_params, + self.config) + self.full_query = full_query + + # force mobile search when view image is true and + # the request is not already made by a mobile + view_image = ('tbm=isch' in full_query + # and self.config.view_image + #and not g.user_request.mobile + ) + + get_body = g.user_request.send(query=full_query, + force_mobile=view_image, + user_agent=self.user_agent) + + + # Produce cleanable html soup from response + get_body_safed = get_body.text.replace("<","andlt;").replace(">","andgt;") + html_soup = bsoup(get_body_safed, 'html.parser') + + # Replace current soup if view_image is active + if view_image: + html_soup = content_filter.view_image(html_soup) + + # Indicate whether or not a Tor connection is active + if g.user_request.tor_valid: + html_soup.insert(0, bsoup(TOR_BANNER, 'html.parser')) + + formatted_results = content_filter.clean(html_soup) + if self.feeling_lucky: + if lucky_link := get_first_link(formatted_results): + return lucky_link + + # Fall through to regular search if unable to find link + self.feeling_lucky = False + + # Append user config to all search links, if available + param_str = ''.join('&{}={}'.format(k, v) + for k, v in + self.request_params.to_dict(flat=True).items() + if self.config.is_safe_key(k)) + for link in formatted_results.find_all('a', href=True): + link['rel'] = "nofollow noopener noreferrer" + if 'search?' not in link['href'] or link['href'].index( + 'search?') > 1: + continue + link['href'] += param_str + + return str(formatted_results) + diff --git a/app/utils/session.py b/app/utils/session.py new file mode 100755 index 0000000..5bac42b --- /dev/null +++ b/app/utils/session.py @@ -0,0 +1,39 @@ +from cryptography.fernet import Fernet +from flask import current_app as app + +REQUIRED_SESSION_VALUES = ['uuid', 'config', 'key', 'auth'] + + +def generate_key() -> bytes: + """Generates a key for encrypting searches and element URLs + + Args: + cookies_disabled: Flag for whether or not cookies are disabled by the + user. If so, the user can only use the default key + generated on app init for queries. + + Returns: + str: A unique Fernet key + + """ + # Generate/regenerate unique key per user + return Fernet.generate_key() + + +def valid_user_session(session: dict) -> bool: + """Validates the current user session + + Args: + session: The current Flask user session + + Returns: + bool: True/False indicating that all required session values are + available + + """ + # Generate secret key for user if unavailable + for value in REQUIRED_SESSION_VALUES: + if value not in session: + return False + + return True diff --git a/app/utils/widgets.py b/app/utils/widgets.py new file mode 100755 index 0000000..156ada9 --- /dev/null +++ b/app/utils/widgets.py @@ -0,0 +1,71 @@ +from pathlib import Path +from bs4 import BeautifulSoup + + +# root +BASE_DIR = Path(__file__).parent.parent.parent + +def add_ip_card(html_soup: BeautifulSoup, ip: str) -> BeautifulSoup: + """Adds the client's IP address to the search results + if query contains keywords + + Args: + html_soup: The parsed search result containing the keywords + ip: ip address of the client + + Returns: + BeautifulSoup + + """ + main_div = html_soup.select_one('#main') + if main_div: + # HTML IP card tag + ip_tag = html_soup.new_tag('div') + ip_tag['class'] = 'ZINbbc xpd O9g5cc uUPGi' + + # For IP Address html tag + ip_address = html_soup.new_tag('div') + ip_address['class'] = 'kCrYT ip-address-div' + ip_address.string = ip + + # Text below the IP address + ip_text = html_soup.new_tag('div') + ip_text.string = 'Your public IP address' + ip_text['class'] = 'kCrYT ip-text-div' + + # Adding all the above html tags to the IP card + ip_tag.append(ip_address) + ip_tag.append(ip_text) + + # Insert the element at the top of the result list + main_div.insert_before(ip_tag) + return html_soup + +def add_calculator_card(html_soup: BeautifulSoup) -> BeautifulSoup: + """Adds the a calculator widget to the search results + if query contains keywords + + Args: + html_soup: The parsed search result containing the keywords + + Returns: + BeautifulSoup + """ + main_div = html_soup.select_one('#main') + if main_div: + # absolute path + widget_file = open(BASE_DIR / 'app/static/widgets/calculator.html', encoding="utf8") + widget_tag = html_soup.new_tag('div') + widget_tag['class'] = 'ZINbbc xpd O9g5cc uUPGi' + widget_tag['id'] = 'calculator-wrapper' + calculator_text = html_soup.new_tag('div') + calculator_text['class'] = 'kCrYT ip-address-div' + calculator_text.string = 'Calculator' + calculator_widget = html_soup.new_tag('div') + calculator_widget.append(BeautifulSoup(widget_file, 'html.parser')) + calculator_widget['class'] = 'kCrYT ip-text-div' + widget_tag.append(calculator_text) + widget_tag.append(calculator_widget) + main_div.insert_before(widget_tag) + widget_file.close() + return html_soup diff --git a/app/version.py b/app/version.py new file mode 100755 index 0000000..31eead6 --- /dev/null +++ b/app/version.py @@ -0,0 +1,7 @@ +import os + +optional_dev_tag = '' +if os.getenv('DEV_BUILD'): + optional_dev_tag = '.dev' + os.getenv('DEV_BUILD') + +__version__ = '0.9.1' + optional_dev_tag diff --git a/charts/whoogle/.helmignore b/charts/whoogle/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/charts/whoogle/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/whoogle/Chart.yaml b/charts/whoogle/Chart.yaml new file mode 100644 index 0000000..8ce2224 --- /dev/null +++ b/charts/whoogle/Chart.yaml @@ -0,0 +1,23 @@ +apiVersion: v2 +name: whoogle +description: A self hosted search engine on Kubernetes +type: application +version: 0.1.0 +appVersion: 0.9.1 + +icon: https://github.com/benbusby/whoogle-search/raw/main/app/static/img/favicon/favicon-96x96.png + +sources: + - https://github.com/benbusby/whoogle-search + - https://gitlab.com/benbusby/whoogle-search + - https://gogs.benbusby.com/benbusby/whoogle-search + +keywords: + - whoogle + - degoogle + - search + - google + - search-engine + - privacy + - tor + - python diff --git a/charts/whoogle/templates/NOTES.txt b/charts/whoogle/templates/NOTES.txt new file mode 100644 index 0000000..bbbf070 --- /dev/null +++ b/charts/whoogle/templates/NOTES.txt @@ -0,0 +1,22 @@ +1. Get the application URL by running these commands: +{{- if .Values.ingress.enabled }} +{{- range $host := .Values.ingress.hosts }} + {{- range .paths }} + http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }} + {{- end }} +{{- end }} +{{- else if contains "NodePort" .Values.service.type }} + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "whoogle.fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT +{{- else if contains "LoadBalancer" .Values.service.type }} + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "whoogle.fullname" . }}' + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "whoogle.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") + echo http://$SERVICE_IP:{{ .Values.service.port }} +{{- else if contains "ClusterIP" .Values.service.type }} + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "whoogle.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") + export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}") + echo "Visit http://127.0.0.1:8080 to use your application" + kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT +{{- end }} diff --git a/charts/whoogle/templates/_helpers.tpl b/charts/whoogle/templates/_helpers.tpl new file mode 100644 index 0000000..4b51048 --- /dev/null +++ b/charts/whoogle/templates/_helpers.tpl @@ -0,0 +1,62 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "whoogle.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "whoogle.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "whoogle.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "whoogle.labels" -}} +helm.sh/chart: {{ include "whoogle.chart" . }} +{{ include "whoogle.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "whoogle.selectorLabels" -}} +app.kubernetes.io/name: {{ include "whoogle.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "whoogle.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "whoogle.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/charts/whoogle/templates/deployment.yaml b/charts/whoogle/templates/deployment.yaml new file mode 100644 index 0000000..3da9f1e --- /dev/null +++ b/charts/whoogle/templates/deployment.yaml @@ -0,0 +1,82 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "whoogle.fullname" . }} + labels: + {{- include "whoogle.labels" . | nindent 4 }} +spec: + {{- if not .Values.autoscaling.enabled }} + replicas: {{ .Values.replicaCount }} + {{- end }} + selector: + matchLabels: + {{- include "whoogle.selectorLabels" . | nindent 6 }} + template: + metadata: + {{- with .Values.podAnnotations }} + annotations: + {{- toYaml . | nindent 8 }} + {{- end }} + labels: + {{- include "whoogle.selectorLabels" . | nindent 8 }} + spec: + {{- with .Values.image.pullSecrets }} + imagePullSecrets: + {{- range .}} + - name: {{ . }} + {{- end }} + {{- end }} + serviceAccountName: {{ include "whoogle.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.podSecurityContext | nindent 8 }} + containers: + - name: whoogle + securityContext: + {{- toYaml .Values.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- with .Values.conf }} + env: + {{- range $k,$v := . }} + {{- if $v }} + - name: {{ $k }} + value: {{ tpl (toString $v) $ | quote }} + {{- end }} + {{- end }} + {{- end }} + ports: + - name: http + containerPort: {{ default 5000 .Values.conf.EXPOSE_PORT }} + protocol: TCP + livenessProbe: + httpGet: + path: / + port: http + {{- if and .Values.conf.WHOOGLE_USER .Values.conf.WHOOGLE_PASS }} + httpHeaders: + - name: Authorization + value: Basic {{ b64enc (printf "%s:%s" .Values.conf.WHOOGLE_USER .Values.conf.WHOOGLE_PASS) }} + {{- end }} + readinessProbe: + httpGet: + path: / + port: http + {{- if and .Values.conf.WHOOGLE_USER .Values.conf.WHOOGLE_PASS }} + httpHeaders: + - name: Authorization + value: Basic {{ b64enc (printf "%s:%s" .Values.conf.WHOOGLE_USER .Values.conf.WHOOGLE_PASS) }} + {{- end }} + resources: + {{- toYaml .Values.resources | nindent 12 }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/charts/whoogle/templates/hpa.yaml b/charts/whoogle/templates/hpa.yaml new file mode 100644 index 0000000..74be742 --- /dev/null +++ b/charts/whoogle/templates/hpa.yaml @@ -0,0 +1,28 @@ +{{- if .Values.autoscaling.enabled }} +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: {{ include "whoogle.fullname" . }} + labels: + {{- include "whoogle.labels" . | nindent 4 }} +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: {{ include "whoogle.fullname" . }} + minReplicas: {{ .Values.autoscaling.minReplicas }} + maxReplicas: {{ .Values.autoscaling.maxReplicas }} + metrics: + {{- if .Values.autoscaling.targetCPUUtilizationPercentage }} + - type: Resource + resource: + name: cpu + targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }} + {{- end }} + {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }} + - type: Resource + resource: + name: memory + targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }} + {{- end }} +{{- end }} diff --git a/charts/whoogle/templates/ingress.yaml b/charts/whoogle/templates/ingress.yaml new file mode 100644 index 0000000..7fec7e9 --- /dev/null +++ b/charts/whoogle/templates/ingress.yaml @@ -0,0 +1,61 @@ +{{- if .Values.ingress.enabled -}} +{{- $fullName := include "whoogle.fullname" . -}} +{{- $svcPort := .Values.service.port -}} +{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }} + {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }} + {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}} + {{- end }} +{{- end }} +{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1 +{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}} +apiVersion: networking.k8s.io/v1beta1 +{{- else -}} +apiVersion: extensions/v1beta1 +{{- end }} +kind: Ingress +metadata: + name: {{ $fullName }} + labels: + {{- include "whoogle.labels" . | nindent 4 }} + {{- with .Values.ingress.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }} + ingressClassName: {{ .Values.ingress.className }} + {{- end }} + {{- if .Values.ingress.tls }} + tls: + {{- range .Values.ingress.tls }} + - hosts: + {{- range .hosts }} + - {{ . | quote }} + {{- end }} + secretName: {{ .secretName }} + {{- end }} + {{- end }} + rules: + {{- range .Values.ingress.hosts }} + - host: {{ .host | quote }} + http: + paths: + {{- range .paths }} + - path: {{ .path }} + {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }} + pathType: {{ .pathType }} + {{- end }} + backend: + {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }} + service: + name: {{ $fullName }} + port: + number: {{ $svcPort }} + {{- else }} + serviceName: {{ $fullName }} + servicePort: {{ $svcPort }} + {{- end }} + {{- end }} + {{- end }} +{{- end }} diff --git a/charts/whoogle/templates/service.yaml b/charts/whoogle/templates/service.yaml new file mode 100644 index 0000000..96521c4 --- /dev/null +++ b/charts/whoogle/templates/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "whoogle.fullname" . }} + labels: + {{- include "whoogle.labels" . | nindent 4 }} +spec: + type: {{ .Values.service.type }} + ports: + - port: {{ .Values.service.port }} + targetPort: http + protocol: TCP + name: http + selector: + {{- include "whoogle.selectorLabels" . | nindent 4 }} diff --git a/charts/whoogle/templates/serviceaccount.yaml b/charts/whoogle/templates/serviceaccount.yaml new file mode 100644 index 0000000..de1398a --- /dev/null +++ b/charts/whoogle/templates/serviceaccount.yaml @@ -0,0 +1,12 @@ +{{- if .Values.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "whoogle.serviceAccountName" . }} + labels: + {{- include "whoogle.labels" . | nindent 4 }} + {{- with .Values.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/charts/whoogle/templates/tests/test-connection.yaml b/charts/whoogle/templates/tests/test-connection.yaml new file mode 100644 index 0000000..bc06188 --- /dev/null +++ b/charts/whoogle/templates/tests/test-connection.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Pod +metadata: + name: "{{ include "whoogle.fullname" . }}-test-connection" + labels: + {{- include "whoogle.labels" . | nindent 4 }} + annotations: + "helm.sh/hook": test +spec: + containers: + - name: wget + image: busybox + command: ['wget'] + args: ['{{ include "whoogle.fullname" . }}:{{ .Values.service.port }}'] + restartPolicy: Never diff --git a/charts/whoogle/values.yaml b/charts/whoogle/values.yaml new file mode 100644 index 0000000..54beded --- /dev/null +++ b/charts/whoogle/values.yaml @@ -0,0 +1,115 @@ +# Default values for whoogle. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +nameOverride: "" +fullnameOverride: "" + +replicaCount: 1 +image: + repository: benbusby/whoogle-search + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: "" + pullSecrets: [] + # - my-image-pull-secret + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +conf: {} + # WHOOGLE_URL_PREFIX: "" # The URL prefix to use for the whoogle instance (i.e. "/whoogle") + # WHOOGLE_DOTENV: "" # Load environment variables in whoogle.env + # WHOOGLE_USER: "" # The username for basic auth. WHOOGLE_PASS must also be set if used. + # WHOOGLE_PASS: "" # The password for basic auth. WHOOGLE_USER must also be set if used. + # WHOOGLE_PROXY_USER: "" # The username of the proxy server. + # WHOOGLE_PROXY_PASS: "" # The password of the proxy server. + # WHOOGLE_PROXY_TYPE: "" # The type of the proxy server. Can be "socks5", "socks4", or "http". + # WHOOGLE_PROXY_LOC: "" # The location of the proxy server (host or ip). + # EXPOSE_PORT: "" # The port where Whoogle will be exposed. (default 5000) + # HTTPS_ONLY: "" # Enforce HTTPS. (See https://github.com/benbusby/whoogle-search#https-enforcement) + # WHOOGLE_ALT_TW: "" # The twitter.com alternative to use when site alternatives are enabled in the config. + # WHOOGLE_ALT_YT: "" # The youtube.com alternative to use when site alternatives are enabled in the config. + # WHOOGLE_ALT_RD: "" # The reddit.com alternative to use when site alternatives are enabled in the config. + # WHOOGLE_ALT_TL: "" # The Google Translate alternative to use. This is used for all "translate ____" searches. + # WHOOGLE_ALT_MD: "" # The medium.com alternative to use when site alternatives are enabled in the config. + # WHOOGLE_ALT_IMG: "" # The imgur.com alternative to use when site alternatives are enabled in the config. + # WHOOGLE_ALT_WIKI: "" # The wikipedia.com alternative to use when site alternatives are enabled in the config. + # WHOOGLE_ALT_IMDB: "" # The imdb.com alternative to use. Set to "" to continue using imdb.com when site alternatives are enabled. + # WHOOGLE_ALT_QUORA: "" # The quora.com alternative to use. Set to "" to continue using quora.com when site alternatives are enabled. + # WHOOGLE_ALT_SO: "" # The stackoverflow.com alternative to use. Set to "" to continue using stackoverflow.com when site alternatives are enabled. + # WHOOGLE_AUTOCOMPLETE: "" # Controls visibility of autocomplete/search suggestions. Default on -- use '0' to disable + # WHOOGLE_MINIMAL: "" # Remove everything except basic result cards from all search queries. + + # WHOOGLE_CONFIG_DISABLE: "" # Hide config from UI and disallow changes to config by client + # WHOOGLE_CONFIG_COUNTRY: "" # Filter results by hosting country + # WHOOGLE_CONFIG_LANGUAGE: "" # Set interface language + # WHOOGLE_CONFIG_SEARCH_LANGUAGE: "" # Set search result language + # WHOOGLE_CONFIG_BLOCK: "" # Block websites from search results (use comma-separated list) + # WHOOGLE_CONFIG_THEME: "" # Set theme mode (light, dark, or system) + # WHOOGLE_CONFIG_SAFE: "" # Enable safe searches + # WHOOGLE_CONFIG_ALTS: "" # Use social media site alternatives (nitter, invidious, etc) + # WHOOGLE_CONFIG_NEAR: "" # Restrict results to only those near a particular city + # WHOOGLE_CONFIG_TOR: "" # Use Tor routing (if available) + # WHOOGLE_CONFIG_NEW_TAB: "" # Always open results in new tab + # WHOOGLE_CONFIG_VIEW_IMAGE: "" # Enable View Image option + # WHOOGLE_CONFIG_GET_ONLY: "" # Search using GET requests only + # WHOOGLE_CONFIG_URL: "" # The root url of the instance (https:///) + # WHOOGLE_CONFIG_STYLE: "" # The custom CSS to use for styling (should be single line) + # WHOOGLE_CONFIG_PREFERENCES_ENCRYPTED: "" # Encrypt preferences token, requires key + # WHOOGLE_CONFIG_PREFERENCES_KEY: "" # Key to encrypt preferences in URL (REQUIRED to show url) + +podAnnotations: {} +podSecurityContext: {} + # fsGroup: 2000 +securityContext: + runAsUser: 0 + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + +service: + type: ClusterIP + port: 5000 + +ingress: + enabled: false + className: "" + annotations: {} + # kubernetes.io/ingress.class: nginx + # kubernetes.io/tls-acme: "true" + hosts: + - host: whoogle.example.com + paths: + - path: / + pathType: ImplementationSpecific + tls: [] + # - secretName: chart-example-tls + # hosts: + # - whoogle.example.com + +resources: {} + # requests: + # cpu: 100m + # memory: 128Mi + # limits: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} +tolerations: [] +affinity: {} diff --git a/docker-compose-traefik.yaml b/docker-compose-traefik.yaml new file mode 100644 index 0000000..4cfb588 --- /dev/null +++ b/docker-compose-traefik.yaml @@ -0,0 +1,81 @@ +# can't use mem_limit in a 3.x docker-compose file in non swarm mode +# see https://github.com/docker/compose/issues/4513 +version: "2.4" + +services: + traefik: + image: "traefik:v2.7" + container_name: "traefik" + command: + #- "--log.level=DEBUG" + - "--api.insecure=true" + - "--providers.docker=true" + - "--providers.docker.exposedbydefault=false" + - "--entrypoints.websecure.address=:443" + - "--certificatesresolvers.myresolver.acme.tlschallenge=true" + #- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory" + - "--certificatesresolvers.myresolver.acme.email=change@domain.name" + - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" + ports: + - "443:443" + - "8080:8080" + volumes: + - "./letsencrypt:/letsencrypt" + - "/var/run/docker.sock:/var/run/docker.sock:ro" + + whoogle-search: + labels: + - "traefik.enable=true" + - "traefik.http.routers.whoami.rule=Host(`change.host.name`)" + - "traefik.http.routers.whoami.entrypoints=websecure" + - "traefik.http.routers.whoami.tls.certresolver=myresolver" + - "traefik.http.services.whoogle-search.loadbalancer.server.port=5000" + image: ${WHOOGLE_IMAGE:-benbusby/whoogle-search} + container_name: whoogle-search + restart: unless-stopped + pids_limit: 50 + mem_limit: 256mb + memswap_limit: 256mb + # user debian-tor from tor package + user: whoogle + security_opt: + - no-new-privileges + cap_drop: + - ALL + tmpfs: + - /config/:size=10M,uid=927,gid=927,mode=1700 + - /var/lib/tor/:size=15M,uid=927,gid=927,mode=1700 + - /run/tor/:size=1M,uid=927,gid=927,mode=1700 + environment: # Uncomment to configure environment variables + # Basic auth configuration, uncomment to enable + #- WHOOGLE_USER= + #- WHOOGLE_PASS= + # Proxy configuration, uncomment to enable + #- WHOOGLE_PROXY_USER= + #- WHOOGLE_PROXY_PASS= + #- WHOOGLE_PROXY_TYPE= + # Site alternative configurations, uncomment to enable + # Note: If not set, the feature will still be available + # with default values. + #- WHOOGLE_ALT_TW=farside.link/nitter + #- WHOOGLE_ALT_YT=farside.link/invidious + #- WHOOGLE_ALT_IG=farside.link/bibliogram/u + #- WHOOGLE_ALT_RD=farside.link/libreddit + #- WHOOGLE_ALT_MD=farside.link/scribe + #- WHOOGLE_ALT_TL=farside.link/lingva + #- WHOOGLE_ALT_IMG=farside.link/rimgo + #- WHOOGLE_ALT_WIKI=farside.link/wikiless + #- WHOOGLE_ALT_IMDB=farside.link/libremdb + #- WHOOGLE_ALT_QUORA=farside.link/quetre + #- WHOOGLE_ALT_SO=farside.link/anonymousoverflow + # - WHOOGLE_CONFIG_DISABLE=1 + # - WHOOGLE_CONFIG_SEARCH_LANGUAGE=lang_en + # - WHOOGLE_CONFIG_GET_ONLY=1 + # - WHOOGLE_CONFIG_COUNTRY=FR + # - WHOOGLE_CONFIG_PREFERENCES_ENCRYPTED=1 + # - WHOOGLE_CONFIG_PREFERENCES_KEY="NEEDS_TO_BE_MODIFIED" + #env_file: # Alternatively, load variables from whoogle.env + #- whoogle.env + ports: + - 8000:5000 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..0a693e6 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,49 @@ +# can't use mem_limit in a 3.x docker-compose file in non swarm mode +# see https://github.com/docker/compose/issues/4513 +version: "2.4" + +services: + whoogle-search: + image: ${WHOOGLE_IMAGE:-benbusby/whoogle-search} + container_name: whoogle-search + restart: unless-stopped + pids_limit: 50 + mem_limit: 256mb + memswap_limit: 256mb + # user debian-tor from tor package + user: whoogle + security_opt: + - no-new-privileges + cap_drop: + - ALL + tmpfs: + - /config/:size=10M,uid=927,gid=927,mode=1700 + - /var/lib/tor/:size=15M,uid=927,gid=927,mode=1700 + - /run/tor/:size=1M,uid=927,gid=927,mode=1700 + #environment: # Uncomment to configure environment variables + # Basic auth configuration, uncomment to enable + #- WHOOGLE_USER= + #- WHOOGLE_PASS= + # Proxy configuration, uncomment to enable + #- WHOOGLE_PROXY_USER= + #- WHOOGLE_PROXY_PASS= + #- WHOOGLE_PROXY_TYPE= + # Site alternative configurations, uncomment to enable + # Note: If not set, the feature will still be available + # with default values. + #- WHOOGLE_ALT_TW=farside.link/nitter + #- WHOOGLE_ALT_YT=farside.link/invidious + #- WHOOGLE_ALT_IG=farside.link/bibliogram/u + #- WHOOGLE_ALT_RD=farside.link/libreddit + #- WHOOGLE_ALT_MD=farside.link/scribe + #- WHOOGLE_ALT_TL=farside.link/lingva + #- WHOOGLE_ALT_IMG=farside.link/rimgo + #- WHOOGLE_ALT_WIKI=farside.link/wikiless + #- WHOOGLE_ALT_IMDB=farside.link/libremdb + #- WHOOGLE_ALT_QUORA=farside.link/quetre + #- WHOOGLE_ALT_SO=farside.link/anonymousoverflow + #env_file: # Alternatively, load variables from whoogle.env + #- whoogle.env + ports: + - 5000:5000 diff --git a/docs/banner.png b/docs/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..2b895c194e82ac393c562059a66ae4838dd9714a GIT binary patch literal 23518 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

-L3;aN;H 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

&z!*2n}G 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 literal 0 HcmV?d00001 diff --git a/docs/screenshot_mobile.png b/docs/screenshot_mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6e3f05893335ba10458c639f0731d9608453b3 GIT binary patch literal 62670 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

v~>K9l?4g3$I% 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 H`MduE$BeQe literal 0 HcmV?d00001 diff --git a/heroku.yml b/heroku.yml new file mode 100644 index 0000000..cfc938e --- /dev/null +++ b/heroku.yml @@ -0,0 +1,4 @@ +build: + docker: + web: Dockerfile + diff --git a/letsencrypt/acme.json b/letsencrypt/acme.json new file mode 100644 index 0000000..e69de29 diff --git a/misc/heroku-regen.sh b/misc/heroku-regen.sh new file mode 100755 index 0000000..198edcf --- /dev/null +++ b/misc/heroku-regen.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# Assumes this is being executed from a session that has already logged +# into Heroku with "heroku login -i" beforehand. +# +# You can set this up to run every night when you aren't using the +# instance with a cronjob. For example: +# 0 3 * * * /home/pi/whoogle-search/config/heroku-regen.sh + +HEROKU_CLI_SITE="https://devcenter.heroku.com/articles/heroku-cli" + +if ! [[ -x "$(command -v heroku)" ]]; then + echo "Must have heroku cli installed: $HEROKU_CLI_SITE" + exit 1 +fi + +cd "$(builtin cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/../" + +if [[ $# -ne 1 ]]; then + echo -e "Must provide the name of the Whoogle instance to regenerate" + exit 1 +fi + +APP_NAME="$1" + +heroku apps:destroy "$APP_NAME" --confirm "$APP_NAME" +heroku apps:create "$APP_NAME" +heroku container:login +heroku container:push web +heroku container:release web diff --git a/misc/instances.txt b/misc/instances.txt new file mode 100644 index 0000000..228b0c5 --- /dev/null +++ b/misc/instances.txt @@ -0,0 +1,24 @@ +https://search.albony.xyz +https://search.garudalinux.org +https://search.dr460nf1r3.org +https://search.nezumi.party +https://s.tokhmi.xyz +https://search.sethforprivacy.com +https://whoogle.dcs0.hu +https://whoogle.lunar.icu +https://gowogle.voring.me +https://whoogle.privacydev.net +https://whoogle.hostux.net +https://wg.vern.cc +https://whoogle.hxvy0.gq +https://whoogle.ungovernable.men +https://whoogle2.ungovernable.men +https://whoogle3.ungovernable.men +https://wgl.frail.duckdns.org +https://whoogle.no-logs.com +https://whoogle.ftw.lol +https://whoogle-search--replitcomreside.repl.co +https://search.notrustverify.ch +https://whoogle.datura.network +https://whoogle.yepserver.xyz +https://search.snine.nl diff --git a/misc/replit.py b/misc/replit.py new file mode 100644 index 0000000..ce222c7 --- /dev/null +++ b/misc/replit.py @@ -0,0 +1,5 @@ +import subprocess + +# A plague upon Replit and all who have built it +replit_cmd = "killall -q python3 > /dev/null 2>&1; pip install -r requirements.txt && ./run" +subprocess.run(replit_cmd, shell=True) diff --git a/misc/tor/start-tor.sh b/misc/tor/start-tor.sh new file mode 100755 index 0000000..8d77ee6 --- /dev/null +++ b/misc/tor/start-tor.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +FF_STRING="FascistFirewall 1" + +if [ "$WHOOGLE_TOR_SERVICE" == "0" ]; then + echo "Skipping Tor startup..." + exit 0 +fi + +if [ "$WHOOGLE_TOR_FF" == "1" ]; then + if (grep -q "$FF_STRING" /etc/tor/torrc); then + echo "FascistFirewall feature already enabled." + else + echo "$FF_STRING" >> /etc/tor/torrc + + if [ "$?" -eq 0 ]; then + echo "FascistFirewall added to /etc/tor/torrc" + else + echo "ERROR: Unable to modify /etc/tor/torrc with $FF_STRING." + exit 1 + fi + fi +fi + +if [ "$(whoami)" != "root" ]; then + tor -f /etc/tor/torrc +else + if (grep alpine /etc/os-release >/dev/null); then + rc-service tor start + else + service tor start + fi +fi diff --git a/misc/tor/torrc b/misc/tor/torrc new file mode 100644 index 0000000..30c6638 --- /dev/null +++ b/misc/tor/torrc @@ -0,0 +1,12 @@ +DataDirectory /var/lib/tor +ControlPort 9051 +CookieAuthentication 1 +DataDirectoryGroupReadable 1 +CookieAuthFileGroupReadable 1 +ExtORPortCookieAuthFileGroupReadable 1 +CacheDirectoryGroupReadable 1 +CookieAuthFile /var/lib/tor/control_auth_cookie +Log debug-notice file /dev/null +# UseBridges 1 +# ClientTransportPlugin obfs4 exec /usr/bin/obfs4proxy +# Bridge obfs4 ip and so on diff --git a/misc/update-translations.py b/misc/update-translations.py new file mode 100644 index 0000000..d5388f1 --- /dev/null +++ b/misc/update-translations.py @@ -0,0 +1,67 @@ +import json +import pathlib +import requests + +lingva = 'https://lingva.ml/api/v1/en' + + +def format_lang(lang: str) -> str: + # Chinese (traditional and simplified) require + # a different format for lingva translations + if 'zh-' in lang: + if lang == 'zh-TW': + return 'zh_HANT' + return 'zh' + + # Strip lang prefix to leave only the actual + # language code (i.e. 'en', 'fr', etc) + return lang.replace('lang_', '') + + +def translate(v: str, lang: str) -> str: + # Strip lang prefix to leave only the actual + #language code (i.e. "es", "fr", etc) + lang = format_lang(lang) + + lingva_req = f'{lingva}/{lang}/{v}' + + response = requests.get(lingva_req).json() + + if 'translation' in response: + return response['translation'] + return '' + + +if __name__ == '__main__': + file_path = pathlib.Path(__file__).parent.resolve() + tl_path = 'app/static/settings/translations.json' + + with open(f'{file_path}/../{tl_path}', 'r+', encoding='utf-8') as tl_file: + tl_data = json.load(tl_file) + + # If there are any english translations that don't + # exist for other languages, extract them and translate + # them now + en_tl = tl_data['lang_en'] + for k, v in en_tl.items(): + for lang in tl_data: + if lang == 'lang_en' or k in tl_data[lang]: + continue + + translation = '' + if len(k) == 0: + # Special case for placeholder text that gets used + # for translations without any key present + translation = v + else: + # Translate the string using lingva + translation = translate(v, lang) + + if len(translation) == 0: + print(f'! Unable to translate {lang}[{k}]') + continue + print(f'{lang}[{k}] = {translation}') + tl_data[lang][k] = translation + + # Write out updated translations json + print(json.dumps(tl_data, indent=4, ensure_ascii=False)) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..9787c3b --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2a39b9b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,37 @@ +attrs==22.2.0 +beautifulsoup4==4.11.2 +brotli==1.0.9 +cachelib==0.10.2 +certifi==2024.7.4 +cffi==1.17.1 +chardet==5.1.0 +click==8.1.3 +cryptography==3.3.2; platform_machine == 'armv7l' +cryptography==43.0.1; platform_machine != 'armv7l' +cssutils==2.6.0 +defusedxml==0.7.1 +Flask==2.3.2 +idna==3.7 +itsdangerous==2.1.2 +Jinja2==3.1.4 +MarkupSafe==2.1.2 +more-itertools==9.0.0 +packaging==23.0 +pluggy==1.0.0 +pycodestyle==2.10.0 +pycparser==2.22 +pyOpenSSL==19.1.0; platform_machine == 'armv7l' +pyOpenSSL==24.2.1; platform_machine != 'armv7l' +pyparsing==3.0.9 +PySocks==1.7.1 +pytest==7.2.1 +python-dateutil==2.8.2 +requests==2.32.2 +soupsieve==2.4 +stem==1.8.1 +urllib3==1.26.19 +validators==0.22.0 +waitress==3.0.1 +wcwidth==0.2.6 +Werkzeug==3.0.6 +python-dotenv==0.21.1 diff --git a/run b/run new file mode 100755 index 0000000..18c2f66 --- /dev/null +++ b/run @@ -0,0 +1,37 @@ +#!/bin/sh +# Usage: +# ./run # Runs the full web app +# ./run test # Runs the testing suite + +set -e + +SCRIPT_DIR="$(CDPATH= command cd -- "$(dirname -- "$0")" && pwd -P)" + +# Set directory to serve static content from +SUBDIR="${1:-app}" +export APP_ROOT="$SCRIPT_DIR/$SUBDIR" +export STATIC_FOLDER="$APP_ROOT/static" + +# Clear out build directory +rm -f "$SCRIPT_DIR"/app/static/build/*.js +rm -f "$SCRIPT_DIR"/app/static/build/*.css + +# Check for regular vs test run +if [ "$SUBDIR" = "test" ]; then + # Set up static files for testing + rm -rf "$STATIC_FOLDER" + ln -s "$SCRIPT_DIR/app/static" "$STATIC_FOLDER" + pytest -sv +else + mkdir -p "$STATIC_FOLDER" + + if [ ! -z "$UNIX_SOCKET" ]; then + python3 -um app \ + --unix-socket "$UNIX_SOCKET" + else + echo "Running on http://${ADDRESS:-0.0.0.0}:${PORT:-"${EXPOSE_PORT:-8000}"}" + python3 -um app \ + --host "${ADDRESS:-0.0.0.0}" \ + --port "${PORT:-"${EXPOSE_PORT:-8000}"}" + fi +fi diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..6e61f45 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,45 @@ +[metadata] +name = whoogle-search +version = attr: app.version.__version__ +url = https://github.com/benbusby/whoogle-search +description = Self-hosted, ad-free, privacy-respecting metasearch engine +long_description = file: README.md +long_description_content_type = text/markdown +keywords = search, metasearch, flask, adblock, degoogle, privacy +author = Ben Busby +author_email = contact@benbusby.com +license = MIT +classifiers = + Programming Language :: Python :: 3 + License :: OSI Approved :: MIT License + Operating System :: OS Independent + +[options] +packages = find: +include_package_data = True +install_requires= + beautifulsoup4 + brotli + cssutils + cryptography + defusedxml + Flask + python-dotenv + requests + stem + validators + waitress + +[options.extras_require] +test = + pytest + python-dateutil +dev = pycodestyle + +[options.packages.find] +exclude = + test* + +[options.entry_points] +console_scripts = + whoogle-search = app.routes:run_app diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 0000000..cec3def --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,24 @@ +from app import app +from app.utils.session import generate_key +import pytest +import random + +demo_config = { + 'near': random.choice(['Seattle', 'New York', 'San Francisco']), + 'dark': str(random.getrandbits(1)), + 'nojs': str(random.getrandbits(1)), + 'lang_interface': random.choice(app.config['LANGUAGES'])['value'], + 'lang_search': random.choice(app.config['LANGUAGES'])['value'], + 'country': random.choice(app.config['COUNTRIES'])['value'] +} + + +@pytest.fixture +def client(): + with app.test_client() as client: + with client.session_transaction() as session: + session['uuid'] = 'test' + session['key'] = app.enc_key + session['config'] = {} + session['auth'] = False + yield client diff --git a/test/test_autocomplete.py b/test/test_autocomplete.py new file mode 100644 index 0000000..194a5ab --- /dev/null +++ b/test/test_autocomplete.py @@ -0,0 +1,16 @@ +from app.models.endpoint import Endpoint + + +def test_autocomplete_get(client): + rv = client.get(f'/{Endpoint.autocomplete}?q=green+eggs+and') + assert rv._status_code == 200 + assert len(rv.data) >= 1 + assert b'green eggs and ham' in rv.data + + +def test_autocomplete_post(client): + rv = client.post(f'/{Endpoint.autocomplete}', + data=dict(q='the+cat+in+the')) + assert rv._status_code == 200 + assert len(rv.data) >= 1 + assert b'the cat in the hat' in rv.data diff --git a/test/test_misc.py b/test/test_misc.py new file mode 100644 index 0000000..177af5f --- /dev/null +++ b/test/test_misc.py @@ -0,0 +1,70 @@ +from cryptography.fernet import Fernet + +from app import app +from app.models.endpoint import Endpoint +from app.utils.session import generate_key, valid_user_session + +JAPAN_PREFS = 'uG7IBICwK7FgMJNpUawp2tKDb1Omuv_euy-cJHVZ' \ + + 'BSydthgwxRFIHxiVA8qUGavKaDXyiM5uNuPIjKbEAW-zB_vzNXWVaafFhW7k2' \ + + 'fO2_mS5e5eK41XXWwiViTz2VVmGWje0UgQwwVPe1A7aH0s10FgARsd2xl5nlg' \ + + 'RLHT2krPUw-iLQ5uHZSnYXFuF4caYemWcj4vqB2ocHkt-aqn04jgnnlWWME_K' \ + + '9ySWdWmPyS66HtLt1tCwc_-xGZklvbHw==' + + +def test_generate_user_keys(): + key = generate_key() + assert Fernet(key) + assert generate_key() != key + + +def test_valid_session(client): + assert not valid_user_session({'key': '', 'config': {}}) + with client.session_transaction() as session: + assert valid_user_session(session) + + +def test_valid_translation_keys(client): + valid_lang_keys = [_['value'] for _ in app.config['LANGUAGES']] + en_keys = app.config['TRANSLATIONS']['lang_en'].keys() + for translation_key in app.config['TRANSLATIONS']: + # Ensure the translation is using a valid language value + assert translation_key in valid_lang_keys + + # Ensure all translations match the same size/content of the original + # English translation + assert app.config['TRANSLATIONS'][translation_key].keys() == en_keys + + +def test_query_decryption(client): + # FIXME: Handle decryption errors in search.py and rewrite test + # This previously was used to test swapping decryption keys between + # queries. While this worked in theory and usually didn't cause problems, + # they were tied to session IDs and those are really unreliable (meaning + # that occasionally page navigation would break). + rv = client.get('/') + cookie = rv.headers['Set-Cookie'] + + rv = client.get(f'/{Endpoint.search}?q=test+1', headers={'Cookie': cookie}) + assert rv._status_code == 200 + + with client.session_transaction() as session: + assert valid_user_session(session) + + rv = client.get(f'/{Endpoint.search}?q=test+2', headers={'Cookie': cookie}) + assert rv._status_code == 200 + + with client.session_transaction() as session: + assert valid_user_session(session) + + +def test_prefs_url(client): + base_url = f'/{Endpoint.search}?q=wikipedia' + rv = client.get(base_url) + assert rv._status_code == 200 + assert b'wikipedia.org' in rv.data + assert b'ja.wikipedia.org' not in rv.data + + rv = client.get(f'{base_url}&preferences={JAPAN_PREFS}') + assert rv._status_code == 200 + assert b'ja.wikipedia.org' in rv.data + diff --git a/test/test_results.py b/test/test_results.py new file mode 100644 index 0000000..ad0fd3e --- /dev/null +++ b/test/test_results.py @@ -0,0 +1,158 @@ +from bs4 import BeautifulSoup +from app.filter import Filter +from app.models.config import Config +from app.models.endpoint import Endpoint +from app.utils import results +from app.utils.session import generate_key +from datetime import datetime +from dateutil.parser import ParserError, parse +from urllib.parse import urlparse + +from test.conftest import demo_config + + +def get_search_results(data): + secret_key = generate_key() + soup = Filter(user_key=secret_key, config=Config(**demo_config)).clean( + BeautifulSoup(data, 'html.parser')) + + main_divs = soup.find('div', {'id': 'main'}) + assert len(main_divs) > 1 + + result_divs = [] + for div in main_divs: + # Result divs should only have 1 inner div + if (len(list(div.children)) != 1 + or not div.findChild() + or 'div' not in div.findChild().name): + continue + + result_divs.append(div) + + return result_divs + + +def test_get_results(client): + rv = client.get(f'/{Endpoint.search}?q=test') + assert rv._status_code == 200 + + # Depending on the search, there can be more + # than 10 result divs + results = get_search_results(rv.data) + assert len(results) >= 10 + assert len(results) <= 15 + + +def test_post_results(client): + rv = client.post(f'/{Endpoint.search}', data=dict(q='test')) + assert rv._status_code == 302 + + +def test_translate_search(client): + rv = client.get(f'/{Endpoint.search}?q=translate hola') + assert rv._status_code == 200 + + # Pretty weak test, but better than nothing + str_data = str(rv.data) + assert 'iframe' in str_data + assert '/auto/en/ hola' in str_data + + +def test_block_results(client): + rv = client.get(f'/{Endpoint.search}?q=pinterest') + assert rv._status_code == 200 + + has_pinterest = False + for link in BeautifulSoup(rv.data, 'html.parser').find_all('a', href=True): + if 'pinterest.com' in urlparse(link['href']).netloc: + has_pinterest = True + break + + assert has_pinterest + + demo_config['block'] = 'pinterest.com' + rv = client.post(f'/{Endpoint.config}', data=demo_config) + assert rv._status_code == 302 + + rv = client.get(f'/{Endpoint.search}?q=pinterest') + assert rv._status_code == 200 + + for link in BeautifulSoup(rv.data, 'html.parser').find_all('a', href=True): + result_site = urlparse(link['href']).netloc + if not result_site: + continue + assert result_site not in 'pinterest.com' + + +def test_view_my_ip(client): + rv = client.get(f'/{Endpoint.search}?q=my ip address') + assert rv._status_code == 200 + + # Pretty weak test, but better than nothing + str_data = str(rv.data) + assert 'Your public IP address' in str_data + assert '127.0.0.1' in str_data + + +def test_recent_results(client): + times = { + 'tbs=qdr:y': 365, + 'tbs=qdr:m': 31, + 'tbs=qdr:w': 7 + } + + for time, num_days in times.items(): + rv = client.get(f'/{Endpoint.search}?q=test&' + time) + result_divs = get_search_results(rv.data) + + current_date = datetime.now() + for div in [_ for _ in result_divs if _.find('span')]: + date_span = div.find('span').decode_contents() + if not date_span or len(date_span) > 15 or len(date_span) < 7: + continue + + try: + date = parse(date_span) + # Date can have a little bit of wiggle room + assert (current_date - date).days <= (num_days + 5) + except ParserError: + pass + + +def test_leading_slash_search(client): + # Ensure searches with a leading slash are interpreted + # correctly as queries and not endpoints + q = '/test' + rv = client.get(f'/{Endpoint.search}?q={q}') + assert rv._status_code == 200 + + soup = Filter( + user_key=generate_key(), + config=Config(**demo_config), + query=q + ).clean(BeautifulSoup(rv.data, 'html.parser')) + + for link in soup.find_all('a', href=True): + if 'start=' not in link['href']: + continue + + assert link['href'].startswith(f'{Endpoint.search}') + + +def test_site_alt_prefix_skip(): + # Ensure prefixes are skipped correctly for site alts + + # default silte_alts (farside.link) + assert results.get_site_alt(link = 'https://www.reddit.com') == 'https://farside.link/libreddit' + assert results.get_site_alt(link = 'https://www.twitter.com') == 'https://farside.link/nitter' + assert results.get_site_alt(link = 'https://www.youtube.com') == 'https://farside.link/invidious' + + test_site_alts = { + 'reddit.com': 'reddit.endswithmobile.domain', + 'twitter.com': 'https://twitter.endswithm.domain', + 'youtube.com': 'http://yt.endswithwww.domain', + } + # Domains with part of SKIP_PREFIX in them + assert results.get_site_alt(link = 'https://www.reddit.com', site_alts = test_site_alts) == 'https://reddit.endswithmobile.domain' + assert results.get_site_alt(link = 'https://www.twitter.com', site_alts = test_site_alts) == 'https://twitter.endswithm.domain' + assert results.get_site_alt(link = 'https://www.youtube.com', site_alts = test_site_alts) == 'http://yt.endswithwww.domain' diff --git a/test/test_routes.py b/test/test_routes.py new file mode 100644 index 0000000..1f64827 --- /dev/null +++ b/test/test_routes.py @@ -0,0 +1,91 @@ +from app import app +from app.models.endpoint import Endpoint + +import json + +from test.conftest import demo_config + + +def test_main(client): + rv = client.get('/') + assert rv._status_code == 200 + + +def test_search(client): + rv = client.get(f'/{Endpoint.search}?q=test') + assert rv._status_code == 200 + + +def test_feeling_lucky(client): + # Bang at beginning of query + rv = client.get(f'/{Endpoint.search}?q=!%20wikipedia') + assert rv._status_code == 303 + assert rv.headers.get('Location').startswith('https://www.wikipedia.org') + + # Move bang to end of query + rv = client.get(f'/{Endpoint.search}?q=github%20!') + assert rv._status_code == 303 + assert rv.headers.get('Location').startswith('https://github.com') + + +def test_ddg_bang(client): + # Bang at beginning of query + rv = client.get(f'/{Endpoint.search}?q=!gh%20whoogle') + assert rv._status_code == 302 + assert rv.headers.get('Location').startswith('https://github.com') + + # Move bang to end of query + rv = client.get(f'/{Endpoint.search}?q=github%20!w') + assert rv._status_code == 302 + assert rv.headers.get('Location').startswith('https://en.wikipedia.org') + + # Move bang to middle of query + rv = client.get(f'/{Endpoint.search}?q=big%20!r%20chungus') + assert rv._status_code == 302 + assert rv.headers.get('Location').startswith('https://www.reddit.com') + + # Ensure bang is case insensitive + rv = client.get(f'/{Endpoint.search}?q=!GH%20whoogle') + assert rv._status_code == 302 + assert rv.headers.get('Location').startswith('https://github.com') + + # Ensure bang without a query still redirects to the result + rv = client.get(f'/{Endpoint.search}?q=!gh') + assert rv._status_code == 302 + assert rv.headers.get('Location').startswith('https://github.com') + + +def test_custom_bang(client): + # Bang at beginning of query + rv = client.get(f'/{Endpoint.search}?q=!i%20whoogle') + assert rv._status_code == 302 + assert rv.headers.get('Location').startswith('search?q=') + + +def test_config(client): + rv = client.post(f'/{Endpoint.config}', data=demo_config) + assert rv._status_code == 302 + + rv = client.get(f'/{Endpoint.config}') + assert rv._status_code == 200 + + config = json.loads(rv.data) + for key in demo_config.keys(): + assert config[key] == demo_config[key] + + # Test disabling changing config from client + app.config['CONFIG_DISABLE'] = 1 + dark_mod = not demo_config['dark'] + demo_config['dark'] = dark_mod + rv = client.post(f'/{Endpoint.config}', data=demo_config) + assert rv._status_code == 403 + + rv = client.get(f'/{Endpoint.config}') + config = json.loads(rv.data) + assert config['dark'] != dark_mod + + +def test_opensearch(client): + rv = client.get(f'/{Endpoint.opensearch}') + assert rv._status_code == 200 + assert 'Whoogle' in str(rv.data) diff --git a/whoogle.template.env b/whoogle.template.env new file mode 100644 index 0000000..ee2a502 --- /dev/null +++ b/whoogle.template.env @@ -0,0 +1,94 @@ +# ---------------------------------- +# Rename to "whoogle.env" before use +# ---------------------------------- +# You can set Whoogle environment variables here, but must +# modify your deployment to enable these values: +# - Local: Set WHOOGLE_DOTENV=1 +# - docker-compose: Uncomment the env_file option +# - docker: Add "--env-file ./whoogle.env" to your build command + +#WHOOGLE_ALT_TW=farside.link/nitter +#WHOOGLE_ALT_YT=farside.link/invidious +#WHOOGLE_ALT_IG=farside.link/bibliogram/u +#WHOOGLE_ALT_RD=farside.link/libreddit +#WHOOGLE_ALT_MD=farside.link/scribe +#WHOOGLE_ALT_TL=farside.link/lingva +#WHOOGLE_ALT_IMG=farside.link/rimgo +#WHOOGLE_ALT_WIKI=farside.link/wikiless +#WHOOGLE_ALT_IMDB=farside.link/libremdb +#WHOOGLE_ALT_QUORA=farside.link/quetre +#WHOOGLE_ALT_SO=farside.link/anonymousoverflow +#WHOOGLE_USER="" +#WHOOGLE_PASS="" +#WHOOGLE_PROXY_USER="" +#WHOOGLE_PROXY_PASS="" +#WHOOGLE_PROXY_TYPE="" +#WHOOGLE_PROXY_LOC="" +#WHOOGLE_CSP=1 +#HTTPS_ONLY=1 + +# The URL prefix to use for the whoogle instance (i.e. "/whoogle") +#WHOOGLE_URL_PREFIX="" + +# Restrict results to only those near a particular city +#WHOOGLE_CONFIG_NEAR=denver + +# See app/static/settings/countries.json for values +#WHOOGLE_CONFIG_COUNTRY=US + +# See app/static/settings/languages.json for values +#WHOOGLE_CONFIG_LANGUAGE=lang_en + +# See app/static/settings/languages.json for values +#WHOOGLE_CONFIG_SEARCH_LANGUAGE=lang_en + +# Disable changing of config from client +#WHOOGLE_CONFIG_DISABLE=1 + +# Block websites from search results (comma-separated list) +#WHOOGLE_CONFIG_BLOCK=pinterest.com,whitehouse.gov + +# Theme (light, dark, or system) +#WHOOGLE_CONFIG_THEME=system + +# Safe search mode +#WHOOGLE_CONFIG_SAFE=1 + +# Use social media site alternatives (nitter, bibliogram, etc) +#WHOOGLE_CONFIG_ALTS=1 + +# Use Tor if available +#WHOOGLE_CONFIG_TOR=1 + +# Open results in new tab +#WHOOGLE_CONFIG_NEW_TAB=1 + +# Enable View Image option +#WHOOGLE_CONFIG_VIEW_IMAGE=1 + +# Search using GET requests only (exposes query in logs) +#WHOOGLE_CONFIG_GET_ONLY=1 + +# Remove everything except basic result cards from all search queries +#WHOOGLE_MINIMAL=0 + +# Set the number of results per page +#WHOOGLE_RESULTS_PER_PAGE=10 + +# Controls visibility of autocomplete/search suggestions +#WHOOGLE_AUTOCOMPLETE=1 + +# The port where Whoogle will be exposed +#EXPOSE_PORT=5000 + +# Set instance URL +#WHOOGLE_CONFIG_URL=https:/// + +# Set custom CSS styling/theming +#WHOOGLE_CONFIG_STYLE=":root { /* LIGHT THEME COLORS */ --whoogle-background: #d8dee9; --whoogle-accent: #2e3440; --whoogle-text: #3B4252; --whoogle-contrast-text: #eceff4; --whoogle-secondary-text: #70757a; --whoogle-result-bg: #fff; --whoogle-result-title: #4c566a; --whoogle-result-url: #81a1c1; --whoogle-result-visited: #a3be8c; /* DARK THEME COLORS */ --whoogle-dark-background: #222; --whoogle-dark-accent: #685e79; --whoogle-dark-text: #fff; --whoogle-dark-contrast-text: #000; --whoogle-dark-secondary-text: #bbb; --whoogle-dark-result-bg: #000; --whoogle-dark-result-title: #1967d2; --whoogle-dark-result-url: #4b11a8; --whoogle-dark-result-visited: #bbbbff; }" + +# Enable preferences encryption (requires key) +#WHOOGLE_CONFIG_PREFERENCES_ENCRYPTED=1 + +# Set Key to encode config in url +#WHOOGLE_CONFIG_PREFERENCES_KEY="NEEDS_TO_BE_MODIFIED" \ No newline at end of file