gwenhywfar  4.3.3
cpp/cppgui.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Mon Mar 01 2004
3  copyright : (C) 2004-2010 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * Please see toplevel file COPYING for license details *
8  ***************************************************************************/
9 
10 
11 #ifdef HAVE_CONFIG_H
12 # include <config.h>
13 #endif
14 
15 #include "cppgui_p.hpp"
16 #include <assert.h>
17 
18 #include <gwenhywfar/inherit.h>
19 #include <gwenhywfar/debug.h>
20 #include <gwenhywfar/gui_be.h>
21 #include <gwenhywfar/i18n.h>
22 
23 #include <gwenhywfar/text.h>
24 #include <gwenhywfar/mdigest.h>
25 #include <gwenhywfar/debug.h>
26 
27 
28 
30 
31 
32 
33 
34 int CppGuiLinker::Print(GWEN_GUI *gui,
35  const char *docTitle,
36  const char *docType,
37  const char *descr,
38  const char *text,
39  uint32_t guiid){
40  CppGui *xgui;
41 
42  assert(gui);
44  assert(xgui);
45 
46  return xgui->print(docTitle, docType, descr, text, guiid);
47 }
48 
49 
50 
51 int CppGuiLinker::GetPassword(GWEN_GUI *gui,
52  uint32_t flags,
53  const char *token,
54  const char *title,
55  const char *text,
56  char *buffer,
57  int minLen,
58  int maxLen,
59  uint32_t guiid) {
60  CppGui *xgui;
61 
62  assert(gui);
64  assert(xgui);
65 
66  return xgui->getPassword(flags, token, title, text, buffer, minLen, maxLen, guiid);
67 }
68 
69 
70 
71 int CppGuiLinker::SetPasswordStatus(GWEN_GUI *gui,
72  const char *token,
73  const char *pin,
75  uint32_t guiid) {
76  CppGui *xgui;
77 
78  assert(gui);
80  assert(xgui);
81 
82  return xgui->setPasswordStatus(token, pin, status, guiid);
83 }
84 
85 
86 
87 int CppGuiLinker::CheckCert(GWEN_GUI *gui,
88  const GWEN_SSLCERTDESCR *cert,
89  GWEN_SYNCIO *sio,
90  uint32_t guiid) {
91  CppGui *xgui;
92 
93  assert(gui);
95  assert(xgui);
96 
97  return xgui->checkCert(cert, sio, guiid);
98 }
99 
100 
101 
102 int CppGuiLinker::LogHook(GWEN_GUI *gui,
103  const char *logDomain,
104  GWEN_LOGGER_LEVEL priority, const char *s) {
105  CppGui *xgui;
106 
107  assert(gui);
109  assert(xgui);
110 
111  return xgui->logHook(logDomain, priority, s);
112 }
113 
114 
115 
116 int CppGuiLinker::ExecDialog(GWEN_GUI *gui,
117  GWEN_DIALOG *dlg,
118  uint32_t guiid) {
119  CppGui *xgui;
120 
121  assert(gui);
123  assert(xgui);
124 
125  return xgui->execDialog(dlg, guiid);
126 }
127 
128 
129 
130 int CppGuiLinker::OpenDialog(GWEN_GUI *gui,
131  GWEN_DIALOG *dlg,
132  uint32_t guiid) {
133  CppGui *xgui;
134 
135  assert(gui);
137  assert(xgui);
138 
139  DBG_ERROR(0, "CppGuiLinker::OpenDialog");
140 
141  return xgui->openDialog(dlg, guiid);
142 }
143 
144 
145 
146 int CppGuiLinker::CloseDialog(GWEN_GUI *gui,
147  GWEN_DIALOG *dlg) {
148  CppGui *xgui;
149 
150  assert(gui);
152  assert(xgui);
153 
154  return xgui->closeDialog(dlg);
155 }
156 
157 
158 
159 int CppGuiLinker::RunDialog(GWEN_GUI *gui,
160  GWEN_DIALOG *dlg,
161  int untilEnd) {
162  CppGui *xgui;
163 
164  assert(gui);
166  assert(xgui);
167 
168  return xgui->runDialog(dlg, untilEnd);
169 }
170 
171 
172 
173 int CppGuiLinker::GetFileName(GWEN_GUI *gui,
174  const char *caption,
176  uint32_t flags,
177  const char *patterns,
178  GWEN_BUFFER *pathBuffer,
179  uint32_t guiid) {
180  CppGui *xgui;
181 
182  assert(gui);
184  assert(xgui);
185 
186  return xgui->getFileName(caption, fnt, flags, patterns, pathBuffer, guiid);
187 }
188 
189 
190 
192 void CppGuiLinker::freeData(void *bp, void *p) {
193  CppGui *xgui;
194 
195  DBG_NOTICE(0, "CppGuiLinker: Freeing CppGui");
196  xgui=(CppGui*)p;
197  if (xgui->_gui) {
198  xgui->_gui=0;
199  }
200  delete xgui;
201 }
202 
203 
204 
205 
206 
207 
208 
209 
210 
211 
212 
213 
215 :_checkCertFn(NULL)
216 ,_dbPasswords(NULL)
217 ,_gui(NULL) {
218  _gui=GWEN_Gui_new();
219  _dbPasswords=GWEN_DB_Group_new("passwords");
220 
222  _gui, this,
223  CppGuiLinker::freeData);
225  _printFn=GWEN_Gui_SetPrintFn(_gui, CppGuiLinker::Print);
226  _getPasswordFn=GWEN_Gui_SetGetPasswordFn(_gui, CppGuiLinker::GetPassword);
227  _setPasswordStatusFn=GWEN_Gui_SetSetPasswordStatusFn(_gui, CppGuiLinker::SetPasswordStatus);
228  _checkCertFn=GWEN_Gui_SetCheckCertFn(_gui, CppGuiLinker::CheckCert);
229  GWEN_Gui_SetLogHookFn(_gui, CppGuiLinker::LogHook);
230  _execDialogFn=GWEN_Gui_SetExecDialogFn(_gui, CppGuiLinker::ExecDialog);
231  _openDialogFn=GWEN_Gui_SetOpenDialogFn(_gui, CppGuiLinker::OpenDialog);
232  _closeDialogFn=GWEN_Gui_SetCloseDialogFn(_gui, CppGuiLinker::CloseDialog);
233  _runDialogFn=GWEN_Gui_SetRunDialogFn(_gui, CppGuiLinker::RunDialog);
234  _getFileNameFn=GWEN_Gui_SetGetFileNameFn(_gui, CppGuiLinker::GetFileName);
235 }
236 
237 
238 
240  if (_gui) {
243  }
244  GWEN_DB_Group_free(_dbPasswords);
245 }
246 
247 
248 
249 int CppGui::print(const char *docTitle,
250  const char *docType,
251  const char *descr,
252  const char *text,
253  uint32_t guiid){
254  if (_printFn)
255  return _printFn(_gui, docTitle, docType, descr, text, guiid);
256  else
258 }
259 
260 
261 
262 std::string CppGui::_getPasswordHash(const char *token, const char *pin) {
263  GWEN_MDIGEST *md;
264  std::string s;
265  GWEN_BUFFER *buf;
266  int rv;
267 
268  /* hash token and pin */
270  rv=GWEN_MDigest_Begin(md);
271  if (rv==0)
272  rv=GWEN_MDigest_Update(md, (const uint8_t*)token, strlen(token));
273  if (rv==0)
274  rv=GWEN_MDigest_Update(md, (const uint8_t*)pin, strlen(pin));
275  if (rv==0)
276  rv=GWEN_MDigest_End(md);
277  if (rv<0) {
278  DBG_ERROR(GWEN_LOGDOMAIN, "Hash error (%d)", rv);
279  GWEN_MDigest_free(md);
280  return "";
281  }
282 
283  buf=GWEN_Buffer_new(0, 256, 0, 1);
286  buf,
287  0, 0, 0);
288  s=std::string(GWEN_Buffer_GetStart(buf),
290  GWEN_Buffer_free(buf);
291 
292  GWEN_MDigest_free(md);
293  return s;
294 }
295 
296 
297 
298 int CppGui::getPassword(uint32_t flags,
299  const char *token,
300  const char *title,
301  const char *text,
302  char *buffer,
303  int minLen,
304  int maxLen,
305  uint32_t guiid) {
306  if (flags & GWEN_GUI_INPUT_FLAGS_TAN) {
307  return GWEN_Gui_InputBox(flags,
308  title,
309  text,
310  buffer,
311  minLen,
312  maxLen,
313  guiid);
314  }
315  else {
316  GWEN_BUFFER *buf;
317  int rv;
318  const char *s;
319 
320  buf=GWEN_Buffer_new(0, 256, 0, 1);
322 
323  if (!(flags & GWEN_GUI_INPUT_FLAGS_CONFIRM)) {
324  s=GWEN_DB_GetCharValue(_dbPasswords,
326  0, NULL);
327  if (s) {
328  int i;
329 
330  i=strlen(s);
331  if (i>=minLen && i<=maxLen) {
332  memmove(buffer, s, i+1);
333  GWEN_Buffer_free(buf);
334  return 0;
335  }
336  }
337  }
338 
339  for (;;) {
340  rv=GWEN_Gui_InputBox(flags,
341  title,
342  text,
343  buffer,
344  minLen,
345  maxLen,
346  guiid);
347  if (rv) {
348  GWEN_Buffer_free(buf);
349  return rv;
350  }
351  else {
352  std::string s;
353  std::list<std::string>::iterator it;
354  bool isBad=false;
355 
356  s=_getPasswordHash(token, buffer);
357  for (it=_badPasswords.begin();
358  it!=_badPasswords.end();
359  it++) {
360  if (*it==s) {
361  /* password is bad */
362  isBad=true;
363  break;
364  }
365  }
366 
367  if (!isBad)
368  break;
372  I18N("Enforce PIN"),
373  I18N(
374  "You entered the same PIN twice.\n"
375  "The PIN is marked as bad, do you want\n"
376  "to use it anyway?"
377  "<html>"
378  "<p>"
379  "You entered the same PIN twice."
380  "</p>"
381  "<p>"
382  "The PIN is marked as <b>bad</b>, "
383  "do you want to use it anyway?"
384  "</p>"
385  "</html>"),
386  I18N("Use my input"),
387  I18N("Re-enter"),
388  0,
389  guiid);
390  if (rv==1) {
391  /* accept this input */
392  _badPasswords.remove(s);
393  break;
394  }
395  }
396  }
397 
398  GWEN_Buffer_free(buf);
399  return 0;
400  }
401 }
402 
403 
404 
406  GWEN_SYNCIO *sio,
407  uint32_t guiid) {
408  return checkCertBuiltIn(cd, sio, guiid);
409 }
410 
411 
412 
413 int CppGui::logHook(const char *logDomain,
414  GWEN_LOGGER_LEVEL priority, const char *s) {
415  /* not hooked */
416  return 0;
417 }
418 
419 
420 
421 int CppGui::execDialog(GWEN_DIALOG *dlg, uint32_t guiid) {
423 }
424 
425 
426 
427 int CppGui::openDialog(GWEN_DIALOG *dlg, uint32_t guiid) {
428  DBG_ERROR(0, "CppGui::OpenDialog");
429 
431 }
432 
433 
434 
437 }
438 
439 
440 
441 int CppGui::runDialog(GWEN_DIALOG *dlg, int untilEnd) {
443 }
444 
445 
446 
447 int CppGui::getFileName(const char *caption,
449  uint32_t flags,
450  const char *patterns,
451  GWEN_BUFFER *pathBuffer,
452  uint32_t guiid) {
453  DBG_ERROR(0, "Not supported");
455 }
456 
457 
458 
459 
461  GWEN_SYNCIO *sio,
462  uint32_t guiid) {
463  if (_checkCertFn)
464  return _checkCertFn(_gui, cert, sio, guiid);
465  else {
466  DBG_ERROR(0, "No built-in checkcert function?");
468  }
469 }
470 
471 
472 
473 int CppGui::setPasswordStatus(const char *token,
474  const char *pin,
476  uint32_t guiid) {
477  if (token==NULL && pin==NULL && status==GWEN_Gui_PasswordStatus_Remove) {
478  GWEN_DB_ClearGroup(_dbPasswords, NULL);
479  }
480  else {
481  GWEN_BUFFER *buf;
482  std::string s;
483 
484  buf=GWEN_Buffer_new(0, 256, 0, 1);
486 
487  s=_getPasswordHash(token, pin);
488  if (status==GWEN_Gui_PasswordStatus_Bad) {
489  std::list<std::string>::iterator it;
490 
491  s=_getPasswordHash(token, pin);
492  for (it=_badPasswords.begin();
493  it!=_badPasswords.end();
494  it++) {
495  if (*it==s) {
496  /* bad password already in list */
497  GWEN_Buffer_free(buf);
498  return 0;
499  }
500  }
501  _badPasswords.push_back(s);
502  }
503  else if (status==GWEN_Gui_PasswordStatus_Ok) {
504  /* only store passwords of which we know that they are ok */
506  GWEN_Buffer_GetStart(buf), pin);
507  }
508  GWEN_Buffer_free(buf);
509  }
510 
511  return 0;
512 }
513 
514 
515 
517  return _gui;
518 }
519 
520 
521 
523  GWEN_GUI *gui;
524  CppGui *xgui;
525 
526  gui=GWEN_Gui_GetGui();
527  if (gui==NULL)
528  return NULL;
530  return xgui;
531 }
532 
533 
534 
535 
536