38 #include <glib/gi18n.h> 50 #define GET_DIALOG_OBJECT(object_name) gtk_builder_get_object(bu, object_name) 90 if (strcasecmp(needle, haystack) != 0)
100 TRACE_CALL(__func__);
110 store = GTK_LIST_STORE(mpcp->
store);
117 if (username == NULL)
134 gtk_list_store_append(store, &iter);
135 s = g_strdup_printf(
"%s\\%s", domain, username);
137 gtk_list_store_set(store, &iter,
138 COL_F, matchcount >= 3 ? TRUE : FALSE,
150 TRACE_CALL(__func__);
155 gboolean a = gtk_cell_renderer_toggle_get_active(cell);
156 path = gtk_tree_path_new_from_string(path_string);
157 gtk_tree_model_get_iter(GTK_TREE_MODEL(mpcp->
store), &iter, path);
158 gtk_tree_path_free(path);
159 gtk_list_store_set(mpcp->
store, &iter,
COL_F, !a, -1);
164 TRACE_CALL(__func__);
179 gtk_widget_set_sensitive(GTK_WIDGET(mpcp->
eGroup), ena);
180 gtk_widget_set_sensitive(GTK_WIDGET(mpcp->
eUsername), ena);
181 gtk_widget_set_sensitive(GTK_WIDGET(mpcp->
eDomain), ena);
182 gtk_widget_set_sensitive(GTK_WIDGET(mpcp->
ePassword1), ena);
183 gtk_widget_set_sensitive(GTK_WIDGET(mpcp->
ePassword2), ena);
184 gtk_widget_set_sensitive(GTK_WIDGET(mpcp->
btnDoChange), ena);
185 gtk_widget_set_sensitive(GTK_WIDGET(mpcp->
table), ena);
190 TRACE_CALL(__func__);
195 gtk_tree_model_get(GTK_TREE_MODEL(mpcp->
store), &mpcp->
iter,
COL_F, &sel, -1);
202 if (gtk_tree_model_iter_next(GTK_TREE_MODEL(mpcp->
store), &mpcp->
iter)) {
203 return G_SOURCE_CONTINUE;
205 gtk_dialog_response(mpcp->
dialog, 1);
207 return G_SOURCE_REMOVE;
213 TRACE_CALL(__func__);
215 const gchar *passwd1, *passwd2;
222 if (!gtk_tree_model_get_iter_first(GTK_TREE_MODEL(mpcp->
store), &mpcp->
iter))
225 passwd1 = gtk_entry_get_text(mpcp->
ePassword1);
226 passwd2 = gtk_entry_get_text(mpcp->
ePassword2);
228 if (g_strcmp0(passwd1, passwd2) != 0) {
229 GtkWidget *msgDialog;
230 msgDialog = gtk_message_dialog_new(GTK_WINDOW(mpcp->
dialog),
231 GTK_DIALOG_DESTROY_WITH_PARENT,
234 _(
"The passwords do not match"));
235 gtk_dialog_run(GTK_DIALOG(msgDialog));
236 gtk_widget_destroy(msgDialog);
244 gtk_label_set_text(mpcp->
statusLabel, _(
"Resetting passwords, please wait…"));
253 TRACE_CALL(__func__);
262 s = gtk_entry_get_text(mpcp->
eGroup);
264 mpcp->
group = g_strdup(s);
266 s = gtk_entry_get_text(mpcp->
eDomain);
268 mpcp->
domain = g_strdup(s);
274 if (mpcp->
store != NULL) {
275 gtk_tree_view_set_model(mpcp->
table, NULL);
277 mpcp->
store = gtk_list_store_new(
NUM_COLS, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
282 gtk_tree_view_set_model(mpcp->table, GTK_TREE_MODEL(mpcp->store));
284 return G_SOURCE_CONTINUE;
290 TRACE_CALL(__func__);
304 TRACE_CALL(__func__);
307 gtk_dialog_response(mpcp->
dialog, 1);
312 TRACE_CALL(__func__);
316 GtkWindow* mainwindow;
317 GtkCellRendererToggle *toggle;
326 if (secret_plugin == NULL) {
327 initerror = _(
"The multi password changer requires a secrecy plugin.\n");
330 initerror = _(
"The multi password changer requires a secrecy service.\n");
334 GtkWidget *msgDialog;
335 msgDialog = gtk_message_dialog_new(mainwindow, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
337 gtk_dialog_run(GTK_DIALOG(msgDialog));
338 gtk_widget_destroy(msgDialog);
345 remmina_debug(
"Unable to load the multiple password changer glade file interface\n");
349 dialog = GTK_DIALOG(gtk_builder_get_object(bu,
"MPCDialog"));
352 gtk_window_set_transient_for(GTK_WINDOW(dialog), mainwindow);
355 mpcp->
eGroup = GTK_ENTRY(GET_DIALOG_OBJECT(
"groupEntry"));
360 mpcp->eUsername = GTK_ENTRY(GET_DIALOG_OBJECT(
"usernameEntry"));
361 gtk_entry_set_text(mpcp->eUsername, mpcp->username);
364 mpcp->eDomain = GTK_ENTRY(GET_DIALOG_OBJECT(
"domainEntry"));
365 gtk_entry_set_text(mpcp->eDomain, mpcp->domain);
368 mpcp->ePassword1 = GTK_ENTRY(GET_DIALOG_OBJECT(
"password1Entry"));
369 gtk_entry_set_text(mpcp->ePassword1, mpcp->password);
371 mpcp->ePassword2 = GTK_ENTRY(GET_DIALOG_OBJECT(
"password2Entry"));
372 gtk_entry_set_text(mpcp->ePassword2, mpcp->password);
374 mpcp->statusLabel = GTK_LABEL(GET_DIALOG_OBJECT(
"statusLabel"));
379 mpcp->table = GTK_TREE_VIEW(GET_DIALOG_OBJECT(
"profchangelist"));
384 toggle = GTK_CELL_RENDERER_TOGGLE(GET_DIALOG_OBJECT(
"cellrenderertoggle1"));
387 mpcp->btnDoChange = GTK_BUTTON(GET_DIALOG_OBJECT(
"btnDoChange"));
390 gtk_dialog_run(dialog);
391 gtk_widget_destroy(GTK_WIDGET(dialog));
394 g_source_remove(mpcp->sid);
398 if (mpcp->searchentrychange_timeout_source_id) {
399 g_source_remove(mpcp->searchentrychange_timeout_source_id);
400 mpcp->searchentrychange_timeout_source_id = 0;
403 if (mpcp->changed_passwords_count) {
404 GtkWidget *msgDialog;
405 msgDialog = gtk_message_dialog_new(GTK_WINDOW(mpcp->dialog),
406 GTK_DIALOG_DESTROY_WITH_PARENT,
409 ngettext(
"%d password changed.",
"%d passwords changed.", mpcp->changed_passwords_count), mpcp->changed_passwords_count);
410 gtk_dialog_run(GTK_DIALOG(msgDialog));
411 gtk_widget_destroy(msgDialog);
415 g_free(mpcp->username);
416 g_free(mpcp->password);
417 g_free(mpcp->domain);
432 TRACE_CALL(__func__);
436 mpcp->
username = g_strdup(username);
437 mpcp->
password = g_strdup(password);
438 mpcp->
domain = g_strdup(domain);
439 mpcp->
group = g_strdup(group);
RemminaFile * remmina_file_load(const gchar *filename)
void remmina_file_free(RemminaFile *remminafile)
const gchar * remmina_file_get_string(RemminaFile *remminafile, const gchar *setting)
guint searchentrychange_timeout_source_id
static void remmina_mpchange_stopsearch(GtkSearchEntry *entry, gpointer user_data)
GtkWindow * remmina_main_get_window()
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
RemminaSecretPlugin * remmina_plugin_manager_get_secret_plugin(void)
GtkBuilder * remmina_public_gtk_builder_new_from_file(gchar *filename)
static gboolean remmina_mpchange_fieldcompare(const gchar *needle, const gchar *haystack, int *matchcount)
gboolean(* is_service_available)(void)
static void remmina_mpchange_file_list_callback(RemminaFile *remminafile, gpointer user_data)
static void remmina_mpchange_searchfield_changed(GtkSearchEntry *se, gpointer user_data)
void remmina_debug(const gchar *fmt,...)
Print a string in the Remmina Debug Windows and in the terminal.
static gboolean remmina_file_multipasswd_changer_mt(gpointer d)
void remmina_mpchange_schedule(gboolean has_domain, const gchar *group, const gchar *domain, const gchar *username, const gchar *password)
static gboolean remmina_mpchange_searchfield_changed_to(gpointer user_data)
static void enable_inputs(struct mpchanger_params *mpcp, gboolean ena)
static void remmina_mpchange_dochange(gchar *fname, struct mpchanger_params *mpcp)
void remmina_file_store_secret_plugin_password(RemminaFile *remminafile, const gchar *key, const gchar *value)
static void remmina_mpchange_dochange_clicked(GtkButton *btn, gpointer user_data)
int changed_passwords_count
static void remmina_mpchange_checkbox_toggle(GtkCellRendererToggle *cell, gchar *path_string, gpointer user_data)
static gboolean changenext(gpointer user_data)
gint remmina_file_manager_iterate(GFunc func, gpointer user_data)