From 55266fd721a42ecc8ac30afd75e715061a89d03e Mon Sep 17 00:00:00 2001 From: philip Date: Wed, 29 Dec 2021 17:17:13 +0300 Subject: [PATCH] Adds system guardians --- .../cic-ussd/cic_ussd/account/guardianship.py | 22 ++++++++++++++++++ .../cic_ussd/state_machine/logic/pin_guard.py | 23 +++++++++++++++++-- apps/cic-ussd/var/lib/sys/guardians.txt | 0 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 apps/cic-ussd/cic_ussd/account/guardianship.py create mode 100644 apps/cic-ussd/var/lib/sys/guardians.txt diff --git a/apps/cic-ussd/cic_ussd/account/guardianship.py b/apps/cic-ussd/cic_ussd/account/guardianship.py new file mode 100644 index 00000000..32bcfaff --- /dev/null +++ b/apps/cic-ussd/cic_ussd/account/guardianship.py @@ -0,0 +1,22 @@ +# standard imports + +# external imports + +# local imports + +class Guardianship: + guardians: list = [] + + @classmethod + def load_system_guardians(cls, guardians_file: str): + with open(guardians_file, 'r') as system_guardians: + cls.guardians = [line.strip() for line in system_guardians] + + def is_system_guardian(self, phone_number: str): + """ + :param phone_number: + :type phone_number: + :return: + :rtype: + """ + return phone_number in self.guardians diff --git a/apps/cic-ussd/cic_ussd/state_machine/logic/pin_guard.py b/apps/cic-ussd/cic_ussd/state_machine/logic/pin_guard.py index 4e87e473..a1e3d0da 100644 --- a/apps/cic-ussd/cic_ussd/state_machine/logic/pin_guard.py +++ b/apps/cic-ussd/cic_ussd/state_machine/logic/pin_guard.py @@ -9,9 +9,11 @@ from phonenumbers.phonenumberutil import NumberParseException from sqlalchemy.orm.session import Session # local imports +from cic_ussd.account.guardianship import Guardianship from cic_ussd.account.metadata import get_cached_preferred_language from cic_ussd.db.models.account import Account from cic_ussd.db.models.base import SessionBase +from cic_ussd.notifications import Notifier from cic_ussd.phone_number import process_phone_number, E164Format from cic_ussd.session.ussd_session import save_session_data from cic_ussd.translation import translation_for @@ -82,6 +84,8 @@ def is_valid_guardian_addition(state_machine_data: Tuple[str, dict, Account, Ses preferred_language = i18n.config.get('fallback') is_valid_account = Account.get_by_phone_number(phone_number, session) is not None + guardianship = Guardianship() + is_system_guardian = guardianship.is_system_guardian(phone_number) is_initiator = phone_number == account.phone_number is_existent_guardian = phone_number in account.get_guardians() @@ -100,7 +104,7 @@ def is_valid_guardian_addition(state_machine_data: Tuple[str, dict, Account, Ses session_data['failure_reason'] = failure_reason save_session_data('cic-ussd', session, session_data, ussd_session) - return phone_number is not None and is_valid_account and not is_existent_guardian and not is_initiator + return phone_number is not None and is_valid_account and not is_existent_guardian and not is_initiator and not is_system_guardian def add_pin_guardian(state_machine_data: Tuple[str, dict, Account, Session]): @@ -130,6 +134,9 @@ def is_set_pin_guardian(account: Account, checked_number: str, preferred_languag is_set_guardian = checked_number in set_guardians is_initiator = checked_number == account.phone_number + guardianship = Guardianship() + is_system_guardian = guardianship.is_system_guardian(checked_number) + if not is_set_guardian: failure_reason = translation_for('helpers.error.is_not_existent_guardian', preferred_language) @@ -141,7 +148,7 @@ def is_set_pin_guardian(account: Account, checked_number: str, preferred_languag session_data['failure_reason'] = failure_reason save_session_data('cic-ussd', session, session_data, ussd_session) - return is_set_guardian and not is_initiator + return (is_set_guardian or is_system_guardian) and not is_initiator def is_dialers_pin_guardian(state_machine_data: Tuple[str, dict, Account, Session]): @@ -193,8 +200,20 @@ def initiate_pin_reset(state_machine_data: Tuple[str, dict, Account, Session]): save_session_data('cic-ussd', session, session_data, ussd_session) guarded_account_phone_number = session_data.get('guarded_account_phone_number') guarded_account = Account.get_by_phone_number(guarded_account_phone_number, session) + if quorum_count >= guarded_account.guardian_quora: guarded_account.reset_pin(session) logg.debug(f'Reset initiated for: {guarded_account.phone_number}') session_data['quorum_count'] = 0 save_session_data('cic-ussd', session, session_data, ussd_session) + + preferred_language = get_cached_preferred_language(guarded_account.blockchain_address) + if not preferred_language: + preferred_language = i18n.config.get('fallback') + + notifier = Notifier() + notifier.send_sms_notification( + key='sms.pin_reset_initiated', + phone_number=guarded_account.phone_number, + preferred_language=preferred_language, + pin_initiator=account.standard_metadata_id()) diff --git a/apps/cic-ussd/var/lib/sys/guardians.txt b/apps/cic-ussd/var/lib/sys/guardians.txt new file mode 100644 index 00000000..e69de29b