From: Raphael Michel Date: Wed, 14 Jun 2017 14:55:34 +0000 (+0200) Subject: Fix escaping problems with GAD banks X-Git-Tag: v0.2.1~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8c0758d167c350876f5d3a0740d853fc5f6c5a4d;p=thirdparty%2Fpython-fints.git Fix escaping problems with GAD banks --- diff --git a/fints/client.py b/fints/client.py index f9fe755..659e0ef 100644 --- a/fints/client.py +++ b/fints/client.py @@ -10,7 +10,7 @@ from .segments.accounts import HKSPA from .segments.statement import HKKAZ from .segments.saldo import HKSAL from .segments.depot import HKWPD -from .utils import mt940_to_array, MT535_Miniparser +from .utils import mt940_to_array, MT535_Miniparser, split_for_data_groups, split_for_data_elements from mt940.models import Balance logger = logging.getLogger(__name__) @@ -69,6 +69,7 @@ class FinTS3Client: while HKKAZ.type in touchdowns: logger.info('Fetching more results ({})...'.format(touchdown_counter)) msg = self._create_statement_message(dialog, account, start_date, end_date, touchdowns[HKKAZ.type]) + logger.debug('Send message: {}'.format(msg)) resp = dialog.send(msg) responses.append(resp) @@ -134,7 +135,7 @@ class FinTS3Client: # find segment and split up to balance part seg = resp._find_segment('HISAL') - arr = seg.split('+')[4].split(':') + arr = split_for_data_elements(split_for_data_groups(seg)[4]) # get balance date date = datetime.datetime.strptime(arr[3], "%Y%m%d").date() diff --git a/fints/message.py b/fints/message.py index b574ed9..b6be2ae 100644 --- a/fints/message.py +++ b/fints/message.py @@ -1,6 +1,7 @@ import random import re +from fints.utils import split_for_data_groups, split_for_data_elements, fints_unescape from .segments.message import HNHBK, HNHBS, HNSHA, HNSHK, HNVSD, HNVSK @@ -156,20 +157,20 @@ class FinTSResponse: for msgseg in msg.encrypted_segments: seg = self._find_segment_for_reference('HIRMS', msgseg) if seg: - parts = seg.split('+')[1:] + parts = split_for_data_groups(seg)[1:] for p in parts: - psplit = p.split(':') + psplit = split_for_data_elements(p) if psplit[0] == "3040": td = psplit[3] - touchdown[msgseg.type] = td + touchdown[msgseg.type] = fints_unescape(td) return touchdown def _get_segment_max_version(self, name): v = 3 segs = self._find_segments(name) for s in segs: - parts = s.split('+') - segheader = parts[0].split(':') + parts = split_for_data_groups(s) + segheader = split_for_data_elements(parts[0]) curver = int(segheader[2]) if curver > v: v = curver diff --git a/fints/segments/statement.py b/fints/segments/statement.py index 5f3f891..71114e4 100644 --- a/fints/segments/statement.py +++ b/fints/segments/statement.py @@ -1,9 +1,12 @@ +from fints.utils import fints_escape from . import FinTS3Segment class HKKAZ(FinTS3Segment): """ HKKAZ (Kontoumsätze) + + Refs: http://www.hbci-zka.de/dokumente/spezifikation_deutsch/fintsv3/FinTS_3.0_Messages_Geschaeftsvorfaelle_2015-08-07_final_version.pdf Section C.2.1.1.1.2 """ type = 'HKKAZ' @@ -17,6 +20,6 @@ class HKKAZ(FinTS3Segment): date_start.strftime('%Y%m%d'), date_end.strftime('%Y%m%d'), '', - touchdown if touchdown is not None else '' + fints_escape(touchdown) if touchdown is not None else '' ] super().__init__(segno, data) diff --git a/fints/utils.py b/fints/utils.py index c06ec82..9c2a86d 100644 --- a/fints/utils.py +++ b/fints/utils.py @@ -17,6 +17,28 @@ def print_segments(message): print(u"{}: {}".format(idx, seg.encode('utf-8'))) +def fints_escape(content): + """ + Escape strings + + Ref: https://www.hbci-zka.de/dokumente/spezifikation_deutsch/fintsv3/FinTS_3.0_Formals_2017-05-11_final_version.pdf + Section H.1.1 + """ + return content.replace('?', '??').replace('+', '?+').replace(':', '?:').replace("'", "?'") + + +def fints_unescape(content): + return content.replace('??', '?').replace("?'", "'").replace('?+', '+').replace('?:', ':') + + +def split_for_data_groups(seg): + return re.split('\+(?