Skip to content

Commit

Permalink
Prompt for file again, fix #335
Browse files Browse the repository at this point in the history
  • Loading branch information
paolostivanin committed Feb 9, 2024
1 parent 8a3d11a commit af69923
Show file tree
Hide file tree
Showing 9 changed files with 98 additions and 39 deletions.
5 changes: 3 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.16)
project(OTPClient VERSION "3.3.0" LANGUAGES "C")
project(OTPClient VERSION "3.4.0" LANGUAGES "C")
include(GNUInstallDirs)

configure_file("src/common/version.h.in" "version.h")
Expand Down Expand Up @@ -88,7 +88,8 @@ set(GUI_HEADER_FILES
src/shortcuts-cb.h
src/webcam-add-cb.h
src/edit-row-cb.h
src/show-qr-cb.h src/dbinfo-cb.h)
src/show-qr-cb.h src/dbinfo-cb.h
src/change-file-cb.h)

set(GUI_SOURCE_FILES
src/common/common.c
Expand Down
6 changes: 5 additions & 1 deletion src/app.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "edit-row-cb.h"
#include "show-qr-cb.h"
#include "dbinfo-cb.h"
#include "change-file-cb.h"

#ifndef USE_FLATPAK_APP_FOLDER
static gchar *get_db_path (AppData *app_data);
Expand Down Expand Up @@ -208,11 +209,14 @@ activate (GtkApplication *app,
retry:
app_data->db_data->key = prompt_for_password (app_data, NULL, NULL, FALSE);
if (app_data->db_data->key == NULL) {
if (change_file (app_data) == FALSE) {
retry_change_file:
if (change_file (app_data) == QUIT_APP) {
g_free (app_data->db_data);
g_free (app_data);
g_application_quit (G_APPLICATION(app));
return;
} else {
goto retry_change_file;
}
}
}
Expand Down
56 changes: 37 additions & 19 deletions src/change-db-cb.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,12 @@
#include "password-cb.h"
#include "db-actions.h"
#include "secret-schema.h"
#include "change-file-cb.h"


void
change_db_cb (GSimpleAction *simple __attribute__((unused)),
GVariant *parameter __attribute__((unused)),
gpointer user_data)
int
change_db (AppData *app_data)
{
AppData *app_data = (AppData *)user_data;

GtkWidget *changedb_diag = GTK_WIDGET(gtk_builder_get_object (app_data->builder, "changedb_diag_id"));
GtkWidget *old_changedb_entry = GTK_WIDGET(gtk_builder_get_object (app_data->builder, "changedb_olddb_entry_id"));
GtkWidget *new_changedb_entry = GTK_WIDGET(gtk_builder_get_object (app_data->builder, "changedb_entry_id"));
Expand All @@ -29,29 +26,50 @@ change_db_cb (GSimpleAction *simple __attribute__((unused)),
gint result = gtk_dialog_run (GTK_DIALOG (changedb_diag));
switch (result) {
case GTK_RESPONSE_OK:
if (gtk_entry_get_text_length (GTK_ENTRY(new_changedb_entry)) == 0) {
show_message_dialog (app_data->main_window, "Input path cannot be empty.", GTK_MESSAGE_ERROR);
gtk_widget_hide (changedb_diag);
return RETRY_CHANGE;
}
new_db_path = gtk_entry_get_text (GTK_ENTRY(new_changedb_entry));
if (!g_file_test (new_db_path, G_FILE_TEST_IS_REGULAR) || g_file_test (new_db_path,G_FILE_TEST_IS_SYMLINK)){
show_message_dialog (app_data->main_window, "Selected file is either a symlink or a non regular file.\nPlease choose another file.", GTK_MESSAGE_ERROR);
} else {
g_free (app_data->db_data->db_path);
app_data->db_data->db_path = g_strdup (new_db_path);
update_cfg_file (app_data);
gcry_free (app_data->db_data->key);
app_data->db_data->key = prompt_for_password (app_data, NULL, NULL, FALSE);
secret_password_store (OTPCLIENT_SCHEMA, SECRET_COLLECTION_DEFAULT, "main_pwd", app_data->db_data->key, NULL, on_password_stored, NULL, "string", "main_pwd", NULL);
GError *err = NULL;
load_new_db (app_data, &err);
if (err != NULL) {
show_message_dialog (app_data->main_window, err->message, GTK_MESSAGE_ERROR);
g_clear_error (&err);
}
gtk_widget_hide (changedb_diag);
return RETRY_CHANGE;
}
g_free (app_data->db_data->db_path);
app_data->db_data->db_path = g_strdup (new_db_path);
update_cfg_file (app_data);
gcry_free (app_data->db_data->key);
app_data->db_data->key = prompt_for_password (app_data, NULL, NULL, FALSE);
secret_password_store (OTPCLIENT_SCHEMA, SECRET_COLLECTION_DEFAULT, "main_pwd", app_data->db_data->key, NULL, on_password_stored, NULL, "string", "main_pwd", NULL);
GError *err = NULL;
load_new_db (app_data, &err);
if (err != NULL) {
show_message_dialog (app_data->main_window, err->message, GTK_MESSAGE_ERROR);
g_clear_error (&err);
}
break;
case GTK_RESPONSE_CANCEL:
gtk_widget_destroy (changedb_diag);
return QUIT_APP;
default:
break;
}
gtk_widget_destroy (changedb_diag);

return CHANGE_OK;
}


void
change_db_cb (GSimpleAction *action_name __attribute__((unused)),
GVariant *parameter __attribute__((unused)),
gpointer user_data)
{
AppData *app_data = (AppData *)user_data;

change_db (app_data);
}


Expand Down
2 changes: 2 additions & 0 deletions src/change-db-cb.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

G_BEGIN_DECLS

int change_db (AppData *app_data);

void change_db_cb (GSimpleAction *simple,
GVariant *parameter,
gpointer user_data);
Expand Down
14 changes: 7 additions & 7 deletions src/change-file-cb.c
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
#include <gtk/gtk.h>
#include "new-db-cb.h"
#include "change-db-cb.h"
#include "db-misc.h"
#include "change-file-cb.h"
#include "message-dialogs.h"

gboolean
int
change_file (AppData *app_data)
{
GtkWidget *label = GTK_WIDGET(gtk_builder_get_object (app_data->builder, "diag_changefile_label_id"));
Expand All @@ -21,18 +21,18 @@ change_file (AppData *app_data)
switch (result) {
case GTK_RESPONSE_ACCEPT:
// select an existing DB.
change_db_cb (NULL, NULL, app_data);
res = TRUE;
res = change_db (app_data);
break;
case GTK_RESPONSE_OK:
// create a new db.
new_db_cb (NULL, NULL, app_data);
res = TRUE;
res = new_db (app_data);
break;
case GTK_RESPONSE_CANCEL:
case GTK_RESPONSE_CLOSE:
res = QUIT_APP;
default:
break;
}

gtk_widget_hide (diag_changefile);

return res;
Expand Down
13 changes: 13 additions & 0 deletions src/change-file-cb.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#pragma once

#include "data.h"

G_BEGIN_DECLS

#define QUIT_APP 50
#define RETRY_CHANGE 51
#define CHANGE_OK 52

int change_file (AppData *app_data);

G_END_DECLS
30 changes: 25 additions & 5 deletions src/new-db-cb.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,11 @@
#include "password-cb.h"
#include "db-actions.h"
#include "secret-schema.h"
#include "change-file-cb.h"

void
new_db_cb (GSimpleAction *simple __attribute__((unused)),
GVariant *parameter __attribute__((unused)),
gpointer user_data)
int
new_db (AppData *app_data)
{
AppData *app_data = (AppData *)user_data;
GtkWidget *newdb_diag = GTK_WIDGET(gtk_builder_get_object (app_data->builder, "newdb_diag_id"));
GtkWidget *newdb_entry = GTK_WIDGET(gtk_builder_get_object (app_data->builder, "newdb_entry_id"));

Expand All @@ -24,10 +22,17 @@ new_db_cb (GSimpleAction *simple __attribute__((unused)),
gint result = gtk_dialog_run (GTK_DIALOG (newdb_diag));
switch (result) {
case GTK_RESPONSE_OK:
if (gtk_entry_get_text_length (GTK_ENTRY(newdb_entry)) == 0) {
show_message_dialog (app_data->main_window, "Input cannot be empty.", GTK_MESSAGE_ERROR);
gtk_widget_hide (newdb_diag);
return RETRY_CHANGE;
}
new_db_path_with_suffix = g_string_new (gtk_entry_get_text (GTK_ENTRY(newdb_entry)));
g_string_append (new_db_path_with_suffix, ".enc");
if (g_file_test (new_db_path_with_suffix->str, G_FILE_TEST_IS_REGULAR) || g_file_test (new_db_path_with_suffix->str, G_FILE_TEST_IS_SYMLINK)) {
show_message_dialog (app_data->main_window, "Selected file already exists, please choose another filename.", GTK_MESSAGE_ERROR);
g_string_free (new_db_path_with_suffix, TRUE);
return RETRY_CHANGE;
} else {
g_free (app_data->db_data->db_path);
app_data->db_data->db_path = g_strdup (new_db_path_with_suffix->str);
Expand All @@ -51,8 +56,23 @@ new_db_cb (GSimpleAction *simple __attribute__((unused)),
g_string_free (new_db_path_with_suffix, TRUE);
break;
case GTK_RESPONSE_CANCEL:
gtk_widget_destroy (newdb_diag);
return QUIT_APP;
default:
break;
}
gtk_widget_destroy (newdb_diag);

return TRUE;
}


void
new_db_cb (GSimpleAction *simple __attribute__((unused)),
GVariant *parameter __attribute__((unused)),
gpointer user_data)
{
AppData *app_data = (AppData *)user_data;

new_db (app_data);
}
9 changes: 6 additions & 3 deletions src/new-db-cb.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
#pragma once

#include <gtk/gtk.h>
#include "data.h"

G_BEGIN_DECLS

void new_db_cb (GSimpleAction *simple,
GVariant *parameter,
gpointer user_data);
gboolean new_db (AppData *app_data);

void new_db_cb (GSimpleAction *simple,
GVariant *parameter,
gpointer user_data);

G_END_DECLS
2 changes: 0 additions & 2 deletions src/otpclient.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ G_BEGIN_DECLS
void activate (GtkApplication *app,
gpointer user_data);

gboolean change_file (AppData *app_data);

void add_qr_from_file (GSimpleAction *simple,
GVariant *parameter,
gpointer user_data);
Expand Down

0 comments on commit af69923

Please sign in to comment.