fix key logic

This commit is contained in:
Karl 2025-07-18 17:07:46 +01:00
parent 42831d294c
commit 5ab44bd78d

View File

@ -15,6 +15,8 @@ from ktvmanager.lib.checker import validate_account
from typing import Tuple from typing import Tuple
import json import json
import re import re
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import ec
from pywebpush import webpush, WebPushException from pywebpush import webpush, WebPushException
api_blueprint = Blueprint("api", __name__) api_blueprint = Blueprint("api", __name__)
@ -149,18 +151,24 @@ def login_route(username: str, password: str) -> Response:
def vapid_public_key(): def vapid_public_key():
"""Provides the VAPID public key in the correct format.""" """Provides the VAPID public key in the correct format."""
pem_key = current_app.config["VAPID_PUBLIC_KEY"] pem_key = current_app.config["VAPID_PUBLIC_KEY"]
# Use regex to robustly extract the base64 content from the PEM key try:
match = re.search(r"-----BEGIN PUBLIC KEY-----(.*)-----END PUBLIC KEY-----", pem_key, re.DOTALL) public_key = serialization.load_pem_public_key(pem_key.encode("utf-8"))
if not match: if not isinstance(public_key, ec.EllipticCurvePublicKey):
return jsonify({"error": "Could not parse VAPID public key from config"}), 500 raise TypeError("VAPID public key is not an Elliptic Curve key")
# Join the split lines to remove all whitespace and newlines # Get the raw, uncompressed public key bytes (65 bytes for P-256)
base64_key = "".join(match.group(1).split()) raw_key = public_key.public_bytes(
encoding=serialization.Encoding.X962,
# Convert to URL-safe base64 and remove padding for the PushManager API format=serialization.PublicFormat.UncompressedPoint
url_safe_key = base64_key.replace('+', '-').replace('/', '_').rstrip('=') )
return jsonify({"public_key": url_safe_key}) # URL-safe base64 encode the raw key
url_safe_key = base64.urlsafe_b64encode(raw_key).rstrip(b'=').decode('utf-8')
return jsonify({"public_key": url_safe_key})
except (ValueError, TypeError, AttributeError) as e:
current_app.logger.error(f"Error processing VAPID public key: {e}")
return jsonify({"error": "Could not process VAPID public key"}), 500
@api_blueprint.route("/save-subscription", methods=["POST"]) @api_blueprint.route("/save-subscription", methods=["POST"])