mirror of
https://git.pwmt.org/pwmt/zathura.git
synced 2025-01-01 09:16:00 +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);
|
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,
|
void cb_file_monitor(GFileMonitor* monitor, GFile* file, GFile* other_file,
|
||||||
GFileMonitorEvent event, girara_session_t* session);
|
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
|
#endif // CALLBACKS_H
|
||||||
|
|
36
document.c
36
document.c
|
@ -28,6 +28,7 @@
|
||||||
#include <girara/datastructures.h>
|
#include <girara/datastructures.h>
|
||||||
#include <girara/utils.h>
|
#include <girara/utils.h>
|
||||||
#include <girara/statusbar.h>
|
#include <girara/statusbar.h>
|
||||||
|
#include <girara/session.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register document plugin
|
* Register document plugin
|
||||||
|
@ -262,6 +263,36 @@ zathura_document_open(zathura_t* zathura, const char* path, const char* password
|
||||||
document->scale = 1.0;
|
document->scale = 1.0;
|
||||||
document->zathura = zathura;
|
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;
|
int offset = 0;
|
||||||
zathura_db_get_fileinfo(zathura->database, document->file_path,
|
zathura_db_get_fileinfo(zathura->database, document->file_path,
|
||||||
&document->current_page_number, &offset, &document->scale);
|
&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;
|
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 */
|
/* update statusbar */
|
||||||
girara_statusbar_item_set_text(zathura->ui.session, zathura->ui.statusbar.file, real_path);
|
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_MODIFICATION_DATE /**< Modification data */
|
||||||
} zathura_document_meta_t;
|
} 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
|
* 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 */
|
/* ask for input */
|
||||||
if (show_links == true) {
|
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;
|
return false;
|
||||||
|
|
Loading…
Reference in a new issue