From: Raphael Michel Date: Mon, 2 Jan 2017 18:11:08 +0000 (+0100) Subject: Make get_sepa_accounts work X-Git-Tag: v0.1.0~8 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=34e24574047bdc6223d79834f6d2cf469516ea1b;p=thirdparty%2Fpython-fints.git Make get_sepa_accounts work --- diff --git a/fints3/client.py b/fints3/client.py index 88a81b8..b52ed72 100644 --- a/fints3/client.py +++ b/fints3/client.py @@ -60,5 +60,6 @@ class FinTS3PinTanClient(FinTS3Client): return dialog def _new_message(self, dialog: FinTSDialog, segments): - return FinTSMessage(self.blz, self.username, self.pin, dialog.systemid, dialog.dialogid, dialog.msgno, segments) + return FinTSMessage(self.blz, self.username, self.pin, dialog.systemid, dialog.dialogid, dialog.msgno, + segments, dialog.tan_mechs) diff --git a/fints3/dialog.py b/fints3/dialog.py index 2fe952b..16d8c09 100644 --- a/fints3/dialog.py +++ b/fints3/dialog.py @@ -58,13 +58,13 @@ class FinTSDialog: def init(self): logger.info('Initialize Dialog') - seg_identification = HKIDN(3, self.blz, self.username, 0) + seg_identification = HKIDN(3, self.blz, self.username, self.systemid) seg_prepare = HKVVB(4) msg_init = FinTSMessage(self.blz, self.username, self.pin, self.systemid, self.dialogid, self.msgno, [ seg_identification, seg_prepare, - ]) + ], self.tan_mechs) logger.debug('Sending INIT: {}'.format(msg_init)) resp = self.send(msg_init) logger.debug('Got INIT response: {}'.format(resp)) diff --git a/fints3/message.py b/fints3/message.py index d6e9d96..b5fe3cf 100644 --- a/fints3/message.py +++ b/fints3/message.py @@ -5,7 +5,7 @@ from fints3.segments.message import HNHBK, HNSHK, HNVSK, HNVSD, HNSHA, HNHBS class FinTSMessage: - def __init__(self, blz, username, pin, systemid, dialogid, msgno, encrypted_segments): + def __init__(self, blz, username, pin, systemid, dialogid, msgno, encrypted_segments, tan_mechs=None): self.blz = blz self.username = username self.pin = pin @@ -15,6 +15,13 @@ class FinTSMessage: self.segments = [] self.encrypted_segments = [] + if tan_mechs and '999' not in tan_mechs: + self.profile_version = 2 + self.security_function = tan_mechs[0] + else: + self.profile_version = 1 + self.security_function = '999' + sig_head = self.build_signature_head() enc_head = self.build_encryption_head() self.segments.append(enc_head) @@ -39,10 +46,11 @@ class FinTSMessage: def build_signature_head(self): rand = random.SystemRandom() self.secref = rand.randint(1000000, 9999999) - return HNSHK(2, self.secref, self.blz, self.username, self.systemid) + return HNSHK(2, self.secref, self.blz, self.username, self.systemid, self.profile_version, + self.security_function) def build_encryption_head(self): - return HNVSK(998, self.blz, self.username, self.systemid) + return HNVSK(998, self.blz, self.username, self.systemid, self.profile_version) def build_header(self): l = sum([len(str(s)) for s in self.segments]) @@ -133,7 +141,7 @@ class FinTSResponse: if id == "3920": m = self.RE_TANMECH.search(msg) if m: - return m.group(0) + return [m.group(0)] return False def _get_segment_max_version(self, name): diff --git a/fints3/segments/message.py b/fints3/segments/message.py index a6f2ad2..8db471b 100644 --- a/fints3/segments/message.py +++ b/fints3/segments/message.py @@ -37,12 +37,11 @@ class HNSHK(FinTS3Segment): SECURITY_FUNC = 999 SECURITY_BOUNDARY = 1 # SHM SECURITY_SUPPLIER_ROLE = 1 # ISS - PINTAN_VERSION = 1 # 1-step - def __init__(self, segno, secref, blz, username, systemid): + def __init__(self, segno, secref, blz, username, systemid, profile_version, security_function=SECURITY_FUNC): data = [ - ':'.join(['PIN', str(self.PINTAN_VERSION)]), - self.SECURITY_FUNC, + ':'.join(['PIN', str(profile_version)]), + security_function, secref, self.SECURITY_BOUNDARY, self.SECURITY_SUPPLIER_ROLE, @@ -66,11 +65,10 @@ class HNVSK(FinTS3Segment): COMPRESSION_NONE = 0 SECURITY_SUPPLIER_ROLE = 1 # ISS - PINTAN_VERSION = 1 # 1-step - def __init__(self, segno, blz, username, systemid): + def __init__(self, segno, blz, username, systemid, profile_version): data = [ - ':'.join(['PIN', str(self.PINTAN_VERSION)]), + ':'.join(['PIN', str(profile_version)]), 998, self.SECURITY_SUPPLIER_ROLE, ':'.join(['1', '', str(systemid)]),