From 81e909e9031d8f8a68101080f225b4a977ec0015 Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Tue, 9 Oct 2012 11:31:07 +0200 Subject: Make use of Module::Build for the build script. --- lib/Net/MulkyID/Setup.pm | 128 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100755 lib/Net/MulkyID/Setup.pm (limited to 'lib/Net/MulkyID/Setup.pm') diff --git a/lib/Net/MulkyID/Setup.pm b/lib/Net/MulkyID/Setup.pm new file mode 100755 index 0000000..8c58013 --- /dev/null +++ b/lib/Net/MulkyID/Setup.pm @@ -0,0 +1,128 @@ +#! /usr/bin/env perl +# Copyright 2012, Matthias Andreas Benkard . + +package Net::MulkyID::Setup; + +use common::sense; +use Modern::Perl; +use JSON; +use Crypt::OpenSSL::RSA; +use File::Slurp qw(write_file read_file); +use File::Path qw(make_path); +use File::Copy; +use LWP::Simple qw(getstore); +use Data::Dumper; + +use base 'Exporter'; +our @EXPORT = qw(setup); + +sub prompt($$) { + my ($question, $default) = @_; + $|++; + print "${question} \[${default}\] "; + $_ = <>; + chomp; + if ($_) { + return $_; + } else { + return $default; + } +} + +sub makespec($) { + my ($key) = @_; + my ($n, $e, @stuff) = $key->get_key_parameters; + return + encode_json({"public-key" => {e => $e->to_decimal, n => $n->to_decimal, algorithm => "RS"}, + "authentication" => "/browserid/authenticate.html", + "provisioning" => "/browserid/provision.html"}); +}; + +sub setup() { + my $conffile = "www/config.pl"; + + # Generate configuration file. + $::MULKONF = { }; + if (stat($conffile)) { + say "Found existing configuration ($conffile)."; + do $conffile; + } + + my $configpath = $::MULKONF->{configpath} // "/etc/mulkyid"; + $configpath = prompt("Where shall I put configuration files?", $configpath); + my $pemfile = $::MULKONF->{pemfile} // "$configpath/rsa2048.pem"; + $pemfile = prompt("Where shall I put the private key?", $pemfile); + my $aliases_file = $::MULKONF->{aliases_file} // "/etc/aliases"; + $aliases_file = prompt("Where is the aliases file? Type a single dot for none.", $aliases_file); + my $imap_server = $::MULKONF->{imap_server} // "localhost"; + $imap_server = prompt("What is the IMAP server's address?", $imap_server); + my $imap_port = $::MULKONF->{imap_port} // 143; + $imap_port = int(prompt("What is the IMAP server's port?", $imap_port)); + + say "OK."; + + # Download jQuery. + make_path("www/jquery"); + if (stat("www/jquery/jquery.js")) { + say "Using existing copy of jQuery (www/jquery/jquery.js)."; + } else { + say "Fetching jQuery..."; + getstore("http://code.jquery.com/jquery-1.7.2.min.js", "www/jquery/jquery.js") + or die "Could not fetch jQuery"; + say "jQuery saved to: www/jquery/jquery.js"; + } + + # Generate the private key. + my $key; + if (stat($pemfile)) { + say "Using existing private key ($pemfile)."; + $key = Crypt::OpenSSL::RSA->new_private_key(scalar read_file($pemfile)); + } else { + say "Generating private key..."; + $key = Crypt::OpenSSL::RSA->generate_key(2048); + make_path($configpath); + write_file($pemfile, $key->get_private_key_string()) + or die "Could not write private key to $pemfile: $!"; + say "Private key saved to: $pemfile"; + chmod 0440, $pemfile; + } + + # Generate spec file. + write_file("browserid.json", makespec $key) + or die "Could not write spec to browserid.json: $!"; + say "Persona spec file saved to: browserid.json"; + + # Generate configuration file. + $::MULKONF = { + configpath => $configpath, + pemfile => $pemfile, + aliases_file => $aliases_file, + imap_server => $imap_server, + imap_port => $imap_port + }; + write_file($conffile, <Dump([$::MULKONF], ["::MULKONF"])]} +1; +EOF + ) or die "Could not write configuration to $conffile: $!"; + say "Configuration saved to: $conffile"; + + say ""; + say "******************************************************************"; + say "* FINISHED. *"; + say "* *"; + say "* Please put browserid.json where it will be served as *"; + say "* https:///.well-known/browserid *"; + say "* with a content type of: *"; + say "* application/json *"; + say "* *"; + say "* In addition, please ensure that the private key file can be *"; + say "* read by the web server by assigning the file to the *"; + say "* appropriate owner. *"; + say "******************************************************************"; +} + +1; + -- cgit v1.2.3