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