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 )