245 lines
5.9 KiB
Perl
Executable File
245 lines
5.9 KiB
Perl
Executable File
package Lemonldap::Handlers::Utilities;
|
|
use Apache2::Const;
|
|
use Apache::Session::Memorycached;
|
|
use BerkeleyDB;
|
|
use MIME::Base64;
|
|
use Crypt::CBC;
|
|
use URI::Escape;
|
|
use Data::Dumper;
|
|
use Template;
|
|
use CGI ':cgi-lib';
|
|
use Sys::Hostname;
|
|
use strict;
|
|
our ( @ISA, $VERSION, @EXPORTS );
|
|
$VERSION = '3.1.1';
|
|
our $VERSION_LEMONLDAP = "3.1";
|
|
our $VERSION_INTERNAL = "3.1";
|
|
my %STACK;
|
|
###########################################################
|
|
# cleanupcookie function (config,cookie line) #
|
|
# return $id storing in lemonldap cookie #
|
|
# and remove lemonldap cookie of header cookie #
|
|
# if STOPCCOKIE is actived #
|
|
# Should return undef,undef wihtout $id and cookie #
|
|
# #
|
|
###########################################################
|
|
sub cleanupcookie {
|
|
( my $config, my $cookie_line ) = @_;
|
|
return ( undef, undef ) unless $cookie_line;
|
|
my $local_cookie = $config->{'COOKIE'};
|
|
my @tab = split /;/, $cookie_line;
|
|
my @tmp;
|
|
my $id;
|
|
foreach (@tab) {
|
|
if (/$local_cookie=([^; ]+)/) {
|
|
push @tmp, $_ unless ( $config->{STOPCOOKIE} );
|
|
$id = $1;
|
|
$id =~ s/\s//g; # remove space
|
|
}
|
|
else { push @tmp, $_; }
|
|
}
|
|
my $ret;
|
|
|
|
if (@tmp) {
|
|
$ret = join ";", @tmp;
|
|
}
|
|
return ( $id, $ret );
|
|
}
|
|
|
|
sub get_my_timeout {
|
|
( my $config, my $cookie_line ) = @_;
|
|
return ( undef, undef ) unless $cookie_line;
|
|
my $local_cookie = $config->{'COOKIE'};
|
|
my @tab = split /;/, $cookie_line;
|
|
my @tmp;
|
|
my $cookie;
|
|
my $id;
|
|
my $sep;
|
|
|
|
foreach (@tab) {
|
|
if (/$local_cookie=([^; ]+)/) {
|
|
$cookie = $_;
|
|
}
|
|
else {
|
|
push @tmp, $_;
|
|
}
|
|
|
|
}
|
|
$sep = "_";
|
|
|
|
#On separe le time_end et l'id de session
|
|
my @tab_tmp = split( $sep, $cookie );
|
|
my $id = $tab_tmp[0];
|
|
my $timeout = $tab_tmp[1];
|
|
if ( defined( $config->{ENCRYPTIONKEY} ) ) {
|
|
my $clef = $config->{ENCRYPTIONKEY};
|
|
my $cipher = new Crypt::CBC(
|
|
-key => $clef,
|
|
-cipher => 'Blowfish',
|
|
-iv => 'lemonlda',
|
|
-header => 'none'
|
|
);
|
|
$timeout = $cipher->decrypt_hex($timeout);
|
|
}
|
|
push @tmp, $id;
|
|
|
|
my $ret;
|
|
|
|
if (@tmp) {
|
|
$ret = join ";", @tmp;
|
|
|
|
}
|
|
|
|
return ( $ret, $timeout );
|
|
}
|
|
|
|
sub rewrite_cookie {
|
|
( my $cookie_line, my $config ) = @_;
|
|
my $local_domain = $config->{'DOMAIN'};
|
|
my @tab = split /;/, $cookie_line;
|
|
my @tmp;
|
|
my $flag;
|
|
foreach (@tab) {
|
|
next if /path/;
|
|
|
|
# $date = $_ if /expire/i;
|
|
|
|
( push @tmp, $_ ) and (next) unless /domain/;
|
|
( my $domain ) = /domain\s?=\s?([^; ]+)/;
|
|
if ( $domain =~ /$local_domain/i ) {
|
|
push @tmp, $_;
|
|
}
|
|
else {
|
|
$flag = 1;
|
|
my $l = 'domain = .' . $local_domain;
|
|
push @tmp, $l;
|
|
}
|
|
|
|
}
|
|
my $ret = join ";", @tmp;
|
|
if ($flag) {
|
|
return $ret;
|
|
}
|
|
else { return $cookie_line; }
|
|
|
|
}
|
|
|
|
sub cache2 {
|
|
my ( $path, $pid, $id ) = @_;
|
|
my $message;
|
|
my $ligne_h;
|
|
tie %STACK, 'BerkeleyDB::Btree',
|
|
-Filename => "$path/$pid.db",
|
|
-Flags => DB_CREATE;
|
|
$ligne_h = $STACK{$id};
|
|
if ($ligne_h) { ## match in ipc
|
|
$message = "match in cache level 2 for $id";
|
|
untie %STACK;
|
|
}
|
|
else {
|
|
$message = "No match in cache level 2 for $id";
|
|
}
|
|
|
|
return ( $ligne_h, $message );
|
|
|
|
}
|
|
|
|
sub goPortal {
|
|
my ( $r, $conf, $op, $id ) = @_;
|
|
my $log = $r->log;
|
|
my %CONFIG = %$conf;
|
|
my $test = $r->construct_url();
|
|
|
|
#ATTENTION : ne valide que les http et https
|
|
my $prot;
|
|
|
|
if ( $test =~ /^https/ ) {
|
|
$prot = "https://";
|
|
}
|
|
else {
|
|
$prot = "http://";
|
|
}
|
|
|
|
my $urlc_init = $prot . $r->headers_in->{Host} . $r->uri;
|
|
$urlc_init .= "?" . $r->args if $r->args;
|
|
my $urlc_initenc = encode_base64( $urlc_init, "" );
|
|
$r->err_headers_out->add( Pragma => 'no-cache' );
|
|
$r->headers_out->add(
|
|
Location => $CONFIG{PORTAL} . "?op=$op&url=$urlc_initenc" );
|
|
$r->err_headers_out->add( Connection => 'close' );
|
|
$log->error(
|
|
"SERVER MEMCACHED UNREACHABLE. PLEASE CHECK IF YOUR SERVER IS ON OR IF YOUR CONFIGURATION FILE IS CORRECT"
|
|
)
|
|
if ( $op eq 'm' );
|
|
my $messagelog =
|
|
"$CONFIG{HANDLERID} : Redirect to portal (url was " . $urlc_init . ")";
|
|
$log->info($messagelog);
|
|
return REDIRECT;
|
|
|
|
}
|
|
|
|
sub save_session {
|
|
my $id = shift;
|
|
my $trace = shift;
|
|
$STACK{$id} = $trace;
|
|
untie %STACK;
|
|
}
|
|
|
|
sub fake_refresh_ldap {
|
|
|
|
my $HashSession = shift;
|
|
my $config = shift;
|
|
my $ttl = shift;
|
|
my $new_SessExp;
|
|
my $central = $config->{SERVERS};
|
|
my $refresh = $config->{SESSCACHEREFRESHPERIOD};
|
|
$central->{timeout} = $ttl;
|
|
|
|
#No insertion in Memcached before untie
|
|
$central->{updateOnly} = 1;
|
|
|
|
my %Session;
|
|
tie %Session, 'Apache::Session::Memorycached', undef, $central;
|
|
foreach ( keys %{$HashSession} ) {
|
|
if ( "SessExpTime" eq $_ ) {
|
|
$new_SessExp = time() + $refresh;
|
|
$HashSession->{$_} = $new_SessExp;
|
|
}
|
|
$Session{$_} = $HashSession->{$_} if $HashSession->{$_};
|
|
}
|
|
untie %Session;
|
|
return $new_SessExp;
|
|
|
|
}
|
|
|
|
sub save_memcached_local {
|
|
|
|
my $HashSession = shift;
|
|
my $local = shift;
|
|
my $ttl = shift;
|
|
my $safe = $local->{'servers'};
|
|
|
|
if ( $local->{'servers'} ) {
|
|
delete $local->{'servers'};
|
|
}
|
|
$local->{timeout} = $ttl;
|
|
|
|
#No insertion in Memcached before untie
|
|
$local->{updateOnly} = 1;
|
|
|
|
my %Session;
|
|
tie %Session, 'Apache::Session::Memorycached', undef, $local;
|
|
foreach ( keys %{$HashSession} ) {
|
|
|
|
$Session{$_} = $HashSession->{$_} if $HashSession->{$_};
|
|
}
|
|
|
|
untie %Session;
|
|
if ($safe) {
|
|
$local->{'servers'} = $safe;
|
|
}
|
|
|
|
}
|
|
|
|
1;
|