odoo18/addons/sms_twilio/tools/sms_twilio.py

43 lines
1.4 KiB
Python

import base64
import hashlib
import hmac
from werkzeug.urls import url_join
from odoo.addons.phone_validation.tools import phone_validation
def get_twilio_from_number(company, to_number):
"""
:return: the Twilio number from which we'll send the SMS depending on the country of destination (to_number)
"""
country_code = phone_validation.phone_get_country_code_for_number(to_number)
from_number = company.sms_twilio_number_ids
if not from_number or not country_code:
return from_number[:1]
return from_number.sorted(
lambda rec: rec.country_code == country_code,
reverse=True,
)[0]
def get_twilio_status_callback_url(company, uuid):
base_url = company.get_base_url() # When testing locally, this should be replaced by a real url (not localhost, e.g. with ngrok)
return url_join(base_url, f'/sms_twilio/status/{uuid}')
def generate_twilio_sms_callback_signature(company, sms_uuid, callback_params):
url = get_twilio_status_callback_url(company, sms_uuid)
# Sort the POST parameters by key and concatenate them to URL
sorted_params = ''.join(f"{k}{v}" for k, v in sorted(callback_params.items()))
data = url + sorted_params
# Compute HMAC-SHA1 digest and then base64 encode
return base64.b64encode(
hmac.new(
company.sms_twilio_auth_token.encode(),
data.encode(),
hashlib.sha1
).digest()
).decode()