anastasis-gtk_handle-challenge-totp.c (3687B)
1 /* 2 This file is part of anastasis-gtk. 3 Copyright (C) 2021 Anastasis SARL 4 5 Anastasis is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published 7 by the Free Software Foundation; either version 3, or (at your 8 option) any later version. 9 10 Anastasis is distributed in the hope that it will be useful, but 11 WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with Anastasis; see the file COPYING. If not, write to the 17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18 Boston, MA 02110-1301, USA. 19 */ 20 21 /** 22 * @file src/anastasis/anastasis-gtk_handle-challenge-totp.c 23 * @brief Handle dialogs for code returned to challenge address (TOTP) 24 * @author Christian Grothoff 25 */ 26 #include <gnunet/gnunet_util_lib.h> 27 #include "anastasis-gtk_action.h" 28 #include "anastasis-gtk_helper.h" 29 #include "anastasis-gtk_handle-identity-changed.h" 30 #include <jansson.h> 31 32 33 /** 34 * Function called from the secure question challenge dialog upon completion. 35 * 36 * @param dialog the pseudonym selection dialog 37 * @param response_id response totp from the dialog 38 * @param user_data the builder of the dialog 39 */ 40 void 41 anastasis_gtk_c_totp_dialog_response_cb (GtkDialog *dialog, 42 gint response_id, 43 gpointer user_data) 44 { 45 GtkBuilder *builder = GTK_BUILDER (user_data); 46 GtkEntry *q; 47 const char *qs; 48 json_t *args; 49 unsigned long long pin; 50 char dummy; 51 52 if (GTK_RESPONSE_OK != response_id) 53 { 54 gtk_widget_destroy (GTK_WIDGET (dialog)); 55 g_object_unref (G_OBJECT (builder)); 56 GNUNET_assert (NULL == AG_ra); 57 AG_ra = ANASTASIS_redux_action (AG_redux_state, 58 "back", 59 NULL, 60 &AG_action_cb, 61 NULL); 62 return; 63 } 64 q = GTK_ENTRY (gtk_builder_get_object (builder, 65 "anastasis_gtk_c_totp_entry")); 66 qs = gtk_entry_get_text (q); 67 if (1 != sscanf (qs, 68 "%llu%c", 69 &pin, 70 &dummy)) 71 { 72 GNUNET_break (0); 73 return; 74 } 75 args = GNUNET_JSON_PACK ( 76 GNUNET_JSON_pack_uint64 ("pin", 77 pin)); 78 gtk_widget_destroy (GTK_WIDGET (dialog)); 79 g_object_unref (G_OBJECT (builder)); 80 AG_freeze (); 81 AG_ra = ANASTASIS_redux_action (AG_redux_state, 82 "solve_challenge", 83 args, 84 &AG_action_cb, 85 NULL); 86 json_decref (args); 87 } 88 89 90 void 91 anastasis_gtk_c_totp_dialog_answer_entry_changed_cb (GtkEntry *entry, 92 gpointer user_data) 93 { 94 GtkBuilder *builder = GTK_BUILDER (user_data); 95 GtkEntry *a; 96 const char *as; 97 unsigned int pin; 98 char dummy; 99 bool ok; 100 101 a = GTK_ENTRY (gtk_builder_get_object (builder, 102 "anastasis_gtk_c_totp_entry")); 103 as = gtk_entry_get_text (a); 104 ok = ( (NULL != as) && 105 (8 == strlen (as)) && 106 (1 == sscanf (as, 107 "%u%c", 108 &pin, 109 &dummy)) ); 110 gtk_widget_set_sensitive ( 111 GTK_WIDGET (gtk_builder_get_object (builder, 112 "anastasis_gtk_c_totp_dialog_btn_ok")), 113 ok); 114 }