00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifdef HAVE_CONFIG_H
00012 # include <config.h>
00013 #endif
00014
00015 #include "cppgui_p.hpp"
00016 #include <assert.h>
00017
00018 #include <gwenhywfar/inherit.h>
00019 #include <gwenhywfar/debug.h>
00020 #include <gwenhywfar/gui_be.h>
00021 #include <gwenhywfar/i18n.h>
00022
00023 #include <gwenhywfar/text.h>
00024 #include <gwenhywfar/mdigest.h>
00025 #include <gwenhywfar/debug.h>
00026
00027
00028
00029 GWEN_INHERIT(GWEN_GUI, CppGui);
00030
00031
00032
00033
00034 int CppGuiLinker::Print(GWEN_GUI *gui,
00035 const char *docTitle,
00036 const char *docType,
00037 const char *descr,
00038 const char *text,
00039 uint32_t guiid){
00040 CppGui *xgui;
00041
00042 assert(gui);
00043 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, CppGui, gui);
00044 assert(xgui);
00045
00046 return xgui->print(docTitle, docType, descr, text, guiid);
00047 }
00048
00049
00050
00051 int CppGuiLinker::GetPassword(GWEN_GUI *gui,
00052 uint32_t flags,
00053 const char *token,
00054 const char *title,
00055 const char *text,
00056 char *buffer,
00057 int minLen,
00058 int maxLen,
00059 uint32_t guiid) {
00060 CppGui *xgui;
00061
00062 assert(gui);
00063 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, CppGui, gui);
00064 assert(xgui);
00065
00066 return xgui->getPassword(flags, token, title, text, buffer, minLen, maxLen, guiid);
00067 }
00068
00069
00070
00071 int CppGuiLinker::SetPasswordStatus(GWEN_GUI *gui,
00072 const char *token,
00073 const char *pin,
00074 GWEN_GUI_PASSWORD_STATUS status,
00075 uint32_t guiid) {
00076 CppGui *xgui;
00077
00078 assert(gui);
00079 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, CppGui, gui);
00080 assert(xgui);
00081
00082 return xgui->setPasswordStatus(token, pin, status, guiid);
00083 }
00084
00085
00086
00087 int CppGuiLinker::CheckCert(GWEN_GUI *gui,
00088 const GWEN_SSLCERTDESCR *cert,
00089 GWEN_SYNCIO *sio,
00090 uint32_t guiid) {
00091 CppGui *xgui;
00092
00093 assert(gui);
00094 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, CppGui, gui);
00095 assert(xgui);
00096
00097 return xgui->checkCert(cert, sio, guiid);
00098 }
00099
00100
00101
00102 int CppGuiLinker::LogHook(GWEN_GUI *gui,
00103 const char *logDomain,
00104 GWEN_LOGGER_LEVEL priority, const char *s) {
00105 CppGui *xgui;
00106
00107 assert(gui);
00108 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, CppGui, gui);
00109 assert(xgui);
00110
00111 return xgui->logHook(logDomain, priority, s);
00112 }
00113
00114
00115
00116 int CppGuiLinker::ExecDialog(GWEN_GUI *gui,
00117 GWEN_DIALOG *dlg,
00118 uint32_t guiid) {
00119 CppGui *xgui;
00120
00121 assert(gui);
00122 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, CppGui, gui);
00123 assert(xgui);
00124
00125 return xgui->execDialog(dlg, guiid);
00126 }
00127
00128
00129
00130 int CppGuiLinker::OpenDialog(GWEN_GUI *gui,
00131 GWEN_DIALOG *dlg,
00132 uint32_t guiid) {
00133 CppGui *xgui;
00134
00135 assert(gui);
00136 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, CppGui, gui);
00137 assert(xgui);
00138
00139 DBG_ERROR(0, "CppGuiLinker::OpenDialog");
00140
00141 return xgui->openDialog(dlg, guiid);
00142 }
00143
00144
00145
00146 int CppGuiLinker::CloseDialog(GWEN_GUI *gui,
00147 GWEN_DIALOG *dlg) {
00148 CppGui *xgui;
00149
00150 assert(gui);
00151 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, CppGui, gui);
00152 assert(xgui);
00153
00154 return xgui->closeDialog(dlg);
00155 }
00156
00157
00158
00159 int CppGuiLinker::RunDialog(GWEN_GUI *gui,
00160 GWEN_DIALOG *dlg,
00161 int untilEnd) {
00162 CppGui *xgui;
00163
00164 assert(gui);
00165 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, CppGui, gui);
00166 assert(xgui);
00167
00168 return xgui->runDialog(dlg, untilEnd);
00169 }
00170
00171
00172
00173 int CppGuiLinker::GetFileName(GWEN_GUI *gui,
00174 const char *caption,
00175 GWEN_GUI_FILENAME_TYPE fnt,
00176 uint32_t flags,
00177 const char *patterns,
00178 GWEN_BUFFER *pathBuffer,
00179 uint32_t guiid) {
00180 CppGui *xgui;
00181
00182 assert(gui);
00183 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, CppGui, gui);
00184 assert(xgui);
00185
00186 return xgui->getFileName(caption, fnt, flags, patterns, pathBuffer, guiid);
00187 }
00188
00189
00190
00191 GWENHYWFAR_CB
00192 void CppGuiLinker::freeData(void *bp, void *p) {
00193 CppGui *xgui;
00194
00195 DBG_NOTICE(0, "CppGuiLinker: Freeing CppGui");
00196 xgui=(CppGui*)p;
00197 if (xgui->_gui) {
00198 xgui->_gui=0;
00199 }
00200 delete xgui;
00201 }
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 CppGui::CppGui()
00215 :_checkCertFn(NULL)
00216 ,_dbPasswords(NULL)
00217 ,_gui(NULL) {
00218 _gui=GWEN_Gui_new();
00219 _dbPasswords=GWEN_DB_Group_new("passwords");
00220
00221 GWEN_INHERIT_SETDATA(GWEN_GUI, CppGui,
00222 _gui, this,
00223 CppGuiLinker::freeData);
00224 GWEN_Gui_UseDialogs(_gui);
00225 _printFn=GWEN_Gui_SetPrintFn(_gui, CppGuiLinker::Print);
00226 _getPasswordFn=GWEN_Gui_SetGetPasswordFn(_gui, CppGuiLinker::GetPassword);
00227 _setPasswordStatusFn=GWEN_Gui_SetSetPasswordStatusFn(_gui, CppGuiLinker::SetPasswordStatus);
00228 _checkCertFn=GWEN_Gui_SetCheckCertFn(_gui, CppGuiLinker::CheckCert);
00229 GWEN_Gui_SetLogHookFn(_gui, CppGuiLinker::LogHook);
00230 _execDialogFn=GWEN_Gui_SetExecDialogFn(_gui, CppGuiLinker::ExecDialog);
00231 _openDialogFn=GWEN_Gui_SetOpenDialogFn(_gui, CppGuiLinker::OpenDialog);
00232 _closeDialogFn=GWEN_Gui_SetCloseDialogFn(_gui, CppGuiLinker::CloseDialog);
00233 _runDialogFn=GWEN_Gui_SetRunDialogFn(_gui, CppGuiLinker::RunDialog);
00234 _getFileNameFn=GWEN_Gui_SetGetFileNameFn(_gui, CppGuiLinker::GetFileName);
00235 }
00236
00237
00238
00239 CppGui::~CppGui(){
00240 if (_gui) {
00241 GWEN_INHERIT_UNLINK(GWEN_GUI, CppGui, _gui)
00242 GWEN_Gui_free(_gui);
00243 }
00244 GWEN_DB_Group_free(_dbPasswords);
00245 }
00246
00247
00248
00249 int CppGui::print(const char *docTitle,
00250 const char *docType,
00251 const char *descr,
00252 const char *text,
00253 uint32_t guiid){
00254 if (_printFn)
00255 return _printFn(_gui, docTitle, docType, descr, text, guiid);
00256 else
00257 return GWEN_ERROR_NOT_SUPPORTED;
00258 }
00259
00260
00261
00262 std::string CppGui::_getPasswordHash(const char *token, const char *pin) {
00263 GWEN_MDIGEST *md;
00264 std::string s;
00265 GWEN_BUFFER *buf;
00266 int rv;
00267
00268
00269 md=GWEN_MDigest_Md5_new();
00270 rv=GWEN_MDigest_Begin(md);
00271 if (rv==0)
00272 rv=GWEN_MDigest_Update(md, (const uint8_t*)token, strlen(token));
00273 if (rv==0)
00274 rv=GWEN_MDigest_Update(md, (const uint8_t*)pin, strlen(pin));
00275 if (rv==0)
00276 rv=GWEN_MDigest_End(md);
00277 if (rv<0) {
00278 DBG_ERROR(GWEN_LOGDOMAIN, "Hash error (%d)", rv);
00279 GWEN_MDigest_free(md);
00280 return "";
00281 }
00282
00283 buf=GWEN_Buffer_new(0, 256, 0, 1);
00284 GWEN_Text_ToHexBuffer((const char*)GWEN_MDigest_GetDigestPtr(md),
00285 GWEN_MDigest_GetDigestSize(md),
00286 buf,
00287 0, 0, 0);
00288 s=std::string(GWEN_Buffer_GetStart(buf),
00289 GWEN_Buffer_GetUsedBytes(buf));
00290 GWEN_Buffer_free(buf);
00291
00292 GWEN_MDigest_free(md);
00293 return s;
00294 }
00295
00296
00297
00298 int CppGui::getPassword(uint32_t flags,
00299 const char *token,
00300 const char *title,
00301 const char *text,
00302 char *buffer,
00303 int minLen,
00304 int maxLen,
00305 uint32_t guiid) {
00306 if (flags & GWEN_GUI_INPUT_FLAGS_TAN) {
00307 return GWEN_Gui_InputBox(flags,
00308 title,
00309 text,
00310 buffer,
00311 minLen,
00312 maxLen,
00313 guiid);
00314 }
00315 else {
00316 GWEN_BUFFER *buf;
00317 int rv;
00318 const char *s;
00319
00320 buf=GWEN_Buffer_new(0, 256, 0, 1);
00321 GWEN_Text_EscapeToBufferTolerant(token, buf);
00322
00323 if (!(flags & GWEN_GUI_INPUT_FLAGS_CONFIRM)) {
00324 s=GWEN_DB_GetCharValue(_dbPasswords,
00325 GWEN_Buffer_GetStart(buf),
00326 0, NULL);
00327 if (s) {
00328 int i;
00329
00330 i=strlen(s);
00331 if (i>=minLen && i<=maxLen) {
00332 memmove(buffer, s, i+1);
00333 GWEN_Buffer_free(buf);
00334 return 0;
00335 }
00336 }
00337 }
00338
00339 for (;;) {
00340 rv=GWEN_Gui_InputBox(flags,
00341 title,
00342 text,
00343 buffer,
00344 minLen,
00345 maxLen,
00346 guiid);
00347 if (rv) {
00348 GWEN_Buffer_free(buf);
00349 return rv;
00350 }
00351 else {
00352 std::string s;
00353 std::list<std::string>::iterator it;
00354 bool isBad=false;
00355
00356 s=_getPasswordHash(token, buffer);
00357 for (it=_badPasswords.begin();
00358 it!=_badPasswords.end();
00359 it++) {
00360 if (*it==s) {
00361
00362 isBad=true;
00363 break;
00364 }
00365 }
00366
00367 if (!isBad)
00368 break;
00369 rv=GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_TYPE_ERROR |
00370 GWEN_GUI_MSG_FLAGS_CONFIRM_B1 |
00371 GWEN_GUI_MSG_FLAGS_SEVERITY_DANGEROUS,
00372 I18N("Enforce PIN"),
00373 I18N(
00374 "You entered the same PIN twice.\n"
00375 "The PIN is marked as bad, do you want\n"
00376 "to use it anyway?"
00377 "<html>"
00378 "<p>"
00379 "You entered the same PIN twice."
00380 "</p>"
00381 "<p>"
00382 "The PIN is marked as <b>bad</b>, "
00383 "do you want to use it anyway?"
00384 "</p>"
00385 "</html>"),
00386 I18N("Use my input"),
00387 I18N("Re-enter"),
00388 0,
00389 guiid);
00390 if (rv==1) {
00391
00392 _badPasswords.remove(s);
00393 break;
00394 }
00395 }
00396 }
00397
00398 GWEN_Buffer_free(buf);
00399 return 0;
00400 }
00401 }
00402
00403
00404
00405 int CppGui::checkCert(const GWEN_SSLCERTDESCR *cd,
00406 GWEN_SYNCIO *sio,
00407 uint32_t guiid) {
00408 return checkCertBuiltIn(cd, sio, guiid);
00409 }
00410
00411
00412
00413 int CppGui::logHook(const char *logDomain,
00414 GWEN_LOGGER_LEVEL priority, const char *s) {
00415
00416 return 0;
00417 }
00418
00419
00420
00421 int CppGui::execDialog(GWEN_DIALOG *dlg, uint32_t guiid) {
00422 return GWEN_ERROR_NOT_SUPPORTED;
00423 }
00424
00425
00426
00427 int CppGui::openDialog(GWEN_DIALOG *dlg, uint32_t guiid) {
00428 DBG_ERROR(0, "CppGui::OpenDialog");
00429
00430 return GWEN_ERROR_NOT_SUPPORTED;
00431 }
00432
00433
00434
00435 int CppGui::closeDialog(GWEN_DIALOG *dlg) {
00436 return GWEN_ERROR_NOT_SUPPORTED;
00437 }
00438
00439
00440
00441 int CppGui::runDialog(GWEN_DIALOG *dlg, int untilEnd) {
00442 return GWEN_ERROR_NOT_SUPPORTED;
00443 }
00444
00445
00446
00447 int CppGui::getFileName(const char *caption,
00448 GWEN_GUI_FILENAME_TYPE fnt,
00449 uint32_t flags,
00450 const char *patterns,
00451 GWEN_BUFFER *pathBuffer,
00452 uint32_t guiid) {
00453 DBG_ERROR(0, "Not supported");
00454 return GWEN_ERROR_NOT_SUPPORTED;
00455 }
00456
00457
00458
00459
00460 int CppGui::checkCertBuiltIn(const GWEN_SSLCERTDESCR *cert,
00461 GWEN_SYNCIO *sio,
00462 uint32_t guiid) {
00463 if (_checkCertFn)
00464 return _checkCertFn(_gui, cert, sio, guiid);
00465 else {
00466 DBG_ERROR(0, "No built-in checkcert function?");
00467 return GWEN_ERROR_NOT_SUPPORTED;
00468 }
00469 }
00470
00471
00472
00473 int CppGui::setPasswordStatus(const char *token,
00474 const char *pin,
00475 GWEN_GUI_PASSWORD_STATUS status,
00476 uint32_t guiid) {
00477 if (token==NULL && pin==NULL && status==GWEN_Gui_PasswordStatus_Remove) {
00478 GWEN_DB_ClearGroup(_dbPasswords, NULL);
00479 }
00480 else {
00481 GWEN_BUFFER *buf;
00482 std::string s;
00483
00484 buf=GWEN_Buffer_new(0, 256, 0, 1);
00485 GWEN_Text_EscapeToBufferTolerant(token, buf);
00486
00487 s=_getPasswordHash(token, pin);
00488 if (status==GWEN_Gui_PasswordStatus_Bad) {
00489 std::list<std::string>::iterator it;
00490
00491 s=_getPasswordHash(token, pin);
00492 for (it=_badPasswords.begin();
00493 it!=_badPasswords.end();
00494 it++) {
00495 if (*it==s) {
00496
00497 GWEN_Buffer_free(buf);
00498 return 0;
00499 }
00500 }
00501 _badPasswords.push_back(s);
00502 }
00503 else if (status==GWEN_Gui_PasswordStatus_Ok) {
00504
00505 GWEN_DB_SetCharValue(_dbPasswords, GWEN_DB_FLAGS_OVERWRITE_VARS,
00506 GWEN_Buffer_GetStart(buf), pin);
00507 }
00508 GWEN_Buffer_free(buf);
00509 }
00510
00511 return 0;
00512 }
00513
00514
00515
00516 GWEN_GUI *CppGui::getCInterface(){
00517 return _gui;
00518 }
00519
00520
00521
00522 CppGui *CppGui::getCppGui(){
00523 GWEN_GUI *gui;
00524 CppGui *xgui;
00525
00526 gui=GWEN_Gui_GetGui();
00527 if (gui==NULL)
00528 return NULL;
00529 xgui=GWEN_INHERIT_GETDATA(GWEN_GUI, CppGui, gui);
00530 return xgui;
00531 }
00532
00533
00534
00535
00536