From b84d91c9c074424e9ac1f38adf85b275b43371fb Mon Sep 17 00:00:00 2001 From: Micke Nordin Date: Wed, 30 Mar 2022 11:53:56 +0200 Subject: [PATCH] Start working on flask app --- Dockerfile | 15 +++++ app/main.py | 27 ++++++++ keys/kano@sunet.se.pub.asc | 75 ++++++++++++++++++++++ keys/test.sig | 20 ++++++ lib/__pycache__/nag_parse.cpython-310.pyc | Bin 0 -> 2817 bytes {src => lib}/nag_object.py | 0 src/nagparse.py => lib/nag_parse.py | 23 +++++-- requirements.txt | 2 + src/__init__.py | 3 - src/main.py | 6 -- 10 files changed, 155 insertions(+), 16 deletions(-) create mode 100644 Dockerfile create mode 100644 app/main.py create mode 100644 keys/kano@sunet.se.pub.asc create mode 100644 keys/test.sig create mode 100644 lib/__pycache__/nag_parse.cpython-310.pyc rename {src => lib}/nag_object.py (100%) rename src/nagparse.py => lib/nag_parse.py (90%) create mode 100644 requirements.txt delete mode 100644 src/__init__.py delete mode 100644 src/main.py 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 0000000000000000000000000000000000000000..2a6cf61223a9e5a6d3fb55e2c8f954ea489b66f8 GIT binary patch literal 2817 zcmai0&5zs06`vW7NQ%;aShc-&o3?7>CRLs6HtFZVFpPM&!2+=obln!Evmv+|YFBHK z(hjL6QK%w-wuc^qqJKaO>DYgv=N3692#|ueqUgc5o(;6_?+vwU*$xmA^T;>v&6_vx za|SCb9>e2&{My0q*BJX3Aq_OS>Z$bW;P6xp9JQ(NR}|l4t@;D($l5JY z$em;q7cv}W17Ov5c=+bQan#9*mGj@b?+>F6@h?9d$SsWY8bHKIUtdJll=;%Yih;I) zj@eTbwYNf@MtUy`v#8y23pWUoFph$t@PZ&7s8OH(>p^fb3i~BRTM+L%x8J;TXQzF) zu(x-9w%gt*s@uCi-?@Ev_m}v+^NTm`?!JN9zc9T5ZUY{^v~@Iyqpi5txgTw%gOTn; z=~faR>L|^&`n?1C4~C@A=J0)OW1WkUlEYkPb9y~)<_kN`bT2t9Y#n7Iopk8vXAh}Y z!MKf)ZUSU%#^-Fpb3PL}n^}s_@p1-SVqRpGTqrRW%DTwl2-zN2Mp^gepFUW};@+*- z)>z9foTD&3f|9oH@BgUO0K~WL1&f zIpWV>je}(s3aNUXY-u(N5BgCd`#qSs8V3WD7^yK;Q8%%(SYO!Ta2O@3B@3BG{jRgTds=<(2D!2`h=(_?kw}t%k&UmN z>kbje=^)v>(I0feetHu>XA4?ZA&FL0)F>XNrM-A*ucxiF5cB-m9+#KxvmojwsG5@g ziO8q=L&Ny;AFx{nFQRG)c+|?Q99El(KYTusN=z!51a5uACw4Apl{w|YUnfpx&m79g z+?ly^Hn%2jUQssuUdgJtizpEHMfxhZ&?a(sF7yvhHVoz(>~?O=YPn6>@>{#y-OwFX zRbK9vGG}$vvT81feqZP;uPSjB4F>-SX+`>~`bPqqRdPF6$yUK(UxlB6tzp&rL_q2V zwKBy%oF!c&YaQ$V49-=^qOk`26xy z{t8R~{jNDDXTQd2X-(?_vQKNuj21V+Fm}ItFMN5t-}+!I-+ra}!2_a=y?5?aoBQ9p z_x%3#hkP;?O?;XtwNba1L@i-f`kv}(^z7bmqIBHY&0b8K-4XhpYL14@I7}Wq!t;>7 zJ$BwPJ6vyFGM!CRr0K5#6mo$2r778ps*Xa{hxD`%Izn|A9TXL68^gltM@WD;%sNM! zY5?Yk{a)syIMRY38E7ioz8wb{E)BY7c!ubnnXVI|9tV$AMM4dFNy{sfsA+gpx*Pb; zqSX2|>J7nBn5aHx7kl_#XQUUo?mIesm*%NVCuoda9UjI}lBG{2zy3PpQ*lfW0I0p! zQMWw6hH$MbLh!oqxWK&NmxX85QGRUZfu`eCGWZ z@IT%^<<|Nqa%+6)ys9jBiZ+hxKmkq7S62y;{WaAi{cQr@A#j}ldBdo^bQDu+sC(-x z08|qfSC$5Mt8V41mYHv@>K_tMivTqhT*`3G(^T-v8 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())