Neuer BenachrichtigungTransport hinter der Aktor-URL "Benachrichtigung": push schickt an alle angemeldeten Geraete (homeMesh.push_abos), mail ueber den SMTP-Zugang aus der config.ini. Ein Abo, das der Push-Dienst mit 404 oder 410 ablehnt, wird geloescht statt weiter angeschrieben. Daneben hoert der Runner auf benachrichtigung/# - darueber schickt die Probe aus den Einstellungen, ohne dass die Weboberflaeche verschluesseln muesste. Zugestellt wird im Haupttakt, nicht im MQTT-Faden. pywebpush, py_vapid und http_ece liegen wie die uebrigen Fremdpakete im Ordner, nicht in site-packages; transports.py haengt ihn an den Suchpfad. Das Schluesselpaar erzeugt vapid_erzeugen.py und bleibt ausserhalb des Git. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
40 lines
921 B
Python
40 lines
921 B
Python
import base64
|
|
import binascii
|
|
|
|
|
|
def b64urldecode(data):
|
|
"""Decodes an unpadded Base64url-encoded string.
|
|
|
|
:param data: data bytes to decode
|
|
:type data: bytes
|
|
|
|
:returns bytes
|
|
|
|
"""
|
|
return base64.urlsafe_b64decode(data + b"===="[len(data) % 4:])
|
|
|
|
|
|
def b64urlencode(data):
|
|
"""Encode a byte string into a Base64url-encoded string without padding
|
|
|
|
:param data: data bytes to encode
|
|
:type data: bytes
|
|
|
|
:returns str
|
|
|
|
"""
|
|
return base64.urlsafe_b64encode(data).replace(b'=', b'').decode('utf8')
|
|
|
|
|
|
def num_to_bytes(n, pad_to):
|
|
"""Returns the byte representation of an integer, in big-endian order.
|
|
:param n: The integer to encode.
|
|
:type n: int
|
|
:param pad_to: Expected length of result, zeropad if necessary.
|
|
:type pad_to: int
|
|
:returns bytes
|
|
"""
|
|
h = '%x' % n
|
|
r = binascii.unhexlify('0' * (len(h) % 2) + h)
|
|
return b'\x00' * (pad_to - len(r)) + r
|