release 1.0.0

- bump python-version to 3.14
- bump streamlit to 1.52.2
- bump numpy to 2.4.0
- extra-script for generating special-wb's
- rework of container to use a python-virtual-environment and create the special-wb's at first start of the container (no longer at first web-request)
- adding links to source-code and docker-registry's in welcome-message
- some more error-handling for ADFG(V)X
This commit is contained in:
2025-12-25 18:52:23 +01:00
parent 79c3cb83c7
commit 6bac7839d3
11 changed files with 136 additions and 93 deletions

View File

@@ -6,7 +6,7 @@ on:
image_tag: image_tag:
description: '2. Tag für das Docker-Image (außer latest) (z.B. v1.0.0)' description: '2. Tag für das Docker-Image (außer latest) (z.B. v1.0.0)'
required: true required: true
default: '0.7.3' default: '1.0.0'
env: env:
image_name: mysteryhelfer image_name: mysteryhelfer

1
.gitignore vendored
View File

@@ -3,3 +3,4 @@
/.idea/ /.idea/
/app/data/morse-de.dic /app/data/morse-de.dic
/app/data/t9-de.dic /app/data/t9-de.dic
/.venv/

View File

@@ -1,28 +1,34 @@
FROM python:3.13-slim # Copyright (c) 2025 Martin Kayser (tebarius)
# Licensed under the MIT License. See LICENSE file in the project root.
ARG PYTHON_VERSION="3.14"
FROM python:${PYTHON_VERSION}-slim
LABEL authors="tebarius" LABEL authors="tebarius"
LABEL description="tebarius Mysteryhelfer web" LABEL description="tebarius Mysteryhelfer web"
WORKDIR /app ARG PYTHON_VERSION
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PATH="/myst-venv/bin:$PATH"
RUN apt-get update \ RUN apt-get update \
&& apt-get install -y --no-install-recommends curl \ && apt-get install -y --no-install-recommends curl \
&& apt-get clean \ && apt-get clean \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt . COPY requirements.txt .
COPY ./app /app
RUN python -m pip install --upgrade pip \ RUN python -m venv /myst-venv \
&& python -m pip install --upgrade pip \
&& pip install --no-cache-dir -r requirements.txt && pip install --no-cache-dir -r requirements.txt
COPY ./app /app
# ein bisschen Patchen um auch beim Bookmarken oder Versenden der Webadresse per Messenger den richtigen Titel und das # ein bisschen Patchen um auch beim Bookmarken oder Versenden der Webadresse per Messenger den richtigen Titel und das
# richtige Favicon zu verwenden/sehen # richtige Favicon zu verwenden/sehen
COPY ./app/images/favicon.ico /usr/local/lib/python3.13/site-packages/streamlit/static/favicon.ico COPY ./app/images/favicon.ico /myst-venv/lib/python${PYTHON_VERSION}/site-packages/streamlit/static/favicon.ico
RUN sed -i -e 's|favicon\.png|favicon.ico|' \ RUN sed -i -e 's|favicon\.png|favicon.ico|' \
-e 's|<title>.*</title>|<title>tebarius Mysteryhelfer (web)</title>|' \ -e 's|<title>.*</title>|<title>tebarius Mysteryhelfer (web)</title>|' \
/usr/local/lib/python3.13/site-packages/streamlit/static/index.html \ /myst-venv/lib/python${PYTHON_VERSION}/site-packages/streamlit/static/index.html \
&& useradd -m -u 1000 myst \ && useradd -m -u 1000 myst \
&& chown -R myst:myst /app && chown -R myst:myst /app
USER myst USER myst
@@ -31,4 +37,4 @@ EXPOSE 8501
HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
ENTRYPOINT ["streamlit", "run", "app.py", "--server.port=8501", "--server.address=0.0.0.0"] ENTRYPOINT ["/bin/bash", "entrypoint.sh"]

View File

@@ -7,11 +7,16 @@ import matplotlib.pyplot as plt
import helper import helper
standard_output = ('#### Um den HILFE-Text zu einzelnen Funktionen aufzurufen bitte die Funktion mit leerem' standard_output = ('#### Um den HILFE-Text zu einzelnen Funktionen aufzurufen bitte die Funktion mit leerem'
' Eingabefeld aufrufen.') ' Eingabefeld aufrufen.\n'
'__Diese APP ist OpenSource:__ \n'
'- Sourcecode: https://gitea.tebarius.duckdns.org/tebarius/Mysteryhelfer-web\n'
'- Docker-Images sind verfügbar via:\n'
' - https://hub.docker.com/r/tebarius/mysteryhelfer\n'
' - https://gitea.tebarius.duckdns.org/tebarius/-/packages/container/mysteryhelfer/latest')
st.set_page_config( st.set_page_config(
# we do also patching static-files of streamlit in the docker-container so bookmarks will have # we do also patching static-files of streamlit in the docker-container so bookmarks will have
# the same favicon and if posting links for example in whatsapp they will have the same title # the same favicon and if posting links for example in WhatsApp they will have the same title
page_title="tebarius Mysteryhelfer (web)", page_title="tebarius Mysteryhelfer (web)",
page_icon="images/favicon.ico", page_icon="images/favicon.ico",
layout="wide", layout="wide",
@@ -224,7 +229,6 @@ if 'input_text' not in st.session_state:
st.session_state.input_text = "" st.session_state.input_text = ""
if 'output_text' not in st.session_state: if 'output_text' not in st.session_state:
st.session_state.output_text = standard_output st.session_state.output_text = standard_output
st.session_state.output_text += helper.generate_special_files()
if 'map_data' not in st.session_state: if 'map_data' not in st.session_state:
st.session_state.map_data = None st.session_state.map_data = None
if 'graph_data' not in st.session_state: if 'graph_data' not in st.session_state:

13
app/entrypoint.sh Normal file
View File

@@ -0,0 +1,13 @@
#!/bin/bash
# Copyright (c) 2025 Martin Kayser (tebarius)
# Licensed under the MIT License. See LICENSE file in the project root.
set -e # Script bei Fehler abbrechen
# 1) einmalig bei Containerstart ausführen
echo "Generiere Special-WBs..."
python generate_special_wbs.py
# 2) Streamlit-App starten
echo "Starte Hauptprogramm..."
streamlit run app.py --server.port=8501 --server.address=0.0.0.0

View File

@@ -0,0 +1,69 @@
#!/usr/bin/env python3
# Copyright (c) 2025 Martin Kayser (tebarius)
# Licensed under the MIT License. See LICENSE file in the project root.
import os
def t9_generate_t9de():
alphabet = {'A': '2', 'B': '2', 'C': '2', 'D': '3', 'E': '3', 'F': '3', 'G': '4',
'H': '4', 'I': '4', 'J': '5', 'K': '5', 'L': '5', 'M': '6', 'N': '6',
'O': '6', 'P': '7', 'Q': '7', 'R': '7', 'S': '7', 'T': '8', 'U': '8',
'V': '8', 'W': '9', 'X': '9', 'Y': '9', 'Z': '9', '1': '1', '2': '2',
'3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9',
'0': '0', 'Ñ': '6', 'É': '3', 'È': '3', 'À': '2', 'Ü': '8', 'Ö': '6',
'Ä': '2', '@': '1', '?': '1', '=': '0', ':': '1', '/': '1', '.': '1',
'-': '1', ',': '1', '+': '0', ')': '1', '(': '1', 'SS': '7'}
ofile = open("./data/t9-de.dic", "a", encoding="iso-8859-15")
file = open("./data/german.dic", "r", encoding="iso-8859-15")
for zeile in file:
omsg = ""
zeile = zeile.rstrip()
try:
for char in zeile:
omsg = omsg + alphabet[char.upper()]
except KeyError:
continue
else:
ofile.write(omsg + "," + zeile + "\n")
file.close()
ofile.close()
def remorse_generate_morsede():
alphabet = {'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.', 'G': '--.',
'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.',
'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-', 'U': '..-',
'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--', 'Z': '--..', '1': '.----',
'2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....', '7': '--...',
'8': '---..', '9': '----.', '0': '-----', 'Ñ': '--.--', 'É': '..-..', 'È': '.-..-',
'À': '.--.-', 'Ü': '..--', 'Ö': '---.', 'Ä': '.-.-', '_': '..--.-', '@': '.--.-.',
'?': '..--..', '=': '-...-', ';': '-.-.-.', ':': '---...', '/': '-..-.',
'.': '.-.-.-', '-': '-....-', ',': '--..--', '+': '.-.-.', ')': '-.--.-',
'(': '-.--.', "'": '.----.', 'SS': '...--..'}
with open("./data/morse-de.dic", "w", encoding="iso-8859-1") as ofile:
for symbol, morse in alphabet.items():
ofile.write(f"{morse},{symbol}\n")
with open("./data/german.dic", "r", encoding="iso-8859-1") as infile:
for line in infile:
word = line.strip()
try:
morse_word = ''.join(alphabet[char.upper()] for char in word)
ofile.write(f"{morse_word},{word}\n")
except KeyError:
# Überspringe Wörter mit nicht-unterstützten Zeichen
continue
infile.close()
ofile.close()
def generate_special_files():
if os.path.exists("./data/morse-de.dic"):
print("Übersprungen...[deutsches Re-Morse-Wörterbuch existiert bereits]")
else:
remorse_generate_morsede()
print("[deutsches Re-Morse-Wörterbuch wurde generiert]")
if os.path.exists("./data/t9-de.dic"):
print("Übersprungen...[deutsches T9-Wörterbuch wurde existiert bereits]")
else:
t9_generate_t9de()
print("[deutsches T9-Wörterbuch wurde generiert]")
if __name__ == "__main__":
generate_special_files()

View File

@@ -2,10 +2,10 @@
# Licensed under the MIT License. See LICENSE file in the project root. # Licensed under the MIT License. See LICENSE file in the project root.
import math import math
from re import match # für unkennify from re import match # für unkennify
import folium
import streamlit as st import streamlit as st
from streamlit_folium import st_folium from streamlit_folium import st_folium
import folium
import os
# ***recursive quersummenfunktion*** # ***recursive quersummenfunktion***
@@ -176,70 +176,6 @@ def unkennify(text):
decoded = decoded + text[i:] decoded = decoded + text[i:]
return decoded return decoded
def generate_special_files():
out="\n\n\n"
if os.path.exists("./data/morse-de.dic"):
pass
else:
remorse_generate_morsede()
out+=":blue[deutsches Re-Morse-Wörterbuch wurde generiert] \n"
if os.path.exists("./data/t9-de.dic"):
pass
else:
t9_generate_t9de()
out+=":blue[deutsches T9-Wörterbuch wurde generiert] \n"
return out
def remorse_generate_morsede():
alphabet = {'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..', 'E': '.', 'F': '..-.', 'G': '--.',
'H': '....', 'I': '..', 'J': '.---', 'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.',
'O': '---', 'P': '.--.', 'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-', 'U': '..-',
'V': '...-', 'W': '.--', 'X': '-..-', 'Y': '-.--', 'Z': '--..', '1': '.----',
'2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....', '7': '--...',
'8': '---..', '9': '----.', '0': '-----', 'Ñ': '--.--', 'É': '..-..', 'È': '.-..-',
'À': '.--.-', 'Ü': '..--', 'Ö': '---.', 'Ä': '.-.-', '_': '..--.-', '@': '.--.-.',
'?': '..--..', '=': '-...-', ';': '-.-.-.', ':': '---...', '/': '-..-.',
'.': '.-.-.-', '-': '-....-', ',': '--..--', '+': '.-.-.', ')': '-.--.-',
'(': '-.--.', "'": '.----.', 'SS': '...--..'}
with open("./data/morse-de.dic", "w", encoding="iso-8859-1") as ofile:
for symbol, morse in alphabet.items():
ofile.write(f"{morse},{symbol}\n")
with open("./data/german.dic", "r", encoding="iso-8859-1") as infile:
for line in infile:
word = line.strip()
try:
morse_word = ''.join(alphabet[char.upper()] for char in word)
ofile.write(f"{morse_word},{word}\n")
except KeyError:
# Überspringe Wörter mit nicht-unterstützten Zeichen
continue
infile.close()
ofile.close()
def t9_generate_t9de():
alphabet = {'A': '2', 'B': '2', 'C': '2', 'D': '3', 'E': '3', 'F': '3', 'G': '4',
'H': '4', 'I': '4', 'J': '5', 'K': '5', 'L': '5', 'M': '6', 'N': '6',
'O': '6', 'P': '7', 'Q': '7', 'R': '7', 'S': '7', 'T': '8', 'U': '8',
'V': '8', 'W': '9', 'X': '9', 'Y': '9', 'Z': '9', '1': '1', '2': '2',
'3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9',
'0': '0', 'Ñ': '6', 'É': '3', 'È': '3', 'À': '2', 'Ü': '8', 'Ö': '6',
'Ä': '2', '@': '1', '?': '1', '=': '0', ':': '1', '/': '1', '.': '1',
'-': '1', ',': '1', '+': '0', ')': '1', '(': '1', 'SS': '7'}
ofile = open("./data/t9-de.dic", "a", encoding="iso-8859-15")
file = open("./data/german.dic", "r", encoding="iso-8859-15")
for zeile in file:
omsg = ""
zeile = zeile.rstrip()
try:
for char in zeile:
omsg = omsg + alphabet[char.upper()]
except KeyError:
continue
else:
ofile.write(omsg + "," + zeile + "\n")
file.close()
ofile.close()
def rail_encrypt(plain_text: str, rails: int): def rail_encrypt(plain_text: str, rails: int):
arr = [["" for _ in range(len(plain_text))] for _ in range(rails)] arr = [["" for _ in range(len(plain_text))] for _ in range(rails)]
r = 0 r = 0
@@ -293,10 +229,10 @@ def rail_decrypt(cipher: str, rails: int):
y -= 1 y -= 1
elif down: elif down:
y += 1 y += 1
elif down is False and y == 0: elif not down and y == 0:
down = True down = True
y += 1 y += 1
elif down is False: elif not down:
y -= 1 y -= 1
return out return out
#from folium.map import DivIcon #from folium.map import DivIcon
@@ -329,4 +265,4 @@ def show_map_folium(df):
# Schritt 5: In Streamlit anzeigen # Schritt 5: In Streamlit anzeigen
st_folium(m, use_container_width=True) st_folium(m, use_container_width=True)
else: else:
st.markdown(":red[Keine sinnvoll darstellbaren Koordinaten gefunden]") st.markdown(":red[Keine sinnvoll darstellbaren Koordinaten gefunden]")

View File

@@ -227,7 +227,7 @@ naknak_to_text = ("### NakNak to Text\n"
"Diese Funktion übersetzt das Geschnatter in verständliche Buchstaben/Zeichen. !!Bitte unbedingt " "Diese Funktion übersetzt das Geschnatter in verständliche Buchstaben/Zeichen. !!Bitte unbedingt "
"die Groß- und Kleinschreibung beibehalten!! Wer diesen Quatsch unbedingt umgekehrt übersetzten " "die Groß- und Kleinschreibung beibehalten!! Wer diesen Quatsch unbedingt umgekehrt übersetzten "
"will, wird wohl etwas suchen müssen, da der Original-Übersetzer, der unter " "will, wird wohl etwas suchen müssen, da der Original-Übersetzer, der unter "
"http://uebersetzer.schnatterente.net erreichbar war, nicht mehr online ist und ich ganz bestimmt " "https://uebersetzer.schnatterente.net erreichbar war, nicht mehr online ist und ich ganz bestimmt "
"keinen hier integrieren werde.") "keinen hier integrieren werde.")
navajo_to_text = ("### Navajo-ABC to Text\n" navajo_to_text = ("### Navajo-ABC to Text\n"
@@ -240,7 +240,7 @@ navajo_to_text = ("### Navajo-ABC to Text\n"
"Wörter bzw. deren Schreibweise angeht im Netz, mit welchen codiert wird, weshalb ich hier nur die " "Wörter bzw. deren Schreibweise angeht im Netz, mit welchen codiert wird, weshalb ich hier nur die "
"Dekodierung anbiete. weitere Codewörter und Erklärungen gibt es z.B. hier: " "Dekodierung anbiete. weitere Codewörter und Erklärungen gibt es z.B. hier: "
"https://ww2db.com/other.php?other_id=29 oder hier: " "https://ww2db.com/other.php?other_id=29 oder hier: "
"http://math.ucsd.edu/~crypto/Projects/RobertoSandoval/NavajoWindtalkers.pdf") "https://math.ucsd.edu/~crypto/Projects/RobertoSandoval/NavajoWindtalkers.pdf")
pi_suche = ("### PI Nachkommastellensuche\n" pi_suche = ("### PI Nachkommastellensuche\n"
"Für die eingegebene Zahl/Zahlenreihe X wird versucht die entsprechende X. Nachkommastelle auszugeben " "Für die eingegebene Zahl/Zahlenreihe X wird versucht die entsprechende X. Nachkommastelle auszugeben "
@@ -498,7 +498,7 @@ url_decode = ("### URL-decode\n"
"Listing erscheinen wird es manchmal schwer die ursprüngliche URL und/oder den Dateinamen des " "Listing erscheinen wird es manchmal schwer die ursprüngliche URL und/oder den Dateinamen des "
"Bildes noch lesen zu können. Die URL hat dort nun jeweils folgendes Muster: " "Bildes noch lesen zu können. Die URL hat dort nun jeweils folgendes Muster: "
"`https://imgproxy.geocaching.com/......?url=.....` wobei nach dem `?url=` dann die ursprüngliche " "`https://imgproxy.geocaching.com/......?url=.....` wobei nach dem `?url=` dann die ursprüngliche "
"Bild-URL folgt, allerdings wird dabei dann aus `http://` folgendes `http%3A%2F%2F` und um genau " "Bild-URL folgt, allerdings wird dabei dann aus `https://` folgendes `https%3A%2F%2F` und um genau "
"dieses wieder normal lesbar zu machen dient diese Funktion") "dieses wieder normal lesbar zu machen dient diese Funktion")
reversewig = ('### Reverse Wherigo zu Koordinaten\n' reversewig = ('### Reverse Wherigo zu Koordinaten\n'
@@ -607,4 +607,4 @@ rlou_to_graph = ("### RLOU/RLUD -> Graph\n"
"englischen Variante halt L=left, R=right, U=up, D=down ist. \n" "englischen Variante halt L=left, R=right, U=up, D=down ist. \n"
"Die Funktion hier versucht das ganz halt zu malen und als Grafik auszugeben, wobei versucht wird " "Die Funktion hier versucht das ganz halt zu malen und als Grafik auszugeben, wobei versucht wird "
"automatisch zu erkennen ob die deutsche oder englische Variante zum Einsatz kommt. \n" "automatisch zu erkennen ob die deutsche oder englische Variante zum Einsatz kommt. \n"
"Zum ausprobieren könnt ihr ja mal `ddurduu ddurduulr ddr rluu ddruul` probieren.") "Zum ausprobieren könnt ihr ja mal `ddurduu ddurduulr ddr rluu ddruul` probieren.")

View File

@@ -2309,6 +2309,8 @@ def adfgx_kodieren(eingabetext, pw):
return ":red[Es es werden genau zwei durch Komma getrennte Passwörter benötigt!]" return ":red[Es es werden genau zwei durch Komma getrennte Passwörter benötigt!]"
pw[0] = pw[0].strip() pw[0] = pw[0].strip()
pw[1] = pw[1].strip() pw[1] = pw[1].strip()
if not pw[0].isalpha() or not pw[1].isalpha():
return ":red[Passwörter dürfen nur aus Buchstaben bestehen!]"
pw1az = "" pw1az = ""
for b in pw[0] + alpha_az: for b in pw[0] + alpha_az:
if b in alpha_az and b not in pw1az: if b in alpha_az and b not in pw1az:
@@ -2334,7 +2336,6 @@ def adfgx_kodieren(eingabetext, pw):
ctext1az = "" ctext1az = ""
for b in klartext: for b in klartext:
ctext1az += w_baz[b] ctext1az += w_baz[b]
print(ctext1az)
ctext1za = "" ctext1za = ""
for b in klartext: for b in klartext:
ctext1za += w_bza[b] ctext1za += w_bza[b]
@@ -2370,7 +2371,8 @@ def adfgx_kodieren(eingabetext, pw):
else: else:
ausgabe_za += i[j + 1] ausgabe_za += i[j + 1]
z += 1 z += 1
ausgabetext = f":blue[Passwort 1:] {pw[0]} \n" ausgabetext = f":blue[verwendeter Eingabetext:] {klartext} \n"
ausgabetext += f":blue[Passwort 1:] {pw[0]} \n"
ausgabetext += f":blue[Passwort 2:] {pw2} \n \n" ausgabetext += f":blue[Passwort 2:] {pw2} \n \n"
ausgabetext += f":blue[kodiert mit Variante A-Z:] \n{ausgabe_az} \n \n" ausgabetext += f":blue[kodiert mit Variante A-Z:] \n{ausgabe_az} \n \n"
ausgabetext += f":blue[kodiert mit Variante Z-A:] \n{ausgabe_za}" ausgabetext += f":blue[kodiert mit Variante Z-A:] \n{ausgabe_za}"
@@ -2390,6 +2392,7 @@ def adfgx_dekodieren(eingabetext, pw):
alpha_za = "ZYXWVUTSRQPONMLKIHGFEDCBA" alpha_za = "ZYXWVUTSRQPONMLKIHGFEDCBA"
text = text.upper() text = text.upper()
text = text.replace("J", "I") text = text.replace("J", "I")
text = text.replace(" ", "")
pw = pw.upper() pw = pw.upper()
pw = pw.replace("J", "I") pw = pw.replace("J", "I")
pw = pw.split(",") pw = pw.split(",")
@@ -2397,6 +2400,11 @@ def adfgx_dekodieren(eingabetext, pw):
return ":red[Es es werden genau zwei durch Komma getrennte Passwörter benötigt!]" return ":red[Es es werden genau zwei durch Komma getrennte Passwörter benötigt!]"
pw[0] = pw[0].strip() pw[0] = pw[0].strip()
pw[1] = pw[1].strip() pw[1] = pw[1].strip()
if not pw[0].isalpha() or not pw[1].isalpha():
return ":red[Passwörter dürfen nur aus Buchstaben bestehen!]"
for zeichen in text:
if zeichen not in "ADFGX":
return ":red[Im Eingabetext dürfen nur Leerzeichen und die Buchstaben ADFGX vorkommen!]"
pw1az = "" pw1az = ""
for b in pw[0] + alpha_az: for b in pw[0] + alpha_az:
if b in alpha_az and b not in pw1az: if b in alpha_az and b not in pw1az:
@@ -2466,6 +2474,8 @@ def adfgvx_kodieren(eingabetext, pw):
return ":red[Es es werden genau zwei durch Komma getrennte Passwörter benötigt!]" return ":red[Es es werden genau zwei durch Komma getrennte Passwörter benötigt!]"
pw[0] = pw[0].strip() pw[0] = pw[0].strip()
pw[1] = pw[1].strip() pw[1] = pw[1].strip()
if not pw[0].isalnum() or not pw[1].isalnum():
return ":red[Passwörter dürfen nur aus Buchstaben und Ziffern bestehen!]"
pw1az09 = "" pw1az09 = ""
for b in pw[0] + alpha_az09: for b in pw[0] + alpha_az09:
if b in alpha_az09 and b not in pw1az09: if b in alpha_az09 and b not in pw1az09:
@@ -2526,7 +2536,8 @@ def adfgvx_kodieren(eingabetext, pw):
else: else:
ausgabe_90za += i[j + 1] ausgabe_90za += i[j + 1]
z += 1 z += 1
ausgabetext = f":blue[Passwort 1:] {pw[0]} \n" ausgabetext = f":blue[verwendeter Eingabetext:] {klartext} \n"
ausgabetext += f":blue[Passwort 1:] {pw[0]} \n"
ausgabetext += f":blue[Passwort 2:] {pw2} \n \n" ausgabetext += f":blue[Passwort 2:] {pw2} \n \n"
ausgabetext += f":blue[kodiert mit Variante A-Z,0-9:] \n{ausgabe_az09} \n \n" ausgabetext += f":blue[kodiert mit Variante A-Z,0-9:] \n{ausgabe_az09} \n \n"
ausgabetext += f":blue[kodiert mit Variante 9-0,Z-A:] \n{ausgabe_90za}" ausgabetext += f":blue[kodiert mit Variante 9-0,Z-A:] \n{ausgabe_90za}"
@@ -2546,12 +2557,18 @@ def adfgvx_dekodieren(eingabetext, pw):
alpha_az09 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" alpha_az09 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
alpha_90za = "9876543210ZYXWVUTSRQPONMLKJIHGFEDCBA" alpha_90za = "9876543210ZYXWVUTSRQPONMLKJIHGFEDCBA"
text = text.upper() text = text.upper()
text = text.replace(" ", "")
pw = pw.upper() pw = pw.upper()
pw = pw.split(",") pw = pw.split(",")
if len(pw) != 2: if len(pw) != 2:
return ":red[Es es werden genau zwei durch Komma getrennte Passwörter benötigt!]" return ":red[Es es werden genau zwei durch Komma getrennte Passwörter benötigt!]"
pw[0] = pw[0].strip() pw[0] = pw[0].strip()
pw[1] = pw[1].strip() pw[1] = pw[1].strip()
if not pw[0].isalnum() or not pw[1].isalnum():
return ":red[Passwörter dürfen nur aus Buchstaben und Ziffern bestehen!]"
for zeichen in text:
if zeichen not in "ADFGVX":
return ":red[Im Eingabetext dürfen nur Leerzeichen und die Buchstaben ADFGVX vorkommen!]"
pw1az09 = "" pw1az09 = ""
for b in pw[0] + alpha_az09: for b in pw[0] + alpha_az09:
if b in alpha_az09 and b not in pw1az09: if b in alpha_az09 and b not in pw1az09:

View File

@@ -35,6 +35,3 @@ Der einfachst Weg, um die App lokal laufen zu lassen, ist mit Docker, wobei ich
- `docker compose up -d` - `docker compose up -d`
bei allen 3 Varianten ist die App anschließend im Browser unter http://127.0.0.1:8501/ aufrufbar bei allen 3 Varianten ist die App anschließend im Browser unter http://127.0.0.1:8501/ aufrufbar
__HINWEIS: Beim ersten Aufruf der Adresse werden Special-Wörterbücher für RE-Morse und T9 generiert,
was ca. 15-30s in Anspruch nimmt und dadurch das Laden der Seite einmalig verzögert.__

Binary file not shown.