From: Henryk Plötz Date: Thu, 9 Aug 2018 00:10:56 +0000 (+0200) Subject: Ignore end-of-sequence for open-end multiple fields X-Git-Tag: v2.0.0~1^2~144 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1f03580f9cfdc6e2bfeb565c741b3ac1b32c89ff;p=thirdparty%2Fpython-fints.git Ignore end-of-sequence for open-end multiple fields --- diff --git a/fints/formals.py b/fints/formals.py index 7695b74..b95b89b 100644 --- a/fints/formals.py +++ b/fints/formals.py @@ -540,3 +540,23 @@ class AllowedTransaction(DataElementGroup): limit_type = DataElementField(type='code', length=1, required=False) limit_amount = DataElementField(type='btg', required=False) limit_days = DataElementField(type='num', max_length=3, required=False) + +class TwoStepParameters(DataElementGroup): + security_function = DataElementField(type='code', max_length=3) + tan_process = DataElementField(type='code', length=1) + technical_identification_tan_process = DataElementField(type='id') + name_twostep_process = DataElementField(type='an', max_length=30) + max_length_tan_entry = DataElementField(type='num', max_length=2) + allowed_format_tan_entry = DataElementField(type='code', length=1) + return_value_text = DataElementField(type='an', max_length=30) + max_length_return_value = DataElementField(type='num', max_length=3) + number_supported_tan_lists = DataElementField(type='num', length=1) + multiple_tans_allowed = DataElementField(type='jn') + tan_time_delayed_allowed = DataElementField(type='jn') + +class ParameterTwostepTAN(DataElementGroup): + onestep_method_allowed = DataElementField(type='jn') + multiple_tasks_allowed = DataElementField(type='jn') + hash_algorithm = DataElementField(type='code', length=1) + security_profile_bank_signature = DataElementField(type='code', length=1) + twostep_parameters = DataElementGroupField(type=TwoStepParameters, min_count=1, max_count=98) diff --git a/fints/parser.py b/fints/parser.py index 70cbf3d..26c0664 100644 --- a/fints/parser.py +++ b/fints/parser.py @@ -190,6 +190,7 @@ class FinTS3Parser: for number, (name, field) in enumerate(retval._fields.items()): repeat = field.count != 1 constructed = isinstance(field, DataElementGroupField) + is_last = number == len(retval._fields)-1 if not repeat: if not constructed: @@ -212,7 +213,8 @@ class FinTS3Parser: break else: - deg = self.parse_deg(field.type, data_i, required and field.required) + require_last = (field.max_count is None) if is_last else True + deg = self.parse_deg(field.type, data_i, require_last and required and field.required) getattr(retval, name)[i] = deg i = i + 1 diff --git a/fints/segments/__init__.py b/fints/segments/__init__.py index 1b9a41e..5d1cdc0 100644 --- a/fints/segments/__init__.py +++ b/fints/segments/__init__.py @@ -1,6 +1,6 @@ import re -from fints.formals import Container, ContainerMeta, SegmentHeader, DataElementGroupField, DataElementField, ReferenceMessage, SegmentSequenceField, SecurityProfile, SecurityIdentificationDetails, SecurityDateTime, EncryptionAlgorithm, KeyName, Certificate, HashAlgorithm, SignatureAlgorithm, UserDefinedSignature, Response, AccountInformation, AccountLimit, AllowedTransaction +from fints.formals import Container, ContainerMeta, SegmentHeader, DataElementGroupField, DataElementField, ReferenceMessage, SegmentSequenceField, SecurityProfile, SecurityIdentificationDetails, SecurityDateTime, EncryptionAlgorithm, KeyName, Certificate, HashAlgorithm, SignatureAlgorithm, UserDefinedSignature, Response, AccountInformation, AccountLimit, AllowedTransaction, ParameterTwostepTAN from fints.utils import classproperty, SubclassesMixin @@ -126,3 +126,16 @@ class HIUPD6(FinTS3Segment): account_limit = DataElementGroupField(type=AccountLimit, required=False) allowed_transactions = DataElementGroupField(type=AllowedTransaction, max_count=999, required=False) extension = DataElementField(type='an', max_length=2048, required=False) + +class HISYN4(FinTS3Segment): + customer_system_id = DataElementField(type='id') + message_number = DataElementField(type='num', max_length=4, required=False) + security_reference_signature_key = DataElementField(type='num', max_length=16, required=False) + security_reference_digital_signature = DataElementField(type='num', max_length=16, required=False) + + +class HITANS1(FinTS3Segment): + max_number_tasks = DataElementField(type='num', max_length=3) + min_number_signatures = DataElementField(type='num', length=1) + security_class = DataElementField(type='num', length=1) + parameters_twostep_tan = DataElementGroupField(type=ParameterTwostepTAN)