11
11
from bunq .sdk .context .session_context import SessionContext
12
12
from bunq .sdk .exception .bunq_exception import BunqException
13
13
from bunq .sdk .json import converter
14
+ from bunq .sdk .model .core .payment_service_provider_credential_internal import PaymentServiceProviderCredentialInternal
14
15
from bunq .sdk .model .generated import endpoint
16
+ from bunq .sdk .model .generated .endpoint import UserCredentialPasswordIp , UserPaymentServiceProvider
15
17
from bunq .sdk .security import security
16
18
17
19
if typing .TYPE_CHECKING :
21
23
class ApiContext :
22
24
"""
23
25
:type _environment_type: ApiEnvironmentType
24
- :type _api_key: str
25
- :type _session_context: SessionContext
26
- :type _installation_context: InstallationContext
26
+ :type _api_key: str|None
27
+ :type _session_context: SessionContext|None
28
+ :type _installation_context: InstallationContext|None
27
29
:type _proxy_url: str|None
28
30
"""
29
31
@@ -42,28 +44,56 @@ class ApiContext:
42
44
43
45
def __init__ (self ,
44
46
environment_type : ApiEnvironmentType ,
45
- api_key : str ,
46
- device_description : str ,
47
- permitted_ips : List [str ] = None ,
48
47
proxy_url : List [str ] = None ) -> None :
49
- if permitted_ips is None :
50
- permitted_ips = []
51
-
52
48
self ._environment_type = environment_type
53
- self ._api_key = api_key
49
+ self ._proxy_url = proxy_url
50
+ self ._api_key = None
54
51
self ._installation_context = None
55
52
self ._session_context = None
56
- self ._proxy_url = proxy_url
57
- self ._initialize (device_description , permitted_ips )
58
53
59
- def _initialize (self ,
60
- device_description : str ,
61
- permitted_ips : List [str ]) -> None :
62
- self ._initialize_installation ()
63
- self ._register_device (device_description , permitted_ips )
64
- self ._initialize_session ()
54
+ @classmethod
55
+ def create (cls ,
56
+ environment_type : ApiEnvironmentType ,
57
+ api_key : str ,
58
+ description : str ,
59
+ all_permitted_ip : List [str ] = None ,
60
+ proxy_url : List [str ] = None ) -> ApiContext :
61
+ api_context = cls (environment_type , proxy_url )
62
+
63
+ api_context ._api_key = api_key
64
+
65
+ api_context .__initialize_installation ()
66
+ api_context .__register_device (description , all_permitted_ip )
67
+ api_context .__initialize_session ()
68
+
69
+ return api_context
70
+
71
+ @classmethod
72
+ def create_for_psd2 (cls ,
73
+ environment_type : ApiEnvironmentType ,
74
+ certificate : str ,
75
+ private_key : str ,
76
+ all_chain_certificate : List [str ],
77
+ description : str ,
78
+ all_permitted_ip : List [str ] = None ,
79
+ proxy_url : List [str ] = None ) -> ApiContext :
80
+ api_context = cls (environment_type , proxy_url )
81
+
82
+ api_context .__initialize_installation ()
83
+
84
+ service_provider_credential = api_context .__initialize_psd2_credential (
85
+ certificate ,
86
+ private_key ,
87
+ all_chain_certificate )
88
+
89
+ api_context ._api_key = service_provider_credential .token_value
90
+
91
+ api_context .__register_device (description , all_permitted_ip )
92
+ api_context .__initialize_session_for_psd2 (service_provider_credential )
93
+
94
+ return api_context
65
95
66
- def _initialize_installation (self ) -> None :
96
+ def __initialize_installation (self ) -> None :
67
97
from bunq .sdk .model .core .installation import Installation
68
98
69
99
private_key_client = security .generate_rsa_private_key ()
@@ -83,9 +113,28 @@ def _initialize_installation(self) -> None:
83
113
public_key_server
84
114
)
85
115
86
- def _register_device (self ,
87
- device_description : str ,
88
- permitted_ips : List [str ]) -> None :
116
+ def __initialize_psd2_credential (self ,
117
+ certificate : str ,
118
+ private_key : str ,
119
+ all_chain_certificate : List [str ], ) -> UserCredentialPasswordIp :
120
+ session_token = self .installation_context .token
121
+ client_key_pair = self .installation_context .private_key_client
122
+
123
+ string_to_sign = security .public_key_to_string (client_key_pair .publickey ()) + "\n " + session_token
124
+ encoded_signature = security .generate_signature (string_to_sign , security .rsa_key_from_string (private_key ))
125
+
126
+ payment_response_provider = PaymentServiceProviderCredentialInternal .create_with_api_context (
127
+ certificate ,
128
+ security .get_certificate_chain_string (all_chain_certificate ),
129
+ encoded_signature ,
130
+ self
131
+ )
132
+
133
+ return payment_response_provider
134
+
135
+ def __register_device (self ,
136
+ device_description : str ,
137
+ permitted_ips : List [str ]) -> None :
89
138
from bunq .sdk .model .core .device_server_internal import DeviceServerInternal
90
139
91
140
DeviceServerInternal .create (
@@ -95,7 +144,7 @@ def _register_device(self,
95
144
api_context = self
96
145
)
97
146
98
- def _initialize_session (self ) -> None :
147
+ def __initialize_session (self ) -> None :
99
148
from bunq .sdk .model .core .session_server import SessionServer
100
149
101
150
session_server = SessionServer .create (self ).value
@@ -105,6 +154,17 @@ def _initialize_session(self) -> None:
105
154
106
155
self ._session_context = SessionContext (token , expiry_time , user_id )
107
156
157
+ def __initialize_session_for_psd2 (self , user_payment_service_provider : UserPaymentServiceProvider ) -> None :
158
+ from bunq .sdk .model .core .session_server import SessionServer
159
+
160
+ session_server = SessionServer .create (self ).value
161
+
162
+ token = session_server .token .token
163
+ expiry_time = self ._get_expiry_timestamp (session_server )
164
+ user_id = session_server .get_referenced_user ().id_
165
+
166
+ self ._session_context = SessionContext (token , expiry_time , user_id )
167
+
108
168
@classmethod
109
169
def _get_expiry_timestamp (cls , session_server : SessionServer ) -> datetime .datetime :
110
170
timeout_seconds = cls ._get_session_timeout_seconds (session_server )
@@ -118,6 +178,8 @@ def _get_session_timeout_seconds(cls, session_server: SessionServer) -> int:
118
178
return session_server .user_company .session_timeout
119
179
elif session_server .user_person is not None :
120
180
return session_server .user_person .session_timeout
181
+ elif session_server .user_payment_service_provider is not None :
182
+ return session_server .user_payment_service_provider .session_timeout
121
183
elif session_server .user_api_key is not None :
122
184
return session_server \
123
185
.user_api_key \
@@ -159,7 +221,7 @@ def reset_session(self) -> None:
159
221
"""
160
222
161
223
self ._drop_session_context ()
162
- self ._initialize_session ()
224
+ self .__initialize_session ()
163
225
164
226
def _drop_session_context (self ) -> None :
165
227
self ._session_context = None
0 commit comments