From c8d941d7c0f1ddf6f633029266121a61cadc0513 Mon Sep 17 00:00:00 2001 From: Thomas Hooge Date: Thu, 12 Nov 2020 18:39:12 +0100 Subject: [PATCH] Add missing key import feature --- lib/GUI.pm | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- lib/KEY.pm | 33 ++++++++++++++++++----- 2 files changed, 104 insertions(+), 8 deletions(-) diff --git a/lib/GUI.pm b/lib/GUI.pm index 6610a45..dfae4e6 100644 --- a/lib/GUI.pm +++ b/lib/GUI.pm @@ -1658,9 +1658,84 @@ sub show_ca_export_dialog { sub show_key_import_dialog { my ($self, $opts) = @_; - # my $opts = {}; - my($box, $button_ok, $button_cancel, $button, $entry, $table, $label); + my ($box, $button_ok, $button_cancel, $button, $entry, $table, $label); + my ($t, $fileentry); + + $button_ok = Gtk2::Button->new_from_stock('gtk-ok'); + $button_ok->signal_connect('clicked', + sub { $self->{'KEY'}->get_import_key($self, $opts, $box) }); + + $button_cancel = Gtk2::Button->new_from_stock('gtk-cancel'); + $button_cancel->signal_connect('clicked', sub { $box->destroy() }); + + $box = GUI::HELPERS::dialog_box( + $self->{'CA'}->{'actca'} . ': ' . _("Import Key"), + _("Import Key"), + $button_ok, $button_cancel); + $box->set_default_size(640, -1); + + # small table for file selection + $table = Gtk2::Table->new(1, 3, 0); + $table->set_col_spacing(0, 10); + $box->vbox->add($table); + + $label = GUI::HELPERS::create_label(_("File:"), 'left', 0, 0); + $table->attach($label, 0, 1, 0, 1, 'fill', 'fill', 0, 0); + + $t = _("Select key file"); + $fileentry = Gtk2::Entry->new(); + $fileentry->set_text($opts->{'infile'}) if(defined($opts->{'infile'})); + $fileentry->signal_connect( 'changed', + sub{ GUI::CALLBACK::entry_to_var( + $fileentry, $fileentry, \$opts->{'infile'})}); + $table->attach_defaults($fileentry, 1, 2, 0, 1); + $button = Gtk2::Button->new(_("Browse...")); + $button->signal_connect('clicked' => + sub{GUI::HELPERS::browse_file( + $t, $fileentry, 'key')}); + $table->attach($button, 2, 3, 0, 1, 'fill', 'fill', 0, 0); + + $label = GUI::HELPERS::create_label(_("Metadata"), 'left', 0, 1); + $box->vbox->add($label); + + $table = Gtk2::Table->new(1, 5, 0); + $table->set_col_spacing(0, 7); + $box->vbox->add($table); + + $entry = GUI::HELPERS::entry_to_table( + _("Common Name"), + \$opts->{'CN'}, $table, 0, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("eMail Address").":", + \$opts->{'EMAIL'}, $table, 1, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("Country Name (2 letter code):"), + \$opts->{'C'}, $table, 2, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("State or Province Name:"), + \$opts->{'ST'}, $table, 3, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("Locality Name (eg. city):"), + \$opts->{'L'}, $table, 4, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("Organization Name (eg. company):"), + \$opts->{'O'}, $table, 5, 1); + + $entry = GUI::HELPERS::entry_to_table( + _("Organizational Unit Name (eg. section):"), + \$opts->{'OU'}, $table, 6, 1); + + # Hint: We don't need the password for import + + $box->show_all(); + + return; } # diff --git a/lib/KEY.pm b/lib/KEY.pm index fa928be..b41ab97 100644 --- a/lib/KEY.pm +++ b/lib/KEY.pm @@ -31,20 +31,41 @@ sub new { } # -# get informations to import key from file +# import key from file # sub get_import_key { my ($self, $main, $opts, $box) = @_; + my ($name, $keyfile, $ca, $cadir); $box->destroy() if(defined($box)); - GUI::HELPERS::print_warning(_("Import Key: Function does not yet exist.")); + if(not defined($opts)) { + $main->show_key_import_dialog(); + return; + } + + $name = HELPERS::gen_name($opts); + $opts->{'keyname'} = HELPERS::enc_base64($name); -# if(not defined($opts)) { -# $main->show_key_import_dialog(); -# return; -# } + $ca = $main->{'CA'}->{'actca'}; + $cadir = $main->{'CA'}->{$ca}->{'dir'}; + $keyfile = $cadir . "/keys/" . $opts->{'keyname'} . ".pem"; + # TODO: Check if valid key, key with password? + if (not -s $opts->{'infile'}) { + GUI::HELPERS::print_warning(_("Key not found: ") . $opts->{'infile'}); + return; + } + if (not -e $keyfile) { + copy($opts->{'infile'}, $keyfile); + $main->{'keybrowser'}->update($cadir."/keys", + $cadir."/crl/crl.pem", + $cadir."/index.txt", + 0); + } else { + GUI::HELPERS::print_warning(_("Key file already exists: ".$keyfile)); + } + return; } #