Merge branch 'master' of /usr/local/git/koha_base.git/
[koha.git] / C4 / Auth.pm
index 8d57a94..14ae8da 100644 (file)
@@ -22,12 +22,13 @@ package C4::Auth;
 
 use strict;
 use Digest::MD5 qw(md5_base64);
+use CGI::Session;
+
 
 require Exporter;
 use C4::Context;
 use C4::Output;    # to get the template
-use C4::Interface::CGI::Output;
-use C4::Circulation::Circ2;    # getpatroninformation
+use C4::Members;
 use C4::Koha;
 use C4::Branch; # GetBranches
 
@@ -53,15 +54,18 @@ C4::Auth - Authenticates Koha users
   my $query = new CGI;
 
   my ($template, $borrowernumber, $cookie) 
-    = get_template_and_user({template_name   => "opac-main.tmpl",
-                             query           => $query,
-                            type            => "opac",
-                            authnotrequired => 1,
-                            flagsrequired   => {borrow => 1},
-                         });
+    = get_template_and_user(
+        {
+            template_name   => "opac-main.tmpl",
+            query           => $query,
+           type            => "opac",
+           authnotrequired => 1,
+           flagsrequired   => {borrow => 1},
+       }
+    );
 
   print $query->header(
-    -type => guesstype($template->output),
+    -type => 'utf-8',
     -cookie => $cookie
   ), $template->output;
 
@@ -88,12 +92,15 @@ C4::Auth - Authenticates Koha users
 =item get_template_and_user
 
   my ($template, $borrowernumber, $cookie)
-    = get_template_and_user({template_name   => "opac-main.tmpl",
-                             query           => $query,
-                            type            => "opac",
-                            authnotrequired => 1,
-                            flagsrequired   => {borrow => 1},
-                         });
+    = get_template_and_user(
+        {
+           template_name   => "opac-main.tmpl",
+           query           => $query,
+          type            => "opac",
+          authnotrequired => 1,
+          flagsrequired   => {borrow => 1},
+       }
+    );
 
     This call passes the C<query>, C<flagsrequired> and C<authnotrequired>
     to C<&checkauth> (in this module) to perform authentification.
@@ -120,7 +127,7 @@ sub get_template_and_user {
         $in->{'authnotrequired'},
         $in->{'flagsrequired'},
         $in->{'type'}
-    );
+    ) unless ($in->{'template_name'}=~/maintenance/);
 
     my $borrowernumber;
     my $insecure = C4::Context->preference('insecure');
@@ -130,7 +137,7 @@ sub get_template_and_user {
 
         $borrowernumber = getborrowernumber($user);
         my ( $borr, $alternativeflags ) =
-          getpatroninformation( undef, $borrowernumber );
+          GetMemberDetails( $borrowernumber );
         my @bordat;
         $bordat[0] = $borr;
         $template->param( "USER_INFO" => \@bordat );
@@ -215,19 +222,25 @@ sub get_template_and_user {
     }
     if ( $in->{'type'} eq "intranet" ) {
         $template->param(
-            intranetcolorstylesheet =>
-              C4::Context->preference("intranetcolorstylesheet"),
-            intranetstylesheet => C4::Context->preference("intranetstylesheet"),
-            IntranetNav        => C4::Context->preference("IntranetNav"),
-            intranetuserjs     => C4::Context->preference("intranetuserjs"),
-            TemplateEncoding   => C4::Context->preference("TemplateEncoding"),
-            AmazonContent      => C4::Context->preference("AmazonContent"),
-            LibraryName        => C4::Context->preference("LibraryName"),
-            LoginBranchname    => (C4::Context->userenv?C4::Context->userenv->{"branchname"}:"insecure"),
-            AutoLocation       => C4::Context->preference("AutoLocation"),
-            hide_marc          => C4::Context->preference("hide_marc"),
-            patronimages       => C4::Context->preference("patronimages"),
+            intranetcolorstylesheet => C4::Context->preference("intranetcolorstylesheet"),
+            intranetstylesheet      => C4::Context->preference("intranetstylesheet"),
+            IntranetNav             => C4::Context->preference("IntranetNav"),
+            intranetuserjs          => C4::Context->preference("intranetuserjs"),
+            TemplateEncoding        => C4::Context->preference("TemplateEncoding"),
+            AmazonContent           => C4::Context->preference("AmazonContent"),
+            LibraryName             => C4::Context->preference("LibraryName"),
+            LoginBranchcode         => (C4::Context->userenv?C4::Context->userenv->{"branch"}:"insecure"),
+            LoginBranchname         => (C4::Context->userenv?C4::Context->userenv->{"branchname"}:"insecure"),
+            LoginBranchnameShort    => substr((C4::Context->userenv?C4::Context->userenv->{"branchname"}:"insecure"),0,10),
+            AutoLocation            => C4::Context->preference("AutoLocation"),
+            hide_marc               => C4::Context->preference("hide_marc"),
+            patronimages            => C4::Context->preference("patronimages"),
             "BiblioDefaultView".C4::Context->preference("BiblioDefaultView") => 1,
+            advancedMARCEditor      => C4::Context->preference("advancedMARCEditor"),
+            suggestion              => C4::Context->preference("suggestion"),
+            virtualshelves          => C4::Context->preference("virtualshelves"),
+            LibraryName             => C4::Context->preference("LibraryName"),
+            KohaAdminEmailAddress   => "" . C4::Context->preference("KohaAdminEmailAddress"),
         );
     }
     else {
@@ -237,34 +250,36 @@ sub get_template_and_user {
         $LibraryNameTitle =~ s/<(?:\/?)(?:br|p)\s*(?:\/?)>/ /sgi;
         $LibraryNameTitle =~ s/<(?:[^<>'"]|'(?:[^']*)'|"(?:[^"]*)")*>//sg;
        $template->param(
-            suggestion     => "" . C4::Context->preference("suggestion"),
-            virtualshelves => "" . C4::Context->preference("virtualshelves"),
-            OpacNav        => "" . C4::Context->preference("OpacNav"),
-            opacheader     => "" . C4::Context->preference("opacheader"),
-            opaccredits    => "" . C4::Context->preference("opaccredits"),
-            opacsmallimage => "" . C4::Context->preference("opacsmallimage"),
-            opaclargeimage => "" . C4::Context->preference("opaclargeimage"),
-            opaclayoutstylesheet => "". C4::Context->preference("opaclayoutstylesheet"),
-            opaccolorstylesheet => "". C4::Context->preference("opaccolorstylesheet"),
-            opaclanguagesdisplay => "". C4::Context->preference("opaclanguagesdisplay"),
-            opacuserlogin    => "" . C4::Context->preference("opacuserlogin"),
-            opacbookbag      => "" . C4::Context->preference("opacbookbag"),
-            TemplateEncoding => "". C4::Context->preference("TemplateEncoding"),
-            AmazonContent => "" . C4::Context->preference("AmazonContent"),
-            LibraryName   => "" . C4::Context->preference("LibraryName"),
-            LibraryNameTitle   => "" . $LibraryNameTitle,
-            LoginBranchname    => C4::Context->userenv?C4::Context->userenv->{"branchname"}:"", 
-            OpacPasswordChange => C4::Context->preference("OpacPasswordChange"),
-            opacreadinghistory => C4::Context->preference("opacreadinghistory"),
-            opacuserjs         => C4::Context->preference("opacuserjs"),
-            OpacCloud          => C4::Context->preference("OpacCloud"),
-            OpacTopissue       => C4::Context->preference("OpacTopissue"),
-            OpacAuthorities    => C4::Context->preference("OpacAuthorities"),
-            OpacBrowser        => C4::Context->preference("OpacBrowser"),
-            RequestOnOpac        => C4::Context->preference("RequestOnOpac"),
-            reviewson          => C4::Context->preference("reviewson"),
-            hide_marc          => C4::Context->preference("hide_marc"),
-            patronimages       => C4::Context->preference("patronimages"),
+            KohaAdminEmailAddress  => "" . C4::Context->preference("KohaAdminEmailAddress"),
+            suggestion             => "" . C4::Context->preference("suggestion"),
+            virtualshelves         => "" . C4::Context->preference("virtualshelves"),
+            OpacNav                => "" . C4::Context->preference("OpacNav"),
+            opacheader             => "" . C4::Context->preference("opacheader"),
+            opaccredits            => "" . C4::Context->preference("opaccredits"),
+            opacsmallimage         => "" . C4::Context->preference("opacsmallimage"),
+            opaclargeimage         => "" . C4::Context->preference("opaclargeimage"),
+            opaclayoutstylesheet   => "". C4::Context->preference("opaclayoutstylesheet"),
+            opaccolorstylesheet    => "". C4::Context->preference("opaccolorstylesheet"),
+            opaclanguagesdisplay   => "". C4::Context->preference("opaclanguagesdisplay"),
+            opacuserlogin          => "" . C4::Context->preference("opacuserlogin"),
+            opacbookbag            => "" . C4::Context->preference("opacbookbag"),
+            TemplateEncoding       => "". C4::Context->preference("TemplateEncoding"),
+            AmazonContent          => "" . C4::Context->preference("AmazonContent"),
+            LibraryName            => "" . C4::Context->preference("LibraryName"),
+            LibraryNameTitle       => "" . $LibraryNameTitle,
+            LoginBranchcode        => (C4::Context->userenv?C4::Context->userenv->{"branch"}:"insecure"),
+            LoginBranchname        => C4::Context->userenv?C4::Context->userenv->{"branchname"}:"", 
+            OpacPasswordChange     => C4::Context->preference("OpacPasswordChange"),
+            opacreadinghistory     => C4::Context->preference("opacreadinghistory"),
+            opacuserjs             => C4::Context->preference("opacuserjs"),
+            OpacCloud              => C4::Context->preference("OpacCloud"),
+            OpacTopissue           => C4::Context->preference("OpacTopissue"),
+            OpacAuthorities        => C4::Context->preference("OpacAuthorities"),
+            OpacBrowser            => C4::Context->preference("OpacBrowser"),
+            RequestOnOpac          => C4::Context->preference("RequestOnOpac"),
+            reviewson              => C4::Context->preference("reviewson"),
+            hide_marc              => C4::Context->preference("hide_marc"),
+            patronimages           => C4::Context->preference("patronimages"),
             "BiblioDefaultView".C4::Context->preference("BiblioDefaultView") => 1,
         );
     }
@@ -339,6 +354,27 @@ sub checkauth {
     $type = 'opac' unless $type;
 
     my $dbh     = C4::Context->dbh;
+    # check that database and koha version are the same
+    unless (C4::Context->preference('Version')){
+      if ($type ne 'opac'){
+        warn "Install required, redirecting to Installer";
+        print $query->redirect("/cgi-bin/koha/installer/install.pl");
+      } else {
+        warn "OPAC Install required, redirecting to maintenance";
+        print $query->redirect("/cgi-bin/koha/maintenance.pl");
+      }       
+      exit;
+    }
+    if (C4::Context->preference('Version') < C4::Context->config("kohaversion")){
+      if ($type ne 'opac'){
+      warn "Database update needed, redirecting to Installer. Database is ".C4::Context->preference('Version')." and Koha is : ".C4::Context->config("kohaversion");
+        print $query->redirect("/cgi-bin/koha/installer/install.pl?step=3");
+      } else {
+      warn "OPAC :Database update needed, redirecting to maintenance. Database is ".C4::Context->preference('Version')." and Koha is : ".C4::Context->config("kohaversion");
+        print $query->redirect("/cgi-bin/koha/maintenance.pl");
+      }       
+      exit;
+    }
     my $timeout = C4::Context->preference('timeout');
     $timeout = 600 unless $timeout;
 
@@ -359,34 +395,32 @@ sub checkauth {
 
         # Using Basic Authentication, no cookies required
         $cookie = $query->cookie(
-            -name    => 'sessionID',
+            -name    => 'CGISESSID',
             -value   => '',
             -expires => ''
         );
         $loggedin = 1;
     }
-    elsif ( $sessionID = $query->cookie('sessionID') ) {
+    elsif ( $sessionID = $query->cookie("CGISESSID")) {
+               my $session = new CGI::Session("driver:MySQL", $sessionID, {Handle=>$dbh});
+           
         C4::Context->_new_userenv($sessionID);
-        if ( my %hash = $query->cookie('userenv') ) {
-            C4::Context::set_userenv(
-                $hash{number},       $hash{id},
-                $hash{cardnumber},   $hash{firstname},
-                $hash{surname},      $hash{branch},
-                $hash{branchname},   $hash{flags},
-                $hash{emailaddress}, $hash{branchprinter}
+               if ($session){
+                       C4::Context::set_userenv(
+                $session->param('number'),       $session->param('id'),
+                $session->param('cardnumber'),   $session->param('firstname'),
+                $session->param('surname'),      $session->param('branch'),
+                $session->param('branchname'),   $session->param('flags'),
+                $session->param('emailaddress'), $session->param('branchprinter')
             );
         }
-        my ( $ip, $lasttime );
-
-        ( $userid, $ip, $lasttime ) =
-          $dbh->selectrow_array(
-            "SELECT userid,ip,lasttime FROM sessions WHERE sessionid=?",
-            undef, $sessionID );
+        my $ip=$session->param('ip');
+        $userid = $session->param('id');
+               my $lasttime = $session->param('lasttime');
         if ($logout) {
 
             # voluntary logout the user
-            $dbh->do( "DELETE FROM sessions WHERE sessionID=?",
-                undef, $sessionID );
+                       $session->delete;
             C4::Context->_unset_userenv($sessionID);
             $sessionID = undef;
             $userid    = undef;
@@ -397,12 +431,12 @@ sub checkauth {
             close L;
         }
         if ($userid) {
+                       warn "here $userid";
             if ( $lasttime < time() - $timeout ) {
 
                 # timed logout
                 $info{'timed_out'} = 1;
-                $dbh->do( "DELETE FROM sessions WHERE sessionID=?",
-                    undef, $sessionID );
+                               $session->delete();
                 C4::Context->_unset_userenv($sessionID);
                 $userid    = undef;
                 $sessionID = undef;
@@ -418,8 +452,7 @@ sub checkauth {
                 $info{'oldip'}        = $ip;
                 $info{'newip'}        = $ENV{'REMOTE_ADDR'};
                 $info{'different_ip'} = 1;
-                $dbh->do( "DELETE FROM sessions WHERE sessionID=?",
-                    undef, $sessionID );
+                               $session->delete();
                 C4::Context->_unset_userenv($sessionID);
                 $sessionID = undef;
                 $userid    = undef;
@@ -431,13 +464,9 @@ sub checkauth {
                 close L;
             }
             else {
-                $cookie = $query->cookie(
-                    -name    => 'sessionID',
-                    -value   => $sessionID,
-                    -expires => ''
+                $cookie = $query->cookie(CGISESSID => $session->id
                 );
-                $dbh->do( "UPDATE sessions SET lasttime=? WHERE sessionID=?",
-                    undef, ( time(), $sessionID ) );
+                               $session->param('lasttime',time());
                 $flags = haspermission( $dbh, $userid, $flagsrequired );
                 if ($flags) {
                     $loggedin = 1;
@@ -449,30 +478,20 @@ sub checkauth {
         }
     }
     unless ($userid) {
-        $sessionID = int( rand() * 100000 ) . '-' . time();
+               my $session = new CGI::Session("driver:MySQL", undef, {Handle=>$dbh});          
+               my $sessionID = $session->id;
         $userid    = $query->param('userid');
         C4::Context->_new_userenv($sessionID);
         my $password = $query->param('password');
         C4::Context->_new_userenv($sessionID);
         my ( $return, $cardnumber ) = checkpw( $dbh, $userid, $password );
         if ($return) {
-            $dbh->do( "DELETE FROM sessions WHERE sessionID=? AND userid=?",
-                undef, ( $sessionID, $userid ) );
-            $dbh->do(
-"INSERT INTO sessions (sessionID, userid, ip,lasttime) VALUES (?, ?, ?, ?)",
-                undef,
-                ( $sessionID, $userid, $ENV{'REMOTE_ADDR'}, time() )
-            );
             open L, ">>/tmp/sessionlog";
             my $time = localtime( time() );
             printf L "%20s from %16s logged in  at %30s.\n", $userid,
               $ENV{'REMOTE_ADDR'}, $time;
             close L;
-            $cookie = $query->cookie(
-                -name    => 'sessionID',
-                -value   => $sessionID,
-                -expires => ''
-            );
+            $cookie = $query->cookie(CGISESSID => $sessionID);
             if ( $flags = haspermission( $dbh, $userid, $flagsrequired ) ) {
                 $loggedin = 1;
             }
@@ -546,39 +565,34 @@ sub checkauth {
                         $branchname    = $branches->{$br}->{'branchname'};
                     }
                 }
-                my $hash = C4::Context::set_userenv(
-                    $borrowernumber, $userid,    $cardnumber,
-                    $firstname,      $surname,   $branchcode,
-                    $branchname,     $userflags, $emailaddress,
-                    $branchprinter,
-                );
-
-                $envcookie = $query->cookie(
-                    -name    => 'userenv',
-                    -value   => $hash,
-                    -expires => ''
-                );
+                               
+                               $session->param('number',$borrowernumber);
+                               $session->param('id',$userid);
+                               $session->param('cardnumber',$cardnumber);
+                               $session->param('firstname',$firstname);
+                               $session->param('surname',$surname);
+                               $session->param('branch',$branchcode);
+                               $session->param('branchname',$branchname);
+                               $session->param('flags',$userflags);
+                               $session->param('emailaddress',$emailaddress);
+                $session->param('ip',$session->remote_addr());
+                               $session->param('lasttime',time());
             }
             elsif ( $return == 2 ) {
 
                 #We suppose the user is the superlibrarian
-                my $hash = C4::Context::set_userenv(
-                    0,
-                    0,
-                    C4::Context->config('user'),
-                    C4::Context->config('user'),
-                    C4::Context->config('user'),
-                    "",
-                    "SUPER",
-                    1,
-                    C4::Context->preference('KohaAdminEmailAddress')
-                );
-                $envcookie = $query->cookie(
-                    -name    => 'userenv',
-                    -value   => $hash,
-                    -expires => ''
-                );
-            }
+                               $session->param('number',0);
+                               $session->param('id',C4::Context->config('user'));
+                               $session->param('cardnumber',C4::Context->config('user'));
+                               $session->param('firstname',C4::Context->config('user'));
+                               $session->param('surname',C4::Context->config('user'),);
+                               $session->param('branch','NO_LIBRARY_SET');
+                               $session->param('branchname','NO_LIBRARY_SET');
+                               $session->param('flags',1);
+                               $session->param('emailaddress', C4::Context->preference('KohaAdminEmailAddress'));
+                $session->param('ip',$session->remote_addr());
+                               $session->param('lasttime',time());
+                       }
         }
         else {
             if ($userid) {
@@ -592,21 +606,13 @@ sub checkauth {
     # finished authentification, now respond
     if ( $loggedin || $authnotrequired || ( defined($insecure) && $insecure ) )
     {
-
         # successful login
         unless ($cookie) {
-            $cookie = $query->cookie(
-                -name    => 'sessionID',
-                -value   => '',
-                -expires => ''
+            $cookie = $query->cookie( CGISESSID => ''
             );
         }
-        if ($envcookie) {
-            return ( $userid, [ $cookie, $envcookie ], $sessionID, $flags );
-        }
-        else {
-            return ( $userid, $cookie, $sessionID, $flags );
-        }
+               return ( $userid, $cookie, $sessionID, $flags );
+
     }
 
     # else we have a problem...
@@ -650,13 +656,10 @@ sub checkauth {
         LibraryName => => C4::Context->preference("LibraryName"),
     );
     $template->param( \%info );
-    $cookie = $query->cookie(
-        -name    => 'sessionID',
-        -value   => $sessionID,
-        -expires => ''
-    );
+#    $cookie = $query->cookie(CGISESSID => $session->id
+#   );
     print $query->header(
-        -type   => guesstype( $template->output ),
+        -type   => 'utf-8',
         -cookie => $cookie
       ),
       $template->output;