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

Commit

Permalink
feat(notification): added better validation
Browse files Browse the repository at this point in the history
  • Loading branch information
marcorombach committed Jun 9, 2021
1 parent 0381e5e commit 229ba51
Show file tree
Hide file tree
Showing 7 changed files with 92 additions and 23 deletions.
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)

#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
2 changes: 2 additions & 0 deletions tools/its.py
Original file line number Diff line number Diff line change
Expand Up @@ -965,6 +965,7 @@ def notify(self, title: str, msg: str):
fire_notifications(self.notifications, self.operating_system, title, msg)

@staticmethod

def terminsuche(codes: list, plz_impfzentren: list, kontakt: dict,
PATH: str, notifications: dict = {}, zeitrahmen: dict = dict(),
check_delay: int = 30):
Expand Down Expand Up @@ -1026,6 +1027,7 @@ def terminsuche(codes: list, plz_impfzentren: list, kontakt: dict,
msg = "Termin erfolgreich gebucht!"
its.log.success(msg)
its.notify(title="Terminbuchung:", message=msg)

# Programm beenden, wenn Termin gefunden wurde
return
except AppointmentGone:
Expand Down
34 changes: 33 additions & 1 deletion tools/kontaktdaten.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
import json
import re
from email.utils import parseaddr

from tools.utils import telegram_validation, pushover_validation
from tools.exceptions import ValidationError, MissingValuesError
from tools import Modus
from tools.exceptions import ValidationError, MissingValuesError

Expand Down Expand Up @@ -398,27 +399,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

0 comments on commit 229ba51

Please sign in to comment.