mirror of
https://git.pwmt.org/pwmt/zathura.git
synced 2024-12-29 12:55:59 +01:00
Ask for password if file is encrypted
This commit is contained in:
parent
7ca0f3b20e
commit
1d606ef027
5 changed files with 97 additions and 7 deletions
49
callbacks.c
49
callbacks.c
|
@ -220,3 +220,52 @@ cb_file_monitor(GFileMonitor* monitor, GFile* file, GFile* UNUSED(other_file), G
|
|||
|
||||
sc_reload(session, NULL, NULL, 0);
|
||||
}
|
||||
|
||||
bool
|
||||
cb_password_dialog(GtkEntry* entry, zathura_password_dialog_info_t* dialog)
|
||||
{
|
||||
if (entry == NULL || dialog == NULL) {
|
||||
goto error_ret;
|
||||
}
|
||||
|
||||
if (dialog->path == NULL) {
|
||||
free(dialog);
|
||||
goto error_ret;
|
||||
}
|
||||
|
||||
if (dialog->zathura == NULL) {
|
||||
goto error_free;
|
||||
}
|
||||
|
||||
char* input = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
|
||||
|
||||
/* no or empty password: ask again */
|
||||
if (input == NULL || strlen(input) == 0) {
|
||||
if (input != NULL) {
|
||||
g_free(input);
|
||||
}
|
||||
|
||||
girara_dialog(dialog->zathura->ui.session, "Enter password:", true, NULL,
|
||||
(girara_callback_inputbar_activate_t) cb_password_dialog, dialog);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* try to open document again */
|
||||
document_open(dialog->zathura, dialog->path, input);
|
||||
|
||||
g_free(input);
|
||||
g_free(dialog->path);
|
||||
free(dialog);
|
||||
|
||||
return true;
|
||||
|
||||
error_free:
|
||||
|
||||
g_free(dialog->path);
|
||||
free(dialog);
|
||||
|
||||
error_ret:
|
||||
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -78,4 +78,13 @@ bool cb_sc_follow(GtkEntry* entry, girara_session_t* session);
|
|||
void cb_file_monitor(GFileMonitor* monitor, GFile* file, GFile* other_file,
|
||||
GFileMonitorEvent event, girara_session_t* session);
|
||||
|
||||
/**
|
||||
* Callback to read new password for file that should be opened
|
||||
*
|
||||
* @param entry The password entry
|
||||
* @param dialog The dialog information
|
||||
* @return true if input has been handled
|
||||
*/
|
||||
bool cb_password_dialog(GtkEntry* entry, zathura_password_dialog_info_t* dialog);
|
||||
|
||||
#endif // CALLBACKS_H
|
||||
|
|
36
document.c
36
document.c
|
@ -28,6 +28,7 @@
|
|||
#include <girara/datastructures.h>
|
||||
#include <girara/utils.h>
|
||||
#include <girara/statusbar.h>
|
||||
#include <girara/session.h>
|
||||
|
||||
/**
|
||||
* Register document plugin
|
||||
|
@ -262,6 +263,36 @@ zathura_document_open(zathura_t* zathura, const char* path, const char* password
|
|||
document->scale = 1.0;
|
||||
document->zathura = zathura;
|
||||
|
||||
/* open document */
|
||||
if (plugin->open_function == NULL) {
|
||||
girara_error("plugin has no open function\n");
|
||||
goto error_free;
|
||||
}
|
||||
|
||||
zathura_plugin_error_t error = plugin->open_function(document);
|
||||
if (error != ZATHURA_PLUGIN_ERROR_OK) {
|
||||
while (error == ZATHURA_PLUGIN_ERROR_INVALID_PASSWORD) {
|
||||
zathura_password_dialog_info_t* password_dialog_info = malloc(sizeof(zathura_password_dialog_info_t));
|
||||
if (password_dialog_info != NULL) {
|
||||
password_dialog_info->path = g_strdup(path);
|
||||
password_dialog_info->zathura = zathura;
|
||||
|
||||
if (path != NULL) {
|
||||
girara_dialog(zathura->ui.session, "Enter password:", true, NULL,
|
||||
(girara_callback_inputbar_activate_t) cb_password_dialog, password_dialog_info);
|
||||
goto error_free;
|
||||
} else {
|
||||
free(password_dialog_info);
|
||||
}
|
||||
}
|
||||
goto error_free;
|
||||
}
|
||||
|
||||
girara_error("could not open document\n");
|
||||
goto error_free;
|
||||
}
|
||||
|
||||
/* read history file */
|
||||
int offset = 0;
|
||||
zathura_db_get_fileinfo(zathura->database, document->file_path,
|
||||
&document->current_page_number, &offset, &document->scale);
|
||||
|
@ -276,11 +307,6 @@ zathura_document_open(zathura_t* zathura, const char* path, const char* password
|
|||
document->current_page_number = 1;
|
||||
}
|
||||
|
||||
if (plugin->open_function == NULL || plugin->open_function(document) != ZATHURA_PLUGIN_ERROR_OK) {
|
||||
girara_error("could not open file\n");
|
||||
goto error_free;
|
||||
}
|
||||
|
||||
/* update statusbar */
|
||||
girara_statusbar_item_set_text(zathura->ui.session, zathura->ui.statusbar.file, real_path);
|
||||
|
||||
|
|
|
@ -67,6 +67,12 @@ typedef enum zathura_document_meta_e
|
|||
ZATHURA_DOCUMENT_MODIFICATION_DATE /**< Modification data */
|
||||
} zathura_document_meta_t;
|
||||
|
||||
typedef struct zathura_password_dialog_info_s
|
||||
{
|
||||
char* path; /**< Path to the file */
|
||||
zathura_t* zathura; /**< Zathura session */
|
||||
} zathura_password_dialog_info_t;
|
||||
|
||||
/**
|
||||
* Function prototype that is called to register a document plugin
|
||||
*
|
||||
|
|
|
@ -147,7 +147,7 @@ sc_follow(girara_session_t* session, girara_argument_t* UNUSED(argument),
|
|||
|
||||
/* ask for input */
|
||||
if (show_links == true) {
|
||||
girara_dialog(zathura->ui.session, "Follow link:", FALSE, NULL, (girara_callback_inputbar_activate_t) cb_sc_follow);
|
||||
girara_dialog(zathura->ui.session, "Follow link:", FALSE, NULL, (girara_callback_inputbar_activate_t) cb_sc_follow, NULL);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
Loading…
Reference in a new issue