mirror of
https://git.pwmt.org/pwmt/zathura.git
synced 2025-01-14 15:16:01 +01:00
Enter password dialog
If the user tries to open an encrypted file, zathura aks for the password in form of a dialog.
This commit is contained in:
parent
b6f367612b
commit
fab51efea3
2 changed files with 65 additions and 16 deletions
|
@ -180,6 +180,5 @@ SpecialCommand special_commands[] = {
|
||||||
Setting settings[] = {
|
Setting settings[] = {
|
||||||
/* name, variable, type, render, description */
|
/* name, variable, type, render, description */
|
||||||
{"recolor", &(Zathura.Global.recolor), 'b', TRUE, "Invert the image"},
|
{"recolor", &(Zathura.Global.recolor), 'b', TRUE, "Invert the image"},
|
||||||
{"password", &(Zathura.PDF.password), 's', FALSE, "The password of the document"},
|
|
||||||
{"offset", &(Zathura.PDF.page_offset), 'i', FALSE, "Optional page offset"},
|
{"offset", &(Zathura.PDF.page_offset), 'i', FALSE, "Optional page offset"},
|
||||||
};
|
};
|
||||||
|
|
80
zathura.c
80
zathura.c
|
@ -289,6 +289,7 @@ void add_marker(int);
|
||||||
void build_index(GtkTreeModel*, GtkTreeIter*, PopplerIndexIter*);
|
void build_index(GtkTreeModel*, GtkTreeIter*, PopplerIndexIter*);
|
||||||
void change_mode(int);
|
void change_mode(int);
|
||||||
void calculate_offset(GtkWidget*, double*, double*);
|
void calculate_offset(GtkWidget*, double*, double*);
|
||||||
|
void enter_password();
|
||||||
void highlight_result(int, PopplerRectangle*);
|
void highlight_result(int, PopplerRectangle*);
|
||||||
void draw(int);
|
void draw(int);
|
||||||
void eval_marker(int);
|
void eval_marker(int);
|
||||||
|
@ -371,6 +372,7 @@ gboolean cb_index_row_activated(GtkTreeView*, GtkTreePath*, GtkTreeViewColumn*,
|
||||||
gboolean cb_inputbar_kb_pressed(GtkWidget*, GdkEventKey*, gpointer);
|
gboolean cb_inputbar_kb_pressed(GtkWidget*, GdkEventKey*, gpointer);
|
||||||
gboolean cb_inputbar_activate(GtkEntry*, gpointer);
|
gboolean cb_inputbar_activate(GtkEntry*, gpointer);
|
||||||
gboolean cb_inputbar_form_activate(GtkEntry*, gpointer);
|
gboolean cb_inputbar_form_activate(GtkEntry*, gpointer);
|
||||||
|
gboolean cb_inputbar_password_activate(GtkEntry*, gpointer);
|
||||||
gboolean cb_view_kb_pressed(GtkWidget*, GdkEventKey*, gpointer);
|
gboolean cb_view_kb_pressed(GtkWidget*, GdkEventKey*, gpointer);
|
||||||
gboolean cb_view_resized(GtkWidget*, GtkAllocation*, gpointer);
|
gboolean cb_view_resized(GtkWidget*, GtkAllocation*, gpointer);
|
||||||
gboolean cb_view_button_pressed(GtkWidget*, GdkEventButton*, gpointer);
|
gboolean cb_view_button_pressed(GtkWidget*, GdkEventButton*, gpointer);
|
||||||
|
@ -812,7 +814,18 @@ calculate_offset(GtkWidget* widget, double* offset_x, double* offset_y)
|
||||||
*offset_y = (window_y - height) / 2;
|
*offset_y = (window_y - height) / 2;
|
||||||
else
|
else
|
||||||
*offset_y = 0;
|
*offset_y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
enter_password()
|
||||||
|
{
|
||||||
|
/* replace default inputbar handler */
|
||||||
|
g_signal_handler_disconnect((gpointer) Zathura.UI.inputbar, Zathura.Handler.inputbar_activate);
|
||||||
|
Zathura.Handler.inputbar_activate = g_signal_connect(G_OBJECT(Zathura.UI.inputbar), "activate", G_CALLBACK(cb_inputbar_password_activate), NULL);
|
||||||
|
|
||||||
|
Argument argument;
|
||||||
|
argument.data = "Enter password: ";
|
||||||
|
sc_focus_inputbar(&argument);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -879,6 +892,7 @@ gboolean
|
||||||
open_file(char* path, char* password)
|
open_file(char* path, char* password)
|
||||||
{
|
{
|
||||||
g_static_mutex_lock(&(Zathura.Lock.pdf_obj_lock));
|
g_static_mutex_lock(&(Zathura.Lock.pdf_obj_lock));
|
||||||
|
|
||||||
/* get filename */
|
/* get filename */
|
||||||
char* file = realpath(path, NULL);
|
char* file = realpath(path, NULL);
|
||||||
|
|
||||||
|
@ -895,15 +909,14 @@ open_file(char* path, char* password)
|
||||||
{
|
{
|
||||||
notify(ERROR, "File does not exist");
|
notify(ERROR, "File does not exist");
|
||||||
free(file);
|
free(file);
|
||||||
|
g_static_mutex_unlock(&(Zathura.Lock.pdf_obj_lock));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* close old file */
|
/* close old file */
|
||||||
|
g_static_mutex_unlock(&(Zathura.Lock.pdf_obj_lock));
|
||||||
cmd_close(-1, NULL);
|
cmd_close(-1, NULL);
|
||||||
|
g_static_mutex_lock(&(Zathura.Lock.pdf_obj_lock));
|
||||||
/* check saved password */
|
|
||||||
if(!password)
|
|
||||||
password = (Zathura.PDF.password && strlen(Zathura.PDF.password) != 0) ? Zathura.PDF.password : NULL;
|
|
||||||
|
|
||||||
/* format path */
|
/* format path */
|
||||||
GError* error = NULL;
|
GError* error = NULL;
|
||||||
|
@ -920,21 +933,34 @@ open_file(char* path, char* password)
|
||||||
|
|
||||||
/* open file */
|
/* open file */
|
||||||
g_static_mutex_lock(&(Zathura.Lock.pdflib_lock));
|
g_static_mutex_lock(&(Zathura.Lock.pdflib_lock));
|
||||||
Zathura.PDF.document = poppler_document_new_from_file(file_uri, password ? password : NULL, &error);
|
Zathura.PDF.document = poppler_document_new_from_file(file_uri, password, &error);
|
||||||
g_static_mutex_unlock(&(Zathura.Lock.pdflib_lock));
|
g_static_mutex_unlock(&(Zathura.Lock.pdflib_lock));
|
||||||
g_free(file_uri);
|
g_free(file_uri);
|
||||||
|
|
||||||
if(!Zathura.PDF.document)
|
if(!Zathura.PDF.document)
|
||||||
{
|
{
|
||||||
char* message = (error->code == 1) ? "(Use \":set password\" to set the password)" : "";
|
if(error->code == 1)
|
||||||
message = g_strdup_printf("Can not open file: %s %s", error->message, message);
|
{
|
||||||
notify(ERROR, message);
|
g_error_free(error);
|
||||||
g_free(message);
|
Zathura.PDF.file = file;
|
||||||
g_error_free(error);
|
g_static_mutex_unlock(&(Zathura.Lock.pdf_obj_lock));
|
||||||
g_static_mutex_unlock(&(Zathura.Lock.pdf_obj_lock));
|
enter_password();
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char* message = g_strdup_printf("Can not open file: %s", error->message);
|
||||||
|
notify(ERROR, message);
|
||||||
|
g_free(message);
|
||||||
|
g_error_free(error);
|
||||||
|
g_static_mutex_unlock(&(Zathura.Lock.pdf_obj_lock));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* save password */
|
||||||
|
Zathura.PDF.password = password;
|
||||||
|
|
||||||
/* inotify */
|
/* inotify */
|
||||||
if(Zathura.Inotify.fd != -1)
|
if(Zathura.Inotify.fd != -1)
|
||||||
{
|
{
|
||||||
|
@ -2283,8 +2309,8 @@ cmd_close(int argc, char** argv)
|
||||||
|
|
||||||
g_static_mutex_lock(&(Zathura.Lock.pdf_obj_lock));
|
g_static_mutex_lock(&(Zathura.Lock.pdf_obj_lock));
|
||||||
Zathura.PDF.document = NULL;
|
Zathura.PDF.document = NULL;
|
||||||
Zathura.PDF.file = "";
|
Zathura.PDF.file = NULL;
|
||||||
Zathura.PDF.password = "";
|
Zathura.PDF.password = NULL;
|
||||||
Zathura.PDF.page_number = 0;
|
Zathura.PDF.page_number = 0;
|
||||||
Zathura.PDF.number_of_pages = 0;
|
Zathura.PDF.number_of_pages = 0;
|
||||||
Zathura.PDF.scale = 0;
|
Zathura.PDF.scale = 0;
|
||||||
|
@ -2573,7 +2599,7 @@ cmd_open(int argc, char** argv)
|
||||||
filepath = g_string_append(filepath, argv[i]);
|
filepath = g_string_append(filepath, argv[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return open_file(filepath->str, Zathura.PDF.password);
|
return open_file(filepath->str, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
@ -3333,6 +3359,29 @@ cb_inputbar_form_activate(GtkEntry* entry, gpointer data)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
cb_inputbar_password_activate(GtkEntry* entry, gpointer data)
|
||||||
|
{
|
||||||
|
gchar *input = gtk_editable_get_chars(GTK_EDITABLE(entry), 1, -1);
|
||||||
|
gchar *token = input + strlen("Enter password: ") - 1;
|
||||||
|
if(!token)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if(!open_file(Zathura.PDF.file, token))
|
||||||
|
{
|
||||||
|
enter_password();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* replace default inputbar handler */
|
||||||
|
g_signal_handler_disconnect((gpointer) Zathura.UI.inputbar, Zathura.Handler.inputbar_activate);
|
||||||
|
Zathura.Handler.inputbar_activate = g_signal_connect(G_OBJECT(Zathura.UI.inputbar), "activate", G_CALLBACK(cb_inputbar_activate), NULL);
|
||||||
|
|
||||||
|
isc_abort(NULL);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
cb_view_kb_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
cb_view_kb_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
||||||
{
|
{
|
||||||
|
@ -3567,6 +3616,7 @@ int main(int argc, char* argv[])
|
||||||
if(argc >= 2)
|
if(argc >= 2)
|
||||||
open_file(argv[1], (argc == 3) ? argv[2] : NULL);
|
open_file(argv[1], (argc == 3) ? argv[2] : NULL);
|
||||||
|
|
||||||
|
switch_view(Zathura.UI.document);
|
||||||
update_status();
|
update_status();
|
||||||
|
|
||||||
gtk_widget_show_all(GTK_WIDGET(Zathura.UI.window));
|
gtk_widget_show_all(GTK_WIDGET(Zathura.UI.window));
|
||||||
|
|
Loading…
Reference in a new issue