diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..1884acc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,15 @@ +FROM python:3.10.4-slim-bullseye + +WORKDIR /app +RUN mkdir keys +RUN mkdir nagrest +COPY requirements.txt ./ +COPY app/* ./ +COPY lib/* ./nagrest/ +COPY keys/* ./keys/ +RUN pip3 install --no-cache-dir -r requirements.txt +RUN apt update && apt upgrade && apt install -y gnupg +RUN ["/bin/bash", "-c", "pwd && ls -l"] +RUN ["/bin/bash", "-c", "gpg --import /app/keys/*.asc"] + +CMD [ "python3", "./main.py" ] diff --git a/app/main.py b/app/main.py new file mode 100644 index 0000000..714a609 --- /dev/null +++ b/app/main.py @@ -0,0 +1,27 @@ +from flask import Flask +from flask_gnupg import GnuPG +import json +from nagrest.nag_parse import NagParse + +app = Flask(__name__) +app.config['GPG_HOME_DIR'] = "/root/.gnupg" +app.config['GPG_BINARY'] = "/usr/bin/gpg" +gpg = GnuPG(app) +parser = NagParse() + +@app.route('/') +def index(): + keys_list = gpg.list_keys() + for key in keys_list: + gpg.trust_keys(key['fingerprint'], 'TRUST_ULTIMATE') + file = "/app/keys/test.sig" + with open(file, 'rb') as fh: + verified = gpg.decrypt_file(fh) + if verified.trust_level == verified.TRUST_ULTIMATE: + return str(verified).strip() + return '{}' + + +if __name__ == "__main__": + # use 0.0.0.0 to use it in container + app.run(host='0.0.0.0') diff --git a/keys/kano@sunet.se.pub.asc b/keys/kano@sunet.se.pub.asc new file mode 100644 index 0000000..0c59609 --- /dev/null +++ b/keys/kano@sunet.se.pub.asc @@ -0,0 +1,75 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +DVhe +=wTa2 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/keys/test.sig b/keys/test.sig new file mode 100644 index 0000000..e5cff33 --- /dev/null +++ b/keys/test.sig @@ -0,0 +1,20 @@ +-----BEGIN PGP SIGNED MESSAGE----- +Hash: SHA512 + +{"valid": "message"} +-----BEGIN PGP SIGNATURE----- + +iQIzBAEBCgAdFiEEIpL7dwHsMfazpY3ODaCnpXCP4lcFAmJEGYwACgkQDaCnpXCP +4lfKwhAAx45ZJGwf6o+aZ5lFtB6b8Nqx/fOm8Ax6IFwQcLebLM79I1yvOSFlcoKk +7t3Vwj0pL8d0w+PwNLrkjC78fKDqltTlHtD7ByW7b6lPXEUX1i/e2uBTd6zv+7zg +vkWQ1tYk9IOa7X4LubwhIC3L04BC0xNwbnlDioyUox1QzOVKpRufOrr30N0CQE3d +U1S6U8y3jLAvHi7dxC+RyvHYH8QGRWoRj6TXa3lsw1aeTShct2f3fXuZT0bQlsap +TJoffKKpr2Fw5wxLja00MYkBA4SXl568HLohSeL3uSxa2D//mwZ0zowERf1C+BC7 +Gx7kSIkH/+16Mn1aHVMktNIZlhvAyoLwGUvZvL81bBTP+BMttPOOHzodRHljPFlW +fCWnozTKR0ouWczXR611rIEVCjeXardiDzXyYG41fCl/83TTmMQcQ+NxMbU3Uslk +FjvjANzkz/zzdte0S2kpzfe/zCwHT8vsfQM4Jvs+i8ycH+Ui03ShirjPdtwVuKui +WIj0o8h3PnBsl6aB3uDtHAjzeDsA4qZddoCqIAcrLVm8rIHXYfvFstevMYtGBqZ7 +TIq2WhtFIvF8PECXjGK5gN8V4g+uWeBJTykAUbrdWJRaH9g3kbCa2NYRuVvdkwSw +LXJnPXqIDkdxqnO2IiIdsTvTdS6iiK1wwPG+oPVkexQB3tM/Auc= +=W+Mg +-----END PGP SIGNATURE----- diff --git a/lib/__pycache__/nag_parse.cpython-310.pyc b/lib/__pycache__/nag_parse.cpython-310.pyc new file mode 100644 index 0000000..2a6cf61 Binary files /dev/null and b/lib/__pycache__/nag_parse.cpython-310.pyc differ diff --git a/src/nag_object.py b/lib/nag_object.py similarity index 100% rename from src/nag_object.py rename to lib/nag_object.py diff --git a/src/nagparse.py b/lib/nag_parse.py similarity index 90% rename from src/nagparse.py rename to lib/nag_parse.py index 874e3aa..69d1ef2 100644 --- a/src/nagparse.py +++ b/lib/nag_parse.py @@ -3,7 +3,7 @@ import re import json import hashlib from enum import Enum, auto -from nag_object import NagObject, NagObjectType +from .nag_object import NagObject, NagObjectType class ParserState(Enum): COMMENT = auto() @@ -18,20 +18,29 @@ def hash_string(string:str) -> int: return int(digest,16) * 1000000 class NagParse: - def __init__(self, config_files: list[str]): - self.m_config_files: list[str] = config_files + def __init__(self): self.m_config_table: dict[int,str] = dict() self.m_objects: list[NagObject] = list() - for config_file in self.m_config_files: - self.m_config_table[hash_string(config_file)] = config_file - for object in self.parse_config(config_file): - self.m_objects.append(object) + def __str__(self): string = str() for object in self.m_objects: string += str(object) + "\n" return string + + def consume_config_files(self, config_files: list[str]) -> None: + for config_file in config_files: + self.m_config_table[hash_string(config_file)] = config_file + for object in self.parse_config(config_file): + self.m_objects.append(object) + + def consume_config_list(self, config_list: list[dict] ) -> None: + for object in config_list: + nag_object = NagObject() + nag_object.from_object(object) + self.m_objects.append(nag_object) + def to_json(self): return json.dumps([x.to_object() for x in self.m_objects]) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a8e97d4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Flask-GnuPG +Flask diff --git a/src/__init__.py b/src/__init__.py deleted file mode 100644 index 60809e3..0000000 --- a/src/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -import os, sys -sys.path.append(os.path.dirname(os.path.realpath(__file__))) -from nagparse import NagParse diff --git a/src/main.py b/src/main.py deleted file mode 100644 index 89b1d4b..0000000 --- a/src/main.py +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env python3 -import sys -from nagparse import NagParse -parser = NagParse(sys.argv[1:]) -for object in parser.m_objects: - print(object.get_id())