File: //usr/share/usermin/gnupg/secret.cgi
#!/usr/bin/perl
# setup.sh
# Call gnupg to setup a key initially
require './gnupg-lib.pl';
&ReadParse();
$pfx = $in{'newkey'} ? 'secret' : 'setup';
&error_setup($text{$pfx.'_err'});
# Validate inputs
$in{'name'} || &error($text{'setup_ename'});
length($in{'name'}) >= 5 || &error(&text('setup_enamelen', 5));
#$in{'email'} || &error($text{'setup_eemail'});
# Run gpg --list-keys to create the directory
&list_keys();
&list_keys();
# Create .gnupg directory if missing
if (!-d "$remote_user_info[7]/.gnupg") {
mkdir("$remote_user_info[7]/.gnupg", 0700) ||
&error(&text('setup_emkdir', $!));
}
$pid = fork();
if (!$pid) {
# Run the find command in a subprocess to generate some entropy
untie(*STDOUT);
untie(*STDERR);
close(STDOUT);
close(STDERR);
exec("find / -type f");
exit(0);
}
foreach $k (&list_secret_keys()) {
$oldid{$k->{'key'}}++;
}
# Run the gpg --gen-key command
my $temp = &transname();
$in{'size'} ||= 2048;
&open_tempfile(TEMP, ">$temp", 0, 1);
&print_tempfile(TEMP, "Key-Type: default\n");
&print_tempfile(TEMP, "Key-Length: $in{'size'}\n");
&print_tempfile(TEMP, "Key-Usage: sign,encrypt,auth\n");
&print_tempfile(TEMP, "Name-Real: $in{'name'}\n");
&print_tempfile(TEMP, "Name-Email: $in{'email'}\n");
if ($in{'comment'}) {
&print_tempfile(TEMP, "Name-Comment: $in{'comment'}\n");
}
&print_tempfile(TEMP, "Expire-Date: 0\n");
if ($in{'pass'}) {
&print_tempfile(TEMP, "Passphrase: $in{'pass'}\n");
}
else {
&print_tempfile(TEMP, "%no-protection\n");
}
&print_tempfile(TEMP, "%commit\n");
&print_tempfile(TEMP, "%echo done\n");
&close_tempfile(TEMP);
($out, $timed_out) = &backquote_with_timeout(
"$gpgpath --gen-key --batch $temp 2>&1 </dev/null", 90);
$err = $?;
&ui_print_header(undef, $text{$pfx.'_title'}, "");
if ($err || $timed_out) {
print "<p>",&text('setup_failed', "<pre>$out</pre>"),"<p>\n";
}
else {
print "<p>$text{$pfx.'_ok'}<p>\n";
@keys = &list_secret_keys();
($key) = grep { !$oldid{$_->{'key'}} } @keys;
&put_passphrase($in{'pass'}, $key);
}
&ui_print_footer("", $text{'index_return'});