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