module PDFWalker::Walker::SignatureDialogs

Private Instance Methods

create_keypair_import_page() click to toggle source
# File lib/pdfwalker/signing.rb, line 100
def create_keypair_import_page
    labels =
    [
        [ "Private RSA key:", @pkeyfilename = Entry.new,  pkeychoosebtn = Button.new(Gtk::Stock::OPEN) ],
        [ "Public certificate:", @certfilename = Entry.new, certchoosebtn = Button.new(Gtk::Stock::OPEN) ]
    ]

    row = 0
    table = Table.new(2, 3)
    labels.each do |lbl, entry, btn|
        entry.editable = entry.sensitive = false

        table.attach(Label.new(lbl).set_alignment(1,0), 0, 1, row, row + 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 4, 4)
        table.attach(entry, 1, 2, row, row + 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 4, 4)
        table.attach(btn, 2, 3, row, row + 1, Gtk::EXPAND | Gtk::FILL, Gtk::SHRINK, 4, 4)

        row = row.succ
    end

    pkeychoosebtn.signal_connect('clicked') { open_private_key_dialog(table) }
    certchoosebtn.signal_connect('clicked') { open_certificate_dialog(table) }

    append_page(table)
    set_page_title(table, "Import a public/private key pair")
    set_page_type(table, Assistant::PAGE_CONTENT)
end
file_chooser_dialog(title, *patterns) { |dialog| ... } click to toggle source
# File lib/pdfwalker/signing.rb, line 143
def file_chooser_dialog(title, *patterns)
    dialog = FileChooserDialog.new(title,
                @parent,
                FileChooser::ACTION_OPEN,
                nil,
                [Stock::CANCEL, Dialog::RESPONSE_CANCEL],
                [Stock::OPEN, Dialog::RESPONSE_ACCEPT])

    filter = FileFilter.new
    patterns.each do |pattern|
        filter.add_pattern(pattern)
    end

    dialog.set_filter(filter)

    if dialog.run == Dialog::RESPONSE_ACCEPT
        yield(dialog)
    end

    dialog.destroy
end
open_certificate_dialog(page) click to toggle source
# File lib/pdfwalker/signing.rb, line 55
def open_certificate_dialog(page)
    file_chooser_dialog('Choose a x509 certificate', '*.crt', '*.cer', '*.pem', '*.der') do |dialog|
        begin
            @cert = OpenSSL::X509::Certificate.new(File.binread(dialog.filename))

            @certfilename.set_text(dialog.filename)
            set_page_complete(page, true) if @pkey

        rescue
            @parent.error("Error loading file '#{File.basename(dialog.filename)}'")

            @cert = nil
            @certfilename.text = ""
            set_page_complete(page, false)
        ensure
            @ca = [] # Shall be added to the GUI
        end
    end
end
open_pkcs12_file_dialog(page) click to toggle source
# File lib/pdfwalker/signing.rb, line 75
def open_pkcs12_file_dialog(page)

    file_chooser_dialog('Open PKCS12 container', '*.pfx', '*.p12') do |dialog|
        begin
            p12 = OpenSSL::PKCS12::PKCS12.new(File.binread(dialog.filename), method(:prompt_passphrase))

            raise TypeError, "PKCS12 does not contain a RSA key" unless p12.key.is_a?(OpenSSL::PKey::RSA)
            raise TypeError, "PKCS12 does not contain a x509 certificate" unless p12.certificate.is_a?(OpenSSL::X509::Certificate)

            @pkey = p12.key
            @cert = p12.certificate
            @ca = p12.ca_certs

            @p12filename.set_text(dialog.filename)
            set_page_complete(page, true)
        rescue
            @parent.error("Error loading file '#{File.basename(dialog.filename)}'")

            @pkey, @cert, @ca = nil, nil, []
            @p12filename.text = ""
            set_page_complete(page, false)
        end
    end
end
open_private_key_dialog(page) click to toggle source
# File lib/pdfwalker/signing.rb, line 36
def open_private_key_dialog(page)
    file_chooser_dialog('Choose a private RSA key', '*.key', '*.pem', '*.der') do |dialog|
        begin
            @pkey = OpenSSL::PKey::RSA.new(File.binread(dialog.filename))

            @pkeyfilename.set_text(dialog.filename)
            set_page_complete(page, true) if @cert
        rescue
            @parent.error("Error loading file '#{File.basename(dialog.filename)}'")

            @pkey = nil
            @pkeyfilename.text = ""
            set_page_complete(page, false)
        ensure
            @ca = [] # Shall be added to the GUI
        end
    end
end
prompt_passphrase() click to toggle source
# File lib/pdfwalker/signing.rb, line 127
def prompt_passphrase
    dialog = Dialog.new("Enter passphrase",
                @parent,
                Dialog::MODAL,
                [Stock::OK, Dialog::RESPONSE_OK]
    )

    pwd_entry = Entry.new.set_visibility(false).show
    dialog.vbox.pack_start(pwd_entry, true, true, 0)

    pwd = pwd_entry.text if dialog.run == Dialog::RESPONSE_OK

    dialog.destroy
    pwd.to_s
end