Skip to content

Commit

Permalink
Merge branch 'pr/1006' into devel
Browse files Browse the repository at this point in the history
  • Loading branch information
yanick committed Mar 26, 2014
2 parents 63b78bb + 5904765 commit 7408271
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 10 deletions.
2 changes: 2 additions & 0 deletions CHANGES
Expand Up @@ -10,6 +10,8 @@ NEXT
(GH#996, Bernhard Reutner-Fischer)
* Serializer::Mutable now correctly deals with content-types
with charsets. (GH#996, Bernhard Reutner-Fischer)
* Without Clone(), Dancer::Error::dumper() could clobber
values in deep structures. (GH#1006, fix by asergei)


[ MISC ]
Expand Down
13 changes: 8 additions & 5 deletions lib/Dancer/Error.pm
Expand Up @@ -118,13 +118,16 @@ sub dumper {


# Take a copy of the data, so we can mask sensitive-looking stuff:
my %data = Dancer::ModuleLoader->load('Clone') ?
%{ Clone::clone($obj) } :
%$obj;
my $censored = _censor(\%data);
my $data = Dancer::ModuleLoader->load('Clone') ?
Clone::clone($obj)
: eval Data::Dumper->new([$obj])->Purity(1)->Terse(1)->Deepcopy(1)->Dump;

$data = {%$data} if blessed($data);

my $censored = _censor($data);

#use Data::Dumper;
my $dd = Data::Dumper->new([\%data]);
my $dd = Data::Dumper->new([$data]);
$dd->Terse(1)->Quotekeys(0)->Indent(1)->Sortkeys(1);
my $content = $dd->Dump();
$content =~ s{(\s*)(\S+)(\s*)=>}{$1<span class="key">$2</span>$3 =&gt;}g;
Expand Down
16 changes: 11 additions & 5 deletions t/12_response/10_error_dumper.t
Expand Up @@ -5,14 +5,14 @@ use Test::More;
use Dancer::Error;
use Dancer::ModuleLoader;

plan skip_all => 'Clone is required for this test'
unless Dancer::ModuleLoader->load('Clone');

plan tests => 4;
plan tests => 5;

my $error_obj = Dancer::Error->new(
code => '404',
pass => 'secret',
deep => {
pass => 'secret'
},
);

isa_ok( $error_obj, 'Dancer::Error' );
Expand All @@ -21,7 +21,7 @@ my $censored = $error_obj->dumper;

like(
$censored,
qr/\QNote: Values of 1 sensitive-looking key hidden\E/,
qr/\QNote: Values of 2 sensitive-looking keys hidden\E/,
'Data was censored in the output',
);

Expand All @@ -31,6 +31,12 @@ is(
'Original data was not overwritten',
);

is(
$error_obj->{'deep'}{'pass'},
'secret',
'Censoring of complex data structures works fine',
);

my %recursive;
$recursive{foo}{bar}{baz} = 1;
$recursive{foo}{bar}{oops} = $recursive{foo};
Expand Down
34 changes: 34 additions & 0 deletions t/12_response/10_error_dumper_without_clone.t
@@ -0,0 +1,34 @@
use strict;
use warnings;

BEGIN {
use Test::More;

plan skip_all => 'Devel::Hide required' unless eval 'use Devel::Hide; 1';
}

use Devel::Hide 'Clone';

plan tests => 3;

{
package MyApp;

use Dancer;

my $data = { deep => { secret => 'akadabra' } };

get '/dump' => sub { Dancer::Error::dumper( $data ) };
get '/straight' => sub { $data->{deep}{secret} };
}

use Dancer::Test;


response_content_is '/straight' => 'akadabra', 'secret visible';

response_content_like '/dump' => qr/secret.*Hidden/, 'masked by dumper()';

response_content_is '/straight' => 'akadabra', '...but not modified';


0 comments on commit 7408271

Please sign in to comment.