1 /***************************************************************************
2 begin : Sat May 08 2010
3 copyright : (C) 2018 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13
14 #include <aqbanking/backendsupport/providerqueue.h>
15 #include "provider_p.h"
16 #include "user_l.h"
17 #include "control/control_l.h"
18
19 #include "dlg_newuser_l.h"
20 #include "dlg_edituser_l.h"
21
22 #include <aqbanking/backendsupport/httpsession.h>
23 #include <aqbanking/types/transaction.h>
24 #include <aqbanking/banking_be.h>
25
26 #include <gwenhywfar/misc.h>
27 #include <gwenhywfar/debug.h>
28 #include <gwenhywfar/i18n.h>
29 #include <gwenhywfar/gwentime.h>
30 #include <gwenhywfar/text.h>
31 #include <gwenhywfar/smalltresor.h>
32 #include <gwenhywfar/directory.h>
33 #include <gwenhywfar/gui.h>
34
35 #include <ctype.h>
36 #include <errno.h>
37
38
39 #define AQPAYPAL_PASSWORD_ITERATIONS 1467
40 #define AQPAYPAL_CRYPT_ITERATIONS 648
41
42 #define AQPAYPAL_API_VER "56.0"
43
44
45 #define I18N(msg) GWEN_I18N_Translate(PACKAGE, msg)
46
47
48 /*#define DEBUG_PAYPAL */
49
50
51
GWEN_INHERIT(AB_PROVIDER,APY_PROVIDER)52 GWEN_INHERIT(AB_PROVIDER, APY_PROVIDER)
53
54
55
56 void GWENHYWFAR_CB APY_Provider_FreeData(void *bp, void *p)
57 {
58 APY_PROVIDER *xp;
59
60 xp=(APY_PROVIDER *) p;
61
62 GWEN_FREE_OBJECT(xp);
63 }
64
65
APY_Provider_new(AB_BANKING * ab)66 AB_PROVIDER *APY_Provider_new(AB_BANKING *ab)
67 {
68 AB_PROVIDER *pro;
69 APY_PROVIDER *xp;
70
71 pro=AB_Provider_new(ab, APY_PROVIDER_NAME);
72 GWEN_NEW_OBJECT(APY_PROVIDER, xp);
73 GWEN_INHERIT_SETDATA(AB_PROVIDER, APY_PROVIDER, pro, xp,
74 APY_Provider_FreeData);
75
76
77 AB_Provider_SetInitFn(pro, APY_Provider_Init);
78 AB_Provider_SetFiniFn(pro, APY_Provider_Fini);
79
80 AB_Provider_SetCreateAccountObjectsFn(pro, APY_Provider_CreateAccountObject);
81 AB_Provider_SetCreateUserObjectsFn(pro, APY_Provider_CreateUserObject);
82
83 AB_Provider_SetUpdateAccountSpecFn(pro, APY_Provider_UpdateAccountSpec);
84 AB_Provider_SetControlFn(pro, APY_Control);
85 AB_Provider_SetSendCommandsFn(pro, APY_Provider_SendCommands);
86
87 AB_Provider_SetGetNewUserDialogFn(pro, APY_Provider_GetNewUserDialog);
88 AB_Provider_SetGetEditUserDialogFn(pro, APY_Provider_GetEditUserDialog);
89
90 AB_Provider_AddFlags(pro,
91 AB_PROVIDER_FLAGS_HAS_EDITUSER_DIALOG |
92 AB_PROVIDER_FLAGS_HAS_NEWUSER_DIALOG);
93
94 return pro;
95 }
96
97
98
99
APY_Provider_Init(AB_PROVIDER * pro,GWEN_DB_NODE * dbData)100 int APY_Provider_Init(AB_PROVIDER *pro, GWEN_DB_NODE *dbData)
101 {
102 APY_PROVIDER *dp;
103 const char *logLevelName;
104 uint32_t currentVersion;
105 uint32_t lastVersion;
106
107 assert(pro);
108 dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, APY_PROVIDER, pro);
109 assert(dp);
110
111 if (!GWEN_Logger_IsOpen(AQPAYPAL_LOGDOMAIN)) {
112 GWEN_Logger_Open(AQPAYPAL_LOGDOMAIN,
113 "aqpaypal", 0,
114 GWEN_LoggerType_Console,
115 GWEN_LoggerFacility_User);
116 }
117
118 logLevelName=getenv("AQPAYPAL_LOGLEVEL");
119 if (logLevelName) {
120 GWEN_LOGGER_LEVEL ll;
121
122 ll=GWEN_Logger_Name2Level(logLevelName);
123 if (ll!=GWEN_LoggerLevel_Unknown) {
124 GWEN_Logger_SetLevel(AQPAYPAL_LOGDOMAIN, ll);
125 DBG_WARN(AQPAYPAL_LOGDOMAIN, "Overriding loglevel for AqPAYPAL with \"%s\"", logLevelName);
126 }
127 else {
128 DBG_ERROR(AQPAYPAL_LOGDOMAIN, "Unknown loglevel \"%s\"", logLevelName);
129 }
130 }
131
132 /* check whether we need to update */
133 currentVersion=
134 (AQBANKING_VERSION_MAJOR<<24) |
135 (AQBANKING_VERSION_MINOR<<16) |
136 (AQBANKING_VERSION_PATCHLEVEL<<8) |
137 AQBANKING_VERSION_BUILD;
138 lastVersion=GWEN_DB_GetIntValue(dbData, "lastVersion", 0, 0);
139
140 if (lastVersion<currentVersion) {
141 int rv;
142
143 DBG_WARN(AQPAYPAL_LOGDOMAIN, "Updating configuration for AqPaypal (before init)");
144 rv=APY_Provider_UpdatePreInit(pro, lastVersion, currentVersion);
145 if (rv<0) {
146 DBG_INFO(AQPAYPAL_LOGDOMAIN, "here (%d)", rv);
147 return rv;
148 }
149 }
150
151 /* do some init (currently: none needed) */
152
153 /* update post-init */
154 if (lastVersion<currentVersion) {
155 int rv;
156
157 DBG_WARN(AQPAYPAL_LOGDOMAIN, "Updating configuration for AqPaypal (after init)");
158 rv=APY_Provider_UpdatePostInit(pro, lastVersion, currentVersion);
159 if (rv<0) {
160 DBG_INFO(AQPAYPAL_LOGDOMAIN, "here (%d)", rv);
161 return rv;
162 }
163 }
164
165
166 if (1) {
167 GWEN_STRINGLIST *sl;
168 const char *localedir;
169 int rv;
170
171 sl=GWEN_PathManager_GetPaths(AB_PM_LIBNAME, AB_PM_LOCALEDIR);
172 localedir=GWEN_StringList_FirstString(sl);
173
174 rv=GWEN_I18N_BindTextDomain_Dir(PACKAGE, localedir);
175 if (rv) {
176 DBG_ERROR(AQPAYPAL_LOGDOMAIN, "Could not bind textdomain (%d)", rv);
177 }
178 else {
179 rv=GWEN_I18N_BindTextDomain_Codeset(PACKAGE, "UTF-8");
180 if (rv) {
181 DBG_ERROR(AQPAYPAL_LOGDOMAIN, "Could not set codeset (%d)", rv);
182 }
183 }
184
185 GWEN_StringList_free(sl);
186 }
187
188 DBG_NOTICE(AQPAYPAL_LOGDOMAIN, "Initializing AqPaypal backend");
189
190 return 0;
191 }
192
193
194
APY_Provider_Fini(AB_PROVIDER * pro,GWEN_DB_NODE * dbData)195 int APY_Provider_Fini(AB_PROVIDER *pro, GWEN_DB_NODE *dbData)
196 {
197 APY_PROVIDER *dp;
198 uint32_t currentVersion;
199
200 DBG_NOTICE(AQPAYPAL_LOGDOMAIN, "Deinitializing AqPaypal backend");
201
202 assert(pro);
203 dp=GWEN_INHERIT_GETDATA(AB_PROVIDER, APY_PROVIDER, pro);
204 assert(dp);
205
206 currentVersion=
207 (AQBANKING_VERSION_MAJOR<<24) |
208 (AQBANKING_VERSION_MINOR<<16) |
209 (AQBANKING_VERSION_PATCHLEVEL<<8) |
210 AQBANKING_VERSION_BUILD;
211
212 /* save configuration */
213 DBG_NOTICE(AQPAYPAL_LOGDOMAIN, "Setting version %08x", currentVersion);
214 GWEN_DB_SetIntValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "lastVersion", currentVersion);
215
216 DBG_INFO(AQPAYPAL_LOGDOMAIN, "Deinit done");
217
218 return 0;
219 }
220
221
222
APY_Provider_CreateAccountObject(AB_PROVIDER * pro)223 AB_ACCOUNT *APY_Provider_CreateAccountObject(AB_PROVIDER *pro)
224 {
225 AB_ACCOUNT *a;
226
227 a=AB_Account_new();
228 assert(a);
229 AB_Account_SetProvider(a, pro);
230 AB_Account_SetBackendName(a, APY_PROVIDER_NAME);
231 AB_Account_SetReadFromDbFn(a, APY_Account_ReadFromDb);
232 return a;
233 }
234
235
APY_Account_ReadFromDb(AB_ACCOUNT * a,GWEN_DB_NODE * db)236 int APY_Account_ReadFromDb(AB_ACCOUNT *a, GWEN_DB_NODE *db)
237 {
238 int rv;
239 AB_PROVIDER *pro;
240
241 assert(a);
242
243 /* save provider, because AB_Account_ReadFromDb clears it */
244 pro=AB_Account_GetProvider(a);
245
246 /* read data for base class */
247 rv=AB_Account__ReadFromDb(a, db);
248 if (rv<0) {
249 DBG_INFO(AQPAYPAL_LOGDOMAIN, "here (%d)", rv);
250 return rv;
251 }
252
253 /* set provider again */
254 AB_Account_SetProvider(a, pro);
255
256 return 0;
257 }
258
259
APY_Provider_CreateUserObject(AB_PROVIDER * pro)260 AB_USER *APY_Provider_CreateUserObject(AB_PROVIDER *pro)
261 {
262 return APY_User_new(pro);
263 }
264
265
266
267
268
269
270
271
272
APY_Provider_ParseResponse(AB_PROVIDER * pro,const char * s,GWEN_DB_NODE * db)273 int APY_Provider_ParseResponse(AB_PROVIDER *pro, const char *s, GWEN_DB_NODE *db)
274 {
275 /* read vars */
276 while (*s) {
277 GWEN_BUFFER *bName;
278 GWEN_BUFFER *bValue;
279 const char *p;
280 GWEN_DB_NODE *dbT;
281
282 bName=GWEN_Buffer_new(0, 256, 0, 1);
283 bValue=GWEN_Buffer_new(0, 256, 0, 1);
284 p=s;
285 while (*p && *p!='&' && *p!='=')
286 p++;
287 if (p!=s)
288 GWEN_Buffer_AppendBytes(bName, s, (p-s));
289 s=p;
290 if (*p=='=') {
291 s++;
292 p=s;
293 while (*p && *p!='&')
294 p++;
295 if (p!=s)
296 GWEN_Buffer_AppendBytes(bValue, s, (p-s));
297 s=p;
298 }
299
300 dbT=db;
301 if (strncasecmp(GWEN_Buffer_GetStart(bName), "L_ERRORCODE", 11)!=0 &&
302 strncasecmp(GWEN_Buffer_GetStart(bName), "L_SHORTMESSAGE", 14)!=0 &&
303 strncasecmp(GWEN_Buffer_GetStart(bName), "L_LONGMESSAGE", 13)!=0 &&
304 strncasecmp(GWEN_Buffer_GetStart(bName), "L_SEVERITYCODE", 14)!=0 &&
305 strncasecmp(GWEN_Buffer_GetStart(bName), "SHIPTOSTREET2", 13)!=0) {
306 int i;
307
308 i=GWEN_Buffer_GetUsedBytes(bName)-1;
309 if (i>0) {
310 char *t;
311
312 t=GWEN_Buffer_GetStart(bName)+i;
313 while (i && isdigit(*t)) {
314 i--;
315 t--;
316 }
317 if (i>0) {
318 t++;
319 if (*t) {
320 dbT=GWEN_DB_GetGroup(db, GWEN_DB_FLAGS_DEFAULT, t);
321 *t=0;
322 }
323 }
324 }
325 }
326
327 /* store variable/value pair */
328 if (strlen(GWEN_Buffer_GetStart(bName))) {
329 GWEN_BUFFER *xbuf;
330
331 xbuf=GWEN_Buffer_new(0, 256, 0, 1);
332 GWEN_Text_UnescapeToBufferTolerant(GWEN_Buffer_GetStart(bValue), xbuf);
333 GWEN_DB_SetCharValue(dbT,
334 GWEN_DB_FLAGS_DEFAULT,
335 GWEN_Buffer_GetStart(bName),
336 GWEN_Buffer_GetStart(xbuf));
337 GWEN_Buffer_free(xbuf);
338 }
339
340 GWEN_Buffer_free(bValue);
341 GWEN_Buffer_free(bName);
342 if (*s!='&')
343 break;
344 s++;
345 }
346
347 return 0;
348 }
349
350
351 #include "provider_accspec.c"
352 #include "provider_update.c"
353 #include "provider_credentials.c"
354 #include "provider_dialogs.c"
355 #include "provider_getbalance.c"
356 #include "provider_getstm.c"
357 #include "provider_sendcmd.c"
358