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