App-Raps2

 view release on metacpan or  search on metacpan

bin/raps2  view on Meta::CPAN

#!/usr/bin/env perl
## Copyright © 2011-2015 by Daniel Friesel <derf@finalrewind.org>
## License: WTFPL:
##   0. You just DO WHAT THE FUCK YOU WANT TO.
use strict;
use warnings;
use 5.010;

no if $] >= 5.018, warnings => 'experimental::smartmatch';

use App::Raps2;
use File::BaseDir qw(data_files data_home);
use File::Slurp qw(read_dir);
use Getopt::Long qw(:config no_ignore_case);

my ( $chrome, $default_cost, $no_echo, $paste, $pwgen_cmd, $xclip_cmd );

our $VERSION = '0.54';

GetOptions(
	'c|cost=i'      => \$default_cost,
	'C|chrome'      => \$chrome,
	'E|no-echo'     => \$no_echo,
	'h|help'        => sub { cmd_help(0) },
	'p|pwgen-cmd=s' => \$pwgen_cmd,
	'P|paste'       => \$paste,
	'V|version'     => sub { say "raps2 version ${VERSION}"; exit 0 },
	'x|xclip-cmd=s' => \$xclip_cmd,

) or cmd_help(1);

if ($chrome) {
	$xclip_cmd = 'xclip -l 2';
}

my ( $action, @args ) = @ARGV;
my $raps2 = App::Raps2->new(
	cost      => $default_cost,
	pwgen_cmd => $pwgen_cmd,
	xclip_cmd => $xclip_cmd,
);

sub file_must_exist {
	my ( $file, $name ) = @_;

	if ( not defined $file ) {
		say STDERR "No such account: ${name}";
		exit 2;
	}

	return;
}

sub file_must_not_exist {
	my ( $file, $name ) = @_;

	if ( -e $file ) {
		say STDERR "Account already exists: ${name}";
		exit 2;
	}

	return;
}

sub cmd_add {
	my ($name) = @_;

	if ( not $name ) {
		cmd_help( 1, 'add <account>' );
	}

	my $pwfile = data_home('raps2') . "/${name}";

	file_must_not_exist( $pwfile, $name );

	$raps2->get_master_password();

	my $url   = $raps2->ui->read_line('URL');
	my $login = $raps2->ui->read_line('Login');
	my $pass  = $raps2->ui->read_pw( 'Password', 1 );
	my $extra = $raps2->ui->read_multiline('Additional content');

	if ( length($pass) == 0 ) {
		$pass = $raps2->generate_password();

		if ( not $pass ) {
			say STDERR "Password generation failed: ${!}: "
			  . $raps2->conf('pwgen_cmd');
			exit 3;
		}

		if ($paste) {
			$raps2->ui->to_clipboard( $pass, $raps2->conf('xclip_cmd') );
		}
		elsif ( not $no_echo ) {
			$raps2->ui->output( [ 'Generated password', $pass ] );
		}
	}

	$raps2->pw_save(
		file     => $pwfile,
		url      => $url,
		login    => $login,
		password => $pass,
		extra    => $extra,
	);

	return;
}

sub cmd_dump {
	my ($name) = @_;

	if ( not $name ) {
		cmd_help( 1, 'dump <account>' );
	}

	my $pwfile = data_files("raps2/${name}");

	file_must_exist( $pwfile, $name );

	$raps2->get_master_password();

	my $key = $raps2->pw_load( file => $pwfile );

	$raps2->ui->output(
		[ 'URL',      $key->{url} ],
		[ 'Login',    $key->{login} ],
		[ 'Password', $key->{password} ],
	);
	if ( $key->{extra} ) {
		print $key->{extra};
	}



( run in 2.365 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )