1# OpenXPKI::Client::UI::Bootstrap
2# Written 2013 by Oliver Welter
3# (C) Copyright 2013 by The OpenXPKI Project
4
5package OpenXPKI::Client::UI::Bootstrap;
6use Moose;
7
8extends 'OpenXPKI::Client::UI::Result';
9
10# Core modules
11use Data::Dumper;
12use Digest::SHA;
13
14# Project modules
15use OpenXPKI::i18n qw( i18nTokenizer get_language );
16
17
18sub init_structure {
19
20    my $self = shift;
21    my $session = $self->_session;
22    my $user = $session->param('user') || undef;
23
24    # create CSRF token
25    if (!$session->param('rtoken')) {
26        $self->logger->debug('Generate rtoken');
27        $session->param('rtoken', Digest::SHA::sha1_hex( $$. $session->id() . rand(2**32) ) );
28    }
29    $self->_result->{rtoken} = $session->param('rtoken');
30
31    $self->_result->{language} = get_language();
32
33    # To issue redirects to the UI, we store the referrer
34    # default is mainly relevant for test scripts
35    my $baseurl = $self->param('baseurl') || '/openxpki';
36    $baseurl =~ s|/$||;
37    $session->param('baseurl',  $baseurl.'/#/');
38    $session->flush;
39    $self->logger->debug("Baseurl from referrer: " . $baseurl);
40
41    if ($session->param('is_logged_in') && $user) {
42        $self->_result->{user} = $user;
43
44        # Preselect tenant, for now we just pick the first from the list
45        if ($user->{tenants}) {
46            $self->_result->{tenant} = $user->{tenants}->[0]->{value};
47            $self->logger->trace('Preset tenant from items ' . Dumper $user->{tenants}) if $self->logger->is_trace;
48        }
49
50        $self->_result->{structure} = $session->param('menu');
51
52        # Ping endpoint
53        if (my $ping = $session->param('ping')) {
54            $self->_result->{ping} = $ping;
55        }
56
57        # Redirection targets for apache based SSO Handling
58        if (my $auth = $session->param('authinfo')) {
59            if (my $target = ($auth->{resume} || $auth->{login})) {
60                $self->_result->{on_exception} = [{
61                    status_code => [ 403, 401 ],
62                    redirect => $target,
63                }];
64            }
65        }
66    }
67
68    # default menu if nothing was set before
69    $self->_result->{structure} ||= [{
70        key => 'logout',
71        label => 'I18N_OPENXPKI_UI_CLEAR_LOGIN',
72        entries => [],
73    }];
74
75    return $self;
76
77}
78
79
80sub init_error {
81
82    my $self = shift;
83    my $args = shift;
84
85    $self->_result->{main} = [{
86        type => 'text',
87        content => {
88            headline => 'I18N_OPENXPKI_UI_OOPS',
89            paragraphs => [{text=>'I18N_OPENXPKI_UI_OOPS'}]
90        }
91    }];
92
93    return $self;
94}
951;
96