diff options
Diffstat (limited to 'rt/lib/RT/Interface/Web/Session.pm')
-rw-r--r-- | rt/lib/RT/Interface/Web/Session.pm | 285 |
1 files changed, 0 insertions, 285 deletions
diff --git a/rt/lib/RT/Interface/Web/Session.pm b/rt/lib/RT/Interface/Web/Session.pm deleted file mode 100644 index 1e0e6d5..0000000 --- a/rt/lib/RT/Interface/Web/Session.pm +++ /dev/null @@ -1,285 +0,0 @@ -# BEGIN BPS TAGGED BLOCK {{{ -# -# COPYRIGHT: -# -# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC -# <jesse@bestpractical.com> -# -# (Except where explicitly superseded by other copyright notices) -# -# -# LICENSE: -# -# This work is made available to you under the terms of Version 2 of -# the GNU General Public License. A copy of that license should have -# been provided with this software, but in any event can be snarfed -# from www.gnu.org. -# -# This work is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA -# 02110-1301 or visit their web page on the internet at -# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. -# -# -# CONTRIBUTION SUBMISSION POLICY: -# -# (The following paragraph is not intended to limit the rights granted -# to you to modify and distribute this software under the terms of -# the GNU General Public License and is only of importance to you if -# you choose to contribute your changes and enhancements to the -# community by submitting them to Best Practical Solutions, LLC.) -# -# By intentionally submitting any modifications, corrections or -# derivatives to this work, or any other work intended for use with -# Request Tracker, to Best Practical Solutions, LLC, you confirm that -# you are the copyright holder for those contributions and you grant -# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, -# royalty-free, perpetual, license to use, copy, create derivative -# works based on those contributions, and sublicense and distribute -# those contributions and any derivatives thereof. -# -# END BPS TAGGED BLOCK }}} - -package RT::Interface::Web::Session; -use warnings; -use strict; - -use RT::CurrentUser; - -=head1 NAME - -RT::Interface::Web::Session - RT web session class - -=head1 SYNOPSYS - - -=head1 DESCRIPTION - -RT session class and utilities. - -CLASS METHODS can be used without creating object instances, -it's mainly utilities to clean unused session records. - -Object is tied hash and can be used to access session data. - -=head1 METHODS - -=head2 CLASS METHODS - -=head3 Class - -Returns name of the class that is used as sessions storage. - -=cut - -sub Class { - my $self = shift; - - my $class = RT->Config->Get('WebSessionClass') - || $self->Backends->{RT->Config->Get('DatabaseType')} - || 'Apache::Session::File'; - eval "require $class"; - die $@ if $@; - return $class; -} - -=head3 Backends - -Returns hash reference with names of the databases as keys and -sessions class names as values. - -=cut - -sub Backends { - return { - mysql => 'Apache::Session::MySQL', - Pg => 'Apache::Session::Postgres', - }; -} - -=head3 Attributes - -Returns hash reference with attributes that are used to create -new session objects. - -=cut - -sub Attributes { - my $class = $_[0]->Class; - return !$class->isa('Apache::Session::File') ? { - Handle => $RT::Handle->dbh, - LockHandle => $RT::Handle->dbh, - Transaction => 1, - } : { - Directory => $RT::MasonSessionDir, - LockDirectory => $RT::MasonSessionDir, - Transaction => 1, - }; -} - -=head3 Ids - -Returns array ref with list of the session IDs. - -=cut - -sub Ids { - my $self = shift || __PACKAGE__; - my $attributes = $self->Attributes; - if( $attributes->{Directory} ) { - return $self->_IdsDir( $attributes->{Directory} ); - } else { - return $self->_IdsDB( $RT::Handle->dbh ); - } -} - -sub _IdsDir { - my ($self, $dir) = @_; - require File::Find; - my %file; - File::Find::find( - sub { return unless /^[a-zA-Z0-9]+$/; - $file{$_} = (stat($_))[9]; - }, - $dir, - ); - - return [ sort { $file{$a} <=> $file{$b} } keys %file ]; -} - -sub _IdsDB { - my ($self, $dbh) = @_; - my $ids = $dbh->selectcol_arrayref("SELECT id FROM sessions ORDER BY LastUpdated DESC"); - die "couldn't get ids: ". $dbh->errstr if $dbh->errstr; - return $ids; -} - -=head3 ClearOld - -Takes seconds and deletes all sessions that are older. - -=cut - -sub ClearOld { - my $class = shift || __PACKAGE__; - my $attributes = $class->Attributes; - if( $attributes->{Directory} ) { - return $class->_CleariOldDir( $attributes->{Directory}, @_ ); - } else { - return $class->_ClearOldDB( $RT::Handle->dbh, @_ ); - } -} - -sub _ClearOldDB { - my ($self, $dbh, $older_than) = @_; - my $rows; - unless( int $older_than ) { - $rows = $dbh->do("DELETE FROM sessions"); - die "couldn't delete sessions: ". $dbh->errstr unless defined $rows; - } else { - require POSIX; - my $date = POSIX::strftime("%Y-%m-%d %H:%M", localtime( time - int $older_than ) ); - - my $sth = $dbh->prepare("DELETE FROM sessions WHERE LastUpdated < ?"); - die "couldn't prepare query: ". $dbh->errstr unless $sth; - $rows = $sth->execute( $date ); - die "couldn't execute query: ". $dbh->errstr unless defined $rows; - } - - $RT::Logger->info("successfuly deleted $rows sessions"); - return; -} - -sub _ClearOldDir { - my ($self, $dir, $older_than) = @_; - - require File::Spec if int $older_than; - - my $now = time; - my $class = $self->Class; - my $attrs = $self->Attributes; - - foreach my $id( @{ $self->Ids } ) { - if( int $older_than ) { - my $ctime = (stat(File::Spec->catfile($dir,$id)))[9]; - if( $ctime > $now - $older_than ) { - $RT::Logger->debug("skipped session '$id', isn't old"); - next; - } - } - - my %session; - local $@; - eval { tie %session, $class, $id, $attrs }; - if( $@ ) { - $RT::Logger->debug("skipped session '$id', couldn't load: $@"); - next; - } - tied(%session)->delete; - $RT::Logger->info("successfuly deleted session '$id'"); - } - return; -} - -=head3 ClearByUser - -Checks all sessions and if user has more then one session -then leave only the latest one. - -=cut - -sub ClearByUser { - my $self = shift || __PACKAGE__; - my $class = $self->Class; - my $attrs = $self->Attributes; - - my %seen = (); - foreach my $id( @{ $self->Ids } ) { - my %session; - local $@; - eval { tie %session, $class, $id, $attrs }; - if( $@ ) { - $RT::Logger->debug("skipped session '$id', couldn't load: $@"); - next; - } - if( $session{'CurrentUser'} && $session{'CurrentUser'}->id ) { - unless( $seen{ $session{'CurrentUser'}->id }++ ) { - $RT::Logger->debug("skipped session '$id', first user's session"); - next; - } - } - tied(%session)->delete; - $RT::Logger->info("successfuly deleted session '$id'"); - } -} - -sub TIEHASH { - my $self = shift; - my $id = shift; - - my $class = $self->Class; - my $attrs = $self->Attributes; - - my %session; - - local $@; - eval { tie %session, $class, $id, $attrs }; - eval { tie %session, $class, undef, $attrs } if $@; - if ( $@ ) { - die loc("RT couldn't store your session.") . "\n" - . loc("This may mean that that the directory '[_1]' isn't writable or a database table is missing or corrupt.", - $RT::MasonSessionDir) - . "\n\n" - . $@; - } - - return tied %session; -} - -1; |