1 /***************************************************************************
2     begin       : Mon Mar 01 2004
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 "provider_p.h"
15 
16 #include "provider_accspec.h"
17 #include "provider_dialogs.h"
18 #include "provider_sendcmd.h"
19 #include "provider_update.h"
20 #include "aqhbci_l.h"
21 #include "account_l.h"
22 #include "hbci_l.h"
23 #include "dialog_l.h"
24 #include "outbox_l.h"
25 #include "user_l.h"
26 #include "control_l.h"
27 
28 #include "message_l.h" /* for test4 */
29 
30 /*
31 #include "dlg_newuser_l.h"
32 #include "dlg_pintan_l.h"
33 #include "dlg_ddvcard_l.h"
34 #include "dlg_zkacard_l.h"
35 #include "dlg_newkeyfile_l.h"
36 #include "dlg_importkeyfile_l.h"
37 #include "dlg_edituserpintan_l.h"
38 #include "dlg_edituserddv_l.h"
39 #include "dlg_edituserrdh_l.h"
40 #include "dlg_choose_usertype_l.h"
41 #include "dlg_editaccount_l.h"
42 */
43 
44 #include "adminjobs_l.h"
45 #include "aqhbci/banking/user.h"
46 
47 #include <aqbanking/banking_be.h>
48 #include <aqbanking/backendsupport/account.h>
49 #include <aqbanking/backendsupport/provider_be.h>
50 #include <aqbanking/backendsupport/userqueue.h>
51 
52 #include <gwenhywfar/misc.h>
53 #include <gwenhywfar/inherit.h>
54 #include <gwenhywfar/directory.h>
55 #include <gwenhywfar/text.h>
56 #include <gwenhywfar/debug.h>
57 #include <gwenhywfar/gui.h>
58 #include <gwenhywfar/mdigest.h>
59 #include <gwenhywfar/ctplugin.h>
60 
61 
62 
63 #ifdef OS_WIN32
64 # define AH_PATH_SEP "\\"
65 #else
66 # define AH_PATH_SEP "/"
67 #endif
68 
69 
70 
71 GWEN_INHERIT(AB_PROVIDER, AH_PROVIDER);
72 
73 
AH_Provider_new(AB_BANKING * ab,const char * name)74 AB_PROVIDER *AH_Provider_new(AB_BANKING *ab, const char *name)
75 {
76   AB_PROVIDER *pro;
77   AH_PROVIDER *hp;
78   GWEN_BUFFER *pbuf;
79 
80   pbuf=0;
81   pro=AB_Provider_new(ab, name);
82   assert(pro);
83 
84   AB_Provider_SetInitFn(pro, AH_Provider_Init);
85   AB_Provider_SetFiniFn(pro, AH_Provider_Fini);
86 
87   AB_Provider_SetGetNewUserDialogFn(pro, AH_Provider_GetNewUserDialog);
88   AB_Provider_SetGetEditUserDialogFn(pro, AH_Provider_GetEditUserDialog);
89   AB_Provider_SetGetUserTypeDialogFn(pro, AH_Provider_GetUserTypeDialog);
90   AB_Provider_SetGetEditAccountDialogFn(pro, AH_Provider_GetEditAccountDialog);
91 
92   AB_Provider_SetSendCommandsFn(pro, AH_Provider_SendCommands);
93   AB_Provider_SetCreateAccountObjectsFn(pro, AH_Provider_CreateAccountObject);
94   AB_Provider_SetCreateUserObjectsFn(pro, AH_Provider_CreateUserObject);
95 
96   AB_Provider_SetUpdateAccountSpecFn(pro, AH_Provider_UpdateAccountSpec);
97   AB_Provider_SetControlFn(pro, AH_Control);
98 
99   AB_Provider_AddFlags(pro,
100                        AB_PROVIDER_FLAGS_HAS_NEWUSER_DIALOG |
101                        AB_PROVIDER_FLAGS_HAS_EDITUSER_DIALOG |
102                        AB_PROVIDER_FLAGS_HAS_EDITACCOUNT_DIALOG |
103                        AB_PROVIDER_FLAGS_HAS_USERTYPE_DIALOG);
104 
105   GWEN_NEW_OBJECT(AH_PROVIDER, hp);
106   GWEN_INHERIT_SETDATA(AB_PROVIDER, AH_PROVIDER, pro, hp,
107                        AH_Provider_FreeData);
108 
109   hp->hbci=AH_HBCI_new(pro);
110   assert(hp->hbci);
111   GWEN_Buffer_free(pbuf);
112 
113   hp->dbTempConfig=GWEN_DB_Group_new("tmpConfig");
114 
115   return pro;
116 }
117 
118 
119 
AH_Provider_FreeData(void * bp,void * p)120 void GWENHYWFAR_CB AH_Provider_FreeData(void *bp, void *p)
121 {
122   AH_PROVIDER *hp;
123 
124   DBG_INFO(AQHBCI_LOGDOMAIN, "Destroying AH_PROVIDER");
125   hp=(AH_PROVIDER *)p;
126 
127   GWEN_DB_Group_free(hp->dbTempConfig);
128   AH_HBCI_free(hp->hbci);
129 
130   GWEN_FREE_OBJECT(hp);
131 }
132 
133 
134 
AH_Provider_Init(AB_PROVIDER * pro,GWEN_DB_NODE * dbData)135 int AH_Provider_Init(AB_PROVIDER *pro, GWEN_DB_NODE *dbData)
136 {
137   AH_PROVIDER *hp;
138   int rv;
139   const char *logLevelName;
140   uint32_t currentVersion;
141   uint32_t lastVersion;
142 
143   if (!GWEN_Logger_IsOpen(AQHBCI_LOGDOMAIN)) {
144     GWEN_Logger_Open(AQHBCI_LOGDOMAIN, "aqhbci", 0, GWEN_LoggerType_Console, GWEN_LoggerFacility_User);
145   }
146 
147   logLevelName=getenv("AQHBCI_LOGLEVEL");
148   if (logLevelName) {
149     GWEN_LOGGER_LEVEL ll;
150 
151     ll=GWEN_Logger_Name2Level(logLevelName);
152     if (ll!=GWEN_LoggerLevel_Unknown) {
153       GWEN_Logger_SetLevel(AQHBCI_LOGDOMAIN, ll);
154       DBG_WARN(AQHBCI_LOGDOMAIN, "Overriding loglevel for AqHBCI with \"%s\"", logLevelName);
155     }
156     else {
157       DBG_ERROR(AQHBCI_LOGDOMAIN, "Unknown loglevel \"%s\"", logLevelName);
158     }
159   }
160 
161   DBG_NOTICE(AQHBCI_LOGDOMAIN, "Initializing AqHBCI backend");
162   assert(pro);
163 
164   hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro);
165   assert(hp);
166 
167   GWEN_DB_ClearGroup(hp->dbTempConfig, 0);
168 
169   /* check whether we need to update */
170   currentVersion=
171     (AQBANKING_VERSION_MAJOR<<24) |
172     (AQBANKING_VERSION_MINOR<<16) |
173     (AQBANKING_VERSION_PATCHLEVEL<<8) |
174     AQBANKING_VERSION_BUILD;
175   lastVersion=GWEN_DB_GetIntValue(dbData, "lastVersion", 0, 0);
176 
177   if (lastVersion<currentVersion) {
178     DBG_WARN(AQHBCI_LOGDOMAIN, "Updating configuration for AqHBCI (before init)");
179     rv=AH_Provider_UpdatePreInit(pro, lastVersion, currentVersion);
180     if (rv<0) {
181       DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv);
182       return rv;
183     }
184   }
185 
186   /* HBCI init */
187   rv=AH_HBCI_Init(hp->hbci, dbData);
188   if (rv<0) {
189     DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv);
190   }
191 
192   if (lastVersion<currentVersion) {
193     DBG_WARN(AQHBCI_LOGDOMAIN, "Updating configuration for AqHBCI (after init)");
194     rv=AH_Provider_UpdatePostInit(pro, lastVersion, currentVersion);
195     if (rv<0) {
196       DBG_INFO(AQHBCI_LOGDOMAIN, "here (%d)", rv);
197       return rv;
198     }
199   }
200 
201   return rv;
202 }
203 
204 
205 
AH_Provider_Fini(AB_PROVIDER * pro,GWEN_DB_NODE * dbData)206 int AH_Provider_Fini(AB_PROVIDER *pro, GWEN_DB_NODE *dbData)
207 {
208   AH_PROVIDER *hp;
209   uint32_t currentVersion;
210   int rv;
211 
212   DBG_NOTICE(AQHBCI_LOGDOMAIN, "Deinitializing AqHBCI backend");
213 
214   assert(pro);
215   hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro);
216   assert(hp);
217 
218   currentVersion=
219     (AQBANKING_VERSION_MAJOR<<24) |
220     (AQBANKING_VERSION_MINOR<<16) |
221     (AQBANKING_VERSION_PATCHLEVEL<<8) |
222     AQBANKING_VERSION_BUILD;
223 
224   /* save version */
225   DBG_NOTICE(AQHBCI_LOGDOMAIN, "Setting version %08x", currentVersion);
226   GWEN_DB_SetIntValue(dbData, GWEN_DB_FLAGS_OVERWRITE_VARS, "lastVersion", currentVersion);
227 
228   /* save configuration */
229   rv=AH_HBCI_Fini(hp->hbci, dbData);
230   GWEN_DB_ClearGroup(hp->dbTempConfig, 0);
231 
232   return rv;
233 }
234 
235 
236 
AH_Provider_GetProductName(const AB_PROVIDER * pro)237 const char *AH_Provider_GetProductName(const AB_PROVIDER *pro)
238 {
239   AH_HBCI *h;
240 
241   assert(pro);
242   h=AH_Provider_GetHbci(pro);
243   assert(h);
244   return AH_HBCI_GetProductName(h);
245 }
246 
247 
248 
AH_Provider_GetProductVersion(const AB_PROVIDER * pro)249 const char *AH_Provider_GetProductVersion(const AB_PROVIDER *pro)
250 {
251   AH_HBCI *h;
252 
253   assert(pro);
254   h=AH_Provider_GetHbci(pro);
255   assert(h);
256   return AH_HBCI_GetProductVersion(h);
257 }
258 
259 
260 
261 
262 
263 
AH_Provider_GetHbci(const AB_PROVIDER * pro)264 AH_HBCI *AH_Provider_GetHbci(const AB_PROVIDER *pro)
265 {
266   AH_PROVIDER *hp;
267 
268   assert(pro);
269   hp=GWEN_INHERIT_GETDATA(AB_PROVIDER, AH_PROVIDER, pro);
270   assert(hp);
271 
272   return hp->hbci;
273 }
274 
275 
276 
AH_Provider_CreateAccountObject(AB_PROVIDER * pro)277 AB_ACCOUNT *AH_Provider_CreateAccountObject(AB_PROVIDER *pro)
278 {
279   return AH_Account_new(pro);
280 }
281 
282 
283 
AH_Provider_CreateUserObject(AB_PROVIDER * pro)284 AB_USER *AH_Provider_CreateUserObject(AB_PROVIDER *pro)
285 {
286   return AH_User_new(pro);
287 }
288 
289 
290 
AH_Provider_CheckCryptToken(AB_PROVIDER * pro,GWEN_CRYPT_TOKEN_DEVICE devt,GWEN_BUFFER * typeName,GWEN_BUFFER * tokenName)291 int AH_Provider_CheckCryptToken(AB_PROVIDER *pro,
292                                 GWEN_CRYPT_TOKEN_DEVICE devt,
293                                 GWEN_BUFFER *typeName,
294                                 GWEN_BUFFER *tokenName)
295 {
296   GWEN_PLUGIN_MANAGER *pm;
297   int rv;
298 
299   /* get crypt token */
300   pm=GWEN_PluginManager_FindPluginManager(GWEN_CRYPT_TOKEN_PLUGIN_TYPENAME);
301   if (pm==0) {
302     DBG_ERROR(AQHBCI_LOGDOMAIN, "CryptToken plugin manager not found");
303     return GWEN_ERROR_NOT_FOUND;
304   }
305 
306   /* try to determine the type and name */
307   rv=GWEN_Crypt_Token_PluginManager_CheckToken(pm, devt, typeName, tokenName, 0);
308   if (rv) {
309     DBG_ERROR(AQHBCI_LOGDOMAIN, "here (%d)", rv);
310     return rv;
311   }
312 
313   return 0;
314 }
315 
316 
317 
318 
319 
320 
321 
322 
323 
AH_Provider_WriteValueToDb(const AB_VALUE * v,GWEN_DB_NODE * dbV)324 int AH_Provider_WriteValueToDb(const AB_VALUE *v, GWEN_DB_NODE *dbV)
325 {
326   if (v) {
327     GWEN_BUFFER *nbuf;
328     char *p;
329     const char *s;
330     int l;
331 
332     nbuf=GWEN_Buffer_new(0, 32, 0, 1);
333     AH_Job_ValueToChallengeString(v, nbuf);
334     l=GWEN_Buffer_GetUsedBytes(nbuf);
335     if (!l) {
336       DBG_ERROR(AQHBCI_LOGDOMAIN, "Error in conversion");
337       GWEN_Buffer_free(nbuf);
338       abort();
339     }
340 
341     /* replace "C" comma with "DE" comma, remove thousand's comma */
342     p=GWEN_Buffer_GetStart(nbuf);
343     s=p;
344     while (*s) {
345       if (*s=='.') {
346         *p=',';
347         p++;
348       }
349       else if (*s!=',') {
350         *p=*s;
351         p++;
352       }
353       s++;
354     } /* while */
355     *p=0;
356 
357     if (strchr(GWEN_Buffer_GetStart(nbuf), ',')) {
358       /* kill all trailing '0' behind the comma */
359       p=GWEN_Buffer_GetStart(nbuf)+l;
360       while (l--) {
361         --p;
362         if (*p=='0')
363           *p=0;
364         else
365           break;
366       }
367     }
368     else
369       GWEN_Buffer_AppendString(nbuf, ",");
370 
371     /* store value */
372     GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS,
373                          "value",
374                          GWEN_Buffer_GetStart(nbuf));
375     GWEN_Buffer_free(nbuf);
376 
377     s=AB_Value_GetCurrency(v);
378     if (!s)
379       s="EUR";
380     GWEN_DB_SetCharValue(dbV, GWEN_DB_FLAGS_OVERWRITE_VARS,
381                          "currency", s);
382 
383     return 0;
384   } /* if value */
385   else {
386     DBG_ERROR(AQHBCI_LOGDOMAIN, "No value");
387     return GWEN_ERROR_NO_DATA;
388   }
389 }
390 
391 
392 
AH_Provider_Test4(AB_PROVIDER * pro)393 static int AH_Provider_Test4(AB_PROVIDER *pro)
394 {
395 #if 0
396   AB_BANKING *ab;
397   AB_USER *u;
398   AH_DIALOG *dlg;
399   AH_MSG *msg;
400   GWEN_BUFFER *tbuf;
401 
402   ab=AB_Provider_GetBanking(pro);
403   assert(ab);
404 
405   tbuf=GWEN_Buffer_new(0, 1024, 0, 1);
406   GWEN_Buffer_AppendString(tbuf, "(Test-String)");
407   GWEN_Buffer_Rewind(tbuf);
408 
409   u=AB_Banking_FindUser(ab, "aqhbci", "de", "20090500", "*", "*");
410   assert(u);
411   dlg=AH_Dialog_new(u);
412   assert(dlg);
413   AH_Dialog_AddFlags(dlg, AH_DIALOG_FLAGS_INITIATOR);
414   msg=AH_Msg_new(dlg);
415   assert(msg);
416   AH_Msg_SetBuffer(msg, tbuf);
417   AH_Msg_SetHbciVersion(msg, 220);
418 
419   AH_Msg_AddSignerId(msg, AB_User_GetUserId(u));
420   AH_Msg_SetCrypterId(msg, AB_User_GetUserId(u));
421 
422   if (AH_Msg_EncodeMsg(msg)) {
423     DBG_ERROR(AQHBCI_LOGDOMAIN, "Could not decode this message:");
424     AH_Msg_Dump(msg, 2);
425     return -1;
426   }
427 
428   fprintf(stderr, "Message is:\n");
429   AH_Msg_Dump(msg, 2);
430 #endif
431   return 0;
432 }
433 
434 
435 
AH_Provider_Test(AB_PROVIDER * pro)436 int AH_Provider_Test(AB_PROVIDER *pro)
437 {
438   return AH_Provider_Test4(pro);
439 }
440 
441 
442 
443 
444 
445 #include "provider_dtazv.c"
446 
447 
448 
449