From 4976f48944b9a8e57bc9359df6c0f7b38741b8e0 Mon Sep 17 00:00:00 2001 From: Son Date: Wed, 5 Jan 2022 18:14:51 +0100 Subject: [PATCH] add /phone/provider2/sms --- app/phone/__init__.py | 8 +++- app/phone/views/provider2_callback.py | 60 +++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 app/phone/views/provider2_callback.py diff --git a/app/phone/__init__.py b/app/phone/__init__.py index 9cae932e..b959902b 100644 --- a/app/phone/__init__.py +++ b/app/phone/__init__.py @@ -1 +1,7 @@ -from .views import index, phone_reservation, twilio_callback, provider1_callback +from .views import ( + index, + phone_reservation, + twilio_callback, + provider1_callback, + provider2_callback, +) diff --git a/app/phone/views/provider2_callback.py b/app/phone/views/provider2_callback.py new file mode 100644 index 00000000..1ed26c95 --- /dev/null +++ b/app/phone/views/provider2_callback.py @@ -0,0 +1,60 @@ +import jwt +from flask import request +from jwt import InvalidSignatureError, DecodeError + +from app.config import ( + PHONE_PROVIDER_2_HEADER, + PHONE_PROVIDER_2_SECRET, +) +from app.log import LOG +from app.models import PhoneNumber, PhoneMessage +from app.phone.base import phone_bp + + +@phone_bp.route("/provider2/sms", methods=["GET", "POST"]) +def provider2_sms(): + encoded = request.headers.get(PHONE_PROVIDER_2_HEADER) + try: + jwt.decode(encoded, key=PHONE_PROVIDER_2_SECRET, algorithms="HS256") + except (InvalidSignatureError, DecodeError): + LOG.e( + "Unauthenticated callback %s %s %s %s", + request.headers, + request.method, + request.args, + request.json, + ) + return "not ok", 400 + + # request.json should be a dict where + # msisdn is the sender + # receiver is the receiver + # For ex: + # {'id': 2042489247, 'msisdn': 33612345678, 'country_code': 'FR', 'country_prefix': 33, 'receiver': 33687654321, + # 'message': 'Test 1', 'senttime': 1641401781, 'webhook_label': 'Hagekar', 'sender': None, + # 'mcc': None, 'mnc': None, 'validity_period': None, 'encoding': 'UTF8', 'udh': None, 'payload': None} + + to_number: str = str(request.json.get("receiver")) + if not to_number.startswith("+"): + to_number = "+" + to_number + + from_number = str(request.json.get("msisdn")) + if not from_number.startswith("+"): + from_number = "+" + from_number + + body = request.json.get("message") + + LOG.d("%s->%s:%s", from_number, to_number, body) + + phone_number = PhoneNumber.get_by(number=to_number) + if phone_number: + PhoneMessage.create( + number_id=phone_number.id, + from_number=from_number, + body=body, + commit=True, + ) + else: + LOG.e("Unknown phone number %s %s", to_number, request.json) + return "not ok", 200 + return "ok", 200