diff options
| -rw-r--r-- | Build.PL | 1 | ||||
| -rwxr-xr-x | bin/raps2 | 53 | ||||
| -rw-r--r-- | lib/App/Raps2.pm | 45 | ||||
| -rw-r--r-- | lib/App/Raps2/Password.pm | 6 | 
4 files changed, 93 insertions, 12 deletions
| @@ -16,6 +16,7 @@ my $build = Module::Build->new(  	requires => {  		'perl' => '5.10.0',  		'Carp' => 0, +		'Config::Tiny' => 0,  		'Crypt::CBC' => 0,  		'Crypt::Eksblowfish' => 0,  		'Crypt::Eksblowfish::Bcrypt' => 0, @@ -11,15 +11,15 @@ use File::BaseDir qw(data_files data_home);  use File::Slurp qw(read_dir);  use Getopt::Long qw(:config no_ignore_case); -my ( $default_cost, $echo_generated, $pwgen_cmd ); +my ( $default_cost, $no_echo, $pwgen_cmd );  our $VERSION = '0.50';  GetOptions(  	'c|cost=i'      => \$default_cost, -	'e|echo'        => \$echo_generated, +	'E|no-echo'     => \$no_echo,  	'h|help'        => sub { cmd_help(0) }, -	'p|pwgen_cmd=s' => \$pwgen_cmd, +	'p|pwgen-cmd=s' => \$pwgen_cmd,  	'V|version'     => sub { say "raps2 version ${VERSION}"; exit 0 },  ) or cmd_help(1); @@ -79,7 +79,7 @@ sub cmd_add {  			exit 3;  		} -		if ($echo_generated) { +		if ( not $no_echo ) {  			$raps2->ui->output( [ 'Generated password', $pass ] );  		}  	} @@ -294,6 +294,12 @@ and Login will be saved as plaintext, Extra is encrypted like the password.  Adds I<account> to the store.  It will ask you for the store's master  password, some metadata and the new password and then store them. +If you do not provide a password (that is, leave both "Password" and "Verify" +lines blank), B<raps2> will use the B<pwgen> command to create one for you and +print the generated password on stdout. + +See also the B<-c>, B<-E> and B<-p> options. +  =item B<del> I<account>  Remove I<account> from the store. @@ -330,7 +336,36 @@ Show version information  =head1 OPTIONS -None. +=over + +=item B<-c>, B<--cost> I<int> + +Key setup cost to use for new passwords, overrides the configuration file. +Only makes sense with B<raps2 add>. + +Please be aware that the key setup time is an exponential function. That is, +when you increment the cost by 1, the key setup time will double.  See +Crypt::Eksblowfish(3pm). + +Default: 12 + +=item B<-E>, B<--no-echo> + +When using the pwgen functionality of B<raps2 add>, do not print the generated +password on stdout. + +=item B<-p>, B<--pwgen-cmd> I<command> + +When the user does not enter a password in B<raps2 add>, it will execute +I<command> to create one. The first line of output is taken as password. + +Default: pwgen -s 23 1 + +=item B<-V>, B<--version> + +Show version information. + +=back  =head1 EXIT STATUS @@ -340,6 +375,9 @@ zero on success, non-zero otherwise.  raps2 saves the master password hash in F<~/.config/raps2/password>. +The configuation (key setup cost and pwgen command) is stored in +F<~/.config/raps2/defaults> in an INI-like format. +  Additional encrypted passwords are stored in F<~/.local/share/raps2/>.  These directories can be changed by setting the B<XDG_CONFIG_HOME> and @@ -349,6 +387,8 @@ B<XDG_DATA_HOME> environment variables.  =over +=item * Config::Tiny +  =item * Crypt::CBC  =item * Crypt::Eksblowfish @@ -368,6 +408,9 @@ B<XDG_DATA_HOME> environment variables.  This is alpha software, the store format may change without further notice.  Backwards-compatibility is not guaranteed. +When running for the first time, raps2 will ask for the master passphrase +three times. Two would be better. +  =head1 AUTHOR  Copyright (C) 2011 by Daniel Friesel E<lt>derf@finalrewind.orgE<gt> diff --git a/lib/App/Raps2.pm b/lib/App/Raps2.pm index 897e62e..dd00e54 100644 --- a/lib/App/Raps2.pm +++ b/lib/App/Raps2.pm @@ -275,6 +275,7 @@ sub pw_load_info {  		url   => $key->{url},  		login => $key->{login},  		salt  => $key->{salt}, +		cost  => $key->{cost},  	};  } @@ -316,14 +317,25 @@ Accepted configuration parameters are:  B<cost> of key setup, passed on to App::Raps2::Password(3pm). +Default: 12 +  =item B<no_cli> => I<bool>  If set to true, App::Raps2 assumes it will not be used as a CLI. It won't  initialize its Term::ReadLine object and won't try to read anything from the  terminal. +=item B<pwgen_cmd> => I<comand> + +Command to use in B<generate_password>. + +Default: pwgen -s 23 1 +  =back +Note that the B<cost> and B<pwgen_cmd> options specified here take precedence +over those loaded from the config file. +  =item $raps2->get_master_password( [I<$password>] )  Sets the master password used to encrypt all accounts. Uses I<password> if @@ -334,8 +346,8 @@ specified, otherwise it asks the user via App::Raps2::UI(3pm).  Load a password from I<file> (or account I<name>), requires  B<get_master_password> to have been called before. -Returns a hashref containing its url, login, salt and decrypted password and -extra. +Returns a hashref containing its url, login, salt, cost and decrypted password +and extra.  =item $raps2->pw_load_info( B<file> => I<file> | B<name> => I<name> ) @@ -343,7 +355,7 @@ Load all unencrypted data from I<file> (or account I<name>). Unlike  B<pw_load>, this method does not require a prior call to  B<get_master_password>. -Returns a hashref with url, login and salt. +Returns a hashref with url, login, salt and cost.  =item $raps2->pw_save( I<%data> ) @@ -358,6 +370,8 @@ The following I<data> keys are supported:  =item B<salt> => I<salt> +=item B<cost> => I<cost> (optional, inferred from B<new> / the config otherwise) +  =item B<file> => I<file> | B<name> => I<name> (one must be set)  =item B<url> => I<url> (optional) @@ -372,6 +386,16 @@ The following I<data> keys are supported:  Returns the App::Raps2::UI(3pm) object. +=item $raps2->conf(I<key>) + +Returns the current config value of I<key>, either set by B<new> or loaded +from the defaults config file. + +=item $raps2->generate_password() + +Runs B<pwgen_cmd> (as specified in B<new> or the config file) and returns its +first line of output, without the trailing newline. +  =back  =head2 INTERNAL @@ -382,12 +406,21 @@ You usually don't need to call these methods by yourself.  =item $raps2->create_config() -Creates a default config and asks the user to set a master password. +Creates a password file and asks the user to set a master password.  =item $raps2->load_config()  Load config. Automatically called by B<new>. +=item $raps2->create_defaults() + +Creates a defaults config file containing the default key setup cost and pwgen +command. + +=item $raps2->load_defaults() + +Loads the defaults file. Automatically called by B<new>. +  =item $raps2->pw()  Returns the App::Raps2::Password(3pm) object. @@ -403,7 +436,7 @@ Create working directories (~/.config/raps2 and ~/.local/share/raps2, or the  respective XDG environment variable contents), if they don't exist yet.  Automatically called by B<new>. -Calls B<create_config> if no raps2 config was found. +Calls B<create_config> and B<create_defaults> if no configs were found.  =back @@ -420,6 +453,8 @@ File::Slurp(3pm).  =head1 BUGS AND LIMITATIONS  Be aware that the password handling API is not yet stable. +Also, so far the development concentrated on B<raps2>, so this module / its +documentation may not be completely up-to-date.  =head1 AUTHOR diff --git a/lib/App/Raps2/Password.pm b/lib/App/Raps2/Password.pm index d80a138..fb73255 100644 --- a/lib/App/Raps2/Password.pm +++ b/lib/App/Raps2/Password.pm @@ -175,7 +175,8 @@ Returns a new 16-byte salt. Contains only printable characters.  Returns the currently used salt and optionally changes it to I<salt>. -=item $pass->encrypt(I<data>, [I<salt>]) +=item $pass->encrypt(B<data> => I<data>, [B<salt> => I<salt>], +[B<cost> => I<cost>])  Encrypts I<data> with the passphrase saved in the object, returns the  corresponding hexadecimal hash (as string). @@ -183,7 +184,8 @@ corresponding hexadecimal hash (as string).  By default, the salt set in B<salt> or B<new> will be used. You can override  it by specifying I<salt>. -=item $pass->decrypt(I<hexstr>, [I<salt>]) +=item $pass->decrypt(B<data> => I<hexstr>, [B<salt> => I<salt>], +[B<cost> => I<cost>])  Decrypts I<hexstr> (as created by B<encrypt>), returns its original content. | 
