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