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