summaryrefslogtreecommitdiff
path: root/lib/App
diff options
context:
space:
mode:
Diffstat (limited to 'lib/App')
-rw-r--r--lib/App/Raps2.pm84
1 files changed, 62 insertions, 22 deletions
diff --git a/lib/App/Raps2.pm b/lib/App/Raps2.pm
index 5e72e1d..073ff33 100644
--- a/lib/App/Raps2.pm
+++ b/lib/App/Raps2.pm
@@ -7,6 +7,7 @@ use 5.010;
use App::Raps2::Password;
use App::Raps2::UI;
use Carp qw(confess);
+use Config::Tiny;
use File::BaseDir qw(config_home data_home);
use File::Path qw(make_path);
use File::Slurp qw(slurp write_file);
@@ -31,6 +32,7 @@ sub new {
if ( not $opt{dont_touch_fs} ) {
$self->sanity_check();
$self->load_config();
+ $self->load_defaults();
}
if ( $opt{master_password} ) {
@@ -64,6 +66,9 @@ sub sanity_check {
if ( not -e $self->{xdg_conf} . '/password' ) {
$self->create_config();
}
+ if ( not -e $self->{xdg_conf} . '/defaults' ) {
+ $self->create_defaults();
+ }
return;
}
@@ -89,8 +94,7 @@ sub get_master_password {
sub create_config {
my ($self) = @_;
- $self->{default}{cost} //= 12;
- $self->{master_cost} = $self->{default}{cost};
+ my $cost = $self->{master_cost} = $self->{default}{cost} // 12;
my $pass = $self->{default}{master_password}
// $self->ui->read_pw( 'Master Password', 1 );
@@ -100,25 +104,14 @@ sub create_config {
passphrase => $pass,
);
- $self->write_config();
-
- return;
-}
-
-sub write_config {
- my ($self) = @_;
-
- my $cost = $self->{master_cost};
- my $salt = $self->pw->salt;
- my $hash = $self->pw->bcrypt;
- my $new_cost = $self->{default}{cost};
+ my $hash = $self->{master_hash} = $self->pw->bcrypt;
+ my $salt = $self->{master_salt} = $self->pw->salt;
write_file(
$self->{xdg_conf} . '/password',
"cost ${cost}\n",
"salt ${salt}\n",
"hash ${hash}\n",
- "new_cost ${new_cost}\n",
);
return;
@@ -126,15 +119,53 @@ sub write_config {
sub load_config {
my ($self) = @_;
+
my $cfg = $self->file_to_hash( $self->{xdg_conf} . '/password' );
+
$self->{master_hash} = $cfg->{hash};
$self->{master_salt} = $cfg->{salt};
$self->{master_cost} = $cfg->{cost};
- $self->{default}{cost} //= $cfg->{new_cost} // 12;
return;
}
+sub create_defaults {
+ my ($self) = @_;
+
+ my $cost = $self->{default}{cost} // 12;
+ my $pwgen_cmd = $self->{default}{pwgen_cmd} // 'pwgen -s 23 1';
+
+ write_file(
+ $self->{xdg_conf} . '/defaults',
+ "cost = ${cost}\n",
+ "pwgen_cmd = ${pwgen_cmd}\n",
+ );
+
+ return;
+}
+
+sub load_defaults {
+ my ($self) = @_;
+
+ my $cfg = Config::Tiny->read( $self->{xdg_conf} . '/defaults' );
+
+ $self->{default}{cost} = $cfg->{_}->{cost};
+ $self->{default}{pwgen_cmd} = $cfg->{_}->{pwgen_cmd};
+
+ return;
+}
+
+sub cost {
+ my ( $self, $cost ) = @_;
+
+ if ($cost) {
+ $self->{default}{cost} = $cost;
+ $self->write_config();
+ }
+
+ return $self->{default}{cost};
+}
+
sub pw {
my ($self) = @_;
@@ -167,13 +198,15 @@ sub pw_save {
my $pass_hash = $self->pw->encrypt(
data => $data{password},
- salt => $data{salt}
+ salt => $data{salt},
+ cost => $data{cost},
);
my $extra_hash = (
$data{extra}
? $self->pw->encrypt(
data => $data{extra},
- salt => $data{salt}
+ salt => $data{salt},
+ cost => $data{cost},
)
: q{}
);
@@ -198,19 +231,26 @@ sub pw_load {
my $key = $self->file_to_hash( $data{file} );
+ # $self->{default}{cost} is the normal way, but older password files
+ # (created before the custom cost support) do not have a cost field and
+ # use the one of the master password
+
return {
- url => $key->{url},
- login => $key->{login},
+ url => $key->{url},
+ login => $key->{login},
+ cost => $key->{cost} // $self->{master_cost},
password => $self->pw->decrypt(
data => $key->{hash},
- salt => $key->{salt}
+ salt => $key->{salt},
+ cost => $key->{cost} // $self->{master_cost},
),
salt => $key->{salt},
extra => (
$key->{extra}
? $self->pw->decrypt(
data => $key->{extra},
- salt => $key->{salt}
+ salt => $key->{salt},
+ cost => $key->{cost} // $self->{master_cost},
)
: undef
),