]> git.ipfire.org Git - thirdparty/python-fints.git/commitdiff
Parse full HKTAN segment
authorRaphael Michel <mail@raphaelmichel.de>
Mon, 23 Jul 2018 19:11:34 +0000 (21:11 +0200)
committerRaphael Michel <mail@raphaelmichel.de>
Thu, 26 Jul 2018 20:27:05 +0000 (22:27 +0200)
fints/client.py
fints/models.py
fints/segments/transfer.py

index 1b19d4d1682cbc10644a2cc11788cd3cca34df95..a867ac3e24b8f87a2dccf433b5f2dd54e7263ee8 100644 (file)
@@ -5,7 +5,7 @@ import datetime
 from .connection import FinTSHTTPSConnection
 from .dialog import FinTSDialog
 from .message import FinTSMessage
-from .models import SEPAAccount
+from .models import SEPAAccount, TANMethod5, TANMethod6
 from .segments.auth import HKTAN, HKTAB
 from .segments.accounts import HKSPA
 from .segments.statement import HKKAZ
@@ -313,25 +313,28 @@ class FinTS3Client:
 
         # Get parameters for tan methods
         seg = res._find_segments('HITANS')
-        verfahren = []
-        for t in tan_methods:
-            for s in seg:
-                ct = s.find(t)
-                c0 = s[ct:].find(':00:')  # Initialisierungsverfahren mit Klartext-PIN ohne TAN
-                if ct != -1 and c0 != -1:
-                    deg = s[ct:ct + c0 + 7]
-                    de = split_for_data_elements(deg)
-
-                    v = {}
-                    if de[3] == 'HHDOPT1':
-                        v['Bezeichnung'] = de[5]
-                    else:
-                        v['Bezeichnung'] = de[2]
-                    v['Code'] = de[0]
-                    v['TAN-erf'] = de[len(de) - 2]
-                    verfahren.append(v)
-
-        return verfahren
+        methods = []
+        for s in seg:
+            spl = split_for_data_elements(s)
+            if spl[2] == '5':
+                model = TANMethod5
+            elif spl[2] == '6':
+                model = TANMethod6
+            else:
+                raise NotImplementedError(
+                    "HITANS segment version {} is currently not implemented".format(
+                        spl[2]
+                    )
+                )
+
+            step = len(model._fields)
+            for i in range(len(spl) // step):
+                part = spl[6 + i * step:6 + (i + 1) * step]
+                method = model(*part)
+                if method.security_feature in tan_methods:
+                    methods.append(method)
+
+        return methods
 
     def get_tan_description(self):
         dialog = self._new_dialog()
index c78af2b3dd680cb8365a69ce09bfcbde690b6261..d0b91edeba8b41d33246fe3dcbca2f42cef24cf0 100644 (file)
@@ -4,4 +4,24 @@ SEPAAccount = namedtuple('SEPAAccount', 'iban bic accountnumber subaccount blz')
 
 Saldo = namedtuple('Saldo', 'account date value currency')
 
-Holding = namedtuple('Holding', 'ISIN name market_value value_symbol valuation_date pieces total_value acquisitionprice')
+Holding = namedtuple('Holding',
+                     'ISIN name market_value value_symbol valuation_date pieces total_value acquisitionprice')
+
+
+# Source: PIN/TAN docs – Verfahrensparameter Zwei-Schritt-Verfahren, Elementversion #5
+TANMethod5 = namedtuple('TANMethod5', 'security_feature tan_process tech_id zka_id zka_version name max_length_input '
+                                      'allowed_format text_returnvalue max_length_returnvalue '
+                                      'number_of_supported_lists multiple_tans_allowed '
+                                      'tan_time_dialog_association tan_list_number_required '
+                                      'cancel_allowed sms_charge_account_required principal_account_required '
+                                      'challenge_class_required challenge_value_required '
+                                      'initialization_mode description_required supported_media_number')
+
+# Source: PIN/TAN docs – Verfahrensparameter Zwei-Schritt-Verfahren, Elementversion #6
+TANMethod6 = namedtuple('TANMethod6', 'security_feature tan_process tech_id zka_id zka_version name max_length_input '
+                                      'allowed_format text_returnvalue max_length_returnvalue '
+                                      'multiple_tans_allowed tan_time_dialog_association '
+                                      'cancel_allowed sms_charge_account_required principal_account_required '
+                                      'challenge_class_required challenge_structured '
+                                      'initialization_mode description_required hhd_uc_required '
+                                      'supported_media_number')
index cec70aaa928435e2a22b0cf5f40b7511817b4972..e839ed3e1e60e7b131b82100c5b8a4360cd8999e 100644 (file)
@@ -13,7 +13,6 @@ class HKCCS(FinTS3Segment):
         self.version = 1
         sepa_descriptor = 'urn?:iso?:std?:iso?:20022?:tech?:xsd?:pain.001.001.03'
         pain_msg = self.create_pain(account, arg)
-        length = '@{}@'.format(len(pain_msg))
         msg = ':'.join([
             account.iban,
             account.bic