summaryrefslogtreecommitdiff
path: root/platform/gl/gl-form.c
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-07-04 12:21:30 +0200
committerTor Andersson <tor.andersson@artifex.com>2018-07-06 13:54:49 +0200
commitcd2ae94337aa32e54f6a89945c2069024aad6d12 (patch)
treefb7a238a15d84b3984ccc6737a607009a12da884 /platform/gl/gl-form.c
parentf265c6b08f2366ffa7198cdc52c6e1884f7e4226 (diff)
downloadmupdf-cd2ae94337aa32e54f6a89945c2069024aad6d12.tar.xz
gl: Add signing UI for Digital Signatures.
All the "Sign" button does for now is recreate the appearance stream.
Diffstat (limited to 'platform/gl/gl-form.c')
-rw-r--r--platform/gl/gl-form.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/platform/gl/gl-form.c b/platform/gl/gl-form.c
new file mode 100644
index 00000000..f9083f71
--- /dev/null
+++ b/platform/gl/gl-form.c
@@ -0,0 +1,158 @@
+#include "gl-app.h"
+
+#include <string.h>
+#include <stdio.h>
+
+#ifndef PATH_MAX
+#define PATH_MAX 2048
+#endif
+
+#include "mupdf/helpers/pkcs7-check.h"
+#include "mupdf/helpers/pkcs7-openssl.h"
+
+static char cert_filename[PATH_MAX];
+static struct input cert_password;
+
+static void do_sign(void)
+{
+ pdf_pkcs7_signer *signer = NULL;
+
+ fz_var(signer);
+
+ fz_try(ctx)
+ {
+ signer = pkcs7_openssl_read_pfx(ctx, cert_filename, cert_password.text);
+ pdf_sign_signature(ctx, pdf, selected_annot, signer);
+ ui_show_warning_dialog("Signed document successfully.");
+ }
+ fz_always(ctx)
+ {
+ if (signer)
+ signer->drop(signer);
+ }
+ fz_catch(ctx)
+ ui_show_warning_dialog("%s", fz_caught_message(ctx));
+
+ if (pdf_update_page(ctx, selected_annot->page))
+ render_page();
+}
+
+static void cert_password_dialog(void)
+{
+ int is;
+ ui_dialog_begin(400, (ui.gridsize+4)*3);
+ {
+ ui_layout(T, X, NW, 2, 2);
+ ui_label("Password:");
+ is = ui_input(&cert_password, 200, 1);
+
+ ui_layout(B, X, NW, 2, 2);
+ ui_panel_begin(0, ui.gridsize, 0, 0, 0);
+ {
+ ui_layout(R, NONE, S, 0, 0);
+ if (ui_button("Cancel"))
+ ui.dialog = NULL;
+ ui_spacer();
+ if (ui_button("Okay") || is == UI_INPUT_ACCEPT)
+ {
+ ui.dialog = NULL;
+ do_sign();
+ }
+ }
+ ui_panel_end();
+ }
+ ui_dialog_end();
+}
+
+static int cert_file_filter(const char *fn)
+{
+ return !!strstr(fn, ".pfx");
+}
+
+static void cert_file_dialog(void)
+{
+ if (ui_open_file(cert_filename))
+ {
+ if (cert_filename[0] != 0)
+ {
+ ui_input_init(&cert_password, "");
+ ui.focus = &cert_password;
+ ui.dialog = cert_password_dialog;
+ }
+ else
+ ui.dialog = NULL;
+ }
+}
+
+void do_widget_panel(void)
+{
+ int ff, type;
+ char *value;
+
+ ff = pdf_get_field_flags(ctx, selected_annot->page->doc, selected_annot->obj);
+ type = pdf_field_type(ctx, selected_annot->page->doc, selected_annot->obj);
+
+ if (type == PDF_WIDGET_TYPE_TEXT)
+ {
+ static pdf_annot *last_annot = NULL;
+ static struct input input;
+ ui_label("Value:");
+ if (selected_annot != last_annot)
+ {
+ last_annot = selected_annot;
+ value = pdf_field_value(ctx, selected_annot->page->doc, selected_annot->obj);
+ ui_input_init(&input, value);
+ fz_free(ctx, value);
+ }
+ if (ui_input(&input, 0, (ff & Ff_Multiline) ? 5 : 1) >= UI_INPUT_EDIT)
+ {
+ pdf_field_set_value(ctx, selected_annot->page->doc, selected_annot->obj, input.text);
+ if (pdf_update_page(ctx, selected_annot->page))
+ render_page();
+ }
+ }
+ else if (type == PDF_WIDGET_TYPE_COMBOBOX || type == PDF_WIDGET_TYPE_LISTBOX)
+ {
+ const char **options;
+ int n, choice;
+ ui_label("Value:");
+ n = pdf_choice_widget_options(ctx, selected_annot->page->doc, selected_annot, 0, NULL);
+ options = fz_malloc_array(ctx, n, sizeof(char*));
+ pdf_choice_widget_options(ctx, selected_annot->page->doc, selected_annot, 0, options);
+ value = pdf_field_value(ctx, selected_annot->page->doc, selected_annot->obj);
+ choice = ui_select("Widget/Ch", value, (const char **)options, n);
+ if (choice >= 0)
+ {
+ pdf_field_set_value(ctx, selected_annot->page->doc, selected_annot->obj, options[choice]);
+ if (pdf_update_page(ctx, selected_annot->page))
+ render_page();
+ }
+ fz_free(ctx, value);
+ fz_free(ctx, options);
+ }
+ else if (type == PDF_WIDGET_TYPE_SIGNATURE)
+ {
+ if (ui_button("Verify"))
+ {
+ char status[100];
+ int result;
+ result = pdf_check_signature(ctx, pdf, selected_annot, status, sizeof status);
+ if (result)
+ ui_show_warning_dialog("Signature is valid.\n%s", status);
+ else
+ ui_show_warning_dialog("Could not verify signature:\n%s", status);
+ }
+ if (ui_button("Sign"))
+ {
+ fz_strlcpy(cert_filename, filename, sizeof cert_filename);
+ ui_init_open_file(".", cert_file_filter);
+ ui.dialog = cert_file_dialog;
+ }
+ }
+ else
+ {
+ value = pdf_field_value(ctx, pdf, selected_annot->obj);
+ ui_label("Value: %s", value);
+ fz_free(ctx, value);
+ }
+}