From 57b144ae29445f7e898a3e960785d035926503da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Wieczorek?= Date: Tue, 17 Oct 2023 17:53:20 +0200 Subject: [PATCH] Add plivo gateway. --- docs/configuration.rst | 21 ++++++++++++ requirements_dev.txt | 1 + two_factor/gateways/plivo/__init__.py | 0 two_factor/gateways/plivo/gateway.py | 32 +++++++++++++++++++ .../two_factor/plivo/sms_message.html | 5 +++ 5 files changed, 59 insertions(+) create mode 100644 two_factor/gateways/plivo/__init__.py create mode 100644 two_factor/gateways/plivo/gateway.py create mode 100644 two_factor/templates/two_factor/plivo/sms_message.html diff --git a/docs/configuration.rst b/docs/configuration.rst index 2c5d8d177..4e3e510e5 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -84,6 +84,7 @@ setting. Then, you may want to configure the following settings: * ``'two_factor.gateways.twilio.gateway.Twilio'`` for sending real text messages using Twilio_. + * ``'two_factor.gateways.plivo.gateway.Plivo'`` for sending SMS using Plivo_. * ``'two_factor.gateways.fake.Fake'`` for development, recording tokens to the default logger. @@ -146,6 +147,26 @@ Additionally, you need to enable the ``ThreadLocals`` middleware: .. autoclass:: two_factor.gateways.twilio.gateway.Twilio +Plivo Gateway +-------------- +To use the Plivo you need to get the Auth ID and Auth Token from the Plivo console. +You need to buy a source number from Plivo too, which is used by the gateway too. +To use Plivo as a authentication service you need to setup a PHLO for Two-Factor +authentication. +The dependency needed is the plivo module. + +.. code-block:: console + + pip install plivo + +Sample configuration in settings could look like this: + +.. code-block:: python + + PLIVO_AUTH_ID = 'NANWFHZJDKYJG2YNNNN2' + PLIVO_AUTH_TOKEN = 'ZGYwMTVkMGE5NGiiiWFmHGHmYmNhOWY3NTRhYzQ4' + PLIVO_SOURCE_NUMBER = '+1 206-426-9999' + Fake Gateway ------------ .. autoclass:: two_factor.gateways.fake.Fake diff --git a/requirements_dev.txt b/requirements_dev.txt index 90fc3a374..0e31ac9c3 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -4,6 +4,7 @@ # Additional runtime dependencies +plivo twilio phonenumberslite diff --git a/two_factor/gateways/plivo/__init__.py b/two_factor/gateways/plivo/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/two_factor/gateways/plivo/gateway.py b/two_factor/gateways/plivo/gateway.py new file mode 100644 index 000000000..237822b92 --- /dev/null +++ b/two_factor/gateways/plivo/gateway.py @@ -0,0 +1,32 @@ +import plivo +from django.conf import settings +from django.template.loader import render_to_string + + +class Plivo: + """ + Gateway for sending text messages using Plivo. + """ + + def __init__(self): + self.client = plivo.RestClient( + auth_id=getattr(settings, 'PLIVO_AUTH_ID'), + auth_token=getattr(settings, 'PLIVO_AUTH_TOKEN') + ) + self.source_number = getattr(settings, 'PLIVO_SOURCE_NUMBER') + + def make_call(self, device, token): + raise NotImplementedError + + def send_sms(self, device, token): + text = render_to_string( + 'two_factor/plivo/sms_message.html', + {'token': token} + ) + send_kwargs = { + 'src': self.source_number, + 'dst': device.number.as_e164, + 'text': text, + } + + self.client.messages.create(**send_kwargs) diff --git a/two_factor/templates/two_factor/plivo/sms_message.html b/two_factor/templates/two_factor/plivo/sms_message.html new file mode 100644 index 000000000..822cfde1c --- /dev/null +++ b/two_factor/templates/two_factor/plivo/sms_message.html @@ -0,0 +1,5 @@ +{% load i18n %} +{% blocktrans trimmed %} + Your OTP token is {{ token }} +{% endblocktrans %} +