Skip to content
This repository has been archived by the owner on Jul 9, 2024. It is now read-only.

feat(Notification): better validation #400

Merged
merged 1 commit into from
Jun 9, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,7 @@ werden (von uns oder euch - feel free!) irgendwann hinzukommen:

- [ ] Datum eingrenzen bei der Terminwahl
- [ ] Github Pages
- [ ] Integrierter updater.
- [ ] Macosx Build / Pipeline (Mac currently blocks the app: [Branch](https://github.com/iamnotturner/vaccipy/tree/mac-intel-build))
- [ ] Code Zertifikate für Windows (gegen Virusmeldung)

Expand Down
2 changes: 1 addition & 1 deletion gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ def __init__(self, pfad_fenster_layout: str = os.path.join(PATH, "tools/gui/main
super().__init__()

create_missing_dirs(PATH)

marcorombach marked this conversation as resolved.
Show resolved Hide resolved
#Spawn for now (The parent process starts a fresh python interpreter process. The child process will only inherit those resources necessary to run the process object’s)
multiprocessing.set_start_method('spawn')

Expand Down
56 changes: 37 additions & 19 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from tools.kontaktdaten import decode_wochentag, encode_wochentag, get_kontaktdaten, \
validate_kontaktdaten, validate_datum
from tools.utils import create_missing_dirs, get_latest_version, remove_prefix, update_available, \
get_current_version
get_current_version, pushover_validation, telegram_validation

PATH = os.path.dirname(os.path.realpath(__file__))

Expand Down Expand Up @@ -107,26 +107,44 @@ def update_kontaktdaten_interactive(
if "notifications" not in kontaktdaten:
kontaktdaten["notifications"] = {}
if "pushover" not in kontaktdaten["notifications"]:
kontaktdaten["notifications"]["pushover"] = {}
if input("> Benachtigung mit Pushover einrichten? (y/n): ").lower() != "n":
print()
input_kontaktdaten_key(
kontaktdaten, ["notifications", "pushover", "app_token"],
"> Geben Sie den Pushover APP Token ein: ")
input_kontaktdaten_key(
kontaktdaten, ["notifications", "pushover", "user_key"],
"> Geben Sie den Pushover User Key ein: ")
while True:
kontaktdaten["notifications"]["pushover"] = {}
if input("> Benachtigung mit Pushover einrichten? (y/n): ").lower() != "n":
print()
input_kontaktdaten_key(
kontaktdaten, ["notifications", "pushover", "app_token"],
"> Geben Sie den Pushover APP Token ein: ")
input_kontaktdaten_key(
kontaktdaten, ["notifications", "pushover", "user_key"],
"> Geben Sie den Pushover User Key ein: ")
validation_code = str(pushover_validation(kontaktdaten["notifications"]["pushover"]))
validation_input = input("Geben Sie den Validierungscode ein:").strip()
if validation_input == validation_code:
break
del kontaktdaten["notifications"]["pushover"]
print("Validierung fehlgeschlagen.")
else:
break

if "telegram" not in kontaktdaten["notifications"]:
kontaktdaten["notifications"]["telegram"] = {}
if input("> Benachtigung mit Telegram einrichten? (y/n): ").lower() != "n":
print()
input_kontaktdaten_key(
kontaktdaten, ["notifications", "telegram", "api_token"],
"> Geben Sie den Telegram API Token ein: ")
input_kontaktdaten_key(
kontaktdaten, ["notifications", "telegram", "chat_id"],
"> Geben Sie die Telegram Chat ID ein: ")
while True:
kontaktdaten["notifications"]["telegram"] = {}
if input("> Benachtigung mit Telegram einrichten? (y/n): ").lower() != "n":
print()
input_kontaktdaten_key(
kontaktdaten, ["notifications", "telegram", "api_token"],
"> Geben Sie den Telegram API Token ein: ")
input_kontaktdaten_key(
kontaktdaten, ["notifications", "telegram", "chat_id"],
"> Geben Sie die Telegram Chat ID ein: ")
validation_code = str(telegram_validation(kontaktdaten["notifications"]["telegram"]))
validation_input = input("Geben Sie den Validierungscode ein:").strip()
if validation_input == validation_code:
break
del kontaktdaten["notifications"]["telegram"]
print("Validierung fehlgeschlagen.")
else:
break

if "zeitrahmen" not in kontaktdaten and command == "search":
kontaktdaten["zeitrahmen"] = {}
Expand Down
2 changes: 1 addition & 1 deletion tools/gui/qtkontakt.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@ def __lade_alle_werte(self):
return

# Wird nur bei Terminsuche benötigt
self.i_code_impfzentren.setText(kontaktdaten["code"])
self.i_code_impfzentren.setText(kontaktdaten["codes"][0])
self.i_anrede_combo_box.setEditText(kontaktdaten["kontakt"]["anrede"])
self.i_vorname.setText(kontaktdaten["kontakt"]["vorname"])
self.i_nachname.setText(kontaktdaten["kontakt"]["nachname"])
Expand Down
35 changes: 33 additions & 2 deletions tools/kontaktdaten.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
import json
import re
from email.utils import parseaddr

from tools import Modus
from tools.exceptions import ValidationError, MissingValuesError
from tools import Modus


WOCHENTAG_ABBRS = ["Mo", "Di", "Mi", "Do", "Fr", "Sa", "So"]
WOCHENTAG_NAMES = [
Expand Down Expand Up @@ -398,27 +398,58 @@ def validate_telegram(telegram: dict):


def validate_pushover_app_token(pushover_app_token: str):
"""
Validiert den Pushover App Token.

:raise ValidationError: Typ ist nicht str
:raise ValidationError: Der Wert istz nicht genau 30 Zeichen lang
"""
if not isinstance(pushover_app_token, str):
raise ValidationError("Muss eine Zeichenkette sein")
if len(pushover_app_token) != 30:
raise ValidationError("Der Pushover APP Token muss genau 30 Zeichen lang sein")


def validate_pushover_user_key(pushover_user_key: str):
"""
Validiert den Pushover User Key.

:raise ValidationError: Typ ist nicht str
:raise ValidationError: Der Wert istz nicht genau 30 Zeichen lang
"""

if not isinstance(pushover_user_key, str):
raise ValidationError("Muss eine Zeichenkette sein")
if len(pushover_user_key) != 30:
raise ValidationError("Der Pushover User Key muss genau 30 Zeichen lang sein")


def validate_telegram_api_token(telegram_api_token: str):
"""
Validiert den Telegram API Token.

:raise ValidationError: Typ ist nicht str
:raise ValidationError: Entspricht nicht dem Format \w+:\w+
"""

if not isinstance(telegram_api_token, str):
raise ValidationError("Muss eine Zeichenkette sein")
if not re.search(r"\w+:\w+", telegram_api_token):
raise ValidationError("Der Telegram API-Token besteht aus zwei Teilen welche durch \":\" getrennt sind.")


def validate_telegram_chat_id(telegram_chat_id: str):
"""
Validiert die Telegram Chat ID.

:raise ValidationError: Typ ist nicht str
:raise ValidationError: Die ID ist zu kurz (Länge der IDs variiert)
"""

if not isinstance(telegram_chat_id, str):
raise ValidationError("Muss eine Zeichenkette sein")
if len(telegram_chat_id) < 4:
raise ValidationError("Die Chat ID ist zu kurz.")


def validate_datum(date: str):
Expand Down
18 changes: 17 additions & 1 deletion tools/utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import os
import time
import traceback
import random
import json
import sys
from json import JSONDecodeError
from pathlib import Path
from threading import Thread
Expand All @@ -11,7 +14,6 @@

from tools.exceptions import DesktopNotificationError, PushoverNotificationError, TelegramNotificationError

from tools.kontaktdaten import get_kontaktdaten

def retry_on_failure(retries=10):
"""Decorator zum Errorhandling beim Ausführen einer Methode im Loop.
Expand Down Expand Up @@ -193,6 +195,13 @@ def pushover_notification(notifications: dict, title: str, message: str):
raise PushoverNotificationError(r.status_code, r.text)


def pushover_validation(notifications: dict):
validation_code = random.randint(1000, 9999)
validation_msg = f"Ihr Validierungscode lautet: {validation_code}"
pushover_notification(notifications, "Vaccipy - Validierung", validation_msg)
return validation_code


def telegram_notification(notifications: dict, message: str):
if 'api_token' not in notifications or 'chat_id' not in notifications:
return
Expand All @@ -214,6 +223,13 @@ def telegram_notification(notifications: dict, message: str):
raise TelegramNotificationError(r.status_code, r.text)


def telegram_validation(notifications: dict):
validation_code = random.randint(1000, 9999)
validation_msg = f"Ihr Vaccipy Validierungscode lautet: {validation_code}"
telegram_notification(notifications, validation_msg)
return validation_code


def fire_notifications(notifications: dict, operating_system: str, title: str, message: str):
desktop_notification(operating_system, title, message)
if 'pushover' in notifications:
Expand Down