DBIO
view release on metacpan or search on metacpan
lib/DBIO/EncodedColumn.pm view on Meta::CPAN
return _constant_time_eq($expected, $got);
}
sub _encoded_value_is_hash {
my ($self, $value) = @_;
return 0 unless defined $value && !ref($value);
# Supported DBIO::EncodedColumn format
return 1 if $value =~ /\Adbio\$[^\$]+\$[^\$]*\$[^\$]+\z/;
# Common bcrypt prefix, accepted as pre-encoded passthrough
return 1 if $value =~ /\A\$2[abxy]?\$/;
return 0;
}
sub _digest_ctx {
my ($self, $algorithm) = @_;
t/94encoded_column.t view on Meta::CPAN
TestDBIO::Encoded::Schema->register_class(User => 'TestDBIO::Encoded::Schema::Result::User');
my $schema = TestDBIO::Encoded::Schema->connect(sub { });
$schema->storage(DBIO::Test::Storage->new($schema));
my $user = $schema->resultset('User')->new_result({ password => 's3cret' });
my $encoded = $user->get_column('password');
unlike($encoded, qr/\As3cret\z/, 'password is encoded, not stored plaintext');
like($encoded, qr/\Adbio\$SHA-256\$[^\$]*\$[^\$]+\z/, 'password uses DBIO encoded format');
is($user->get_column('password'), $encoded, 'encoded value is stable across repeated reads');
ok($user->check_password('s3cret'), 'check_password accepts the correct value');
ok(!$user->check_password('wrong'), 'check_password rejects an invalid value');
my $second = $schema->resultset('User')->new_result({ password => 's3cret' });
my $second_encoded = $second->get_column('password');
isnt($second_encoded, $encoded, 'salting generates different hashes for same plaintext');
( run in 1.531 second using v1.01-cache-2.11-cpan-14f38c9f855 )