Mozilla-Persona

 view release on metacpan or  search on metacpan

lib/Mozilla/Persona/Setup.pm  view on Meta::CPAN

        { class  => 'Mozilla::Persona::Validate::Table'
        , pwfile => "$secrets/passwords"
        , domain => $domain
        }
     );

    $persona->writeConfig($config);

    publish_helpers $setup_src, "$docroot/persona", $config;

    print __x"now you probably want to modify {fn}", fn => $config;
}

#### HELPERS

sub get_jquery($$)
{   my ($from_url, $to_fn) = @_;

    if(-f $to_fn && !$restart)
    {   info __x"reusing jquery from {fn}", fn => $to_fn;
        return;
    }

    info __x"downloading latest jquery stable into {fn}", fn => $to_fn;

    $ua ||= LWP::UserAgent->new;
    my $resp = $ua->get($from_url);
    $resp->is_success
        or error __x"failed downloading jquery from {url}: {err}"
             , url => $from_url. err => $resp->status_line;

    write_file $to_fn, $resp->decoded_content || $resp->content;
}

sub create_private_key($$)
{   my ($outfn, $group) = @_;

    my $gid = getpwnam $group
        or error __x"unknown group {name}", name => $group;

    if(-f $outfn && !$restart)
    {   info __x"reusing private key in {fn}", fn => $outfn;

        my $has_gid = (stat $outfn)[5];
        $gid == $has_gid
            or warning __x"please set group on {fn} to {group}"
                 , fn => $outfn, group => $group;

        return;
    }

    info __x"generating new private key at {fn}", fn => $outfn;

    ! -f $outfn || unlink $outfn
        or fault __x"cannot replace existing pem file in {fn}", fn => $outfn;

    my $key = Crypt::OpenSSL::RSA->generate_key(2048);
    write_file $outfn, $key->get_private_key_string;

    chmod 0440, $outfn;
    chown -1, $gid, $outfn
        or warning __x"please set group on {fn} to {group}"
             , fn => $outfn, group => $group;

    $key;
}

sub publish_config($$)
{   my ($outfn, $keyfn) = @_;

    my $pem = read_file $keyfn;
    my $key = Crypt::OpenSSL::RSA->new_private_key($pem);

    my ($n, $e, @stuff) = $key->get_key_parameters;
    write_file $outfn, encode_json
      { 'public-key'     =>
          { e => $e->to_decimal
          , n => $n->to_decimal
          , algorithm => 'RS'
          }
      , authentication => '/persona/authenticate.html'
      , provisioning   => '/persona/provision.html'
      };

    info __x"public configuration written to {fn}", fn => $outfn;
    $outfn;
}

sub publish_helpers($$$)
{   my ($indir, $outdir, $config) = @_;
    local(*FROM, *TO);
    -d $outdir or mkdir $outdir
        or fault __x"cannot create directory {dir}", dir => $outdir;

    foreach my $fn (glob "$indir/*")
    {   my $outfn = $outdir.'/'.basename $fn;
        if(-f $outfn && !$restart)
        {   info __x"keeping file {fn}", fn => $outfn;
            next;
        }

        open FROM, '<:encoding(utf8)', $fn
            or fault __x"cannot read {filename}", filename => $fn;

        open TO, '>:encoding(utf8)', $outfn
            or fault __x"cannot write to {filename}", filename => $outfn;

        while(<FROM>)
        {   s/__CONFIG__/$config/;
            print TO $_;
        }

        close TO;
        close FROM;

        my $mode = $outfn =~ m/\.pl$/i ? 0755 : 0644;
        chmod $mode, $outfn;

        info __x"created file {fn} more 0{mode%o}", fn => $outfn, mode => $mode;
    }
}



( run in 1.762 second using v1.01-cache-2.11-cpan-71847e10f99 )