gwenhywfar  4.99.8beta
gui.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Fri Feb 07 2003
3  copyright : (C) 2003-2010 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * *
8  * This library is free software; you can redistribute it and/or *
9  * modify it under the terms of the GNU Lesser General Public *
10  * License as published by the Free Software Foundation; either *
11  * version 2.1 of the License, or (at your option) any later version. *
12  * *
13  * This library is distributed in the hope that it will be useful, *
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
16  * Lesser General Public License for more details. *
17  * *
18  * You should have received a copy of the GNU Lesser General Public *
19  * License along with this library; if not, write to the Free Software *
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21  * MA 02111-1307 USA *
22  * *
23  ***************************************************************************/
24 
25 
26 #ifdef HAVE_CONFIG_H
27 # include <config.h>
28 #endif
29 
30 #define DISABLE_DEBUGLOG
31 
32 
33 #ifndef ICONV_CONST
34 # define ICONV_CONST
35 #endif
36 
37 
38 #include "gui_p.h"
39 #include "dlg_input_l.h"
40 #include "dlg_message_l.h"
41 #include "dlg_progress_l.h"
42 #include "dlg_showbox_l.h"
43 #include "i18n_l.h"
44 
45 #include <gwenhywfar/debug.h>
46 #include <gwenhywfar/dialog_be.h>
47 #include <gwenhywfar/mdigest.h>
48 #include <gwenhywfar/text.h>
49 #include <gwenhywfar/url.h>
50 #include <gwenhywfar/syncio_socket.h>
51 #include <gwenhywfar/syncio_buffered.h>
52 #include <gwenhywfar/syncio_tls.h>
53 #include <gwenhywfar/syncio_http.h>
54 
55 #include <stdarg.h>
56 #include <string.h>
57 #include <errno.h>
58 #include <ctype.h>
59 
60 #if defined (HAVE_LANGINFO_H)
61 # include <langinfo.h>
62 #elif defined (HAVE_LOCALCHARSET_H)
63 # include <localcharset.h>
64 #endif
65 #ifdef HAVE_ICONV_H
66 # include <iconv.h>
67 #endif
68 
69 
70 
72 
73 
75 
76 
77 
79  GWEN_GUI *gui;
80 
83  gui->refCount=1;
84 
85  gui->checkCertFn=GWEN_Gui_CheckCertBuiltIn;
86  gui->getSyncIoFn=GWEN_Gui_Internal_GetSyncIo;
87 
88  gui->getPasswordFn=GWEN_Gui_Internal_GetPassword;
89  gui->setPasswordStatusFn=GWEN_Gui_Internal_SetPasswordStatus;
90 
91  gui->progressDataTree=GWEN_ProgressData_Tree_new();
92  gui->activeDialogs=GWEN_Dialog_List_new();
93  GWEN_Gui_SetCharSet(gui, "");
94 
95  gui->dbPasswords=GWEN_DB_Group_new("passwords");
96  gui->badPasswords=GWEN_StringList_new();
97 
98  gui->minProgressLogLevel=GWEN_LoggerLevel_Info;
99 
100  return gui;
101 }
102 
103 
104 
106  if (gui) {
107  assert(gui->refCount);
108  if ((--gui->refCount)==0) {
110 
111  GWEN_Dialog_List_free(gui->activeDialogs);
112  GWEN_ProgressData_Tree_free(gui->progressDataTree);
113  free(gui->name);
114  free(gui->charSet);
115 
116  GWEN_DB_Group_free(gui->dbPasswords);
117  if (gui->passwdStore)
118  GWEN_PasswordStore_free(gui->passwdStore);
119  GWEN_StringList_free(gui->badPasswords);
120 
121  GWEN_FREE_OBJECT(gui);
122  }
123  }
124 }
125 
126 
127 
129  assert(gui);
130  DBG_INFO(GWEN_LOGDOMAIN, "Using own callbacks in gui %p", gui);
131  gui->progressStartFn=GWEN_Gui_Internal_ProgressStart;
132  gui->progressAdvanceFn=GWEN_Gui_Internal_ProgressAdvance;
133  gui->progressSetTotalFn=GWEN_Gui_Internal_ProgressSetTotal;
134  gui->progressLogFn=GWEN_Gui_Internal_ProgressLog;
135  gui->progressEndFn=GWEN_Gui_Internal_ProgressEnd;
136  gui->inputBoxFn=GWEN_Gui_Internal_InputBox;
137  gui->messageBoxFn=GWEN_Gui_Internal_MessageBox;
138  gui->showBoxFn=GWEN_Gui_Internal_ShowBox;
139  gui->hideBoxFn=GWEN_Gui_Internal_HideBox;
140 }
141 
142 
143 
145  assert(gui);
146  assert(gui->refCount);
147  gui->refCount++;
148 }
149 
150 
151 
153  if (gui)
154  GWEN_Gui_Attach(gui);
155  if (gwenhywfar_gui)
157  gwenhywfar_gui=gui;
158 }
159 
160 
161 
163  return gwenhywfar_gui;
164 }
165 
166 
167 
168 int GWEN_Gui_ConvertString(const char *text, size_t len, GWEN_BUFFER *tbuf,
169  const char *fromCs, const char *toCs) {
170 #ifdef HAVE_ICONV
171  int rv=0;
172  iconv_t ic;
173 
174  assert(tbuf);
175 
176  ic=iconv_open(toCs, fromCs);
177  if (ic==(iconv_t)-1) {
178  DBG_ERROR(GWEN_LOGDOMAIN, "Cannot convert from \"%s\" to \"%s\", %s",
179  fromCs, toCs, strerror(errno));
181  }
182  else {
183  /* Some systems have iconv in libc, some have it in libiconv
184  (OSF/1 and those with the standalone portable GNU libiconv
185  installed). Check which one is available. The define
186  ICONV_CONST will be "" or "const" accordingly. */
187  ICONV_CONST char *pInbuf;
188  char *pOutbuf;
189  size_t inLeft;
190  size_t outLeft;
191  size_t done;
192  size_t space;
193 
194  /* convert */
195  pInbuf=(char*)text;
196  inLeft=len;
198  space=outLeft;
199 retry:
200  pOutbuf=GWEN_Buffer_GetPosPointer(tbuf);
201  done=iconv(ic, &pInbuf, &inLeft, &pOutbuf, &outLeft);
202  GWEN_Buffer_SetPos(tbuf, space-outLeft);
204  if (done==(size_t)-1) {
205  if (errno==E2BIG) {
206  uint32_t room;
207 
208  room=2*inLeft;
209  if (room<=outLeft)
210  room+=outLeft;
211  GWEN_Buffer_AllocRoom(tbuf, room);
212  /* How much additional room has actually been allocated? */
213  room=GWEN_Buffer_GetMaxUnsegmentedWrite(tbuf)-outLeft;
214  outLeft+=room;
215  space+=room;
216  goto retry;
217  }
218 
219  DBG_ERROR(GWEN_LOGDOMAIN, "Error in conversion: %s (%d)",
220  strerror(errno), errno);
222  }
223  else {
224  DBG_DEBUG(GWEN_LOGDOMAIN, "Conversion done.");
225  }
226  iconv_close(ic);
227  }
228 
229  return rv;
230 #else /* !HAVE_ICONV */
231  return GWEN_Buffer_AppendBytes(tbuf, text, len);
232 #endif
233 }
234 
235 
236 
237 int GWEN_Gui_ConvertFromUtf8(const GWEN_GUI *gui, const char *text, int len, GWEN_BUFFER *tbuf) {
238  int rv;
239 
240  rv=GWEN_Gui_ConvertString(text, len, tbuf, "UTF-8", gui->charSet);
241  if (rv<0) {
242  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
243  return rv;
244  }
245 
246  return 0;
247 }
248 
249 
250 
251 int GWEN_Gui_StdPrintf(const GWEN_GUI *gui, FILE *stream,
252  const char *fmt, ...) {
253  va_list args;
254  int rv;
255 
256  assert(gui);
257 
258  va_start(args, fmt);
259 #ifndef HAVE_ICONV
260  rv=vfprintf(stream, fmt, args);
261 #else
262  if (!gui->charSet)
263  rv=vfprintf(stderr, fmt, args);
264  else {
265  GWEN_BUFFER *tbuf;
266  GWEN_BUFFER *outbuf;
267  size_t space;
268 
269  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
270  space=vsnprintf(GWEN_Buffer_GetStart(tbuf), 256, fmt, args);
271  if (space>=256) {
272  GWEN_Buffer_AllocRoom(tbuf, space);
273  va_end(args);
274  va_start(args, fmt);
275  vsprintf(GWEN_Buffer_GetStart(tbuf), fmt, args);
276  }
277  GWEN_Buffer_IncrementPos(tbuf, space);
279 
280  outbuf=GWEN_Buffer_new(0, 2*space, 0, 1);
282  outbuf, "UTF-8", gui->charSet);
283  if (rv) {
284  GWEN_Buffer_free(outbuf);
285  outbuf=tbuf;
286  }
287  else
288  GWEN_Buffer_free(tbuf);
289 
290  /* let's try to return the same value as fprintf() would */
291  if (fputs(GWEN_Buffer_GetStart(outbuf), stderr)!=EOF)
292  rv=space;
293  else
294  rv=EOF;
295 
296  GWEN_Buffer_free(outbuf);
297  }
298 #endif
299 
300  va_end(args);
301  return rv;
302 }
303 
304 
305 
306 int GWEN_Gui_ReadString(const char *text, GWEN_BUFFER *tbuf) {
307 #ifdef HAVE_ICONV
308  if (gwenhywfar_gui) {
309  const char *fromCs;
310 
311  if (gwenhywfar_gui->charSet)
312  fromCs=gwenhywfar_gui->charSet;
313  else
314  /* UTF-8 to UTF-8 conversion does not seem to make much sense, but
315  * it is a convenient way to check whether the input text actually
316  * is properly UTF-8 encoded.
317  */
318  fromCs="UTF-8";
319 
320  return GWEN_Gui_ConvertString(text, strlen(text), tbuf, fromCs, "UTF-8");
321  }
322  else
323 #endif /* HAVE_ICONV */
324  return GWEN_Buffer_AppendString(tbuf, text);
325 }
326 
327 
328 
329 void GWEN_Gui_GetRawText(const GWEN_GUI *gui, const char *text, GWEN_BUFFER *tbuf) {
330  size_t len;
331  const char *p;
332 
333  assert(text);
334  p=text;
335  while ((p=strchr(p, '<'))) {
336  const char *t;
337 
338  t=p;
339  t++;
340  if (toupper(*t)=='H') {
341  t++;
342  if (toupper(*t)=='T') {
343  t++;
344  if (toupper(*t)=='M') {
345  t++;
346  if (toupper(*t)=='L') {
347  break;
348  }
349  }
350  }
351  }
352  p++;
353  } /* while */
354 
355  if (p)
356  len=p-text;
357  else
358  len=strlen(text);
359  GWEN_Buffer_AppendBytes(tbuf, text, len);
360 }
361 
362 
363 
367 
368  assert(gui);
369  of=gui->messageBoxFn;
370  gui->messageBoxFn=f;
371  return of;
372 }
373 
374 
375 
379 
380  assert(gui);
381  of=gui->inputBoxFn;
382  gui->inputBoxFn=f;
383  return of;
384 }
385 
386 
387 
391 
392  assert(gui);
393  of=gui->showBoxFn;
394  gui->showBoxFn=f;
395  return of;
396 }
397 
398 
399 
403 
404  assert(gui);
405  of=gui->hideBoxFn;
406  gui->hideBoxFn=f;
407  return of;
408 }
409 
410 
411 
415 
416  assert(gui);
417  of=gui->progressStartFn;
418  gui->progressStartFn=f;
419  return of;
420 }
421 
422 
423 
427 
428  assert(gui);
429  of=gui->progressAdvanceFn;
430  gui->progressAdvanceFn=f;
431  return of;
432 }
433 
434 
435 
439 
440  assert(gui);
441  of=gui->progressSetTotalFn;
442  gui->progressSetTotalFn=f;
443  return of;
444 }
445 
446 
447 
451 
452  assert(gui);
453  of=gui->progressLogFn;
454  gui->progressLogFn=f;
455  return of;
456 }
457 
458 
459 
463 
464  assert(gui);
465  of=gui->progressEndFn;
466  gui->progressEndFn=f;
467  return of;
468 }
469 
470 
471 
473  GWEN_GUI_PRINT_FN f) {
475 
476  assert(gui);
477  of=gui->printFn;
478  gui->printFn=f;
479  return of;
480 }
481 
482 
483 
487 
488  assert(gui);
489  of=gui->getPasswordFn;
490  gui->getPasswordFn=f;
491  return of;
492 }
493 
494 
495 
500 
501  assert(gui);
502  of=gui->setPasswordStatusFn;
503  gui->setPasswordStatusFn=f;
504  return of;
505 }
506 
507 
508 
512 
513  assert(gui);
514  of=gui->logHookFn;
515  gui->logHookFn=f;
516 
517  return of;
518 }
519 
520 
521 
525 
526  assert(gui);
527  of=gui->waitForSocketsFn;
528  gui->waitForSocketsFn=f;
529 
530  return of;
531 }
532 
533 
534 
537 
538  assert(gui);
539  of=gui->checkCertFn;
540  gui->checkCertFn=f;
541 
542  return of;
543 }
544 
545 
546 
549 
550  assert(gui);
551  of=gui->execDialogFn;
552  gui->execDialogFn=f;
553 
554  return of;
555 }
556 
557 
558 
561 
562  assert(gui);
563  of=gui->openDialogFn;
564  gui->openDialogFn=f;
565 
566  return of;
567 }
568 
569 
570 
573 
574  assert(gui);
575  of=gui->closeDialogFn;
576  gui->closeDialogFn=f;
577 
578  return of;
579 }
580 
581 
582 
585 
586  assert(gui);
587  of=gui->runDialogFn;
588  gui->runDialogFn=f;
589 
590  return of;
591 }
592 
593 
594 
598 
599  assert(gui);
600  of=gui->readDialogPrefsFn;
601  gui->readDialogPrefsFn=f;
602 
603  return of;
604 }
605 
606 
607 
611 
612  assert(gui);
613  of=gui->writeDialogPrefsFn;
614  gui->writeDialogPrefsFn=f;
615 
616  return of;
617 }
618 
619 
620 
623 
624  assert(gui);
625  of=gui->getFileNameFn;
626  gui->getFileNameFn=f;
627 
628  return of;
629 }
630 
631 
632 
635 
636  assert(gui);
637  of=gui->getSyncIoFn;
638  gui->getSyncIoFn=f;
639 
640  return of;
641 }
642 
643 
644 
649 
650  assert(gui);
651  of=gui->keyDataFromTextOpenSslFn;
652  gui->keyDataFromTextOpenSslFn=f;
653 
654  return of;
655 
656 }
657 
658 
659 
660 uint32_t GWEN_Gui_GetFlags(const GWEN_GUI *gui) {
661  assert(gui);
662  return gui->flags;
663 }
664 
665 
666 
667 void GWEN_Gui_SetFlags(GWEN_GUI *gui, uint32_t fl) {
668  assert(gui);
669  gui->flags=fl;
670 }
671 
672 
673 
674 void GWEN_Gui_AddFlags(GWEN_GUI *gui, uint32_t fl) {
675  assert(gui);
676  gui->flags|=fl;
677 }
678 
679 
680 
681 void GWEN_Gui_SubFlags(GWEN_GUI *gui, uint32_t fl) {
682  assert(gui);
683  gui->flags&=~fl;
684 }
685 
686 
687 
688 void GWEN_Gui_SetName(GWEN_GUI *gui, const char *name) {
689  free(gui->name);
690  if (name) gui->name=strdup(name);
691  else gui->name=NULL;
692 }
693 
694 
695 
696 const char *GWEN_Gui_GetName(void) {
697  if (gwenhywfar_gui)
698  return gwenhywfar_gui->name;
699  return NULL;
700 }
701 
702 
703 
704 const char *GWEN_Gui_GetCharSet(const GWEN_GUI *gui) {
705  if (gui)
706  return gui->charSet;
707  return NULL;
708 }
709 
710 
711 
712 void GWEN_Gui_SetCharSet(GWEN_GUI *gui, const char *s) {
713  const char *cs;
714 
715  assert(gui);
716 
717  if (s) {
718  if (!*s) {
719  /* determine charset according to current locale */
720 #if defined(HAVE_LANGINFO_H)
721  cs=nl_langinfo(CODESET);
722 #elif defined(HAVE_LOCALCHARSET_H)
723  cs=locale_charset();
724 #else
725  /* just pass "" on to libiconv and hope for the best */
726  cs=s;
727 #endif
728  }
729  else
730  cs=s;
731 
732  if (strcasecmp(cs, "UTF-8")==0)
733  cs=NULL;
734  }
735  else
736  cs=s;
737 
738 #ifndef HAVE_ICONV
739  if (cs) {
741  "Missing iconv, cannot convert between UTF-8 and \"%s\"", cs);
742  }
743 #else
744  if (cs) {
745  iconv_t ic;
746  size_t len;
747  char *p;
748 
749  /* Let iconv apply transliteration where necessary */
750  len=strlen(cs);
751  p=(char *)malloc(len+11);
752  assert(p);
753  sprintf(p, "%s//TRANSLIT", cs);
754  ic=iconv_open(p, "UTF-8");
755  if (ic==(iconv_t)-1) {
757  "Charset conversion from \"UTF-8\" to \"%s\" failed: %s (%d)",
758  p, strerror(errno), errno);
759  free(p);
760  return;
761  }
762  iconv_close(ic);
763  cs=p;
764  }
765 
766  if (gui->charSet)
767  free(gui->charSet);
768  gui->charSet=(char *)cs;
769 #endif
770 }
771 
772 
773 
775  if (gui)
776  return gui->passwdStore;
777  return NULL;
778 }
779 
780 
781 
783  if (gui) {
784  if (gui->passwdStore && gui->passwdStore!=sto)
785  GWEN_PasswordStore_free(gui->passwdStore);
786  gui->passwdStore=sto;
787  if (sto)
788  gui->flags|=GWEN_GUI_FLAGS_PERMPASSWORDS;
789  else
790  gui->flags&=~GWEN_GUI_FLAGS_PERMPASSWORDS;
791  }
792 }
793 
794 
795 
797  GWEN_DB_NODE *dbPasswords,
798  int persistent) {
799  GWEN_DB_Group_free(gui->dbPasswords);
800  gui->dbPasswords=dbPasswords;
801  gui->persistentPasswords=persistent;
802 }
803 
804 
805 
807  return gui->dbPasswords;
808 }
809 
810 
811 
812 
813 
814 
815 
816 
817 
818 
819 
820 
821 int GWEN_Gui_MessageBox(uint32_t flags,
822  const char *title,
823  const char *text,
824  const char *b1,
825  const char *b2,
826  const char *b3,
827  uint32_t guiid) {
828  if (gwenhywfar_gui && gwenhywfar_gui->messageBoxFn)
829  return gwenhywfar_gui->messageBoxFn(gwenhywfar_gui,
830  flags,
831  title,
832  text,
833  b1, b2, b3, guiid);
835 }
836 
837 
838 
839 void GWEN_Gui_ShowError(const char *title, const char *fmt, ...) {
840  va_list list;
841  char msgbuffer[2048];
842  int rv;
843 
844  /* prepare list for va_arg */
845  va_start(list, fmt);
846  rv=vsnprintf(msgbuffer, sizeof(msgbuffer), fmt, list);
847  if (rv<0 || rv>=(int)(sizeof(msgbuffer))) {
848  DBG_WARN(GWEN_LOGDOMAIN, "Internal buffer too small for message, truncating (%d>%d)",
849  rv, (int)(sizeof(msgbuffer)));
850  }
851 
855  title,
856  msgbuffer,
857  I18N("Dismiss"), NULL, NULL, 0);
858 }
859 
860 
861 
862 int GWEN_Gui_InputBox(uint32_t flags,
863  const char *title,
864  const char *text,
865  char *buffer,
866  int minLen,
867  int maxLen,
868  uint32_t guiid) {
869  if (gwenhywfar_gui && gwenhywfar_gui->inputBoxFn)
870  return gwenhywfar_gui->inputBoxFn(gwenhywfar_gui,
871  flags,
872  title,
873  text,
874  buffer,
875  minLen, maxLen, guiid);
877 }
878 
879 
880 
881 uint32_t GWEN_Gui_ShowBox(uint32_t flags,
882  const char *title,
883  const char *text,
884  uint32_t guiid) {
885  if (gwenhywfar_gui && gwenhywfar_gui->showBoxFn)
886  return gwenhywfar_gui->showBoxFn(gwenhywfar_gui,
887  flags,
888  title,
889  text,
890  guiid);
891  return 0;
892 }
893 
894 
895 
896 void GWEN_Gui_HideBox(uint32_t id) {
897  if (gwenhywfar_gui && gwenhywfar_gui->hideBoxFn)
898  return gwenhywfar_gui->hideBoxFn(gwenhywfar_gui, id);
899 }
900 
901 
902 
903 uint32_t GWEN_Gui_ProgressStart(uint32_t progressFlags,
904  const char *title,
905  const char *text,
906  uint64_t total,
907  uint32_t guiid) {
908  if (gwenhywfar_gui && gwenhywfar_gui->progressStartFn)
909  return gwenhywfar_gui->progressStartFn(gwenhywfar_gui,
910  progressFlags,
911  title,
912  text,
913  total,
914  guiid);
915  return 0;
916 }
917 
918 
919 
920 int GWEN_Gui_ProgressAdvance(uint32_t id, uint32_t progress) {
921  if (gwenhywfar_gui && gwenhywfar_gui->progressAdvanceFn)
922  return gwenhywfar_gui->progressAdvanceFn(gwenhywfar_gui,
923  id,
924  progress);
925  return 0;
926 }
927 
928 
929 
930 int GWEN_Gui_ProgressSetTotal(uint32_t id, uint64_t total) {
931  if (gwenhywfar_gui && gwenhywfar_gui->progressSetTotalFn)
932  return gwenhywfar_gui->progressSetTotalFn(gwenhywfar_gui,
933  id,
934  total);
935  return 0;
936 }
937 
938 
939 
940 int GWEN_Gui_ProgressLog(uint32_t id,
941  GWEN_LOGGER_LEVEL level,
942  const char *text) {
943  if (gwenhywfar_gui && gwenhywfar_gui->progressLogFn)
944  return gwenhywfar_gui->progressLogFn(gwenhywfar_gui,
945  id, level, text);
946  return 0;
947 }
948 
949 
950 
951 int GWEN_Gui_ProgressLog2(uint32_t id,
952  GWEN_LOGGER_LEVEL level,
953  const char *fmt, ...) {
954  va_list list;
955  char msgbuffer[2048];
956  int rv;
957 
958  /* prepare list for va_arg */
959  va_start(list, fmt);
960  rv=vsnprintf(msgbuffer, sizeof(msgbuffer), fmt, list);
961  if (rv<0 || rv>=(int)(sizeof(msgbuffer))) {
962  DBG_WARN(GWEN_LOGDOMAIN, "Internal buffer too small for message, truncating (%d>%d)",
963  rv, (int)(sizeof(msgbuffer)));
964  }
965 
966  return GWEN_Gui_ProgressLog(id, level, msgbuffer);
967 }
968 
969 
970 
971 int GWEN_Gui_ProgressEnd(uint32_t id) {
972  if (gwenhywfar_gui && gwenhywfar_gui->progressEndFn)
973  return gwenhywfar_gui->progressEndFn(gwenhywfar_gui, id);
975 }
976 
977 
978 
979 int GWEN_Gui_Print(const char *docTitle,
980  const char *docType,
981  const char *descr,
982  const char *text,
983  uint32_t guiid) {
984  if (gwenhywfar_gui && gwenhywfar_gui->printFn)
985  return gwenhywfar_gui->printFn(gwenhywfar_gui,
986  docTitle,
987  docType,
988  descr,
989  text,
990  guiid);
992 }
993 
994 
995 
996 int GWEN_Gui_GetPassword(uint32_t flags,
997  const char *token,
998  const char *title,
999  const char *text,
1000  char *buffer,
1001  int minLen,
1002  int maxLen,
1003  GWEN_GUI_PASSWORD_METHOD methodId,
1004  GWEN_DB_NODE *methodParams,
1005  uint32_t guiid) {
1006  if (gwenhywfar_gui) {
1007  if (gwenhywfar_gui->getPasswordFn)
1008  return gwenhywfar_gui->getPasswordFn(gwenhywfar_gui,
1009  flags,
1010  token,
1011  title,
1012  text,
1013  buffer,
1014  minLen,
1015  maxLen,
1016  methodId,
1017  methodParams,
1018  guiid);
1019  else if (gwenhywfar_gui->inputBoxFn)
1020  return gwenhywfar_gui->inputBoxFn(gwenhywfar_gui,
1021  flags,
1022  title,
1023  text,
1024  buffer,
1025  minLen,
1026  maxLen,
1027  guiid);
1028  }
1030 }
1031 
1032 
1033 
1034 int GWEN_Gui_SetPasswordStatus(const char *token,
1035  const char *pin,
1036  GWEN_GUI_PASSWORD_STATUS status,
1037  uint32_t guiid) {
1038  if (gwenhywfar_gui && gwenhywfar_gui->setPasswordStatusFn)
1039  return gwenhywfar_gui->setPasswordStatusFn(gwenhywfar_gui,
1040  token, pin, status, guiid);
1042 }
1043 
1044 
1045 
1046 int GWEN_Gui_LogHook(const char *logDomain,
1047  GWEN_LOGGER_LEVEL priority, const char *s) {
1048  if (gwenhywfar_gui && gwenhywfar_gui->logHookFn) {
1049  if (priority>=GWEN_LoggerLevel_Debug &&
1050  logDomain &&
1051  strcasecmp(logDomain, "gwenhywfar")==0)
1052  /* don't send possibly sensitive data to the log function because
1053  * some application tend to store the messages indiscriminately.
1054  * In some cases sensitive information can be send to this function
1055  * which we don't want the application to store */
1056  return 0;
1057  else {
1058  int rv;
1059 
1060  if (gwenhywfar_gui->inLogHook==0) {
1061  /* otherwise the log message seems to be uncritical, convey it */
1062  gwenhywfar_gui->inLogHook++;
1063  rv=gwenhywfar_gui->logHookFn(gwenhywfar_gui, logDomain, priority, s);
1064  gwenhywfar_gui->inLogHook--;
1065  return rv;
1066  }
1067  else
1068  /* loghook recursion, don't convey */
1069  return 0;
1070  }
1071  }
1072  else
1073  /* handle as usual */
1074  return 0;
1075 }
1076 
1077 
1078 
1080  GWEN_SOCKET_LIST2 *writeSockets,
1081  uint32_t guiid,
1082  int msecs) {
1083  if (gwenhywfar_gui && gwenhywfar_gui->waitForSocketsFn)
1084  return gwenhywfar_gui->waitForSocketsFn(gwenhywfar_gui, readSockets, writeSockets, guiid, msecs);
1085  else {
1086  uint32_t pid;
1087  time_t t0;
1088  int wt;
1089  int dist;
1090 
1091  t0=time(0);
1092  if (msecs==GWEN_TIMEOUT_NONE) {
1093  wt=0;
1094  dist=0;
1095  }
1096  else if (msecs==GWEN_TIMEOUT_FOREVER) {
1097  wt=0;
1098  dist=500;
1099  }
1100  else {
1101  wt=msecs/1000;
1102  dist=500;
1103  }
1104 
1109  I18N("Waiting for Data"),
1110  "Waiting for data to become available",
1111  wt,
1112  0);
1113  while(1) {
1114  GWEN_SOCKETSET *rset;
1115  GWEN_SOCKETSET *wset;
1117 
1118  rset=GWEN_SocketSet_new();
1119  wset=GWEN_SocketSet_new();
1120 
1121  /* fill read socket set */
1122  if (readSockets) {
1123  sit=GWEN_Socket_List2_First(readSockets);
1124  if (sit) {
1125  GWEN_SOCKET *s;
1126 
1128  assert(s);
1129 
1130  while(s) {
1131  GWEN_SocketSet_AddSocket(rset, s);
1133  }
1135  }
1136  }
1137 
1138  /* fill write socket set */
1139  if (writeSockets) {
1140  sit=GWEN_Socket_List2_First(writeSockets);
1141  if (sit) {
1142  GWEN_SOCKET *s;
1143 
1145  assert(s);
1146 
1147  while(s) {
1148  GWEN_SocketSet_AddSocket(wset, s);
1150  }
1152  }
1153  }
1154 
1155  if (GWEN_SocketSet_GetSocketCount(rset)==0 &&
1156  GWEN_SocketSet_GetSocketCount(wset)==0) {
1157  /* no sockets to wait for, sleep for a few ms to keep cpu load down */
1158  GWEN_SocketSet_free(wset);
1159  GWEN_SocketSet_free(rset);
1160 
1161  if (msecs) {
1162  /* only sleep if a timeout was given */
1163  DBG_DEBUG(GWEN_LOGDOMAIN, "Sleeping (no socket)");
1165  }
1166  GWEN_Gui_ProgressEnd(pid);
1167  return GWEN_ERROR_TIMEOUT;
1168  }
1169  else {
1170  int rv;
1171  int v=0;
1172 
1173  rv=GWEN_Socket_Select(rset, wset, NULL, dist);
1174  GWEN_SocketSet_free(wset);
1175  GWEN_SocketSet_free(rset);
1176 
1177  if (rv!=GWEN_ERROR_TIMEOUT) {
1178  GWEN_Gui_ProgressEnd(pid);
1179  return rv;
1180  }
1181 
1182  if (wt) {
1183  time_t t1;
1184 
1185  t1=time(0);
1186  v=(int) difftime(t1, t0);
1187  if (v>wt) {
1188  GWEN_Gui_ProgressEnd(pid);
1189  return GWEN_ERROR_TIMEOUT;
1190  }
1191  }
1192  rv=GWEN_Gui_ProgressAdvance(pid, v);
1193  if (rv==GWEN_ERROR_USER_ABORTED) {
1194  GWEN_Gui_ProgressEnd(pid);
1195  return rv;
1196  }
1197  }
1198  } /* loop */
1199  }
1200 }
1201 
1202 
1203 
1204 int GWEN_Gui_CheckCert(const GWEN_SSLCERTDESCR *cd, GWEN_SYNCIO *sio, uint32_t guiid) {
1205  if (gwenhywfar_gui && gwenhywfar_gui->checkCertFn)
1206  return gwenhywfar_gui->checkCertFn(gwenhywfar_gui, cd, sio, guiid);
1207  else
1209 }
1210 
1211 
1212 
1214  const GWEN_SSLCERTDESCR *cd,
1215  GWEN_UNUSED GWEN_SYNCIO *sio, uint32_t guiid) {
1216  int rv;
1217  int isError;
1218  const char *hashMd5;
1219  const char *hashSha1;
1220  const char *hashSha512;
1221  const char *status;
1222  //const char *ipAddr;
1223  const char *statusOn;
1224  const char *statusOff;
1225  char varName[128];
1226  char dbuffer1[32];
1227  char dbuffer2[32];
1228  char buffer[8192];
1229  const GWEN_TIME *ti;
1230  const char *unknown;
1231  const char *commonName;
1232  const char *organizationName;
1233  const char *organizationalUnitName;
1234  const char *countryName;
1235  const char *localityName;
1236  const char *stateOrProvinceName;
1237 
1238  char *msg=I18S(
1239  "The following certificate has been received:\n"
1240  "Name : %s\n"
1241  "Organisation : %s\n"
1242  "Department : %s\n"
1243  "Country : %s\n"
1244  "City : %s\n"
1245  "State : %s\n"
1246  "Valid after : %s\n"
1247  "Valid until : %s\n"
1248  "Hash (MD5) : %s\n"
1249  "Hash (SHA1) : %s\n"
1250  "Hash (SHA512): %s\n"
1251  "Status : %s\n"
1252  "Do you wish to accept this certificate?"
1253 
1254  "<html>"
1255  " <p>"
1256  " The following certificate has been received:"
1257  " </p>"
1258  " <table>"
1259  " <tr><td>Name</td><td>%s</td></tr>"
1260  " <tr><td>Organisation</td><td>%s</td></tr>"
1261  " <tr><td>Department</td><td>%s</td></tr>"
1262  " <tr><td>Country</td><td>%s</td></tr>"
1263  " <tr><td>City</td><td>%s</td></tr>"
1264  " <tr><td>State</td><td>%s</td></tr>"
1265  " <tr><td>Valid after</td><td>%s</td></tr>"
1266  " <tr><td>Valid until</td><td>%s</td></tr>"
1267  " <tr><td>Hash (MD5)</td><td>%s</td></tr>"
1268  " <tr><td>Hash (SHA1)</td><td>%s</td></tr>"
1269  " <tr><td>Hash (SHA512)</td><td>%s</td></tr>"
1270  " <tr><td>Status</td><td>%s%s%s</td></tr>"
1271  " </table>"
1272  " <p>"
1273  " Do you wish to accept this certificate?"
1274  " </p>"
1275  "</html>"
1276  );
1277 
1278  memset(dbuffer1, 0, sizeof(dbuffer1));
1279  memset(dbuffer2, 0, sizeof(dbuffer2));
1280  memset(varName, 0, sizeof(varName));
1281 
1282  isError=GWEN_SslCertDescr_GetIsError(cd);
1283 
1288  //ipAddr=GWEN_SslCertDescr_GetIpAddress(cd);
1289 
1291  if (ti) {
1292  GWEN_BUFFER *tbuf;
1293 
1294  tbuf=GWEN_Buffer_new(0, 32, 0, 1);
1295  /* TRANSLATORS: This string is used as a template string to
1296  convert a given time into your local translated timeformat. The
1297  following characters are accepted in the template string: Y -
1298  digit of the year, M - digit of the month, D - digit of the day
1299  of month, h - digit of the hour, m - digit of the minute, s-
1300  digit of the second. All other characters are left unchanged. */
1301  if (GWEN_Time_toString(ti, I18N("YYYY/MM/DD hh:mm:ss"), tbuf)) {
1303  "Could not convert beforeDate to string");
1304  abort();
1305  }
1306  strncpy(dbuffer1, GWEN_Buffer_GetStart(tbuf), sizeof(dbuffer1)-1);
1307  GWEN_Buffer_free(tbuf);
1308  }
1309 
1311  if (ti) {
1312  GWEN_BUFFER *tbuf;
1313 
1314  tbuf=GWEN_Buffer_new(0, 32, 0, 1);
1315  if (GWEN_Time_toString(ti, I18N("YYYY/MM/DD hh:mm:ss"), tbuf)) {
1317  "Could not convert untilDate to string");
1318  abort();
1319  }
1320  strncpy(dbuffer2, GWEN_Buffer_GetStart(tbuf), sizeof(dbuffer2)-1);
1321  GWEN_Buffer_free(tbuf);
1322  }
1323 
1324  if (isError) {
1325  statusOn="<font color=red>";
1326  statusOff="</font>";
1327  }
1328  else {
1329  statusOn="<font color=green>";
1330  statusOff="</font>";
1331  }
1332 
1333  unknown=I18N("unknown");
1334  commonName=GWEN_SslCertDescr_GetCommonName(cd);
1335  if (!commonName)
1336  commonName=unknown;
1337  organizationName=GWEN_SslCertDescr_GetOrganizationName(cd);
1338  if (!organizationName)
1339  organizationName=unknown;
1340  organizationalUnitName=GWEN_SslCertDescr_GetOrganizationalUnitName(cd);
1341  if (!organizationalUnitName)
1342  organizationalUnitName=unknown;
1343  countryName=GWEN_SslCertDescr_GetCountryName(cd);
1344  if (!countryName)
1345  countryName=unknown;
1346  localityName=GWEN_SslCertDescr_GetLocalityName(cd);
1347  if (!localityName)
1348  localityName=unknown;
1349  stateOrProvinceName=GWEN_SslCertDescr_GetStateOrProvinceName(cd);
1350  if (!stateOrProvinceName)
1351  stateOrProvinceName=unknown;
1352  if (!status)
1353  status=unknown;
1354 
1355  snprintf(buffer, sizeof(buffer)-1,
1356  I18N(msg),
1357  commonName,
1358  organizationName,
1359  organizationalUnitName,
1360  countryName,
1361  localityName,
1362  stateOrProvinceName,
1363  dbuffer1, dbuffer2,
1364  hashMd5,
1365  hashSha1,
1366  hashSha512,
1367  status,
1368  /* the same again for HTML */
1369  commonName,
1370  organizationName,
1371  organizationalUnitName,
1372  countryName,
1373  localityName,
1374  stateOrProvinceName,
1375  dbuffer1, dbuffer2,
1376  hashMd5,
1377  hashSha1,
1378  hashSha512,
1379  statusOn,
1380  status,
1381  statusOff
1382  );
1383 
1387  I18N("Certificate Received"),
1388  buffer,
1389  I18N("Yes"), I18N("No"), 0, guiid);
1390  if (rv==1) {
1391  return 0;
1392  }
1393  else {
1394  DBG_NOTICE(GWEN_LOGDOMAIN, "User rejected certificate");
1395 
1396  return GWEN_ERROR_SSL_SECURITY;
1397  }
1398 }
1399 
1400 
1401 
1403  unsigned char *buffer,
1404  unsigned int bufLength) {
1405  if (gwenhywfar_gui && gwenhywfar_gui->keyDataFromTextOpenSslFn)
1406  return gwenhywfar_gui->keyDataFromTextOpenSslFn(gwenhywfar_gui,
1407  text,
1408  buffer,
1409  bufLength);
1411 }
1412 
1413 
1414 
1415 int GWEN_Gui_ExecDialog(GWEN_DIALOG *dlg, uint32_t guiid) {
1416  if (gwenhywfar_gui && gwenhywfar_gui->execDialogFn)
1417  return gwenhywfar_gui->execDialogFn(gwenhywfar_gui, dlg, guiid);
1419 }
1420 
1421 
1422 
1423 int GWEN_Gui_OpenDialog(GWEN_DIALOG *dlg, uint32_t guiid) {
1424  if (gwenhywfar_gui && gwenhywfar_gui->openDialogFn)
1425  return gwenhywfar_gui->openDialogFn(gwenhywfar_gui, dlg, guiid);
1427 }
1428 
1429 
1430 
1432  if (gwenhywfar_gui && gwenhywfar_gui->closeDialogFn)
1433  return gwenhywfar_gui->closeDialogFn(gwenhywfar_gui, dlg);
1435 }
1436 
1437 
1438 
1439 int GWEN_Gui_RunDialog(GWEN_DIALOG *dlg, int untilEnd) {
1440  if (gwenhywfar_gui && gwenhywfar_gui->runDialogFn)
1441  return gwenhywfar_gui->runDialogFn(gwenhywfar_gui, dlg, untilEnd);
1443 }
1444 
1445 
1446 
1447 
1448 int GWEN_Gui_GetFileName(const char *caption,
1450  uint32_t flags,
1451  const char *patterns,
1452  GWEN_BUFFER *pathBuffer,
1453  uint32_t guiid) {
1454  if (gwenhywfar_gui && gwenhywfar_gui->getFileNameFn)
1455  return gwenhywfar_gui->getFileNameFn(gwenhywfar_gui,
1456  caption,
1457  fnt,
1458  flags,
1459  patterns,
1460  pathBuffer,
1461  guiid);
1463 }
1464 
1465 
1466 
1467 int GWEN_Gui_ReadDialogPrefs(const char *groupName,
1468  const char *altName,
1469  GWEN_DB_NODE **pDb) {
1470  if (gwenhywfar_gui && gwenhywfar_gui->readDialogPrefsFn)
1471  return gwenhywfar_gui->readDialogPrefsFn(gwenhywfar_gui, groupName, altName, pDb);
1473 }
1474 
1475 
1476 
1477 int GWEN_Gui_WriteDialogPrefs(const char *groupName,
1478  GWEN_DB_NODE *db) {
1479  if (gwenhywfar_gui && gwenhywfar_gui->writeDialogPrefsFn)
1480  return gwenhywfar_gui->writeDialogPrefsFn(gwenhywfar_gui, groupName, db);
1482 }
1483 
1484 
1485 
1486 int GWEN_Gui_GetSyncIo(const char *url,
1487  const char *defaultProto,
1488  int defaultPort,
1489  GWEN_SYNCIO **pSio) {
1490  if (gwenhywfar_gui && gwenhywfar_gui->getSyncIoFn)
1491  return gwenhywfar_gui->getSyncIoFn(gwenhywfar_gui, url, defaultProto, defaultPort, pSio);
1493 }
1494 
1495 
1496 
1497 
1498 
1499 
1500 
1501 
1502 
1503 
1504 
1505 
1506 
1507 
1509  GWEN_PROGRESS_DATA *highest=NULL;
1510  GWEN_PROGRESS_DATA *t;
1511  GWEN_DIALOG *dlg=NULL;
1512 
1513  assert(gwenhywfar_gui);
1514 
1515  t=pd;
1516  while(t) {
1517  highest=t;
1518  t=GWEN_ProgressData_Tree_GetParent(t);
1519  }
1520 
1521  /* highest must always be visible */
1522  if (GWEN_ProgressData_GetShown(highest)==0)
1523  GWEN_ProgressData_SetShown(highest, 1);
1524 
1525  dlg=GWEN_ProgressData_GetDialog(highest);
1526  if (dlg==NULL) {
1527  int rv;
1528 
1529  /* need to create dialog for it */
1530  dlg=GWEN_DlgProgress_new();
1531  if (dlg==NULL) {
1532  DBG_ERROR(GWEN_LOGDOMAIN, "Unable to create progress dialog, maybe data not installed?");
1533  return GWEN_ERROR_INTERNAL;
1534  }
1537 
1540 
1541  rv=GWEN_Gui_OpenDialog(dlg, 0);
1542  if (rv<0) {
1543  DBG_ERROR(GWEN_LOGDOMAIN, "Unable to openDialog: %d", rv);
1544  GWEN_Dialog_free(dlg);
1545  return rv;
1546  }
1547 
1548  DBG_INFO(GWEN_LOGDOMAIN, "Setting new firstprogress: %08x",
1550  GWEN_DlgProgress_SetFirstProgress(dlg, highest);
1551  GWEN_ProgressData_SetDialog(highest, dlg);
1552  }
1553 
1554  if (pd!=highest) {
1555  DBG_INFO(GWEN_LOGDOMAIN, "Setting new second progress: %08x",
1558  GWEN_ProgressData_SetDialog(pd, dlg);
1560  }
1561 
1562  GWEN_Gui_RunDialog(dlg, 0);
1563 
1564  return 0;
1565 }
1566 
1567 
1568 
1570  if (GWEN_ProgressData_GetShown(pd)==0) {
1572  double dt;
1573  time_t t1;
1574 
1575  t1=time(0);
1576  dt=difftime(t1, GWEN_ProgressData_GetStartTime(pd));
1577  if ((int)dt>=GWEN_GUI_DELAY_SECS) {
1578  DBG_INFO(GWEN_LOGDOMAIN, "Progress %08x open for %d secs, showing",
1579  GWEN_ProgressData_GetId(pd), (int) dt);
1581  }
1582  }
1583  else
1585  }
1586 
1587  if (GWEN_ProgressData_GetShown(pd)==1) {
1588  if (GWEN_ProgressData_GetDialog(pd)==NULL) {
1590  }
1591  }
1592 }
1593 
1594 
1595 
1597  uint32_t progressFlags,
1598  const char *title,
1599  const char *text,
1600  uint64_t total,
1601  uint32_t guiid) {
1602  GWEN_PROGRESS_DATA *pdParent=NULL;
1603  GWEN_PROGRESS_DATA *pd;
1604  uint32_t id;
1605 
1606  id=++(gui->nextProgressId);
1607 
1608  DBG_DEBUG(GWEN_LOGDOMAIN, "ProgressStart: flags=%08x, title=[%s], total=%08x, guiid=%08x",
1609  progressFlags, title?title:"(none)", (uint32_t) total, guiid);
1610 
1611  if (guiid==0) {
1612  guiid=gui->lastProgressId;
1613  }
1614 
1615  if (guiid) {
1616  pdParent=GWEN_ProgressData_Tree_FindProgressById(gui->progressDataTree, guiid);
1617  if (pdParent==NULL) {
1618  DBG_WARN(GWEN_LOGDOMAIN, "Parent progress by id %08x not found", guiid);
1619  DBG_DEBUG(GWEN_LOGDOMAIN, "Title: [%s], Text: [%s]",
1620  title?title:"no title",
1621  text?text:"no text");
1622  }
1623  }
1624 
1625  pd=GWEN_ProgressData_new(gui, id, progressFlags, title, text, total);
1626  assert(pd);
1627  GWEN_ProgressData_SetPreviousId(pd, gui->lastProgressId);
1628  if (pdParent)
1629  GWEN_ProgressData_Tree_AddChild(pdParent, pd);
1630  else
1631  GWEN_ProgressData_Tree_Add(gui->progressDataTree, pd);
1632 
1633  GWEN_Gui_Internal_CheckShow(gui, pd);
1634 
1635  gui->lastProgressId=id;
1636 
1637  return id;
1638 }
1639 
1640 
1641 
1642 int GWEN_Gui_Internal_ProgressEnd(GWEN_GUI *gui, uint32_t pid) {
1643  GWEN_PROGRESS_DATA *pd;
1644  uint32_t parentPid=0;
1645 
1646  DBG_DEBUG(GWEN_LOGDOMAIN, "ProgressEnd: guiid=%08x", pid);
1647 
1648  if (pid==0) {
1649  pid=gui->lastProgressId;
1650  if (pid==0) {
1651  DBG_INFO(GWEN_LOGDOMAIN, "Last active progress not available");
1652  return GWEN_ERROR_INVALID;
1653  }
1654  }
1655 
1656  pd=GWEN_ProgressData_Tree_FindProgressById(gui->progressDataTree, pid);
1657  if (pd==NULL) {
1658  DBG_ERROR(GWEN_LOGDOMAIN, "Progress by id %08x not found", pid);
1659  return GWEN_ERROR_INVALID;
1660  }
1661  else {
1662  GWEN_DIALOG *dlg;
1663  GWEN_PROGRESS_DATA *previousPd;
1664 
1665  /* set previous progress id */
1666  gui->lastProgressId=GWEN_ProgressData_GetPreviousId(pd);
1667 
1668  /* find next highest active progress */
1669  previousPd=GWEN_ProgressData_Tree_GetParent(pd);
1670  if (previousPd)
1671  parentPid=GWEN_ProgressData_GetId(previousPd);
1672  while(previousPd) {
1673  if (GWEN_ProgressData_GetShown(previousPd))
1674  break;
1675  previousPd=GWEN_ProgressData_Tree_GetParent(previousPd);
1676  }
1677 
1679  if (dlg) {
1680  GWEN_PROGRESS_DATA *primary;
1681  GWEN_PROGRESS_DATA *secondary;
1682 
1683  primary=GWEN_DlgProgress_GetFirstProgress(dlg);
1684  secondary=GWEN_DlgProgress_GetSecondProgress(dlg);
1685 
1686  /* force update of progress bar */
1687  GWEN_DlgProgress_Advanced(dlg, pd);
1688  GWEN_Gui_RunDialog(dlg, 0);
1689 
1690  if (primary==pd) {
1691  int rv;
1692 
1693  DBG_DEBUG(GWEN_LOGDOMAIN, "Progress %08x is primary, closing dialog",
1695 
1696  if (secondary) {
1697  DBG_WARN(GWEN_LOGDOMAIN, "There is still a secondary progress!");
1699  GWEN_ProgressData_SetDialog(secondary, NULL);
1700  }
1701 
1702  /* this is the primary progress, with this closed we can also
1703  * close the dialog */
1704  DBG_INFO(GWEN_LOGDOMAIN, "Closing progress dialog");
1705  GWEN_DlgProgress_AddLogText(dlg, GWEN_LoggerLevel_Info, I18N("Operation finished, you can now close this window."));
1706 
1707  // run dialog until end, close then
1709  if (GWEN_DlgProgress_GetStayOpen(dlg)) {
1710  rv=GWEN_Gui_RunDialog(dlg, 1);
1711  if (rv<0) {
1712  DBG_ERROR(GWEN_LOGDOMAIN, "Unable to runDialog: %d", rv);
1713  /*GWEN_Dialog_free(dlg);
1714  return rv;*/
1715  }
1716  }
1717 
1718  rv=GWEN_Gui_CloseDialog(dlg);
1719  if (rv<0) {
1720  DBG_ERROR(GWEN_LOGDOMAIN, "Unable to closeDialog: %d", rv);
1721  GWEN_Dialog_free(dlg);
1722  return rv;
1723  }
1724  GWEN_Dialog_free(dlg);
1725  }
1726  else if (secondary==pd) {
1727  /* t is maybe the next higher progress, it will become the second progress */
1728  if (previousPd && previousPd!=GWEN_DlgProgress_GetFirstProgress(dlg)) {
1729  DBG_DEBUG(GWEN_LOGDOMAIN, "Progress %08x becomes new second progress",
1730  GWEN_ProgressData_GetId(previousPd));
1732  GWEN_ProgressData_SetDialog(pd, dlg);
1733  }
1734  else {
1735  DBG_INFO(GWEN_LOGDOMAIN, "No next secondary progress");
1737  }
1738  }
1739  else {
1740  DBG_ERROR(GWEN_LOGDOMAIN, "Progress %08x is neither primary nor secondary, SNH",
1742  }
1743  }
1744  else {
1745  DBG_DEBUG(GWEN_LOGDOMAIN, "Progress %08x has no dialog", GWEN_ProgressData_GetId(pd));
1746  }
1747 
1749  GWEN_ProgressData_Tree_Del(pd);
1751  }
1752 
1753  return 0;
1754 }
1755 
1756 
1757 
1758 int GWEN_Gui_Internal_ProgressAdvance(GWEN_GUI *gui, uint32_t pid, uint64_t progress) {
1759  GWEN_PROGRESS_DATA *pd;
1760  int aborted=0;
1761 
1762  if (pid==0) {
1763  pid=gui->lastProgressId;
1764  if (pid==0) {
1765  DBG_INFO(GWEN_LOGDOMAIN, "Last active progress not available");
1766  return GWEN_ERROR_INVALID;
1767  }
1768  }
1769 
1770  pd=GWEN_ProgressData_Tree_FindProgressById(gui->progressDataTree, pid);
1771  if (pd==NULL) {
1772  DBG_ERROR(GWEN_LOGDOMAIN, "Progress by id %08x not found", pid);
1773  return GWEN_ERROR_INVALID;
1774  }
1775  else {
1776  GWEN_DIALOG *dlg;
1777 
1778  if (progress==GWEN_GUI_PROGRESS_ONE)
1779  progress=GWEN_ProgressData_GetCurrent(pd)+1;
1780  else if (progress==GWEN_GUI_PROGRESS_NONE)
1781  progress=GWEN_ProgressData_GetCurrent(pd);
1782  GWEN_ProgressData_SetCurrent(pd, progress);
1783  GWEN_Gui_Internal_CheckShow(gui, pd);
1784 
1786  if (dlg) {
1787  time_t t0;
1788  time_t t1;
1789 
1791  t1=time(0);
1792  if (t0!=t1) {
1793  GWEN_DlgProgress_Advanced(dlg, pd);
1794  GWEN_Gui_RunDialog(dlg, 0);
1796  }
1797  }
1798  aborted=GWEN_ProgressData_GetAborted(pd);
1799  }
1800 
1801  if (aborted)
1802  return GWEN_ERROR_USER_ABORTED;
1803  return 0;
1804 }
1805 
1806 
1807 
1808 int GWEN_Gui_Internal_ProgressSetTotal(GWEN_GUI *gui, uint32_t pid, uint64_t total) {
1809  GWEN_PROGRESS_DATA *pd;
1810  int aborted=0;
1811 
1812  if (pid==0) {
1813  pid=gui->lastProgressId;
1814  if (pid==0) {
1815  DBG_INFO(GWEN_LOGDOMAIN, "Last active progress not available");
1816  return GWEN_ERROR_INVALID;
1817  }
1818  }
1819 
1820  pd=GWEN_ProgressData_Tree_FindProgressById(gui->progressDataTree, pid);
1821  if (pd==NULL) {
1822  DBG_ERROR(GWEN_LOGDOMAIN, "Progress by id %08x not found", pid);
1823  return GWEN_ERROR_INVALID;
1824  }
1825  else {
1826  GWEN_DIALOG *dlg;
1827 
1828  GWEN_ProgressData_SetTotal(pd, total);
1829  GWEN_Gui_Internal_CheckShow(gui, pd);
1830 
1832  if (dlg) {
1833  time_t t0;
1834  time_t t1;
1835 
1837  t1=time(0);
1838  if (t0!=t1) {
1840  GWEN_Gui_RunDialog(dlg, 0);
1842  }
1843  }
1844  aborted=GWEN_ProgressData_GetAborted(pd);
1845  }
1846 
1847  if (aborted)
1848  return GWEN_ERROR_USER_ABORTED;
1849  return 0;
1850 }
1851 
1852 
1853 
1855  uint32_t pid,
1856  GWEN_LOGGER_LEVEL level,
1857  const char *text) {
1858  assert(gui);
1859 
1860  /* only show messages with log level lower or equal threshold */
1861  if (level<=gui->minProgressLogLevel) {
1862  GWEN_PROGRESS_DATA *pd;
1863  int aborted=0;
1864 
1865  if (pid==0) {
1866  pid=gui->lastProgressId;
1867  if (pid==0) {
1868  DBG_INFO(GWEN_LOGDOMAIN, "Last active progress not available");
1869  return GWEN_ERROR_INVALID;
1870  }
1871  }
1872 
1873  pd=GWEN_ProgressData_Tree_FindProgressById(gui->progressDataTree, pid);
1874  if (pd==NULL) {
1875  DBG_ERROR(GWEN_LOGDOMAIN, "Progress by id %08x not found", pid);
1876  return GWEN_ERROR_INVALID;
1877  }
1878  else {
1879  GWEN_DIALOG *dlg;
1880 
1881  if (level<=GWEN_LoggerLevel_Notice)
1883  if (level<=GWEN_LoggerLevel_Warning)
1885  GWEN_Gui_Internal_CheckShow(gui, pd);
1886 
1888  if (dlg) {
1889  if (level<=GWEN_LoggerLevel_Warning) {
1892  }
1893 
1894  GWEN_DlgProgress_AddLogText(dlg, level, text);
1895  GWEN_Gui_RunDialog(dlg, 0);
1896  }
1897  else
1898  GWEN_ProgressData_AddLogText(pd, level, text);
1899 
1900  aborted=GWEN_ProgressData_GetAborted(pd);
1901  }
1902 
1903  if (aborted)
1904  return GWEN_ERROR_USER_ABORTED;
1905  }
1906  return 0;
1907 }
1908 
1909 
1910 
1912  uint32_t flags,
1913  const char *title,
1914  const char *text,
1915  char *buffer,
1916  int minLen,
1917  int maxLen,
1918  uint32_t guiid) {
1919  GWEN_DIALOG *dlg;
1920  int rv;
1921 
1922  dlg=GWEN_DlgInput_new(flags, title, text, minLen, maxLen);
1923  if (dlg==NULL) {
1924  DBG_ERROR(GWEN_LOGDOMAIN, "Could not create dialog");
1925  return GWEN_ERROR_INTERNAL;
1926  }
1927 
1928  rv=GWEN_Gui_ExecDialog(dlg, 0);
1929  if (rv==1) {
1930  rv=GWEN_DlgInput_CopyInput(dlg, buffer, maxLen);
1931  if (rv<0) {
1932  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1933  GWEN_Dialog_free(dlg);
1934  return rv;
1935  }
1937  rv=1;
1938  else
1939  rv=0;
1940  GWEN_Dialog_free(dlg);
1941  return rv;
1942  }
1943  else {
1944  DBG_ERROR(GWEN_LOGDOMAIN, "User aborted");
1945  GWEN_Dialog_free(dlg);
1946  return GWEN_ERROR_USER_ABORTED;
1947  }
1948 }
1949 
1950 
1951 
1953  uint32_t flags,
1954  const char *title,
1955  const char *text,
1956  const char *b1,
1957  const char *b2,
1958  const char *b3,
1959  uint32_t guiid) {
1960  GWEN_DIALOG *dlg;
1961  int rv;
1962 
1963  dlg=GWEN_DlgMessage_new(flags, title, text, b1, b2, b3);
1964  if (dlg==NULL) {
1965  DBG_ERROR(GWEN_LOGDOMAIN, "Could not create dialog");
1966  return GWEN_ERROR_INTERNAL;
1967  }
1968 
1969  GWEN_Gui_ExecDialog(dlg, 0);
1971  GWEN_Dialog_free(dlg);
1972  return rv;
1973 }
1974 
1975 
1976 
1978  uint32_t flags,
1979  const char *title,
1980  const char *text,
1981  uint32_t guiid) {
1982  GWEN_DIALOG *dlg;
1983  int rv;
1984  uint32_t id;
1985 
1986  id=++(gui->nextDialogId);
1987 
1988  dlg=GWEN_DlgShowBox_new(flags, title, text);
1989  if (dlg==NULL) {
1990  DBG_ERROR(GWEN_LOGDOMAIN, "Could not create dialog");
1991  return 0;
1992  }
1993 
1994  GWEN_Dialog_SetGuiId(dlg, id);
1995 
1996  rv=GWEN_Gui_OpenDialog(dlg, guiid);
1997  if (rv<0) {
1998  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1999  GWEN_Dialog_free(dlg);
2000  return 0;
2001  }
2002 
2003  GWEN_Dialog_List_Add(dlg, gui->activeDialogs);
2004 
2005  return id;
2006 }
2007 
2008 
2009 
2010 void GWEN_Gui_Internal_HideBox(GWEN_GUI *gui, uint32_t id) {
2011  GWEN_DIALOG *dlg;
2012 
2013  if (id) {
2014  dlg=GWEN_Dialog_List_First(gui->activeDialogs);
2015  while(dlg) {
2016  if (GWEN_Dialog_GetGuiId(dlg)==id)
2017  break;
2018  dlg=GWEN_Dialog_List_Next(dlg);
2019  }
2020  }
2021  else
2022  dlg=GWEN_Dialog_List_Last(gui->activeDialogs);
2023 
2024  if (dlg) {
2025  int rv;
2026 
2027  rv=GWEN_Gui_CloseDialog(dlg);
2028  if (rv<0) {
2029  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
2030  }
2031  GWEN_Dialog_List_Del(dlg);
2032  GWEN_Dialog_free(dlg);
2033  }
2034 }
2035 
2036 
2037 
2039  const char *url,
2040  const char *defaultProto,
2041  int defaultPort,
2042  GWEN_SYNCIO **pSio) {
2043  GWEN_URL *u;
2044  const char *s;
2045  int port;
2046  const char *addr;
2047 
2048  if (!(url && *url)) {
2049  DBG_ERROR(GWEN_LOGDOMAIN, "Empty URL");
2050  return GWEN_ERROR_INVALID;
2051  }
2052 
2053  u=GWEN_Url_fromString(url);
2054  if (u==NULL) {
2055  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid URL [%s]", url);
2056  return GWEN_ERROR_INVALID;
2057  }
2058 
2059  /* determine protocol and port */
2060  s=GWEN_Url_GetProtocol(u);
2061  if (!(s && *s))
2062  s=defaultProto;
2063  if (!(s && *s))
2064  s="http";
2065  port=GWEN_Url_GetPort(u);
2066  if (port<1)
2067  port=defaultPort;
2068  if (port<1)
2069  port=80;
2070  addr=GWEN_Url_GetServer(u);
2071  if (!(addr && *addr)) {
2072  DBG_ERROR(GWEN_LOGDOMAIN, "Missing server in URL [%s]", url);
2073  GWEN_Url_free(u);
2074  return GWEN_ERROR_INVALID;
2075  }
2076 
2077  if (strcasecmp(s, "http")==0 ||
2078  strcasecmp(s, "https")==0) {
2079  GWEN_SYNCIO *sio;
2080  GWEN_SYNCIO *baseLayer;
2081  GWEN_DB_NODE *db;
2082  GWEN_BUFFER *tbuf;
2083  int rv;
2084 
2085  /* create base io */
2087  if (sio==NULL) {
2088  DBG_INFO(GWEN_LOGDOMAIN, "here");
2089  GWEN_Url_free(u);
2090  return GWEN_ERROR_GENERIC;
2091  }
2092 
2093  GWEN_SyncIo_Socket_SetAddress(sio, addr);
2094  GWEN_SyncIo_Socket_SetPort(sio, port);
2095  baseLayer=sio;
2096 
2097  if (strcasecmp(s, "https")==0) {
2098  /* create TLS layer */
2099  sio=GWEN_SyncIo_Tls_new(baseLayer);
2100  if (sio==NULL) {
2101  DBG_INFO(GWEN_LOGDOMAIN, "here");
2102  GWEN_SyncIo_free(baseLayer);
2103  GWEN_Url_free(u);
2104  return GWEN_ERROR_GENERIC;
2105  }
2107  baseLayer=sio;
2108  }
2109 
2110  /* create buffered layer as needed for HTTP */
2111  sio=GWEN_SyncIo_Buffered_new(baseLayer);
2112  if (sio==NULL) {
2113  DBG_INFO(GWEN_LOGDOMAIN, "here");
2114  GWEN_SyncIo_free(baseLayer);
2115  GWEN_Url_free(u);
2116  return GWEN_ERROR_GENERIC;
2117  }
2118  baseLayer=sio;
2119 
2120  /* create HTTP layer */
2121  sio=GWEN_SyncIo_Http_new(baseLayer);
2122  if (sio==NULL) {
2123  DBG_INFO(GWEN_LOGDOMAIN, "here");
2124  GWEN_SyncIo_free(baseLayer);
2125  GWEN_Url_free(u);
2126  return GWEN_ERROR_GENERIC;
2127  }
2128 
2129  /* setup default command and header */
2130  tbuf=GWEN_Buffer_new(0, 256, 0, 1);
2132 
2133  /* get command string (e.g. server-relative path plus variables) */
2134  rv=GWEN_Url_toCommandString(u, tbuf);
2135  if (rv<0) {
2136  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid path in URL, ignoring (%d)", rv);
2137  }
2138  else
2140  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "command", "GET");
2141  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "protocol", "HTTP/1.0");
2142 
2143  /* preset some headers */
2146  GWEN_DB_SetCharValue(db, GWEN_DB_FLAGS_OVERWRITE_VARS, "Connection", "close");
2147 
2148  /* done */
2149  GWEN_Url_free(u);
2150  *pSio=sio;
2151  return 0;
2152  }
2153  else {
2154  GWEN_SYNCIO *sio;
2155 
2156  /* create base io */
2158  if (sio==NULL) {
2159  DBG_INFO(GWEN_LOGDOMAIN, "here");
2160  GWEN_Url_free(u);
2161  return GWEN_ERROR_GENERIC;
2162  }
2163  GWEN_SyncIo_Socket_SetAddress(sio, addr);
2164  GWEN_SyncIo_Socket_SetPort(sio, port);
2165 
2166  /* done */
2167  GWEN_Url_free(u);
2168  *pSio=sio;
2169  return 0;
2170  }
2171 
2172 }
2173 
2174 
2175 
2176 static int GWEN_Gui__HashPair(const char *token, const char *pin, GWEN_BUFFER *buf) {
2177  GWEN_MDIGEST *md;
2178  int rv;
2179 
2180  /* hash token and pin */
2181  md=GWEN_MDigest_Md5_new();
2182  rv=GWEN_MDigest_Begin(md);
2183  if (rv==0)
2184  rv=GWEN_MDigest_Update(md, (const uint8_t*)token, strlen(token));
2185  if (rv==0)
2186  rv=GWEN_MDigest_Update(md, (const uint8_t*)pin, strlen(pin));
2187  if (rv==0)
2188  rv=GWEN_MDigest_End(md);
2189  if (rv<0) {
2190  DBG_ERROR(GWEN_LOGDOMAIN, "Hash error (%d)", rv);
2191  GWEN_MDigest_free(md);
2192  return rv;
2193  }
2194 
2197  buf,
2198  0, 0, 0);
2199  GWEN_MDigest_free(md);
2200  return 0;
2201 }
2202 
2203 
2204 
2205 
2207  uint32_t flags,
2208  const char *token,
2209  const char *title,
2210  const char *text,
2211  char *buffer,
2212  int minLen,
2213  int maxLen,
2214  GWEN_GUI_PASSWORD_METHOD methodId,
2215  GWEN_DB_NODE *methodParams,
2216  uint32_t guiid) {
2217  if ((flags & GWEN_GUI_INPUT_FLAGS_TAN) ||
2218  (flags & GWEN_GUI_INPUT_FLAGS_DIRECT) ||
2219  (gui->dbPasswords==NULL)
2220  ) {
2221  return GWEN_Gui_InputBox(flags,
2222  title,
2223  text,
2224  buffer,
2225  minLen,
2226  maxLen,
2227  guiid);
2228  }
2229  else {
2230  GWEN_BUFFER *buf;
2231  int rv;
2232  const char *s;
2233 
2234  buf=GWEN_Buffer_new(0, 256, 0, 1);
2236 
2237  if (!(flags & GWEN_GUI_INPUT_FLAGS_CONFIRM)) {
2238  s=GWEN_DB_GetCharValue(gui->dbPasswords,
2239  GWEN_Buffer_GetStart(buf),
2240  0, NULL);
2241  if (s) {
2242  int i;
2243 
2244  i=strlen(s);
2245  if (i>=minLen && i < maxLen) {
2246  memmove(buffer, s, i+1);
2247  GWEN_Buffer_free(buf);
2248  return 0;
2249  }
2250  else {
2251  DBG_ERROR(GWEN_LOGDOMAIN, "Stored password [%s] is not within size limits (%d), rejecting.",
2252  GWEN_Buffer_GetStart(buf), i);
2253  }
2254  }
2255  }
2256 
2257  /* passwd not in password cache, look for it in password storage */
2258  if (gui->passwdStore) {
2259  rv=GWEN_PasswordStore_GetPassword(gui->passwdStore, token, buffer, minLen, maxLen);
2260  if (rv<0) {
2261  if (rv==GWEN_ERROR_NOT_FOUND || rv==GWEN_ERROR_NO_DATA) {
2262  DBG_INFO(GWEN_LOGDOMAIN, "Password not found in PasswordStore");
2263  }
2264  else {
2265  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
2266  GWEN_Buffer_free(buf);
2267  return rv;
2268  }
2269  }
2270  else {
2271  /* got password */
2272  return 0;
2273  }
2274  }
2275 
2276  if (gui->flags & GWEN_GUI_FLAGS_NONINTERACTIVE) {
2278  "Password for [%s] missing in noninteractive mode, "
2279  "aborting", GWEN_Buffer_GetStart(buf));
2280  GWEN_Buffer_free(buf);
2281  return GWEN_ERROR_USER_ABORTED;
2282  }
2283 
2284  for (;;) {
2285  int rv2;
2286 
2287  rv=GWEN_Gui_InputBox(flags,
2288  title,
2289  text,
2290  buffer,
2291  minLen,
2292  maxLen,
2293  guiid);
2294  if (rv<0) {
2295  GWEN_Buffer_free(buf);
2296  return rv;
2297  }
2298  else {
2299  GWEN_BUFFER *hbuf;
2300  int isBad=0;
2301 
2302  hbuf=GWEN_Buffer_new(0, 64, 0, 1);
2303  GWEN_Gui__HashPair(token, buffer, hbuf);
2304  isBad=GWEN_StringList_HasString(gui->badPasswords,
2305  GWEN_Buffer_GetStart(hbuf));
2306  if (!isBad) {
2307  GWEN_Buffer_free(hbuf);
2308  break;
2309  }
2313  I18N("Enforce PIN"),
2314  I18N(
2315  "You entered the same PIN twice.\n"
2316  "The PIN is marked as bad, do you want\n"
2317  "to use it anyway?"
2318  "<html>"
2319  "<p>"
2320  "You entered the same PIN twice."
2321  "</p>"
2322  "<p>"
2323  "The PIN is marked as <b>bad</b>, "
2324  "do you want to use it anyway?"
2325  "</p>"
2326  "</html>"),
2327  I18N("Yes, use anyway"),
2328  I18N("Re-enter"),
2329  0,
2330  guiid);
2331  if (rv2==1) {
2332  /* accept this input */
2333  GWEN_StringList_RemoveString(gui->badPasswords,
2334  GWEN_Buffer_GetStart(hbuf));
2335  GWEN_Buffer_free(hbuf);
2336  break;
2337  }
2338  GWEN_Buffer_free(hbuf);
2339  }
2340  } /* for */
2341 
2342  /* store in temporary cache */
2344  GWEN_Buffer_GetStart(buf), buffer);
2345 
2346  /* only store passwd in storage if allowed by the user */
2347  if (rv==1 && gui->passwdStore) {
2348  rv=GWEN_PasswordStore_SetPassword(gui->passwdStore, token, buffer);
2349  if (rv<0) {
2350  DBG_WARN(GWEN_LOGDOMAIN, "Could not store password (%d)", rv);
2351  }
2352  }
2353 
2354  GWEN_Buffer_free(buf);
2355  return 0;
2356  }
2357 }
2358 
2359 
2360 
2362  const char *token,
2363  const char *pin,
2364  GWEN_GUI_PASSWORD_STATUS status,
2365  GWEN_UNUSED uint32_t guiid) {
2366  if (token==NULL && pin==NULL && status==GWEN_Gui_PasswordStatus_Remove) {
2367  /* complete cleaning is requested */
2368  if (gui->passwdStore)
2369  GWEN_PasswordStore_ClearStoragePasswd(gui->passwdStore);
2370  if (gui->persistentPasswords==0)
2371  GWEN_DB_ClearGroup(gui->dbPasswords, NULL);
2372  }
2373  else {
2374  GWEN_BUFFER *hbuf;
2375 
2376  /* setting ststus of a specific password/pin */
2377  hbuf=GWEN_Buffer_new(0, 64, 0, 1);
2378  GWEN_Gui__HashPair(token, pin, hbuf);
2379  if (status==GWEN_Gui_PasswordStatus_Bad) {
2380  GWEN_StringList_AppendString(gui->badPasswords,
2381  GWEN_Buffer_GetStart(hbuf),
2382  0, 1);
2383  /* remove from permanent passwd storage */
2384  if (gui->passwdStore) {
2385  int rv;
2386 
2387  rv=GWEN_PasswordStore_SetPassword(gui->passwdStore, token, NULL);
2388  if (rv<0) {
2389  DBG_WARN(GWEN_LOGDOMAIN, "Could not remove password from storage (%d)", rv);
2390  }
2391  }
2392  }
2393  else if (status==GWEN_Gui_PasswordStatus_Ok ||
2395  if (gui->persistentPasswords==0)
2396  GWEN_StringList_RemoveString(gui->badPasswords, GWEN_Buffer_GetStart(hbuf));
2397  }
2398  GWEN_Buffer_free(hbuf);
2399  }
2400 
2401  return 0;
2402 }
2403 
2404 
2405 
2406 
2408  assert(gui);
2409  return gui->minProgressLogLevel;
2410 }
2411 
2412 
2413 
2415  assert(gui);
2416  gui->minProgressLogLevel=ll;
2417 }
2418 
2419 
2420 
2421 
#define I18S(m)
Definition: error.c:43
const char * GWEN_SslCertDescr_GetFingerPrintSha1(const GWEN_SSLCERTDESCR *st)
GWEN_GUI_CLOSE_DIALOG_FN GWEN_Gui_SetCloseDialogFn(GWEN_GUI *gui, GWEN_GUI_CLOSE_DIALOG_FN f)
Definition: gui.c:571
GWEN_GUI_WRITE_DIALOG_PREFS_FN GWEN_Gui_SetWriteDialogPrefsFn(GWEN_GUI *gui, GWEN_GUI_WRITE_DIALOG_PREFS_FN f)
Definition: gui.c:609
void GWEN_Url_free(GWEN_URL *st)
Definition: url.c:37
GWEN_DIALOG * GWEN_ProgressData_GetDialog(const GWEN_PROGRESS_DATA *pd)
Definition: progressdata.c:248
struct GWEN_TIME GWEN_TIME
Definition: gwentime.h:43
int GWEN_Gui_ProgressLog(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text)
Definition: gui.c:940
void GWEN_Gui_SubFlags(GWEN_GUI *gui, uint32_t fl)
Definition: gui.c:681
struct GWEN_SSLCERTDESCR GWEN_SSLCERTDESCR
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:223
#define I18N(m)
Definition: error.c:42
void GWEN_PasswordStore_free(GWEN_PASSWD_STORE *sto)
Definition: passwdstore.c:59
GWEN_DIALOG * GWEN_DlgInput_new(uint32_t flags, const char *title, const char *text, int minLen, int maxLen)
Definition: dlg_input.c:34
GWEN_GUI_PROGRESS_END_FN GWEN_Gui_SetProgressEndFn(GWEN_GUI *gui, GWEN_GUI_PROGRESS_END_FN f)
Definition: gui.c:461
int GWENHYWFAR_CB(* GWEN_GUI_READ_DIALOG_PREFS_FN)(GWEN_GUI *gui, const char *groupName, const char *altName, GWEN_DB_NODE **pDb)
Definition: gui_be.h:252
GWENHYWFAR_API void GWEN_SocketSet_free(GWEN_SOCKETSET *ssp)
int GWEN_Gui_OpenDialog(GWEN_DIALOG *dlg, uint32_t guiid)
Definition: gui.c:1423
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition: db.h:121
int GWEN_Gui_Internal_ProgressSetTotal(GWEN_GUI *gui, uint32_t pid, uint64_t total)
Definition: gui.c:1808
void GWEN_Gui_SetFlags(GWEN_GUI *gui, uint32_t fl)
Definition: gui.c:667
int GWEN_Gui_ProgressAdvance(uint32_t id, uint32_t progress)
Definition: gui.c:920
int GWEN_ProgressData_GetShown(const GWEN_PROGRESS_DATA *pd)
Definition: progressdata.c:206
void GWEN_MDigest_free(GWEN_MDIGEST *md)
Definition: mdigest.c:53
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
int GWEN_Buffer_AllocRoom(GWEN_BUFFER *bf, uint32_t size)
Definition: buffer.c:273
#define GWEN_INHERIT_FINI(t, element)
Definition: inherit.h:238
uint32_t GWEN_Buffer_GetMaxUnsegmentedWrite(GWEN_BUFFER *bf)
Definition: buffer.c:569
int GWEN_Gui_WaitForSockets(GWEN_SOCKET_LIST2 *readSockets, GWEN_SOCKET_LIST2 *writeSockets, uint32_t guiid, int msecs)
Definition: gui.c:1079
struct GWEN_SOCKET_LIST2 GWEN_SOCKET_LIST2
Definition: listdoc.h:3880
void GWEN_DlgProgress_SetStayOpen(GWEN_DIALOG *dlg, int b)
Definition: dlg_progress.c:112
void GWEN_DB_Group_free(GWEN_DB_NODE *n)
Definition: db.c:369
#define GWEN_ERROR_INVALID
Definition: error.h:67
GWEN_DIALOG * GWEN_Dialog_List_Next(const GWEN_DIALOG *element)
int GWEN_Gui_LogHook(const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s)
Definition: gui.c:1046
GWEN_GUI_PROGRESS_LOG_FN GWEN_Gui_SetProgressLogFn(GWEN_GUI *gui, GWEN_GUI_PROGRESS_LOG_FN f)
Definition: gui.c:449
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbHeaderOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1297
#define GWEN_GUI_PROGRESS_ALLOW_EMBED
Definition: gui.h:196
int GWEN_DlgInput_CopyInput(GWEN_DIALOG *dlg, char *buffer, int size)
Definition: dlg_input.c:362
int GWEN_Gui_Internal_InputBox(GWEN_GUI *gui, uint32_t flags, const char *title, const char *text, char *buffer, int minLen, int maxLen, uint32_t guiid)
Definition: gui.c:1911
#define GWEN_GUI_INPUT_FLAGS_CONFIRM
Definition: gui.h:211
GWEN_GUI_HIDEBOX_FN GWEN_Gui_SetHideBoxFn(GWEN_GUI *gui, GWEN_GUI_HIDEBOX_FN f)
Definition: gui.c:400
GWEN_GUI_GET_FILENAME_FN GWEN_Gui_SetGetFileNameFn(GWEN_GUI *gui, GWEN_GUI_GET_FILENAME_FN f)
Definition: gui.c:621
#define GWEN_GUI_FLAGS_NONINTERACTIVE
Definition: gui.h:979
#define DBG_NOTICE(dbg_logger, format, args...)
Definition: debug.h:140
GWEN_PROGRESS_DATA * GWEN_DlgProgress_GetSecondProgress(const GWEN_DIALOG *dlg)
Definition: dlg_progress.c:216
int GWENHYWFAR_CB(* GWEN_GUI_WAITFORSOCKETS_FN)(GWEN_GUI *gui, GWEN_SOCKET_LIST2 *readSockets, GWEN_SOCKET_LIST2 *writeSockets, int msecs, uint32_t guiid)
Definition: gui_be.h:198
const char * GWEN_SslCertDescr_GetOrganizationName(const GWEN_SSLCERTDESCR *st)
int GWEN_Gui_Internal_ProgressLog(GWEN_GUI *gui, uint32_t pid, GWEN_LOGGER_LEVEL level, const char *text)
Definition: gui.c:1854
int GWEN_Gui_ProgressSetTotal(uint32_t id, uint64_t total)
Definition: gui.c:930
GWEN_LOGGER_LEVEL
Definition: logger.h:64
uint32_t GWEN_ProgressData_GetFlags(const GWEN_PROGRESS_DATA *pd)
Definition: progressdata.c:99
int(* GWEN_GUI_PROGRESS_SETTOTAL_FN)(GWEN_GUI *gui, uint32_t id, uint64_t total)
Definition: gui_be.h:411
int GWEN_Gui_Internal_ProgressAdvance(GWEN_GUI *gui, uint32_t pid, uint64_t progress)
Definition: gui.c:1758
int GWENHYWFAR_CB(* GWEN_GUI_SETPASSWORDSTATUS_FN)(GWEN_GUI *gui, const char *token, const char *pin, GWEN_GUI_PASSWORD_STATUS status, uint32_t guiid)
Definition: gui_be.h:166
void GWEN_Gui_SetCharSet(GWEN_GUI *gui, const char *s)
Definition: gui.c:712
GWEN_DIALOG * GWEN_Dialog_List_First(const GWEN_DIALOG_LIST *l)
void GWEN_Gui_SetMinProgressLogLevel(GWEN_GUI *gui, GWEN_LOGGER_LEVEL ll)
Definition: gui.c:2414
uint32_t GWEN_Gui_Internal_ShowBox(GWEN_GUI *gui, uint32_t flags, const char *title, const char *text, uint32_t guiid)
Definition: gui.c:1977
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:92
#define NULL
Definition: binreloc.c:290
void GWEN_DlgProgress_TotalChanged(GWEN_DIALOG *dlg, GWEN_PROGRESS_DATA *pd)
Definition: dlg_progress.c:356
void GWEN_SyncIo_Socket_SetAddress(GWEN_SYNCIO *sio, const char *s)
const char * GWEN_Url_GetProtocol(const GWEN_URL *st)
Definition: url.c:156
int GWEN_Text_EscapeToBufferTolerant(const char *src, GWEN_BUFFER *buf)
Definition: text.c:1419
int GWEN_Gui_Internal_MessageBox(GWEN_GUI *gui, uint32_t flags, const char *title, const char *text, const char *b1, const char *b2, const char *b3, uint32_t guiid)
Definition: gui.c:1952
uint32_t GWEN_ProgressData_GetId(const GWEN_PROGRESS_DATA *pd)
Definition: progressdata.c:78
int GWEN_Url_GetPort(const GWEN_URL *st)
Definition: url.c:196
#define GWEN_GUI_FLAGS_PERMPASSWORDS
Definition: gui.h:985
const char * GWEN_SslCertDescr_GetFingerPrint(const GWEN_SSLCERTDESCR *st)
int GWEN_Gui_WriteDialogPrefs(const char *groupName, GWEN_DB_NODE *db)
Definition: gui.c:1477
void(* GWEN_GUI_HIDEBOX_FN)(GWEN_GUI *gui, uint32_t id)
Definition: gui_be.h:385
struct GWEN_SOCKETSETSTRUCT GWEN_SOCKETSET
Definition: inetsocket.h:44
#define GWEN_GUI_PROGRESS_DELAY
Definition: gui.h:192
GWEN_GUI_GETPASSWORD_FN GWEN_Gui_SetGetPasswordFn(GWEN_GUI *gui, GWEN_GUI_GETPASSWORD_FN f)
Definition: gui.c:484
void GWEN_Gui_AddFlags(GWEN_GUI *gui, uint32_t fl)
Definition: gui.c:674
int(* GWEN_GUI_PROGRESS_ADVANCE_FN)(GWEN_GUI *gui, uint32_t id, uint64_t progress)
Definition: gui_be.h:402
int GWEN_Buffer_AdjustUsedBytes(GWEN_BUFFER *bf)
Definition: buffer.c:513
#define DBG_WARN(dbg_logger, format, args...)
Definition: debug.h:118
GWEN_GUI_KEYDATAFROMTEXT_OPENSSL_FN GWEN_Gui_SetKeyDataFromTextOpenSslFn(GWEN_GUI *gui, GWEN_GUI_KEYDATAFROMTEXT_OPENSSL_FN f)
Definition: gui.c:646
int GWEN_Gui_ConvertFromUtf8(const GWEN_GUI *gui, const char *text, int len, GWEN_BUFFER *tbuf)
Definition: gui.c:237
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_SOCKET * GWEN_Socket_List2Iterator_Data(GWEN_SOCKET_LIST2_ITERATOR *li)
int GWEN_Gui_MessageBox(uint32_t flags, const char *title, const char *text, const char *b1, const char *b2, const char *b3, uint32_t guiid)
Definition: gui.c:821
int GWEN_MDigest_Update(GWEN_MDIGEST *md, const uint8_t *buf, unsigned int l)
Definition: mdigest.c:144
int GWEN_Gui_ExecDialog(GWEN_DIALOG *dlg, uint32_t guiid)
Definition: gui.c:1415
GWEN_GUI_PRINT_FN GWEN_Gui_SetPrintFn(GWEN_GUI *gui, GWEN_GUI_PRINT_FN f)
Definition: gui.c:472
int GWEN_Gui_Print(const char *docTitle, const char *docType, const char *descr, const char *text, uint32_t guiid)
Definition: gui.c:979
int GWEN_PasswordStore_GetPassword(GWEN_PASSWD_STORE *sto, const char *token, char *buffer, int minLen, int maxLen)
Definition: passwdstore.c:678
#define GWEN_GUI_INPUT_FLAGS_DIRECT
Definition: gui.h:226
GWEN_LOGGER_LEVEL GWEN_Gui_GetMinProgressLogLevel(const GWEN_GUI *gui)
Definition: gui.c:2407
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:38
uint32_t(* GWEN_GUI_SHOWBOX_FN)(GWEN_GUI *gui, uint32_t flags, const char *title, const char *text, uint32_t guiid)
Definition: gui_be.h:375
#define ICONV_CONST
Definition: gui.c:34
struct GWEN_DIALOG GWEN_DIALOG
Definition: dialog.h:54
static GWEN_GUI * gwenhywfar_gui
Definition: gui.c:71
int GWENHYWFAR_CB(* GWEN_GUI_CLOSE_DIALOG_FN)(GWEN_GUI *gui, GWEN_DIALOG *dlg)
Definition: gui_be.h:247
GWEN_DIALOG * GWEN_DlgProgress_new(void)
Definition: dlg_progress.c:39
char * GWEN_Buffer_GetPosPointer(const GWEN_BUFFER *bf)
Definition: buffer.c:588
int(* GWEN_GUI_MESSAGEBOX_FN)(GWEN_GUI *gui, uint32_t flags, const char *title, const char *text, const char *b1, const char *b2, const char *b3, uint32_t guiid)
Definition: gui_be.h:349
int GWEN_PasswordStore_SetPassword(GWEN_PASSWD_STORE *sto, const char *token, const char *secret)
Definition: passwdstore.c:608
int GWENHYWFAR_CB GWEN_Gui_CheckCertBuiltIn(GWEN_UNUSED GWEN_GUI *gui, const GWEN_SSLCERTDESCR *cd, GWEN_UNUSED GWEN_SYNCIO *sio, uint32_t guiid)
Definition: gui.c:1213
GWEN_GUI_RUN_DIALOG_FN GWEN_Gui_SetRunDialogFn(GWEN_GUI *gui, GWEN_GUI_RUN_DIALOG_FN f)
Definition: gui.c:583
const GWEN_TIME * GWEN_SslCertDescr_GetNotBefore(const GWEN_SSLCERTDESCR *st)
int GWEN_Buffer_IncrementPos(GWEN_BUFFER *bf, uint32_t i)
Definition: buffer.c:495
int GWEN_Gui_GetSyncIo(const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
Definition: gui.c:1486
GWENHYWFAR_API int GWEN_StringList_RemoveString(GWEN_STRINGLIST *sl, const char *s)
Definition: stringlist.c:309
void GWEN_Dialog_List_Add(GWEN_DIALOG *element, GWEN_DIALOG_LIST *list)
void GWEN_DlgProgress_SetAllowClose(GWEN_DIALOG *dlg, int b)
Definition: dlg_progress.c:96
int GWEN_Url_toCommandString(const GWEN_URL *url, GWEN_BUFFER *buf)
Definition: urlfns.c:383
GWENHYWFAR_API int GWEN_SocketSet_GetSocketCount(GWEN_SOCKETSET *ssp)
const char * GWEN_SslCertDescr_GetStatusText(const GWEN_SSLCERTDESCR *st)
uint8_t * GWEN_MDigest_GetDigestPtr(GWEN_MDIGEST *md)
Definition: mdigest.c:78
void GWEN_ProgressData_AddLogText(GWEN_PROGRESS_DATA *pd, GWEN_LOGGER_LEVEL level, const char *s)
Definition: progressdata.c:183
GWEN_SYNCIO * GWEN_SyncIo_Http_new(GWEN_SYNCIO *baseIo)
Definition: syncio_http.c:52
int GWEN_Gui_ShowProgress(GWEN_PROGRESS_DATA *pd)
Definition: gui.c:1508
static int GWENHYWFAR_CB GWEN_Gui_Internal_GetPassword(GWEN_GUI *gui, uint32_t flags, const char *token, const char *title, const char *text, char *buffer, int minLen, int maxLen, GWEN_GUI_PASSWORD_METHOD methodId, GWEN_DB_NODE *methodParams, uint32_t guiid)
Definition: gui.c:2206
struct GWEN_SOCKET_LIST2_ITERATOR GWEN_SOCKET_LIST2_ITERATOR
Definition: listdoc.h:3885
time_t GWEN_ProgressData_GetCheckTime(const GWEN_PROGRESS_DATA *pd)
Definition: progressdata.c:234
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:57
const char * GWEN_SslCertDescr_GetOrganizationalUnitName(const GWEN_SSLCERTDESCR *st)
int GWEN_MDigest_Begin(GWEN_MDIGEST *md)
Definition: mdigest.c:122
#define GWEN_GUI_PROGRESS_ONE
Definition: gui.h:376
GWEN_GUI_PROGRESS_SETTOTAL_FN GWEN_Gui_SetProgressSetTotalFn(GWEN_GUI *gui, GWEN_GUI_PROGRESS_SETTOTAL_FN f)
Definition: gui.c:437
const char * GWEN_Gui_GetName(void)
Definition: gui.c:696
GWEN_GUI_FILENAME_TYPE
Definition: gui.h:936
GWEN_GUI_PASSWORD_STATUS
Definition: gui.h:386
void GWEN_DlgProgress_SetSecondProgress(GWEN_DIALOG *dlg, GWEN_PROGRESS_DATA *pd)
Definition: dlg_progress.c:228
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:86
GWEN_GUI_SETPASSWORDSTATUS_FN GWEN_Gui_SetSetPasswordStatusFn(GWEN_GUI *gui, GWEN_GUI_SETPASSWORDSTATUS_FN f)
Definition: gui.c:497
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
void GWEN_ProgressData_SetCheckTime(GWEN_PROGRESS_DATA *pd, time_t t)
Definition: progressdata.c:241
void GWEN_Gui_GetRawText(const GWEN_GUI *gui, const char *text, GWEN_BUFFER *tbuf)
Definition: gui.c:329
GWENHYWFAR_API int GWEN_Time_toString(const GWEN_TIME *t, const char *tmpl, GWEN_BUFFER *buf)
Definition: gwentime_all.c:784
GWEN_SYNCIO * GWEN_SyncIo_Buffered_new(GWEN_SYNCIO *baseIo)
GWEN_SYNCIO * GWEN_SyncIo_Tls_new(GWEN_SYNCIO *baseIo)
Definition: syncio_tls.c:61
#define GWEN_GUI_PROGRESS_NONE
Definition: gui.h:368
int GWEN_Gui_InputBox(uint32_t flags, const char *title, const char *text, char *buffer, int minLen, int maxLen, uint32_t guiid)
Definition: gui.c:862
int GWEN_StringList_AppendString(GWEN_STRINGLIST *sl, const char *s, int take, int checkDouble)
Definition: stringlist.c:230
struct GWEN_URL GWEN_URL
Definition: url.h:77
#define GWEN_GUI_MSG_FLAGS_SEVERITY_DANGEROUS
Definition: gui.h:337
#define GWENHYWFAR_CB
Definition: gwenhywfarapi.h:89
GWEN_GUI_LOG_HOOK_FN GWEN_Gui_SetLogHookFn(GWEN_GUI *gui, GWEN_GUI_LOG_HOOK_FN f)
Definition: gui.c:509
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:192
uint32_t GWEN_Gui_ShowBox(uint32_t flags, const char *title, const char *text, uint32_t guiid)
Definition: gui.c:881
void GWEN_Gui_UseDialogs(GWEN_GUI *gui)
Definition: gui.c:128
GWEN_GUI_OPEN_DIALOG_FN GWEN_Gui_SetOpenDialogFn(GWEN_GUI *gui, GWEN_GUI_OPEN_DIALOG_FN f)
Definition: gui.c:559
int GWEN_Gui_ProgressLog2(uint32_t id, GWEN_LOGGER_LEVEL level, const char *fmt,...)
Definition: gui.c:951
static int GWENHYWFAR_CB GWEN_Gui_Internal_SetPasswordStatus(GWEN_GUI *gui, const char *token, const char *pin, GWEN_GUI_PASSWORD_STATUS status, GWEN_UNUSED uint32_t guiid)
Definition: gui.c:2361
GWEN_GUI_MESSAGEBOX_FN GWEN_Gui_SetMessageBoxFn(GWEN_GUI *gui, GWEN_GUI_MESSAGEBOX_FN f)
Definition: gui.c:364
int GWEN_ProgressData_GetAborted(const GWEN_PROGRESS_DATA *pd)
Definition: progressdata.c:192
#define GWEN_GUI_INPUT_FLAGS_TAN
Definition: gui.h:222
uint64_t GWEN_ProgressData_GetCurrent(const GWEN_PROGRESS_DATA *pd)
Definition: progressdata.c:141
void GWEN_Gui_HideBox(uint32_t id)
Definition: gui.c:896
int GWENHYWFAR_CB(* GWEN_GUI_EXEC_DIALOG_FN)(GWEN_GUI *gui, GWEN_DIALOG *dlg, uint32_t guiid)
Definition: gui_be.h:238
GWEN_GUI_PROGRESS_START_FN GWEN_Gui_SetProgressStartFn(GWEN_GUI *gui, GWEN_GUI_PROGRESS_START_FN f)
Definition: gui.c:413
GWEN_PROGRESS_DATA * GWEN_DlgProgress_GetFirstProgress(const GWEN_DIALOG *dlg)
Definition: dlg_progress.c:167
#define GWEN_ERROR_SSL_SECURITY
Definition: error.h:129
#define GWEN_GUI_MSG_FLAGS_SEVERITY_NORMAL
Definition: gui.h:331
GWEN_GUI * GWEN_Gui_GetGui(void)
Definition: gui.c:162
#define GWEN_ERROR_GENERIC
Definition: error.h:62
void GWEN_SyncIo_Tls_SetRemoteHostName(GWEN_SYNCIO *sio, const char *s)
Definition: syncio_tls.c:262
void GWEN_Dialog_SetGuiId(GWEN_DIALOG *dlg, uint32_t guiid)
Definition: dialog.c:149
int GWEN_Gui_ConvertString(const char *text, size_t len, GWEN_BUFFER *tbuf, const char *fromCs, const char *toCs)
Definition: gui.c:168
struct GWEN_MDIGEST GWEN_MDIGEST
Definition: mdigest.h:25
void GWEN_Dialog_List_free(GWEN_DIALOG_LIST *l)
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:897
void GWEN_ProgressData_SetCurrent(GWEN_PROGRESS_DATA *pd, uint64_t i)
Definition: progressdata.c:148
GWEN_PROGRESS_DATA * GWEN_ProgressData_Tree_FindProgressById(GWEN_PROGRESS_DATA_TREE *pt, uint32_t id)
Definition: progressdata.c:262
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
GWEN_PASSWD_STORE * GWEN_Gui_GetPasswdStore(const GWEN_GUI *gui)
Definition: gui.c:774
GWENHYWFAR_API GWEN_SOCKETSET * GWEN_SocketSet_new(void)
void GWEN_DlgProgress_SetShowLog(GWEN_DIALOG *dlg, int b)
Definition: dlg_progress.c:136
int GWEN_DlgMessage_GetResponse(const GWEN_DIALOG *dlg)
Definition: dlg_message.c:128
GWENHYWFAR_API int GWEN_SocketSet_AddSocket(GWEN_SOCKETSET *ssp, const GWEN_SOCKET *sp)
void GWEN_SyncIo_Socket_SetPort(GWEN_SYNCIO *sio, int i)
void GWEN_DlgProgress_AddLogText(GWEN_DIALOG *dlg, GWEN_LOGGER_LEVEL level, const char *s)
Definition: dlg_progress.c:254
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:83
int GWENHYWFAR_CB(* GWEN_GUI_GET_FILENAME_FN)(GWEN_GUI *gui, const char *caption, GWEN_GUI_FILENAME_TYPE fnt, uint32_t flags, const char *patterns, GWEN_BUFFER *pathBuffer, uint32_t guiid)
Definition: gui_be.h:210
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:41
const char * GWEN_SslCertDescr_GetCountryName(const GWEN_SSLCERTDESCR *st)
void GWEN_SyncIo_free(GWEN_SYNCIO *sio)
Definition: syncio.c:76
const char * GWEN_Url_GetServer(const GWEN_URL *st)
Definition: url.c:176
GWEN_GUI_PASSWORD_METHOD
Definition: gui.h:163
int GWEN_DlgInput_GetFlagAllowStore(GWEN_DIALOG *dlg)
Definition: dlg_input.c:386
#define GWEN_GUI_MSG_FLAGS_TYPE_ERROR
Definition: gui.h:293
GWEN_DIALOG_LIST * GWEN_Dialog_List_new()
GWEN_DIALOG * GWEN_DlgMessage_new(uint32_t flags, const char *title, const char *text, const char *b1, const char *b2, const char *b3)
Definition: dlg_message.c:34
uint32_t GWEN_Gui_ProgressStart(uint32_t progressFlags, const char *title, const char *text, uint64_t total, uint32_t guiid)
Definition: gui.c:903
int GWEN_Gui_KeyDataFromText_OpenSSL(const char *text, unsigned char *buffer, unsigned int bufLength)
Definition: gui.c:1402
int GWEN_Gui_ProgressEnd(uint32_t id)
Definition: gui.c:971
GWEN_GUI_SHOWBOX_FN GWEN_Gui_SetShowBoxFn(GWEN_GUI *gui, GWEN_GUI_SHOWBOX_FN f)
Definition: gui.c:388
#define GWEN_GUI_PROGRESS_KEEP_OPEN
Definition: gui.h:198
GWEN_DIALOG * GWEN_DlgShowBox_new(uint32_t flags, const char *title, const char *text)
Definition: dlg_showbox.c:38
int GWENHYWFAR_CB(* GWEN_GUI_KEYDATAFROMTEXT_OPENSSL_FN)(GWEN_GUI *gui, const char *text, unsigned char *buffer, unsigned int bufLength)
Definition: gui_be.h:224
int GWEN_Gui_CloseDialog(GWEN_DIALOG *dlg)
Definition: gui.c:1431
int GWEN_MDigest_End(GWEN_MDIGEST *md)
Definition: mdigest.c:133
GWEN_DB_NODE * GWEN_SyncIo_Http_GetDbCommandOut(const GWEN_SYNCIO *sio)
Definition: syncio_http.c:1273
int GWEN_SslCertDescr_GetIsError(const GWEN_SSLCERTDESCR *st)
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
const char * GWEN_SslCertDescr_GetCommonName(const GWEN_SSLCERTDESCR *st)
#define GWEN_GUI_CPU_TIMEOUT
Definition: gui.h:180
GWEN_GUI_GETSYNCIO_FN GWEN_Gui_SetGetSyncIoFn(GWEN_GUI *gui, GWEN_GUI_GETSYNCIO_FN f)
Definition: gui.c:633
int GWEN_Gui_ReadDialogPrefs(const char *groupName, const char *altName, GWEN_DB_NODE **pDb)
Definition: gui.c:1467
int GWENHYWFAR_CB(* GWEN_GUI_LOG_HOOK_FN)(GWEN_GUI *gui, const char *logDomain, GWEN_LOGGER_LEVEL priority, const char *s)
Definition: gui_be.h:185
void GWEN_Socket_List2Iterator_free(GWEN_SOCKET_LIST2_ITERATOR *li)
void GWEN_Dialog_List_Del(GWEN_DIALOG *element)
unsigned int GWEN_MDigest_GetDigestSize(GWEN_MDIGEST *md)
Definition: mdigest.c:86
struct GWEN_PASSWD_STORE GWEN_PASSWD_STORE
Definition: passwdstore.h:37
int GWEN_Buffer_SetPos(GWEN_BUFFER *bf, uint32_t i)
Definition: buffer.c:246
int GWENHYWFAR_CB(* GWEN_GUI_WRITE_DIALOG_PREFS_FN)(GWEN_GUI *gui, const char *groupName, GWEN_DB_NODE *db)
Definition: gui_be.h:257
void GWEN_Gui_SetPasswordDb(GWEN_GUI *gui, GWEN_DB_NODE *dbPasswords, int persistent)
Definition: gui.c:796
GWEN_GUI * GWEN_Gui_new(void)
Definition: gui.c:78
#define GWEN_GUI_PROGRESS_SHOW_PROGRESS
Definition: gui.h:197
GWENHYWFAR_API GWEN_MDIGEST * GWEN_MDigest_Md5_new(void)
Definition: mdigestgc.c:135
int(* GWEN_GUI_PROGRESS_END_FN)(GWEN_GUI *gui, uint32_t id)
Definition: gui_be.h:427
int GWEN_StringList_HasString(const GWEN_STRINGLIST *sl, const char *s)
Definition: stringlist.c:389
void GWEN_Gui_SetPasswdStore(GWEN_GUI *gui, GWEN_PASSWD_STORE *sto)
Definition: gui.c:782
GWENHYWFAR_API int GWEN_Socket_Select(GWEN_SOCKETSET *rs, GWEN_SOCKETSET *ws, GWEN_SOCKETSET *xs, int timeout)
GWEN_URL * GWEN_Url_fromString(const char *str)
Definition: urlfns.c:24
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:922
#define GWEN_GUI_PROGRESS_SHOW_LOG
Definition: gui.h:193
int GWENHYWFAR_CB(* GWEN_GUI_PRINT_FN)(GWEN_GUI *gui, const char *docTitle, const char *docType, const char *descr, const char *text, uint32_t guiid)
Definition: gui_be.h:141
int GWEN_Gui_GetPassword(uint32_t flags, const char *token, const char *title, const char *text, char *buffer, int minLen, int maxLen, GWEN_GUI_PASSWORD_METHOD methodId, GWEN_DB_NODE *methodParams, uint32_t guiid)
Definition: gui.c:996
int GWENHYWFAR_CB GWEN_Gui_Internal_GetSyncIo(GWEN_GUI *gui, const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
Definition: gui.c:2038
#define GWEN_GUI_MSG_FLAGS_CONFIRM_B1
Definition: gui.h:299
struct GWEN_PROGRESS_DATA GWEN_PROGRESS_DATA
void GWEN_ProgressData_SetTotal(GWEN_PROGRESS_DATA *pd, uint64_t i)
Definition: progressdata.c:155
#define GWEN_ERROR_NOT_FOUND
Definition: error.h:89
GWEN_GUI_INPUTBOX_FN GWEN_Gui_SetInputBoxFn(GWEN_GUI *gui, GWEN_GUI_INPUTBOX_FN f)
Definition: gui.c:376
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:164
static int GWEN_Gui__HashPair(const char *token, const char *pin, GWEN_BUFFER *buf)
Definition: gui.c:2176
int(* GWEN_GUI_INPUTBOX_FN)(GWEN_GUI *gui, uint32_t flags, const char *title, const char *text, char *buffer, int minLen, int maxLen, uint32_t guiid)
Definition: gui_be.h:362
GWEN_DB_NODE * GWEN_Gui_GetPasswordDb(const GWEN_GUI *gui)
Definition: gui.c:806
void GWEN_Gui_Attach(GWEN_GUI *gui)
Definition: gui.c:144
int GWENHYWFAR_CB(* GWEN_GUI_CHECKCERT_FN)(GWEN_GUI *gui, const GWEN_SSLCERTDESCR *cert, GWEN_SYNCIO *sio, uint32_t guiid)
Definition: gui_be.h:204
struct GWEN_GUI GWEN_GUI
Definition: gui.h:176
struct GWEN_SOCKET GWEN_SOCKET
Definition: inetsocket.h:43
GWEN_PROGRESS_DATA * GWEN_ProgressData_new(GWEN_GUI *gui, uint32_t id, uint32_t progressFlags, const char *title, const char *text, uint64_t total)
Definition: progressdata.c:31
int GWEN_Buffer_AppendBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
Definition: buffer.c:348
void GWEN_PasswordStore_ClearStoragePasswd(GWEN_PASSWD_STORE *sto)
Definition: passwdstore.c:74
int GWENHYWFAR_CB(* GWEN_GUI_GETSYNCIO_FN)(GWEN_GUI *gui, const char *url, const char *defaultProto, int defaultPort, GWEN_SYNCIO **pSio)
Definition: gui_be.h:218
GWEN_SYNCIO * GWEN_SyncIo_Socket_new(GWEN_SOCKETTYPE sockType, GWEN_AddressFamily addressFamily)
Definition: syncio_socket.c:54
int GWEN_Gui_Internal_ProgressEnd(GWEN_GUI *gui, uint32_t pid)
Definition: gui.c:1642
GWEN_SOCKET_LIST2_ITERATOR * GWEN_Socket_List2_First(GWEN_SOCKET_LIST2 *l)
int GWENHYWFAR_CB(* GWEN_GUI_RUN_DIALOG_FN)(GWEN_GUI *gui, GWEN_DIALOG *dlg, int timeout)
Definition: gui_be.h:249
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
Definition: db.c:131
#define GWEN_ERROR_TIMEOUT
Definition: error.h:71
int GWENHYWFAR_CB(* GWEN_GUI_OPEN_DIALOG_FN)(GWEN_GUI *gui, GWEN_DIALOG *dlg, uint32_t guiid)
Definition: gui_be.h:243
const char * GWEN_SslCertDescr_GetFingerPrintSha512(const GWEN_SSLCERTDESCR *st)
void GWEN_Dialog_free(GWEN_DIALOG *dlg)
Definition: dialog.c:88
int GWEN_Gui_SetPasswordStatus(const char *token, const char *pin, GWEN_GUI_PASSWORD_STATUS status, uint32_t guiid)
Definition: gui.c:1034
void GWEN_ProgressData_SetPreviousId(GWEN_PROGRESS_DATA *pd, uint32_t i)
Definition: progressdata.c:92
uint32_t GWEN_Dialog_GetGuiId(const GWEN_DIALOG *dlg)
Definition: dialog.c:140
#define GWEN_ERROR_INTERNAL
Definition: error.h:125
void GWEN_DlgProgress_Advanced(GWEN_DIALOG *dlg, GWEN_PROGRESS_DATA *pd)
Definition: dlg_progress.c:330
#define GWEN_ERROR_USER_ABORTED
Definition: error.h:65
void GWEN_ProgressData_SetShown(GWEN_PROGRESS_DATA *pd, int i)
Definition: progressdata.c:213
#define GWEN_ERROR_NO_DATA
Definition: error.h:94
int GWEN_Gui_ReadString(const char *text, GWEN_BUFFER *tbuf)
Definition: gui.c:306
void GWEN_Gui_SetName(GWEN_GUI *gui, const char *name)
Definition: gui.c:688
uint32_t GWEN_ProgressData_GetPreviousId(const GWEN_PROGRESS_DATA *pd)
Definition: progressdata.c:85
void GWEN_ProgressData_SetDialog(GWEN_PROGRESS_DATA *pd, GWEN_DIALOG *dlg)
Definition: progressdata.c:255
void GWEN_Gui_free(GWEN_GUI *gui)
Definition: gui.c:105
void GWEN_Gui_SetGui(GWEN_GUI *gui)
Definition: gui.c:152
int GWEN_Gui_GetFileName(const char *caption, GWEN_GUI_FILENAME_TYPE fnt, uint32_t flags, const char *patterns, GWEN_BUFFER *pathBuffer, uint32_t guiid)
Definition: gui.c:1448
void GWEN_ProgressData_AddFlags(GWEN_PROGRESS_DATA *pd, uint32_t fl)
Definition: progressdata.c:106
#define GWEN_TIMEOUT_NONE
int GWEN_Gui_StdPrintf(const GWEN_GUI *gui, FILE *stream, const char *fmt,...)
Definition: gui.c:251
void GWEN_Gui_ShowError(const char *title, const char *fmt,...)
Definition: gui.c:839
int GWENHYWFAR_CB(* GWEN_GUI_GETPASSWORD_FN)(GWEN_GUI *gui, uint32_t flags, const char *token, const char *title, const char *text, char *buffer, int minLen, int maxLen, GWEN_GUI_PASSWORD_METHOD methodId, GWEN_DB_NODE *methodParams, uint32_t guiid)
Definition: gui_be.h:151
const GWEN_TIME * GWEN_SslCertDescr_GetNotAfter(const GWEN_SSLCERTDESCR *st)
int GWEN_DB_ClearGroup(GWEN_DB_NODE *n, const char *path)
Definition: db.c:871
GWEN_DIALOG * GWEN_Dialog_List_Last(const GWEN_DIALOG_LIST *l)
int GWEN_Gui_CheckCert(const GWEN_SSLCERTDESCR *cd, GWEN_SYNCIO *sio, uint32_t guiid)
Definition: gui.c:1204
GWEN_STRINGLIST * GWEN_StringList_new(void)
Definition: stringlist.c:46
int GWEN_Gui_RunDialog(GWEN_DIALOG *dlg, int untilEnd)
Definition: gui.c:1439
uint32_t GWEN_Gui_Internal_ProgressStart(GWEN_GUI *gui, uint32_t progressFlags, const char *title, const char *text, uint64_t total, uint32_t guiid)
Definition: gui.c:1596
uint32_t GWEN_Gui_GetFlags(const GWEN_GUI *gui)
Definition: gui.c:660
int GWEN_DlgProgress_GetStayOpen(const GWEN_DIALOG *dlg)
Definition: dlg_progress.c:124
GWEN_GUI_EXEC_DIALOG_FN GWEN_Gui_SetExecDialogFn(GWEN_GUI *gui, GWEN_GUI_EXEC_DIALOG_FN f)
Definition: gui.c:547
GWEN_GUI_PROGRESS_ADVANCE_FN GWEN_Gui_SetProgressAdvanceFn(GWEN_GUI *gui, GWEN_GUI_PROGRESS_ADVANCE_FN f)
Definition: gui.c:425
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
void GWEN_DlgProgress_SetFirstProgress(GWEN_DIALOG *dlg, GWEN_PROGRESS_DATA *pd)
Definition: dlg_progress.c:179
const char * GWEN_SslCertDescr_GetLocalityName(const GWEN_SSLCERTDESCR *st)
int GWEN_Text_ToHexBuffer(const char *src, unsigned l, GWEN_BUFFER *buf, unsigned int groupsize, char delimiter, int skipLeadingZeroes)
Definition: text.c:740
GWEN_GUI_READ_DIALOG_PREFS_FN GWEN_Gui_SetReadDialogPrefsFn(GWEN_GUI *gui, GWEN_GUI_READ_DIALOG_PREFS_FN f)
Definition: gui.c:596
time_t GWEN_ProgressData_GetStartTime(const GWEN_PROGRESS_DATA *pd)
Definition: progressdata.c:220
int(* GWEN_GUI_PROGRESS_LOG_FN)(GWEN_GUI *gui, uint32_t id, GWEN_LOGGER_LEVEL level, const char *text)
Definition: gui_be.h:419
void GWEN_Gui_Internal_CheckShow(GWEN_GUI *gui, GWEN_PROGRESS_DATA *pd)
Definition: gui.c:1569
#define GWEN_UNUSED
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:1014
const char * GWEN_Gui_GetCharSet(const GWEN_GUI *gui)
Definition: gui.c:704
#define GWEN_TIMEOUT_FOREVER
uint32_t(* GWEN_GUI_PROGRESS_START_FN)(GWEN_GUI *gui, uint32_t progressFlags, const char *title, const char *text, uint64_t total, uint32_t guiid)
Definition: gui_be.h:391
GWEN_SOCKET * GWEN_Socket_List2Iterator_Next(GWEN_SOCKET_LIST2_ITERATOR *li)
const char * GWEN_SslCertDescr_GetStateOrProvinceName(const GWEN_SSLCERTDESCR *st)
#define GWEN_GUI_DELAY_SECS
Definition: gui.h:183
GWEN_GUI_WAITFORSOCKETS_FN GWEN_Gui_SetWaitForSocketsFn(GWEN_GUI *gui, GWEN_GUI_WAITFORSOCKETS_FN f)
Definition: gui.c:522
void GWEN_Gui_Internal_HideBox(GWEN_GUI *gui, uint32_t id)
Definition: gui.c:2010
#define GWEN_GUI_PROGRESS_SHOW_ABORT
Definition: gui.h:194
#define GWEN_GUI_MSG_FLAGS_TYPE_WARN
Definition: gui.h:287
void GWEN_ProgressData_free(GWEN_PROGRESS_DATA *pd)
Definition: progressdata.c:59
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition: error.h:108
GWEN_GUI_CHECKCERT_FN GWEN_Gui_SetCheckCertFn(GWEN_GUI *gui, GWEN_GUI_CHECKCERT_FN f)
Definition: gui.c:535