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