Line # Revision Author
1 272 ahitrov package session::Session;
2
3 use strict;
4 use warnings 'all';
5 use Contenido::Globals;
6 use session::Keeper;
7
8 sub new {
9 my ($proto, %params) = @_;
10 my $class = ref($proto) || $proto;
11 my $self = {};
12 bless $self, $class;
13 if ( exists $params{_session_id} ) {
14 $self->{_session_id} = delete $params{_session_id};
15 $self->{_timestamp} = delete $params{_timestamp};
16 }
17 $self->{_domain} = delete $params{domain} || $state->{session}->domain;
18 while ( my ($key, $val) = each %params ) {
19 $self->{$key} = $val;
20 }
21
22 return $self;
23 }
24
25 sub session_id {
26 my $self = shift;
27 return $self->{_session_id};
28 }
29
30 sub _session_id {
31 my $self = shift;
32 return $self->{_session_id};
33 }
34
35 sub rehash {
36 my ($self, $session) = @_;
37 return $self if $self->{_session_id} eq $session->{_session_id};
38
39 warn "STORE_VALUE: New or deprecated session. Old sid = [".$self->{_session_id}."], new sid = [".$session->{_session_id}."]" if $DEBUG;
40 session::Keeper::_store_session_id ($session->{_session_id}, domain => $self->{_domain});
41
42 foreach my $key ( keys %$self ) {
43 next if $key eq '_domain';
44 delete $self->{$key};
45 }
46 while ( my ($key, $val) = each %$session ) {
47 $self->{$key} = $val;
48 }
49 return $self;
50 }
51
52 sub id {
53 my $self = shift;
54 return (exists $self->{id} && $self->{id} ? $self->{id} : undef);
55 }
56
57 sub get {
58 my ($self, $name) = @_;
59 return ($name && exists $self->{$name} ? $self->{$name} : undef);
60 }
61
62 sub set {
63 my ($self, %opts) = @_;
64 my $sid = $self->{_session_id};
65 my $session = session::Keeper::_get_session_object( $sid );
66 return unless ref $session;
67
68 $self->rehash( $session );
69 while ( my ($key, $val) = each %opts ) {
70 $session->{$key} = $val;
71 $self->{$key} = $val;
72 }
73
74 untie %$session;
75 1;
76 }
77
78 sub delete {
79 my ($self, @keys) = @_;
80
81 my $sid = $self->{_session_id};
82 my $session = session::Keeper::_get_session_object( $sid );
83 return unless ref $session;
84
85 $self->rehash( $session );
86
87 foreach my $key ( @keys ) {
88 if ( exists $self->{$key} ) {
89 delete $session->{$key};
90 delete $self->{$key};
91 }
92 }
93
94 untie %$session;
95 1;
96 }
97
98 sub logon {
99 my $self = shift;
100 my %opts = @_;
101
102 my $profile = delete $opts{profile};
103 return unless ref $profile || (($opts{login} || $opts{email}) && $opts{passwd});
104
105 if ( ref $profile ) {
106 my %data = session::Keeper::_get_hash_from_profile( $profile );
107 $self->set ( %data );
108 } else {
109 my @plugins = split (/[\ |\t]+/, $state->{plugins});
110 if ( grep { $_ eq 'users' } @plugins ) {
111 #### Авторизация через плагин users
112 #########################################
113 $profile = $keeper->{users}->login (
114 $opts{login} ? (login => $opts{login}) : (),
115 $opts{email} ? (email => lc($opts{email})) : (),
116 307 ahitrov $opts{phone} ? (phone => $opts{phone}) : (),
117 272 ahitrov passwd => $opts{passwd},
118 );
119 } else {
120 #### Авторизация иным способом
121 }
122 if ( ref $profile ) {
123 my %data = session::Keeper::_get_hash_from_profile( $profile );
124 $self->set ( %data );
125 } else {
126 $self->set( login_error_code => 404 );
127 }
128 }
129 return $self;
130 }
131
132 sub logoff {
133 my ($self, %opts) = @_;
134
135 my $sid = $self->{_session_id};
136 my $session = session::Keeper::_get_session_object( $sid );
137 return unless ref $session;
138
139 $self->rehash( $session );
140
141 if ( exists $opts{clear} ) {
142 my @clear = qw( id email login name nick type status ltime type avatar );
143 push @clear, @{ $opts{clear} } if ref $opts{clear} eq 'ARRAY' && @{ $opts{clear} };
144 foreach my $key ( @clear ) {
145 delete $session->{$key};
146 delete $self->{$key}
147 }
148 } else {
149 foreach my $key ( keys %$session ) {
150 next if $key =~ /^_/;
151
152 delete $session->{$key};
153 delete $self->{$key}
154 }
155 }
156
157 untie %$session;
158 1;
159 }
160
161
162 1;