Revision 263
Date:
2013/01/15 13:42:20
Author:
ahitrov
Revision Log:
Bug: get_session during first user request creates excess table record
Bug: store_value after get_session during first user request creates excess session
Files:
Legend:
Added
Removed
Modified
utf8/plugins/session/lib/session/Keeper.pm
54
54
55
55
sub logoff {
56
56
my $self = shift;
57
my %opts = @_;
57
my (%opts) = @_;
58
58
59
59
my $sid = _get_session_id ();
60
60
my $session = _get_session_object ( $sid );
…
…
63
63
my $session_id = $session->{_session_id};
64
64
if (!$sid || $sid ne $session_id) {
65
65
warn "LOGOFF: New or deprecated session. Old sid = '$sid', new sid = '$session_id'" if $DEBUG;
66
_store_session_id ($session_id)
66
_store_session_id ($session_id, %opts)
67
67
} else {
68
68
if ( exists $opts{clear} ) {
69
69
my @clear = qw( id email login name nick type status ltime );
…
…
114
114
115
115
sub get_value {
116
116
117
my ($self, $name) = @_;
118
my $sid = _get_session_id ();
117
my ($self, $name, %opts) = @_;
118
my $sid = delete $opts{_session_id} || _get_session_id ();
119
119
my $session = _get_session_object ( $sid );
120
120
return unless ref $session;
121
121
…
…
123
123
my $value = $session->{$name};
124
124
if (!$sid || $sid ne $session_id) {
125
125
warn "GET_VALUE: New or deprecated session. Old sid = '$sid', new sid = '$session_id'" if $DEBUG;
126
_store_session_id ($session_id);
126
_store_session_id ($session_id, %opts);
127
127
}
128
128
untie %$session;
129
129
return $value;
…
…
133
133
sub store_value {
134
134
135
135
my ($self, %opts) = @_;
136
my $sid = _get_session_id ();
136
my $domain = delete $opts{domain};
137
my $sid = delete $opts{_session_id} || _get_session_id ();
137
138
my $session = _get_session_object ( $sid );
138
139
return unless ref $session;
139
140
…
…
144
145
my $session_id = $session->{_session_id};
145
146
if (!$sid || $sid ne $session_id) {
146
147
warn "STORE_VALUE: New or deprecated session. Old sid = '$sid', new sid = '$session_id'" if $DEBUG;
147
_store_session_id ($session_id);
148
_store_session_id ($session_id, domain => $domain);
148
149
}
149
150
untie %$session;
150
151
return 1;
…
…
153
154
154
155
sub delete_key {
155
156
156
my ($self, $key) = @_;
157
my ($self, $key, %opts) = @_;
157
158
return unless $key;
158
159
159
my $sid = _get_session_id ();
160
my $sid = delete $opts{_session_id} || _get_session_id ();
160
161
my $session = _get_session_object ( $sid );
161
162
return unless ref $session;
162
163
163
164
my $session_id = $session->{_session_id};
164
165
if (!$sid || $sid ne $session_id) {
165
166
warn "DELETE_VALUE: New or deprecated session. Old sid = '$sid', new sid = '$session_id'" if $DEBUG;
166
_store_session_id ($session_id);
167
_store_session_id ($session_id, %opts);
167
168
} else {
168
169
delete $session->{$key} if exists $session->{$key};
169
170
}
…
…
175
176
sub get_session {
176
177
177
178
my $self = shift;
179
my (%opts) = @_;
178
180
179
181
my $sid = _get_session_id () || '';
180
182
my $session = _get_session_object ($sid);
…
…
184
186
my %ret = %$session;
185
187
if (!$sid || $sid ne $session_id) {
186
188
warn "\nGET_SESSION: New or deprecated session. Old sid = '$sid', new sid = '$session_id'\n" if $DEBUG;
187
_store_session_id ($session_id);
189
_store_session_id ($session_id, %opts);
188
190
}
189
191
untie %$session;
190
192
…
…
197
199
sub _store_session_id {
198
200
199
201
my $sid = shift;
202
my (%opts) = @_;
200
203
return unless $sid;
201
204
my $cookie = Apache::Cookie->new ($request->r(),
202
-domain => $state->{session}->domain,
205
-domain => $opts{domain} || $state->{session}->domain,
203
206
-name => $state->{session}->cookie,
204
207
-expires=> $state->{session}->expires,
205
208
-value => $sid,
…
…
212
215
213
216
sub _get_session_id {
214
217
218
my $keyname = shift || $state->{session}->cookie;
219
215
220
my %cookies = Apache::Cookie->fetch;
216
221
warn Dumper(\%cookies) if $DEBUG;
217
my $cookie = $cookies{$state->{session}->cookie};
222
my $cookie = $cookies{$keyname};
218
223
219
224
# Вытаскиваем SID из куки
220
225
my $sid = $cookie->value() || '' if $cookie;
…
…
253
258
if ($@) {
254
259
warn "Session data is not accessible: $@";
255
260
undef $sid;
256
} elsif ( $state->{session}->lifetime ) {
257
unless ( exists $session{_timestamp} ) {
258
$session{_timestamp} = $now;
259
} elsif ( ($now - $session{_timestamp}) > $state->{session}->lifetime ) {
260
undef $sid;
261
} elsif ( ($now - $session{_timestamp}) > $state->{session}->checkout ) {
262
$session{_timestamp} = $now;
261
} else {
262
$sid = $session{_session_id};
263
if ( $state->{session}->lifetime ) {
264
unless ( exists $session{_timestamp} ) {
265
$session{_timestamp} = $now;
266
} elsif ( ($now - $session{_timestamp}) > $state->{session}->lifetime ) {
267
undef $sid;
268
} elsif ( ($now - $session{_timestamp}) > $state->{session}->checkout ) {
269
$session{_timestamp} = $now;
270
}
263
271
}
264
272
}
265
273
unless ( $sid ) {
Небольшая справка по веткам
cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8 – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.