From 8edd610e7caf9cd4a9c6312cb4ba558e02261524 Mon Sep 17 00:00:00 2001 From: Darryl Nixon Date: Tue, 6 Jun 2023 15:51:54 -0700 Subject: [PATCH] Basic structure in place --- .flake8 | 3 +++ .pre-commit-config.yaml | 29 +++++++++++++++++++++++ README.md | 31 ++++++++++++++++++++++++- crowdtls.png | Bin 0 -> 40757 bytes crowdtls/__init__.py | 0 crowdtls/cli.py | 50 ++++++++++++++++++++++++++++++++++++++++ crowdtls/db.py | 22 ++++++++++++++++++ crowdtls/helpers.py | 30 ++++++++++++++++++++++++ pyproject.toml | 37 +++++++++++++++++++++++++++++ 9 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 .flake8 create mode 100644 .pre-commit-config.yaml create mode 100644 crowdtls.png create mode 100644 crowdtls/__init__.py create mode 100644 crowdtls/cli.py create mode 100644 crowdtls/db.py create mode 100644 crowdtls/helpers.py create mode 100644 pyproject.toml diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..dd0767d --- /dev/null +++ b/.flake8 @@ -0,0 +1,3 @@ +[flake8] +max-line-length = 160 +exclude = docs/*, .git, __pycache__, build diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..510611e --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,29 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.2.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml + - id: check-added-large-files +- repo: https://github.com/asottile/reorder_python_imports + rev: v3.9.0 + hooks: + - id: reorder-python-imports + args: [--application-directories, '.:crowdtls', --py39-plus] +- repo: https://github.com/psf/black + rev: 23.3.0 + hooks: + - id: black + language_version: python3.11 +- repo: https://github.com/PyCQA/bandit + rev: 1.7.5 + hooks: + - id: bandit + args: ["-c", "pyproject.toml"] + additional_dependencies: ["bandit[toml]"] +- repo: https://github.com/pycqa/flake8 + rev: 6.0.0 + hooks: + - id: flake8 + exclude: ^migrations/versions/ diff --git a/README.md b/README.md index 4f4fe51..5025718 100644 --- a/README.md +++ b/README.md @@ -1 +1,30 @@ -# CrowdTLS-server \ No newline at end of file +
+CrowdTLS Logo + +# CrowdTLS-server + +CrowdTLS validates SSL/TLS certificates against the crowd. + +This is the backend server repository for it.
+ +[Installation](#installation) • +[License](#license) +
+ +## Installation + +TODO + +## FAQ + +**What is this? I'm looking for the browser extension!** + +You're in the wrong place. The browser extension can be found [here](https://sillyhats.mips.uk/pdf/CrowdTLS). + +## License + +This project is licensed under the MPL 2.0 License. See the `LICENSE` file for details. + +I carefully evaluated various open-source licenses and chose the Mozilla Public License 2.0 (MPL 2.0) for CrowdTLS due to its compatibility with other licenses, strong copyleft provisions, and its alignment with my values and goals. MPL 2.0 ensures that the source code remains open and available, while allowing for flexibility in terms of collaboration and incorporation into other projects. + +While I understand that different licenses may have their merits, I believe that MPL 2.0 provides the best balance of openness, collaborative potential, and legal clarity for the development and distribution of CrowdTLS. diff --git a/crowdtls.png b/crowdtls.png new file mode 100644 index 0000000000000000000000000000000000000000..3f216f103c6b4edd442ecc916737b6c6489f7e44 GIT binary patch literal 40757 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 CertificateChain: + # Convert list of integers to bytes + der_cert_bytes = bytes(raw_der_certificate) + + # Parse the DER certificate + cert = x509.load_der_x509_certificate(der_cert_bytes, default_backend()) + + certificate_chain = CertificateChain( + raw_der_certificate=der_cert_bytes, + version=cert.version.value, + serial_number=cert.serial_number, + signature=cert.signature, + issuer=cert.issuer.rfc4514_string(), + validity={"not_valid_before": cert.not_valid_before, "not_valid_after": cert.not_valid_after}, + subject=cert.subject.rfc4514_string(), + subject_public_key_info=cert.public_key().public_bytes(), + issuer_unique_id=cert.issuer_unique_id, + subject_unique_id=cert.subject_unique_id, + extensions=[str(ext) for ext in cert.extensions], + ) + + return certificate_chain diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b4fc738 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,37 @@ +[build-system] +requires = ["setuptools>=67.8"] +build-backend = "setuptools.build_meta" + +[project] +name = "crowdtls" +version = "0.0.1" +authors = [{ name = "crowdtls", email = "git@nixon.mozmail.com" }] +description = "Backend server for CrowdTLS browser extension" +readme = "README.md" +requires-python = ">=3.9" +license = { text = "MIT" } +dependencies = [ + "fastapi==0.95.2", + "uvicorn==0.22.0", + "loguru==0.7.0", + "pydantic==1.10.8", + "asyncpg==0.27.0", + "greenlet==2.0.2", + "sqlmodel==0.0.8", + "sqlalchemy==1.4.41", +] + +[project.urls] +homepage = "https://github.com/DarrylNixon/CrowdTLS" +repository = "https://github.com/DarrylNixon/CrowdTLS-server" + +[tool.setuptools] +py-modules = ["crowdtls"] + +[tool.bandit] +exclude_dirs = ["/doc", "/build"] +# TODO: Stop skipping B104 (binding on 0.0.0.0), is there a nice way to get a good docker bind address? +skips = ["B104"] + +[tool.black] +line-length = 120