Line # Revision Author
1 281 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 passwd => $opts{passwd},
117 );
118 } else {
119 #### ����������� ���� ��������
120 }
121 if ( ref $profile ) {
122 my %data = session::Keeper::_get_hash_from_profile( $profile );
123 $self->set ( %data );
124 } else {
125 $self->set( login_error_code => 404 );
126 }
127 }
128 return $self;
129 }
130
131 sub logoff {
132 my ($self, %opts) = @_;
133
134 my $sid = $self->{_session_id};
135 my $session = session::Keeper::_get_session_object( $sid );
136 return unless ref $session;
137
138 $self->rehash( $session );
139
140 if ( exists $opts{clear} ) {
141 my @clear = qw( id email login name nick type status ltime avatar );
142 push @clear, @{ $opts{clear} } if ref $opts{clear} eq 'ARRAY' && @{ $opts{clear} };
143 foreach my $key ( @clear ) {
144 delete $session->{$key};
145 delete $self->{$key}
146 }
147 } else {
148 foreach my $key ( keys %$session ) {
149 next if $key =~ /^_/;
150
151 delete $session->{$key};
152 delete $self->{$key}
153 }
154 }
155
156 untie %$session;
157 1;
158 }
159
160
161 1;