From 1770515e94c2568395c89c09580fcc22953ac7e1 Mon Sep 17 00:00:00 2001 From: Aravinth Manivannan Date: Tue, 2 Jan 2024 19:16:37 +0530 Subject: [PATCH] feat: init --- .env_sample | 3 + .gitignore | 166 ++++++++++++++++++++++++++++++++++++++ .woodpecker.yml | 45 +++++++++++ Makefile | 25 ++++++ requirements.txt | 7 ++ scripts/create_captcha.py | 114 ++++++++++++++++++++++++++ scripts/download-cli.sh | 34 ++++++++ 7 files changed, 394 insertions(+) create mode 100644 .env_sample create mode 100644 .gitignore create mode 100644 .woodpecker.yml create mode 100644 Makefile create mode 100644 requirements.txt create mode 100644 scripts/create_captcha.py create mode 100755 scripts/download-cli.sh diff --git a/.env_sample b/.env_sample new file mode 100644 index 0000000..62108cb --- /dev/null +++ b/.env_sample @@ -0,0 +1,3 @@ +export USERNAME= +export PASSWORD= +export INSTANCE_URL= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f0955f --- /dev/null +++ b/.gitignore @@ -0,0 +1,166 @@ +/target +/Cargo.lock +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ +tmp/ +.env +html/ +.env.local diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 0000000..489634d --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,45 @@ +steps: + postgres: + image: postgres + detach: true + environment: + - POSTGRES_PASSWORD=password + + cache: + image: mcaptcha/cache:latest + detach: true + + mcaptcha: + image: mcaptcha/mcaptcha:latest + detach: true + environment: + - DATABASE_URL=postgres://postgres:password@postgres:5432/postgres # set password at placeholder + - RUST_LOG=debug + - PORT=7000 + - MCAPTCHA_server_IP=0.0.0.0 + - MCAPTCHA_server_DOMAIN=mcaptcha + - MCAPTCHA_server_COOKIE_SECRET=4d08c163c0b9780e7462893fd8aed5102c2c509f + - MCAPTCHA_captcha_SALT=4d08c163c0b9780e7462893fd8aed5102c2c509f + - MCAPTCHA_redis_URL=redis://cache/ + - MCAPTCHA_redis_POOL=4 + - MCAPTCHA_allow_demo=true + + test_setup: + image: python + environment: + - USERNAME=aaronsw + - PASSWORD=password + - INSTANCE_URL=http://mcaptcha:7000 + commands: + - pip install virtualenv && virtualenv venv + - make env + - make test.env + + test: + image: rust + environment: + - USERNAME=aaronsw + - PASSWORD=password + - INSTANCE_URL=http://mcaptcha:7000 + commands: + - . .env.local && echo $TOKEN $SITEKY diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c96df4f --- /dev/null +++ b/Makefile @@ -0,0 +1,25 @@ +env: + ./scripts/download-cli.sh download + . venv/bin/activate && pip install -r requirements.txt + . venv/bin/activate && pip install build + +test.env: + $(eval SECRET = $(shell . ./venv/bin/activate && python ./scripts/create_captcha.py get_secret $(INSTANCE_URL) $(USERNAME) $(PASSWORD))) + $(eval SITEKEY = $(shell . ./venv/bin/activate && python ./scripts/create_captcha.py create_captcha $(INSTANCE_URL) $(USERNAME) $(PASSWORD))) + $(eval WIDGET_URL = $(shell . ./venv/bin/activate && python ./scripts/create_captcha.py widget_url $(INSTANCE_URL) $(SITEKEY))) + $(eval TOKEN = $(shell ./scripts/download-cli.sh gen_pow $(WIDGET_URL))) + @-rm .env.local + echo "export SECRET=$(SECRET)" > .env.local + echo "export SITEKEY=$(SITEKEY)" >> .env.local + echo "export WIDGET_URL=$(WIDGET_URL)" >> .env.local + echo "export TOKEN=$(TOKEN)" >> .env.local + + +test: + . env.local && . && \ + SITEKEY=$(SITEKEY) SECRET=$(SECRET) \ + INSTANCE_URL=$(INSTANCE_URL) \ + TOKEN=$(TOKEN) pytest + +lint: + black src/ scripts/ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..9f9411a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +certifi==2023.11.17 +charset-normalizer==3.3.2 +idna==3.6 +iniconfig==2.0.0 +pluggy==1.3.0 +requests==2.31.0 +urllib3==2.1.0 diff --git a/scripts/create_captcha.py b/scripts/create_captcha.py new file mode 100644 index 0000000..45128bf --- /dev/null +++ b/scripts/create_captcha.py @@ -0,0 +1,114 @@ +# SPDX-FileCopyrightText: 2023 Aravinth Manivannan +# +# SPDX-License-Identifier: Apache-2.0 +# SPDX-License-Identifier: MIT + +import sys +from urllib.parse import urlparse, urlunparse, urlencode, parse_qsl +from requests import Session + + +def clean_url(url): + parsed = urlparse(url) + return urlunparse((parsed.scheme, parsed.netloc, "", "", "", "")) + + +def set_path(url: str, path: str) -> str: + parsed = urlparse(url) + return urlunparse((parsed.scheme, parsed.netloc, path, "", "", "")) + + +def help(): + print("Usage: create_captcha.py