1 /***************************************************************************
2     begin       : Tue Jun 03 2018
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_dialogs.h"
15 #include "aqhbci/banking/provider.h"
16 #include "aqhbci/banking/user.h"
17 
18 
19 #include "dlg_edituserpintan_l.h"
20 #include "dlg_edituserddv_l.h"
21 #include "dlg_edituserrdh_l.h"
22 #include "dlg_editaccount_l.h"
23 #include "dlg_newuser_l.h"
24 #include "dlg_ddvcard_l.h"
25 #include "dlg_zkacard_l.h"
26 #include "dlg_pintan_l.h"
27 #include "dlg_newkeyfile_l.h"
28 #include "dlg_importkeyfile_l.h"
29 #include "dlg_choose_usertype_l.h"
30 
31 #include <aqbanking/banking_be.h>
32 #include <aqbanking/i18n_l.h>
33 
34 #include <gwenhywfar/gui.h>
35 
36 
37 
38 
AH_Provider_GetNewCardUserDialog(AB_PROVIDER * pro)39 GWEN_DIALOG *AH_Provider_GetNewCardUserDialog(AB_PROVIDER *pro)
40 {
41   int rv;
42   GWEN_BUFFER *mtypeName;
43   GWEN_BUFFER *mediumName;
44   GWEN_CRYPT_TOKEN *ct;
45   AB_BANKING *ab;
46 
47   assert(pro);
48   ab=AB_Provider_GetBanking(pro);
49   assert(ab);
50 
51   mtypeName=GWEN_Buffer_new(0, 64, 0, 1);
52   mediumName=GWEN_Buffer_new(0, 64, 0, 1);
53 
54   rv=AB_Banking_CheckCryptToken(ab,
55                                 GWEN_Crypt_Token_Device_Card,
56                                 mtypeName,
57                                 mediumName);
58   if (rv<0) {
59     DBG_ERROR(AQHBCI_LOGDOMAIN, "here (%d)", rv);
60     GWEN_Gui_ShowError(I18N("Chipcard Error"),
61                        I18N("Error checking chip card (%d).\n"
62                             "Maybe libchipcard or its plugins are not installed?"));
63     GWEN_Buffer_free(mediumName);
64     GWEN_Buffer_free(mtypeName);
65     return NULL;
66   }
67 
68   rv=AB_Banking_GetCryptToken(AB_Provider_GetBanking(pro),
69                               GWEN_Buffer_GetStart(mtypeName),
70                               GWEN_Buffer_GetStart(mediumName),
71                               &ct);
72   if (rv<0) {
73     DBG_ERROR(AQHBCI_LOGDOMAIN, "here (%d)", rv);
74     GWEN_Buffer_free(mediumName);
75     GWEN_Buffer_free(mtypeName);
76     return NULL;
77   }
78 
79   if (strcasecmp(GWEN_Buffer_GetStart(mtypeName), "ddvcard")==0) {
80     GWEN_DIALOG *dlg2;
81 
82     DBG_WARN(0, "DDV card");
83     dlg2=AH_DdvCardDialog_new(pro, ct);
84     if (dlg2==NULL) {
85       DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)");
86       GWEN_Buffer_free(mediumName);
87       GWEN_Buffer_free(mtypeName);
88       return NULL;
89     }
90 
91     GWEN_Dialog_SetWidgetText(dlg2, "", I18N("Create HBCI/FinTS DDV User"));
92     GWEN_Buffer_free(mediumName);
93     GWEN_Buffer_free(mtypeName);
94     return dlg2;
95   }
96   else if (strcasecmp(GWEN_Buffer_GetStart(mtypeName), "starcoscard")==0) {
97     DBG_ERROR(AQHBCI_LOGDOMAIN, "STARCOS RSA card currently not supported by this dialog");
98     // TODO
99   }
100   else if (strcasecmp(GWEN_Buffer_GetStart(mtypeName), "zkacard")==0) {
101     GWEN_DIALOG *dlg2;
102 
103     DBG_WARN(0, "ZKA RSA card");
104     dlg2=AH_ZkaCardDialog_new(pro, ct);
105     if (dlg2==NULL) {
106       DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)");
107       GWEN_Buffer_free(mediumName);
108       GWEN_Buffer_free(mtypeName);
109       return NULL;
110     }
111 
112     GWEN_Dialog_SetWidgetText(dlg2, "", I18N("Create HBCI/FinTS ZKA RSA User"));
113     GWEN_Buffer_free(mediumName);
114     GWEN_Buffer_free(mtypeName);
115     return dlg2;
116   }
117   else {
118     DBG_ERROR(AQHBCI_LOGDOMAIN, "Card type \"%s\" not yet supported",
119               GWEN_Buffer_GetStart(mtypeName));
120   }
121   GWEN_Buffer_free(mediumName);
122   GWEN_Buffer_free(mtypeName);
123   AB_Banking_ClearCryptTokenList(AB_Provider_GetBanking(pro));
124   return NULL;
125 }
126 
127 
128 
AH_Provider_GetEditUserDialog(AB_PROVIDER * pro,AB_USER * u)129 GWEN_DIALOG *AH_Provider_GetEditUserDialog(AB_PROVIDER *pro, AB_USER *u)
130 {
131   GWEN_DIALOG *dlg;
132 
133   DBG_ERROR(AQBANKING_LOGDOMAIN, "GetEditUserDialog");
134 
135   assert(pro);
136 
137   switch (AH_User_GetCryptMode(u)) {
138   case AH_CryptMode_Pintan:
139     dlg=AH_EditUserPinTanDialog_new(pro, u, 1);
140     break;
141   case AH_CryptMode_Ddv:
142     dlg=AH_EditUserDdvDialog_new(pro, u, 1);
143     break;
144   case AH_CryptMode_Rdh:
145     dlg=AH_EditUserRdhDialog_new(pro, u, 1);
146     break;
147   case AH_CryptMode_Rah:
148     dlg=AH_EditUserRdhDialog_new(pro, u, 1);
149     break;
150   default:
151     DBG_ERROR(AQHBCI_LOGDOMAIN, "Unknown crypt mode %d)", AH_User_GetCryptMode(u));
152     dlg=NULL;
153     break;
154   }
155 
156   if (dlg==NULL) {
157     DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)");
158     return NULL;
159   }
160 
161   return dlg;
162 }
163 
164 
165 
AH_Provider_GetNewUserDialog(AB_PROVIDER * pro,int i)166 GWEN_DIALOG *AH_Provider_GetNewUserDialog(AB_PROVIDER *pro, int i)
167 {
168   GWEN_DIALOG *dlg;
169 
170   assert(pro);
171 
172   DBG_INFO(AQHBCI_LOGDOMAIN, "Get user dialog %d", i);
173 
174   switch (i) {
175   case AqHBCI_NewUserDialog_CodeExistingPinTan:
176     dlg=AH_PinTanDialog_new(pro);
177     break;
178 
179   case AqHBCI_NewUserDialog_CodeExistingChipcard:
180     dlg=AH_Provider_GetNewCardUserDialog(pro);
181     break;
182 
183   case AqHBCI_NewUserDialog_CodeCreateKeyFile:
184     dlg=AH_NewKeyFileDialog_new(pro);
185     break;
186 
187   case AqHBCI_NewUserDialog_CodeExistingKeyFile:
188     dlg=AH_ImportKeyFileDialog_new(pro);
189     break;
190   case AqHBCI_NewUserDialog_CodeCreateChipcard:
191 
192   case AqHBCI_NewUserDialog_CodeGeneric:
193   default:
194     dlg=AH_NewUserDialog_new(pro);
195     break;
196   }
197 
198   if (dlg==NULL) {
199     DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)");
200     return NULL;
201   }
202 
203   return dlg;
204 }
205 
206 
207 
AH_Provider_GetEditAccountDialog(AB_PROVIDER * pro,AB_ACCOUNT * a)208 GWEN_DIALOG *AH_Provider_GetEditAccountDialog(AB_PROVIDER *pro, AB_ACCOUNT *a)
209 {
210   GWEN_DIALOG *dlg;
211 
212   assert(pro);
213 
214   dlg=AH_EditAccountDialog_new(pro, a, 1);
215   if (dlg==NULL) {
216     DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)");
217     return NULL;
218   }
219 
220   return dlg;
221 }
222 
223 
224 
AH_Provider_GetUserTypeDialog(AB_PROVIDER * pro)225 GWEN_DIALOG *AH_Provider_GetUserTypeDialog(AB_PROVIDER *pro)
226 {
227   GWEN_DIALOG *dlg;
228 
229   DBG_INFO(AQHBCI_LOGDOMAIN, "AH_Provider_GetUserTypeDialog called");
230 
231   assert(pro);
232 
233   dlg=AH_ChooseUserTypeDialog_new(pro);
234   if (dlg==NULL) {
235     DBG_INFO(AQHBCI_LOGDOMAIN, "here (no dialog)");
236     return NULL;
237   }
238 
239   return dlg;
240 }
241 
242 
243 
244