Checks for a basic authentication userid. If found, it skips the cookie stuff.
[koha.git] / C4 / Auth.pm
1 package C4::Auth;
2
3 use strict;
4 require Exporter;
5 use C4::Database;
6
7 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
8
9 # set the version for version checking
10 $VERSION = 0.01;
11
12 @ISA = qw(Exporter);
13 @EXPORT = qw(
14              &checkauth
15 );
16
17
18
19 sub checkauth {
20     my $query=shift;
21     # $authnotrequired will be set for scripts which will run without authentication
22     my $authnotrequired=shift;
23     if (my $userid=$ENV{'REMOTE_USERNAME'}) {
24         # Using Basic Authentication, no cookies required
25         my $cookie=$query->cookie(-name => 'sessionID',
26                                   -value => '',
27                                   -expires => '+1y');
28         return ($userid, $cookie, '');
29     }
30     my $sessionID=$query->cookie('sessionID');
31     my $message='';
32     warn "SID: ".$sessionID;
33
34     my $dbh=C4Connect();
35     my $sth=$dbh->prepare("select userid,ip,lasttime from sessions where sessionid=?");
36     $sth->execute($sessionID);
37     if ($sth->rows) {
38         my ($userid, $ip, $lasttime) = $sth->fetchrow;
39         if ($lasttime<time()-20) {
40             # timed logout
41             warn "$sessionID logged out due to inactivity.";
42             $message="You have been logged out due to inactivity.";
43             my $sti=$dbh->prepare("delete from sessions where sessionID=?");
44             $sti->execute($sessionID);
45             open L, ">>/tmp/sessionlog";
46             print L "$userid from $ip logged out at ".localtime(time())." (inactivity).\n";
47             close L;
48         } elsif ($ip ne $ENV{'REMOTE_ADDR'}) {
49             # Different ip than originally logged in from
50             warn "$sessionID came from a new ip address.";
51             $message="ERROR ERROR ERROR ERROR<br>Attempt to re-use a cookie from a different ip address.";
52         } else {
53             my $cookie=$query->cookie(-name => 'sessionID',
54                                       -value => $sessionID,
55                                       -expires => '+1y');
56             warn "$sessionID had a valid cookie.";
57             my $sti=$dbh->prepare("update sessions set lasttime=? where sessionID=?");
58             $sti->execute(time(), $sessionID);
59             return ($userid, $cookie, $sessionID);
60         }
61     }
62
63
64
65     warn "$sessionID wasn't in sessions table.";
66     if ($authnotrequired) {
67         my $cookie=$query->cookie(-name => 'sessionID',
68                                   -value => '',
69                                   -expires => '+1y');
70         return('', $cookie, '');
71     } else {
72         ($sessionID) || ($sessionID=int(rand()*100000).'-'.time());
73         my $userid=$query->param('userid');
74         my $password=$query->param('password');
75         if ($userid eq 'librarian' && $password eq 'koha') {
76             my $sti=$dbh->prepare("insert into sessions (sessionID, userid, ip,lasttime) values (?, ?, ?, ?)");
77             $sti->execute($sessionID, $userid, $ENV{'REMOTE_ADDR'}, time());
78             open L, ">>/tmp/sessionlog";
79             print L "$userid from ".$ENV{'REMOTE_ADDR'}." logged in at ".localtime(time()).".\n";
80             close L;
81             return ($userid, $sessionID, $sessionID);
82         } elsif ($userid eq 'patron' && $password eq 'koha') {
83             my $sti=$dbh->prepare("insert into sessions (sessionID, userid, ip,lasttime) values (?, ?, ?, ?)");
84             $sti->execute($sessionID, $userid, $ENV{'REMOTE_ADDR'}, time());
85             open L, ">>/tmp/sessionlog";
86             print L "$userid from ".$ENV{'REMOTE_ADDR'}." at ".localtime(time()).".\n";
87             close L;
88             return ($userid, $sessionID, $sessionID);
89         } else {
90             if ($userid) {
91                 $message="Invalid userid or password entered.";
92             }
93             my $parameters;
94             foreach (param $query) {
95                 $parameters->{$_}=$query->{$_};
96             }
97             my $cookie=$query->cookie(-name => 'sessionID',
98                                       -value => $sessionID,
99                                       -expires => '+1y');
100             print $query->header(-cookie=>$cookie);
101             print qq|
102 <html>
103 <body background=/images/kohaback.jpg>
104 <center>
105 <h2>$message</h2>
106 <form method=post>
107 <table border=1>
108 <tr><th colspan=2><font size=+2>Koha Login</font></th></tr>
109 <tr><td>Name:</td><td><input name=userid></td></tr>
110 <tr><td>Password:</td><td><input type=password name=password></td></tr>
111 <tr><td colspan=2 align=center><input type=submit value=login></td></tr>
112 </table>
113 </form>
114 </body>
115 </html>
116 |;
117             exit;
118         }
119     }
120 }
121
122
123 END { }       # module clean-up code here (global destructor)