1package MockUI; 2 3use Moose; 4use namespace::autoclean; 5 6extends 'OpenXPKI::Client::UI'; 7 8use JSON; 9use CGIMock; 10use CGI::Session; 11use OpenXPKI::Client::UI::Request; 12 13 14has cgi => ( 15 is => 'rw', 16 isa => 'Object', 17 lazy => 1, 18 default => sub { return CGIMock->new }, 19); 20 21has json => ( 22 is => 'rw', 23 isa => 'Object', 24 lazy => 1, 25 default => sub { return JSON->new->utf8 }, 26); 27 28has wf_token => ( 29 is => 'rw', 30 isa => 'Str', 31 lazy => 1, 32 default => '', 33); 34 35has rtoken => ( 36 is => 'rw', 37 isa => 'Str', 38 lazy => 1, 39 default => '', 40); 41 42 43sub mock_json_request { 44 my ($self, $data) = @_; 45 46 $self->cgi->content_type('application/json'); 47 $self->cgi->data({ POSTDATA => $self->json->encode($self->__insert_token($data)) }); 48 49 return $self->__request; 50} 51 52sub mock_request { 53 my ($self, $data) = @_; 54 55 $self->cgi->content_type('application/x-www-form-urlencoded'); 56 $self->cgi->data($self->__insert_token($data)); 57 58 return $self->__request; 59} 60 61sub __insert_token { 62 my ($self, $data) = @_; 63 64 my %result = %$data; 65 $result{wf_token} = $self->wf_token if (exists $data->{wf_token} and not $data->{wf_token}); 66 $result{_rtoken} = $self->rtoken unless exists $data->{_rtoken}; 67 68 return \%result; 69} 70 71sub __request { 72 my $self = shift; 73 74 my($out); 75 local *STDOUT; 76 open(STDOUT, '>', \$out); 77 78 $self->handle_request( 79 OpenXPKI::Client::UI::Request->new( 80 cgi => $self->cgi, 81 session => $self->session, 82 logger => $self->logger, 83 ) 84 ); 85 my $json = $self->json->decode($out); 86 87 if (ref $json->{main} and my $fields = $json->{main}->[0]->{content}->{fields}) { 88 $self->wf_token($_->{value}) for grep { $_->{name} eq 'wf_token' } @$fields; 89 } 90 91 return $json; 92} 93 94sub update_rtoken { 95 my $self = shift; 96 97 my $result = $self->mock_request({'page' => 'bootstrap!structure'}); 98 my $rtoken = $result->{rtoken}; 99 $self->rtoken( $rtoken ); 100 return $rtoken; 101} 102 103# Static call that generates a ready-to-use client 104sub factory { 105 my $log = Log::Log4perl->get_logger(); 106 107 my $session = CGI::Session->new(undef, undef, {Directory=>'/tmp'}); 108 109 my $client = MockUI->new({ 110 session => $session, 111 logger => $log, 112 config => { socket => '/var/openxpki/openxpki.socket' } 113 }); 114 115 $client->update_rtoken(); 116 117 $client ->mock_request({ page => 'login'}); 118 119 $client ->mock_request({ 120 'action' => 'login!stack', 121 'auth_stack' => "Testing", 122 }); 123 124 $client ->mock_request({ 125 'action' => 'login!password', 126 'username' => 'raop', 127 'password' => 'openxpki' 128 }); 129 130 $client->update_rtoken(); 131 132 return $client; 133} 134 135 136__PACKAGE__->meta->make_immutable; 137