00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifdef HAVE_CONFIG_H
00027 # include <config.h>
00028 #endif
00029
00030 #define DISABLE_DEBUGLOG
00031
00032
00033 #ifndef ICONV_CONST
00034 # define ICONV_CONST
00035 #endif
00036
00037
00038 #include "cgui_p.h"
00039 #include "i18n_l.h"
00040
00041 #include <gwenhywfar/gui_be.h>
00042 #include <gwenhywfar/inherit.h>
00043 #include <gwenhywfar/debug.h>
00044 #include <gwenhywfar/misc.h>
00045 #include <gwenhywfar/db.h>
00046 #include <gwenhywfar/gwentime.h>
00047 #include <gwenhywfar/mdigest.h>
00048 #include <gwenhywfar/text.h>
00049
00050
00051 #include <stdlib.h>
00052 #include <string.h>
00053 #include <ctype.h>
00054 #ifdef HAVE_TERMIOS_H
00055 # include <termios.h>
00056 #endif
00057 #include <unistd.h>
00058 #include <fcntl.h>
00059 #include <stdio.h>
00060 #include <errno.h>
00061
00062 #ifdef HAVE_SIGNAL_H
00063 # include <signal.h>
00064 #endif
00065
00066
00067
00068 GWEN_INHERIT(GWEN_GUI, GWEN_GUI_CGUI)
00069
00070
00071
00072
00073 GWEN_GUI *GWEN_Gui_CGui_new(void) {
00074 GWEN_GUI *gui;
00075 GWEN_GUI_CGUI *cgui;
00076
00077 gui=GWEN_Gui_new();
00078 GWEN_NEW_OBJECT(GWEN_GUI_CGUI, cgui);
00079 cgui->progressList=GWEN_Gui_CProgress_List_new();
00080 GWEN_INHERIT_SETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui, cgui,
00081 GWEN_Gui_CGui_FreeData);
00082
00083 GWEN_Gui_SetMessageBoxFn(gui, GWEN_Gui_CGui_MessageBox);
00084 GWEN_Gui_SetInputBoxFn(gui, GWEN_Gui_CGui_InputBox);
00085 GWEN_Gui_SetShowBoxFn(gui, GWEN_Gui_CGui_ShowBox);
00086 GWEN_Gui_SetHideBoxFn(gui, GWEN_Gui_CGui_HideBox);
00087 GWEN_Gui_SetProgressStartFn(gui, GWEN_Gui_CGui_ProgressStart);
00088 GWEN_Gui_SetProgressAdvanceFn(gui, GWEN_Gui_CGui_ProgressAdvance);
00089 GWEN_Gui_SetProgressLogFn(gui, GWEN_Gui_CGui_ProgressLog);
00090 GWEN_Gui_SetProgressEndFn(gui, GWEN_Gui_CGui_ProgressEnd);
00091 GWEN_Gui_SetSetPasswordStatusFn(gui, GWEN_Gui_CGui_SetPasswordStatus);
00092 GWEN_Gui_SetGetPasswordFn(gui, GWEN_Gui_CGui_GetPassword);
00093
00094 cgui->checkCertFn=GWEN_Gui_SetCheckCertFn(gui, GWEN_Gui_CGui_CheckCert);
00095
00096 cgui->dbPasswords=GWEN_DB_Group_new("passwords");
00097 cgui->dbCerts=GWEN_DB_Group_new("certs");
00098 cgui->badPasswords=GWEN_StringList_new();
00099
00100 return gui;
00101 }
00102
00103
00104
00105 void GWENHYWFAR_CB GWEN_Gui_CGui_FreeData(GWEN_UNUSED void *bp, void *p) {
00106 GWEN_GUI_CGUI *cgui;
00107
00108 cgui=(GWEN_GUI_CGUI*)p;
00109 GWEN_Gui_CProgress_List_free(cgui->progressList);
00110 GWEN_StringList_free(cgui->badPasswords);
00111 GWEN_DB_Group_free(cgui->dbCerts);
00112 GWEN_DB_Group_free(cgui->dbPasswords);
00113 GWEN_FREE_OBJECT(cgui);
00114 }
00115
00116
00117
00118 const char *GWEN_Gui_CGui_GetCharSet(const GWEN_GUI *gui) {
00119 return GWEN_Gui_GetCharSet(gui);
00120 }
00121
00122
00123
00124 void GWEN_Gui_CGui_SetCharSet(GWEN_GUI *gui, const char *s) {
00125 GWEN_Gui_SetCharSet(gui, s);
00126 }
00127
00128
00129
00130 int GWEN_Gui_CGui_GetIsNonInteractive(const GWEN_GUI *gui) {
00131 return GWEN_Gui_GetFlags(gui) & GWEN_GUI_FLAGS_NONINTERACTIVE;
00132 }
00133
00134
00135
00136 void GWEN_Gui_CGui_SetIsNonInteractive(GWEN_GUI *gui, int i) {
00137 if (i)
00138 GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_NONINTERACTIVE);
00139 else
00140 GWEN_Gui_SubFlags(gui, GWEN_GUI_FLAGS_NONINTERACTIVE);
00141 }
00142
00143
00144
00145 int GWEN_Gui_CGui_GetAcceptAllValidCerts(const GWEN_GUI *gui) {
00146 return GWEN_Gui_GetFlags(gui) & GWEN_GUI_FLAGS_ACCEPTVALIDCERTS;
00147 }
00148
00149
00150
00151 void GWEN_Gui_CGui_SetAcceptAllValidCerts(GWEN_GUI *gui, int i) {
00152 if (i)
00153 GWEN_Gui_AddFlags(gui, GWEN_GUI_FLAGS_ACCEPTVALIDCERTS);
00154 else
00155 GWEN_Gui_SubFlags(gui, GWEN_GUI_FLAGS_ACCEPTVALIDCERTS);
00156 }
00157
00158
00159
00160 char GWEN_Gui_CGui__readCharFromStdin(int waitFor) {
00161 int chr;
00162 #ifdef HAVE_TERMIOS_H
00163 struct termios OldAttr, NewAttr;
00164 int AttrChanged = 0;
00165 #endif
00166 #if HAVE_DECL_SIGPROCMASK
00167 sigset_t snew, sold;
00168 #endif
00169
00170
00171 #if HAVE_DECL_SIGPROCMASK
00172 sigemptyset(&snew);
00173 sigaddset(&snew, SIGINT);
00174 sigaddset(&snew, SIGSTOP);
00175 sigprocmask(SIG_BLOCK, &snew, &sold);
00176 #endif
00177 #ifdef HAVE_TERMIOS_H
00178 if (0 == tcgetattr (fileno (stdin), &OldAttr)){
00179 NewAttr = OldAttr;
00180 NewAttr.c_lflag &= ~ICANON;
00181 NewAttr.c_lflag &= ~ECHO;
00182 tcsetattr (fileno (stdin), TCSAFLUSH, &NewAttr);
00183 AttrChanged = !0;
00184 }
00185 #endif
00186
00187 for (;;) {
00188 chr=getchar();
00189 if (waitFor) {
00190 if (chr==-1 ||
00191 chr==GWEN_GUI_CGUI_CHAR_ABORT ||
00192 chr==GWEN_GUI_CGUI_CHAR_ENTER ||
00193 chr==waitFor)
00194 break;
00195 }
00196 else
00197 break;
00198 }
00199
00200 #ifdef HAVE_TERMIOS_H
00201
00202 if (AttrChanged)
00203 tcsetattr (fileno (stdin), TCSADRAIN, &OldAttr);
00204 #endif
00205
00206 #if HAVE_DECL_SIGPROCMASK
00207 sigprocmask(SIG_BLOCK, &sold, 0);
00208 #endif
00209
00210 return chr;
00211 }
00212
00213
00214
00215 int GWEN_Gui_CGui__input(GWEN_UNUSED GWEN_GUI *gui,
00216 uint32_t flags,
00217 char *buffer,
00218 int minLen,
00219 int maxLen,
00220 uint32_t guiid){
00221 #ifdef HAVE_TERMIOS_H
00222 struct termios OldInAttr, NewInAttr;
00223 struct termios OldOutAttr, NewOutAttr;
00224 int AttrInChanged = 0;
00225 int AttrOutChanged = 0;
00226 #endif
00227 int chr;
00228 unsigned int pos;
00229 int rv;
00230 #if HAVE_DECL_SIGPROCMASK
00231 sigset_t snew, sold;
00232 #endif
00233
00234
00235
00236 #if HAVE_DECL_SIGPROCMASK
00237 sigemptyset(&snew);
00238 sigaddset(&snew, SIGINT);
00239 sigaddset(&snew, SIGSTOP);
00240 sigprocmask(SIG_BLOCK, &snew, &sold);
00241 #endif
00242
00243 #ifdef HAVE_TERMIOS_H
00244 if (0 == tcgetattr (fileno (stdin), &OldInAttr)){
00245 NewInAttr = OldInAttr;
00246 NewInAttr.c_lflag &= ~ECHO;
00247 NewInAttr.c_lflag &= ~ICANON;
00248 tcsetattr (fileno (stdin), TCSAFLUSH, &NewInAttr);
00249 AttrInChanged = !0;
00250 }
00251 if (0 == tcgetattr (fileno (stderr), &OldOutAttr)){
00252 NewOutAttr = OldOutAttr;
00253 NewOutAttr.c_lflag &= ~ICANON;
00254 tcsetattr (fileno (stderr), TCSAFLUSH, &NewOutAttr);
00255 AttrOutChanged = !0;
00256 }
00257 #endif
00258
00259 pos=0;
00260 rv=0;
00261 for (;;) {
00262 chr=getchar();
00263 if (chr==GWEN_GUI_CGUI_CHAR_DELETE) {
00264 if (pos) {
00265 pos--;
00266 fprintf(stderr, "%c %c", 8, 8);
00267 }
00268 }
00269 else if (chr==GWEN_GUI_CGUI_CHAR_ENTER) {
00270 if (minLen && pos<minLen) {
00271 if (pos==0 && (flags & GWEN_GUI_INPUT_FLAGS_ALLOW_DEFAULT)) {
00272 rv=GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_TYPE_INFO |
00273 GWEN_GUI_MSG_FLAGS_CONFIRM_B1 |
00274 GWEN_GUI_MSG_FLAGS_SEVERITY_DANGEROUS,
00275 I18N("Empty Input"),
00276 I18N("Your input was empty.\n"
00277 "Do you want to use the default?"),
00278 I18N("Yes"),
00279 I18N("No"),
00280 I18N("Abort"), guiid);
00281 if (rv==1) {
00282 rv=GWEN_ERROR_DEFAULT_VALUE;
00283 break;
00284 }
00285 else {
00286 rv=GWEN_ERROR_USER_ABORTED;
00287 break;
00288 }
00289 }
00290 else {
00291
00292 fprintf(stderr, "\007");
00293 }
00294 }
00295 else {
00296 fprintf(stderr, "\n");
00297 buffer[pos]=0;
00298 rv=0;
00299 break;
00300 }
00301 }
00302 else {
00303 if (pos<maxLen) {
00304 if (chr==GWEN_GUI_CGUI_CHAR_ABORT) {
00305 DBG_INFO(GWEN_LOGDOMAIN, "User aborted");
00306 rv=GWEN_ERROR_USER_ABORTED;
00307 break;
00308 }
00309 else {
00310 if ((flags & GWEN_GUI_INPUT_FLAGS_NUMERIC) &&
00311 !isdigit(chr)) {
00312
00313 fprintf(stderr, "\007");
00314 }
00315 else {
00316 if (flags & GWEN_GUI_INPUT_FLAGS_SHOW)
00317 fprintf(stderr, "%c", chr);
00318 else
00319 fprintf(stderr, "*");
00320 buffer[pos++]=chr;
00321 buffer[pos]=0;
00322 }
00323 }
00324 }
00325 else {
00326
00327 fprintf(stderr, "\007");
00328 }
00329 }
00330 }
00331
00332 #ifdef HAVE_TERMIOS_H
00333
00334 if (AttrOutChanged)
00335 tcsetattr (fileno (stderr), TCSADRAIN, &OldOutAttr);
00336 if (AttrInChanged)
00337 tcsetattr (fileno (stdin), TCSADRAIN, &OldInAttr);
00338 #endif
00339
00340 #if HAVE_DECL_SIGPROCMASK
00341 sigprocmask(SIG_BLOCK, &sold, 0);
00342 #endif
00343 return rv;
00344 }
00345
00346
00347
00348 int GWEN_Gui_CGui_MessageBox(GWEN_GUI *gui,
00349 uint32_t flags,
00350 const char *title,
00351 const char *text,
00352 const char *b1,
00353 const char *b2,
00354 const char *b3,
00355 GWEN_UNUSED uint32_t guiid) {
00356 GWEN_GUI_CGUI *cgui;
00357 GWEN_BUFFER *tbuf;
00358 int c;
00359
00360 assert(gui);
00361 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00362 assert(cgui);
00363
00364 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
00365 GWEN_Gui_GetRawText(gui, text, tbuf);
00366
00367 if (GWEN_Gui_GetFlags(gui) & GWEN_GUI_FLAGS_NONINTERACTIVE) {
00368 if (GWEN_GUI_MSG_FLAGS_SEVERITY_IS_DANGEROUS(flags)) {
00369 fprintf(stderr,
00370 "Got the following dangerous message:\n%s\n",
00371 GWEN_Buffer_GetStart(tbuf));
00372 GWEN_Buffer_free(tbuf);
00373 return 0;
00374 }
00375 else {
00376 DBG_INFO(GWEN_LOGDOMAIN,
00377 "Auto-answering the following message with %d:\n%s",
00378 GWEN_GUI_MSG_FLAGS_CONFIRM_BUTTON(flags),
00379 GWEN_Buffer_GetStart(tbuf));
00380 GWEN_Buffer_free(tbuf);
00381 return GWEN_GUI_MSG_FLAGS_CONFIRM_BUTTON(flags);
00382 }
00383 }
00384
00385 fprintf(stderr, "===== %s =====\n", title);
00386 fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(tbuf));
00387 GWEN_Buffer_free(tbuf);
00388 tbuf=0;
00389
00390 if (b1) {
00391 fprintf(stderr, "(1) %s", b1);
00392 if (b2) {
00393 fprintf(stderr, " (2) %s", b2);
00394 if (b3) {
00395 fprintf(stderr, " (3) %s", b3);
00396 }
00397 }
00398 fprintf(stderr, "\n");
00399 }
00400 fprintf(stderr, "Please enter your choice: ");
00401 for(;;) {
00402 c=GWEN_Gui_CGui__readCharFromStdin(0);
00403 if (c==EOF) {
00404 fprintf(stderr, "Aborted.\n");
00405 return GWEN_ERROR_USER_ABORTED;
00406 }
00407 if (!b1 && c==13)
00408 return 0;
00409 if (c=='1' && b1) {
00410 fprintf(stderr, "1\n");
00411 return 1;
00412 }
00413 else if (c=='2' && b2) {
00414 fprintf(stderr, "2\n");
00415 return 2;
00416 }
00417 else if (c=='3' && b3) {
00418 fprintf(stderr, "3\n");
00419 return 3;
00420 }
00421 else {
00422 fprintf(stderr, "%c", 7);
00423 }
00424 }
00425
00426 }
00427
00428
00429
00430 int GWEN_Gui_CGui_InputBox(GWEN_GUI *gui,
00431 uint32_t flags,
00432 const char *title,
00433 const char *text,
00434 char *buffer,
00435 int minLen,
00436 int maxLen,
00437 uint32_t guiid) {
00438 int rv;
00439 GWEN_BUFFER *tbuf;
00440
00441 assert(gui);
00442 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
00443 GWEN_Gui_GetRawText(gui, text, tbuf);
00444
00445 fprintf(stderr, "===== %s =====\n", title);
00446 fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(tbuf));
00447 GWEN_Buffer_free(tbuf);
00448 tbuf=0;
00449
00450 if (flags & GWEN_GUI_INPUT_FLAGS_CONFIRM) {
00451 for (;;) {
00452 char *lbuffer=0;
00453
00454 lbuffer=(char*)malloc(maxLen);
00455 if (!lbuffer) {
00456 DBG_ERROR(GWEN_LOGDOMAIN, "Not enough memory for %d bytes", maxLen);
00457 return GWEN_ERROR_INVALID;
00458 }
00459 fprintf(stderr, "Input: ");
00460 rv=GWEN_Gui_CGui__input(gui, flags, lbuffer, minLen, maxLen, guiid);
00461 if (rv) {
00462 free(lbuffer);
00463 return rv;
00464 }
00465
00466 fprintf(stderr, "Again: ");
00467 rv=GWEN_Gui_CGui__input(gui, flags, buffer, minLen, maxLen, guiid);
00468 if (rv) {
00469 free(lbuffer);
00470 return rv;
00471 }
00472 if (strcmp(lbuffer, buffer)!=0) {
00473 fprintf(stderr,
00474 "ERROR: Entries do not match, please try (again or abort)\n");
00475 }
00476 else {
00477 rv=0;
00478 break;
00479 }
00480
00481 }
00482 }
00483 else {
00484 fprintf(stderr, "Input: ");
00485 rv=GWEN_Gui_CGui__input(gui, flags, buffer, minLen, maxLen, guiid);
00486 }
00487
00488 return rv;
00489 }
00490
00491
00492
00493 uint32_t GWEN_Gui_CGui_ShowBox(GWEN_GUI *gui,
00494 GWEN_UNUSED uint32_t flags,
00495 const char *title,
00496 const char *text,
00497 GWEN_UNUSED uint32_t guiid) {
00498 GWEN_GUI_CGUI *cgui;
00499 GWEN_BUFFER *tbuf;
00500
00501 assert(gui);
00502 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00503 assert(cgui);
00504
00505 tbuf=GWEN_Buffer_new(0, 256, 0, 1);
00506 GWEN_Gui_GetRawText(gui, text, tbuf);
00507
00508 fprintf(stderr, "----- %s -----\n", title);
00509 fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(tbuf));
00510 GWEN_Buffer_free(tbuf);
00511 tbuf=0;
00512
00513 return ++(cgui->nextBoxId);
00514 }
00515
00516
00517
00518 void GWEN_Gui_CGui_HideBox(GWEN_GUI *gui, GWEN_UNUSED uint32_t id) {
00519 GWEN_GUI_CGUI *cgui;
00520
00521 assert(gui);
00522 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00523 assert(cgui);
00524
00525
00526 }
00527
00528
00529
00530 uint32_t GWEN_Gui_CGui_ProgressStart(GWEN_GUI *gui,
00531 uint32_t progressFlags,
00532 const char *title,
00533 const char *text,
00534 uint64_t total,
00535 GWEN_UNUSED uint32_t guiid) {
00536 GWEN_GUI_CGUI *cgui;
00537 GWEN_GUI_CPROGRESS *cp;
00538
00539 assert(gui);
00540 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00541 assert(cgui);
00542
00543 cp=GWEN_Gui_CProgress_new(gui,
00544 ++(cgui->nextProgressId),
00545 progressFlags,
00546 title,
00547 text,
00548 total);
00549 GWEN_Gui_CProgress_List_Insert(cp, cgui->progressList);
00550 return GWEN_Gui_CProgress_GetId(cp);
00551 }
00552
00553
00554
00555 GWEN_GUI_CPROGRESS *GWEN_Gui_CGui__findProgress(GWEN_GUI *gui, uint32_t id) {
00556 GWEN_GUI_CGUI *cgui;
00557 GWEN_GUI_CPROGRESS *cp;
00558
00559 assert(gui);
00560 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00561 assert(cgui);
00562
00563 cp=GWEN_Gui_CProgress_List_First(cgui->progressList);
00564 if (id==0)
00565 return cp;
00566 while(cp) {
00567 if (GWEN_Gui_CProgress_GetId(cp)==id)
00568 break;
00569 cp=GWEN_Gui_CProgress_List_Next(cp);
00570 }
00571
00572 return cp;
00573 }
00574
00575
00576
00577 int GWEN_Gui_CGui_ProgressAdvance(GWEN_GUI *gui,
00578 uint32_t id,
00579 uint64_t progress) {
00580 GWEN_GUI_CGUI *cgui;
00581 GWEN_GUI_CPROGRESS *cp;
00582
00583 assert(gui);
00584 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00585 assert(cgui);
00586
00587 cp=GWEN_Gui_CGui__findProgress(gui, id);
00588 if (!cp) {
00589 DBG_DEBUG(GWEN_LOGDOMAIN, "Progress object %u not found", id);
00590 return 0;
00591 }
00592 else {
00593 return GWEN_Gui_CProgress_Advance(cp, progress);
00594 }
00595 }
00596
00597
00598
00599 int GWEN_Gui_CGui_ProgressLog(GWEN_GUI *gui,
00600 uint32_t id,
00601 GWEN_LOGGER_LEVEL level,
00602 const char *text) {
00603 GWEN_GUI_CGUI *cgui;
00604 GWEN_GUI_CPROGRESS *cp;
00605
00606 assert(gui);
00607 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00608 assert(cgui);
00609
00610 cp=GWEN_Gui_CGui__findProgress(gui, id);
00611 if (!cp) {
00612 DBG_DEBUG(GWEN_LOGDOMAIN, "Progress object %u not found", id);
00613 return 0;
00614 }
00615 else {
00616 return GWEN_Gui_CProgress_Log(cp, level, text);
00617 }
00618 }
00619
00620
00621
00622 int GWEN_Gui_CGui_ProgressEnd(GWEN_GUI *gui,uint32_t id) {
00623 GWEN_GUI_CGUI *cgui;
00624 GWEN_GUI_CPROGRESS *cp;
00625
00626 assert(gui);
00627 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00628 assert(cgui);
00629
00630 cp=GWEN_Gui_CGui__findProgress(gui, id);
00631 if (!cp) {
00632 DBG_DEBUG(GWEN_LOGDOMAIN, "Progress object %u not found", id);
00633 return 0;
00634 }
00635 else {
00636 int rv;
00637
00638 rv=GWEN_Gui_CProgress_End(cp);
00639 GWEN_Gui_CProgress_List_Del(cp);
00640 GWEN_Gui_CProgress_free(cp);
00641 return rv;
00642 }
00643 }
00644
00645
00646
00647 int GWEN_Gui_CGui_Print(GWEN_UNUSED GWEN_GUI *gui,
00648 GWEN_UNUSED const char *docTitle,
00649 GWEN_UNUSED const char *docType,
00650 GWEN_UNUSED const char *descr,
00651 GWEN_UNUSED const char *text,
00652 GWEN_UNUSED uint32_t guiid) {
00653 return GWEN_ERROR_NOT_SUPPORTED;
00654 }
00655
00656
00657
00658 int GWEN_Gui_CGui__HashPair(const char *token,
00659 const char *pin,
00660 GWEN_BUFFER *buf) {
00661 GWEN_MDIGEST *md;
00662 int rv;
00663
00664
00665 md=GWEN_MDigest_Md5_new();
00666 rv=GWEN_MDigest_Begin(md);
00667 if (rv==0)
00668 rv=GWEN_MDigest_Update(md, (const uint8_t*)token, strlen(token));
00669 if (rv==0)
00670 rv=GWEN_MDigest_Update(md, (const uint8_t*)pin, strlen(pin));
00671 if (rv==0)
00672 rv=GWEN_MDigest_End(md);
00673 if (rv<0) {
00674 DBG_ERROR(GWEN_LOGDOMAIN, "Hash error (%d)", rv);
00675 GWEN_MDigest_free(md);
00676 return rv;
00677 }
00678
00679 GWEN_Text_ToHexBuffer((const char*)GWEN_MDigest_GetDigestPtr(md),
00680 GWEN_MDigest_GetDigestSize(md),
00681 buf,
00682 0, 0, 0);
00683 GWEN_MDigest_free(md);
00684 return 0;
00685 }
00686
00687
00688
00689 int GWENHYWFAR_CB GWEN_Gui_CGui_CheckCert(GWEN_GUI *gui,
00690 const GWEN_SSLCERTDESCR *cd,
00691 GWEN_SYNCIO *sio, uint32_t guiid) {
00692 GWEN_GUI_CGUI *cgui;
00693 const char *hash;
00694 const char *status;
00695 GWEN_BUFFER *hbuf;
00696 int i;
00697
00698 assert(gui);
00699 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00700 assert(cgui);
00701
00702 hash=GWEN_SslCertDescr_GetFingerPrint(cd);
00703 status=GWEN_SslCertDescr_GetStatusText(cd);
00704
00705 hbuf=GWEN_Buffer_new(0, 64, 0, 1);
00706 GWEN_Gui_CGui__HashPair(hash, status, hbuf);
00707
00708 i=GWEN_DB_GetIntValue(cgui->dbCerts, GWEN_Buffer_GetStart(hbuf), 0, 1);
00709 if (i==0) {
00710 DBG_NOTICE(GWEN_LOGDOMAIN,
00711 "Automatically accepting certificate [%s]",
00712 hash);
00713 GWEN_Buffer_free(hbuf);
00714 return 0;
00715 }
00716
00717 if (GWEN_Gui_GetFlags(gui) & GWEN_GUI_FLAGS_NONINTERACTIVE) {
00718 uint32_t fl;
00719
00720 fl=GWEN_SslCertDescr_GetStatusFlags(cd);
00721 if (fl==GWEN_SSL_CERT_FLAGS_OK && (GWEN_Gui_GetFlags(gui) & GWEN_GUI_FLAGS_ACCEPTVALIDCERTS)) {
00722 DBG_NOTICE(GWEN_LOGDOMAIN,
00723 "Automatically accepting valid new certificate [%s]",
00724 hash);
00725 GWEN_Buffer_free(hbuf);
00726 return 0;
00727 }
00728 else {
00729 DBG_ERROR(GWEN_LOGDOMAIN,
00730 "Automatically rejecting certificate [%s] (noninteractive)",
00731 hash);
00732 GWEN_Buffer_free(hbuf);
00733 return GWEN_ERROR_USER_ABORTED;
00734 }
00735 }
00736
00737 if (cgui->checkCertFn) {
00738 i=cgui->checkCertFn(gui, cd, sio, guiid);
00739 if (i==0) {
00740 GWEN_DB_SetIntValue(cgui->dbCerts, GWEN_DB_FLAGS_OVERWRITE_VARS,
00741 GWEN_Buffer_GetStart(hbuf), i);
00742 }
00743 GWEN_Buffer_free(hbuf);
00744
00745 return i;
00746 }
00747 else {
00748 GWEN_Buffer_free(hbuf);
00749 return GWEN_ERROR_NOT_SUPPORTED;
00750 }
00751 }
00752
00753
00754
00755 int GWENHYWFAR_CB GWEN_Gui_CGui_SetPasswordStatus(GWEN_GUI *gui,
00756 const char *token,
00757 const char *pin,
00758 GWEN_GUI_PASSWORD_STATUS status,
00759 GWEN_UNUSED uint32_t guiid) {
00760 GWEN_GUI_CGUI *cgui;
00761
00762 assert(gui);
00763 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00764 assert(cgui);
00765
00766 if (token==NULL && pin==NULL && status==GWEN_Gui_PasswordStatus_Remove) {
00767 if (cgui->persistentPasswords==0)
00768 GWEN_DB_ClearGroup(cgui->dbPasswords, NULL);
00769 }
00770 else {
00771 GWEN_BUFFER *hbuf;
00772
00773 hbuf=GWEN_Buffer_new(0, 64, 0, 1);
00774 GWEN_Gui_CGui__HashPair(token, pin, hbuf);
00775 if (status==GWEN_Gui_PasswordStatus_Bad)
00776 GWEN_StringList_AppendString(cgui->badPasswords,
00777 GWEN_Buffer_GetStart(hbuf),
00778 0, 1);
00779 else if (status==GWEN_Gui_PasswordStatus_Ok ||
00780 status==GWEN_Gui_PasswordStatus_Remove) {
00781 if (cgui->persistentPasswords==0)
00782 GWEN_StringList_RemoveString(cgui->badPasswords,
00783 GWEN_Buffer_GetStart(hbuf));
00784 }
00785 GWEN_Buffer_free(hbuf);
00786 }
00787
00788 return 0;
00789 }
00790
00791
00792
00793 int GWENHYWFAR_CB GWEN_Gui_CGui_GetPassword(GWEN_GUI *gui,
00794 uint32_t flags,
00795 const char *token,
00796 const char *title,
00797 const char *text,
00798 char *buffer,
00799 int minLen,
00800 int maxLen,
00801 uint32_t guiid) {
00802 GWEN_GUI_CGUI *cgui;
00803
00804 assert(gui);
00805 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00806 assert(cgui);
00807
00808 if (flags & GWEN_GUI_INPUT_FLAGS_TAN) {
00809 return GWEN_Gui_InputBox(flags,
00810 title,
00811 text,
00812 buffer,
00813 minLen,
00814 maxLen,
00815 guiid);
00816 }
00817 else {
00818 GWEN_BUFFER *buf;
00819 int rv;
00820 const char *s;
00821
00822 buf=GWEN_Buffer_new(0, 256, 0, 1);
00823 GWEN_Text_EscapeToBufferTolerant(token, buf);
00824
00825 if (!(flags & GWEN_GUI_INPUT_FLAGS_CONFIRM)) {
00826 s=GWEN_DB_GetCharValue(cgui->dbPasswords,
00827 GWEN_Buffer_GetStart(buf),
00828 0, NULL);
00829 if (s) {
00830 int i;
00831
00832 i=strlen(s);
00833 if (i>=minLen && i < maxLen) {
00834 memmove(buffer, s, i+1);
00835 GWEN_Buffer_free(buf);
00836 return 0;
00837 }
00838 else {
00839 DBG_ERROR(GWEN_LOGDOMAIN, "Stored password [%s] is not within size limits (%d), rejecting.",
00840 GWEN_Buffer_GetStart(buf), i);
00841 }
00842 }
00843 }
00844
00845 if (GWEN_Gui_GetFlags(gui) & GWEN_GUI_FLAGS_NONINTERACTIVE) {
00846 DBG_ERROR(GWEN_LOGDOMAIN,
00847 "Password for [%s] missing in noninteractive mode, "
00848 "aborting", GWEN_Buffer_GetStart(buf));
00849 GWEN_Buffer_free(buf);
00850 return GWEN_ERROR_USER_ABORTED;
00851 }
00852
00853 for (;;) {
00854 rv=GWEN_Gui_InputBox(flags,
00855 title,
00856 text,
00857 buffer,
00858 minLen,
00859 maxLen,
00860 guiid);
00861 if (rv) {
00862 GWEN_Buffer_free(buf);
00863 return rv;
00864 }
00865 else {
00866 GWEN_BUFFER *hbuf;
00867 int isBad=0;
00868
00869 hbuf=GWEN_Buffer_new(0, 64, 0, 1);
00870 GWEN_Gui_CGui__HashPair(token, buffer, hbuf);
00871 isBad=GWEN_StringList_HasString(cgui->badPasswords,
00872 GWEN_Buffer_GetStart(hbuf));
00873 if (!isBad) {
00874 GWEN_Buffer_free(hbuf);
00875 break;
00876 }
00877 rv=GWEN_Gui_MessageBox(GWEN_GUI_MSG_FLAGS_TYPE_ERROR |
00878 GWEN_GUI_MSG_FLAGS_CONFIRM_B1 |
00879 GWEN_GUI_MSG_FLAGS_SEVERITY_DANGEROUS,
00880 I18N("Enforce PIN"),
00881 I18N(
00882 "You entered the same PIN twice.\n"
00883 "The PIN is marked as bad, do you want\n"
00884 "to use it anyway?"
00885 "<html>"
00886 "<p>"
00887 "You entered the same PIN twice."
00888 "</p>"
00889 "<p>"
00890 "The PIN is marked as <b>bad</b>, "
00891 "do you want to use it anyway?"
00892 "</p>"
00893 "</html>"),
00894 I18N("Use my input"),
00895 I18N("Re-enter"),
00896 0,
00897 guiid);
00898 if (rv==1) {
00899
00900 GWEN_StringList_RemoveString(cgui->badPasswords,
00901 GWEN_Buffer_GetStart(hbuf));
00902 GWEN_Buffer_free(hbuf);
00903 break;
00904 }
00905 GWEN_Buffer_free(hbuf);
00906 }
00907 }
00908
00909 GWEN_DB_SetCharValue(cgui->dbPasswords, GWEN_DB_FLAGS_OVERWRITE_VARS,
00910 GWEN_Buffer_GetStart(buf), buffer);
00911 GWEN_Buffer_free(buf);
00912 return 0;
00913 }
00914 }
00915
00916
00917
00918 void GWEN_Gui_CGui_SetPasswordDb(GWEN_GUI *gui,
00919 GWEN_DB_NODE *dbPasswords,
00920 int persistent) {
00921 GWEN_GUI_CGUI *cgui;
00922
00923 assert(gui);
00924 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00925 assert(cgui);
00926
00927 GWEN_DB_Group_free(cgui->dbPasswords);
00928 cgui->dbPasswords=dbPasswords;
00929 cgui->persistentPasswords=persistent;
00930 }
00931
00932
00933
00934 GWEN_DB_NODE *GWEN_Gui_CGui_GetPasswordDb(const GWEN_GUI *gui) {
00935 GWEN_GUI_CGUI *cgui;
00936
00937 assert(gui);
00938 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00939 assert(cgui);
00940
00941 return cgui->dbPasswords;
00942 }
00943
00944
00945
00946 void GWEN_Gui_CGui_SetCertDb(GWEN_GUI *gui, GWEN_DB_NODE *dbCerts) {
00947 GWEN_GUI_CGUI *cgui;
00948
00949 assert(gui);
00950 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00951 assert(cgui);
00952
00953 GWEN_DB_Group_free(cgui->dbCerts);
00954 cgui->dbCerts=dbCerts;
00955 }
00956
00957
00958
00959 GWEN_DB_NODE *GWEN_Gui_CGui_GetCertDb(const GWEN_GUI *gui) {
00960 GWEN_GUI_CGUI *cgui;
00961
00962 assert(gui);
00963 cgui=GWEN_INHERIT_GETDATA(GWEN_GUI, GWEN_GUI_CGUI, gui);
00964 assert(cgui);
00965
00966 return cgui->dbCerts;
00967 }
00968
00969