epic-ts
[kivitendo-erp.git] / SL / Auth / SessionValue.pm
1 package SL::Auth::SessionValue;
2
3 use strict;
4
5 # Classes that overload stringification must be known before
6 # YAML::Load() is called.
7 use SL::Locale::String ();
8
9 use Scalar::Util qw(weaken);
10 use YAML;
11
12 use SL::DBUtils;
13
14 sub new {
15   my ($class, %params) = @_;
16
17   my $self = bless {}, $class;
18
19   map { $self->{$_} = $params{$_} } qw(auth key value auto_restore);
20
21   $self->{fetched} =                  exists $params{value};
22   $self->{parsed}  = !$params{raw} && exists $params{value};
23
24   # delete $self->{auth};
25   # $::lxdebug->dump(0, "NEW", $self);
26   # $self->{auth} = $params{auth};
27
28   weaken $self->{auth};
29
30   return $self;
31 }
32
33 sub get {
34   my ($self) = @_;
35   return $self->_fetch->_parse->{value};
36 }
37
38 sub get_dumped {
39   my ($self) = @_;
40   no warnings 'once';
41   local $YAML::Stringify = 1;
42   return YAML::Dump($self->get);
43 }
44
45 sub _fetch {
46   my ($self) = @_;
47
48   return $self if $self->{fetched};
49
50   my $dbh          = $self->{auth}->dbconnect;
51   my $query        = qq|SELECT sess_value FROM auth.session_content WHERE (session_id = ?) AND (sess_key = ?)|;
52   ($self->{value}) = selectfirst_array_query($::form, $dbh, $query, $self->{auth}->get_session_id, $self->{key});
53   $self->{fetched} = 1;
54
55   return $self;
56 }
57
58 sub _parse {
59   my ($self) = @_;
60
61   $self->{value}  = YAML::Load($self->{value}) unless $self->{parsed};
62   $self->{parsed} = 1;
63
64   return $self;
65 }
66
67 sub _load_value {
68   my ($self, $value) = @_;
69
70   return { simple => 1, data => $value } if $value !~ m/^---/;
71
72   my %params = ( simple => 1 );
73   eval {
74     my $data = YAML::Load($value);
75
76     if (ref $data eq 'HASH') {
77       map { $params{$_} = $data->{$_} } keys %{ $data };
78       $params{simple} = 0;
79
80     } else {
81       $params{data}   = $data;
82     }
83
84     1;
85   } or $params{data} = $value;
86
87   return \%params;
88 }
89
90 1;