content-type was incorrectly set in InstallAuth.pm

Adding 'wizard' and 'login' detection

Signed-off-by: Joshua Ferraro <jmf@liblime.com>
This commit is contained in:
Joshua Ferraro 2007-08-15 21:20:17 -05:00
parent 92f2909d57
commit 836b9857ed
5 changed files with 635 additions and 447 deletions

View file

@ -113,35 +113,37 @@ InstallAuth - Authenticates Koha users for Install process
sub get_template_and_user {
my $in = shift;
my $query=$in->{'query'};
my $language=$query->cookie('KohaOpacLanguage');
my $path=C4::Context->config('intrahtdocs')."/prog/".($language?$language:"en");
my $template = HTML::Template::Pro->new(
filename => "$path/".$in->{template_name},
my $query = $in->{'query'};
my $language = $query->cookie('KohaOpacLanguage');
my $path =
C4::Context->config('intrahtdocs') . "/prog/"
. ( $language ? $language : "en" );
my $template = HTML::Template::Pro->new(
filename => "$path/" . $in->{template_name},
die_on_bad_params => 1,
global_vars => 1,
case_sensitive => 1,
path => ["$path/includes"]
);
my ( $user, $cookie, $sessionID, $flags ) = checkauth(
$in->{'query'},
$in->{'authnotrequired'},
$in->{'flagsrequired'},
$in->{'type'}
);
# use Data::Dumper;warn "utilisateur $user cookie : ".Dumper($cookie);
# use Data::Dumper;warn "utilisateur $user cookie : ".Dumper($cookie);
my $borrowernumber;
if ($user) {
$template->param( loggedinusername => $user );
$template->param( sessionID => $sessionID );
# We are going to use the $flags returned by checkauth
# to create the template's parameters that will indicate
# which menus the user can access.
if (( $flags && $flags->{superlibrarian}==1)) {
if ( ( $flags && $flags->{superlibrarian} == 1 ) ) {
$template->param( CAN_user_circulate => 1 );
$template->param( CAN_user_catalogue => 1 );
$template->param( CAN_user_parameters => 1 );
@ -153,7 +155,7 @@ sub get_template_and_user {
$template->param( CAN_user_updatecharge => 1 );
$template->param( CAN_user_acquisition => 1 );
$template->param( CAN_user_management => 1 );
$template->param( CAN_user_tools => 1 );
$template->param( CAN_user_tools => 1 );
$template->param( CAN_user_editauthorities => 1 );
$template->param( CAN_user_serials => 1 );
$template->param( CAN_user_reports => 1 );
@ -222,6 +224,7 @@ has authenticated.
sub checkauth {
my $query = shift;
# $authnotrequired will be set for scripts which will run without authentication
my $authnotrequired = shift;
my $flagsrequired = shift;
@ -237,20 +240,27 @@ sub checkauth {
my %info;
my ( $userid, $cookie, $sessionID, $flags, $envcookie );
my $logout = $query->param('logout.x');
if ( $sessionID = $query->cookie("CGISESSID") ) {
if ( $sessionID = $query->cookie("CGISESSID") ) {
C4::Context->_new_userenv($sessionID);
my $session = new CGI::Session("driver:File", $sessionID, {Directory=>'/tmp'});
my $session =
new CGI::Session( "driver:File", $sessionID,
{ Directory => '/tmp' } );
if ( $session->param('cardnumber') ) {
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')
);
$cookie = $query->cookie(CGISESSID => $session->id);
$loggedin=1;
$userid = $session->param('cardnumber');
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')
);
$cookie = $query->cookie( CGISESSID => $session->id );
$loggedin = 1;
$userid = $session->param('cardnumber');
}
my ( $ip, $lasttime );
@ -268,47 +278,47 @@ sub checkauth {
}
}
unless ($userid) {
my $session = new CGI::Session("driver:File", undef, {Directory=>'/tmp'});
$sessionID = $session->id;
my $session =
new CGI::Session( "driver:File", undef, { Directory => '/tmp' } );
$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( $userid, $password );
if ($return) {
$loggedin=1;
$loggedin = 1;
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(CGISESSID => $sessionID);
$cookie = $query->cookie( CGISESSID => $sessionID );
if ( $return == 2 ) {
#Only superlibrarian should have access to this page.
#Since if it is a user, it is supposed that there is a borrower table
#And thus that data structure is loaded.
#Only superlibrarian should have access to this page.
#Since if it is a user, it is supposed that there is a borrower table
#And thus that data structure is loaded.
my $hash = C4::Context::set_userenv(
0,
0,
C4::Context->config('user'),
C4::Context->config('user'),
C4::Context->config('user'),
"",
"NO_LIBRARY_SET",
1,""
0, 0,
C4::Context->config('user'), C4::Context->config('user'),
C4::Context->config('user'), "",
"NO_LIBRARY_SET", 1,
""
);
$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());
$userid=C4::Context->config('user');
$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() );
$userid = C4::Context->config('user');
}
}
else {
@ -320,8 +330,7 @@ sub checkauth {
}
# finished authentification, now respond
if ( $loggedin )
{
if ($loggedin) {
# successful login
unless ($cookie) {
@ -348,8 +357,10 @@ sub checkauth {
push @inputs, { name => $name, value => $value };
}
my $path=C4::Context->config('intrahtdocs')."/prog/".($query->param('language')?$query->param('language'):"en");
my $template = HTML::Template::Pro->new(
my $path =
C4::Context->config('intrahtdocs') . "/prog/"
. ( $query->param('language') ? $query->param('language') : "en" );
my $template = HTML::Template::Pro->new(
filename => "$path/$template_name",
die_on_bad_params => 1,
global_vars => 1,
@ -357,15 +368,14 @@ sub checkauth {
path => ["$path/includes"]
);
$template->param(
INPUTS => \@inputs,
INPUTS => \@inputs,
);
$template->param( login => 1 );
$template->param( loginprompt => 1 ) unless $info{'nopermission'};
my $self_url = $query->url( -absolute => 1 );
$template->param(
url => $self_url,
);
$template->param( url => $self_url, );
$template->param( \%info );
$cookie = $query->cookie(
-name => 'CGISESSID',
@ -373,8 +383,8 @@ sub checkauth {
-expires => ''
);
print $query->header(
-type => 'utf-8',
-cookie => $cookie
-type => 'text/html; charset=utf-8',
-cookie => $cookie
),
$template->output;
exit;
@ -384,14 +394,23 @@ sub checkpw {
my ( $userid, $password ) = @_;
if ( $userid && $userid eq C4::Context->config('user')
if ( $userid
&& $userid eq C4::Context->config('user')
&& "$password" eq C4::Context->config('pass') )
{
# Koha superuser account
C4::Context->set_userenv(0,0,C4::Context->config('user'),C4::Context->config('user'),C4::Context->config('user'),"",1);
# Koha superuser account
C4::Context->set_userenv(
0, 0,
C4::Context->config('user'),
C4::Context->config('user'),
C4::Context->config('user'),
"", 1
);
return 2;
}
if ( $userid && $userid eq 'demo'
if ( $userid
&& $userid eq 'demo'
&& "$password" eq 'demo'
&& C4::Context->config('demo') )
{
@ -403,7 +422,6 @@ sub checkpw {
return 0;
}
END { } # module clean-up code here (global destructor)
1;
__END__

View file

@ -8,389 +8,547 @@ use C4::Context;
use C4::Output;
use C4::Languages;
use strict; # please develop with the strict pragma
use strict; # please develop with the strict pragma
use CGI;
my $query=new CGI;
my $step=$query->param('step');
my $query = new CGI;
my $step = $query->param('step');
my $language=$query->param('language');
my ($template, $loggedinuser, $cookie);
my $language = $query->param('language');
my ( $template, $loggedinuser, $cookie );
my $all_languages = getAllLanguages();
my $all_languages=getAllLanguages();
if (defined($language) ){
setlanguagecookie($query,$language,"install.pl?step=1");
if ( defined($language) ) {
setlanguagecookie( $query, $language, "install.pl?step=1" );
}
($template, $loggedinuser, $cookie)
= get_template_and_user({template_name => "installer/step".($step?$step:1).".tmpl",
query => $query,
type => "intranet",
authnotrequired => 0,
debug => 1,
});
( $template, $loggedinuser, $cookie ) = get_template_and_user(
{
template_name => "installer/step" . ( $step ? $step : 1 ) . ".tmpl",
query => $query,
type => "intranet",
authnotrequired => 0,
debug => 1,
}
);
my %info;
$info{'dbname'}=C4::Context->config("database");
$info{'dbms'}=(C4::Context->config("db_scheme")?C4::Context->config("db_scheme"):"mysql");
$info{'hostname'}=C4::Context->config("hostname");
($info{'hostname'},$info{'port'})=($1,$2) if $info{'hostname'}=~/([^:]*):([0-9]+)/;
$info{'user'}=C4::Context->config("user");
$info{'password'}=C4::Context->config("pass");
my $dbh= DBI->connect("DBI:$info{dbms}:$info{dbname}:$info{hostname}".($info{port}?":$info{port}":""),$info{'user'}, $info{'password'});
$info{'dbname'} = C4::Context->config("database");
$info{'dbms'} =
( C4::Context->config("db_scheme")
? C4::Context->config("db_scheme")
: "mysql" );
$info{'hostname'} = C4::Context->config("hostname");
( $info{'hostname'}, $info{'port'} ) = ( $1, $2 )
if $info{'hostname'} =~ /([^:]*):([0-9]+)/;
$info{'user'} = C4::Context->config("user");
$info{'password'} = C4::Context->config("pass");
my $dbh = DBI->connect(
"DBI:$info{dbms}:$info{dbname}:$info{hostname}"
. ( $info{port} ? ":$info{port}" : "" ),
$info{'user'}, $info{'password'}
);
if ( $step && $step == 1 ) {
#First Step
#Checking ALL perl Modules and services needed are installed.
#Whenever there is an error, adding a report to the page
# I suppose here that Apache user can access /usr/bin/
# If mysql or zebra are in some fancy directory not in PATH
# Performing a disk search.
$template->param( language => 1 );
my $problem;
unless ( $] >= 5.006001 ) { # Bug 179
$template->param( "problems" => 1, "perlversion" => 1 );
$problem = 1;
}
unless ( -x "/usr/bin/perl" ) {
my $realperl = `which perl`;
$realperl = `find / -name perl` unless ($realperl);
chomp $realperl;
$template->param( "problems" => 1, 'perllocation' => 1 )
unless ($realperl);
$problem = 1 unless ($realperl);
}
unless ( -x "/usr/local/bin/mysql" ) {
my $mysql = `which mysql`;
$mysql = `find / -name mysql` unless ($mysql);
chomp $mysql;
$template->param( "problems" => 1, 'mysql' => 1 ) unless ($mysql);
$problem = 1 unless ($mysql);
}
unless ( -x "/usr/local/bin/zebraidx" || -x "/usr/local/bin/zebraidx-2.0" )
{
my $zebra = `which zebraidx`;
$zebra = `which zebraidx-2.0` unless ($zebra);
$zebra = `find / -name "zebraidx*"` unless ($zebra);
chomp $zebra;
$template->param( "problems" => 1, 'zebra' => 1 ) unless ($zebra);
$problem = 1 unless ($zebra);
}
unless ( -x "/usr/local/bin/zebrasrv" || -x "/usr/local/bin/zebrasrv-2.0" )
{
my $zebra = `which zebrasrv`;
$zebra = `which zebrasrv-2.0` unless ($zebra);
$zebra = `find / -name "zebrasrv*"` unless ($zebra);
chomp $zebra;
$template->param( "problems" => 1, 'zebra' => 1 ) unless ($zebra);
$problem = 1 unless ($zebra);
}
unless ( -x "/usr/local/bin/yaz-client" ) {
my $yaz = `which yaz-client`;
$yaz = `find / -name "yaz-client*"` unless ($yaz);
chomp $yaz;
$template->param( "problems" => 1, 'yaz' => 1 ) unless ($yaz);
$problem = 1 unless ($yaz);
}
# We could here use a special find
my @missing = ();
unless ( eval { require ZOOM } ) {
push @missing, { name => "ZOOM" };
}
unless ( eval { require LWP::Simple } ) {
push @missing, { name => "LWP::Simple" };
}
unless ( eval { require XML::Simple } ) {
push @missing, { name => "XML::Simple" };
}
unless ( eval { require MARC::File::XML } ) {
push @missing, { name => "MARC::File::XML" };
}
unless ( eval { require MARC::File::USMARC } ) {
push @missing, { name => "MARC::File::USMARC" };
}
unless ( eval { require DBI } ) {
push @missing, { name => "DBI" };
}
unless ( eval { require Date::Manip } ) {
push @missing, { name => "Date::Manip" };
}
unless ( eval { require DBD::mysql } ) {
push @missing, { name => "DBD::mysql" };
}
unless ( eval { require HTML::Template } ) {
push @missing, { name => "HTML::Template::Pro" };
}
unless ( eval { require HTML::Template } ) {
push @missing, { name => "Date::Calc" };
}
unless ( eval { require Digest::MD5 } ) {
push @missing, { name => "Digest::MD5" };
}
unless ( eval { require MARC::Record } ) {
push @missing, { name => "MARC::Record" };
}
unless ( eval { require Mail::Sendmail } ) {
push @missing, { name => "Mail::Sendmail", usagemail => 1 };
}
unless ( eval { require List::MoreUtils } ) {
push @missing, { name => "List::MoreUtils" };
}
unless ( eval { require XML::RSS } ) {
push @missing, { name => "XML::RSS" };
}
if ($step && $step==1){
#First Step
#Checking ALL perl Modules and services needed are installed.
#Whenever there is an error, adding a report to the page
# I suppose here that Apache user can access /usr/bin/
# If mysql or zebra are in some fancy directory not in PATH
# Performing a disk search.
$template->param(language=>1);
my $problem;
unless ($] >= 5.006001) { # Bug 179
$template->param("problems"=>1,"perlversion"=>1);
$problem=1;
}
unless (-x "/usr/bin/perl") {
my $realperl=`which perl`;
$realperl=`find / -name perl` unless ($realperl);
chomp $realperl;
$template->param("problems"=>1,'perllocation'=>1) unless ($realperl);
$problem=1 unless($realperl);
}
unless (-x "/usr/local/bin/mysql") {
my $mysql=`which mysql`;
$mysql=`find / -name mysql` unless ($mysql);
chomp $mysql;
$template->param("problems"=>1,'mysql'=>1) unless ($mysql);
$problem=1 unless($mysql);
}
unless (-x "/usr/local/bin/zebraidx" ||-x "/usr/local/bin/zebraidx-2.0") {
my $zebra=`which zebraidx`;
$zebra=`which zebraidx-2.0` unless ($zebra);
$zebra=`find / -name "zebraidx*"` unless ($zebra);
chomp $zebra;
$template->param("problems"=>1,'zebra'=>1) unless ($zebra);
$problem=1 unless ($zebra);
}
unless (-x "/usr/local/bin/zebrasrv" ||-x "/usr/local/bin/zebrasrv-2.0") {
my $zebra=`which zebrasrv`;
$zebra=`which zebrasrv-2.0` unless ($zebra);
$zebra=`find / -name "zebrasrv*"` unless ($zebra);
chomp $zebra;
$template->param("problems"=>1,'zebra'=>1) unless ($zebra);
$problem=1 unless ($zebra);
}
unless (-x "/usr/local/bin/yaz-client") {
my $yaz=`which yaz-client`;
$yaz=`find / -name "yaz-client*"` unless ($yaz);
chomp $yaz;
$template->param("problems"=>1,'yaz'=>1) unless ($yaz);
$problem=1 unless ($yaz);
}
# We could here use a special find
my @missing = ();
unless (eval {require ZOOM}) {
push @missing, {name=>"ZOOM"};
}
unless (eval {require LWP::Simple}) {
push @missing, {name=>"LWP::Simple"};
}
unless (eval {require XML::Simple}) {
push @missing, {name=>"XML::Simple"};
}
unless (eval {require MARC::File::XML}) {
push @missing, {name=>"MARC::File::XML"};
}
unless (eval {require MARC::File::USMARC}) {
push @missing, {name=>"MARC::File::USMARC"};
}
unless (eval {require DBI}) { push @missing,{name=>"DBI"} };
unless (eval {require Date::Manip}) { push @missing,{name=>"Date::Manip"} };
unless (eval {require DBD::mysql}) { push @missing,{name=>"DBD::mysql"} };
unless (eval {require HTML::Template}) { push @missing,{name=>"HTML::Template::Pro"} };
unless (eval {require HTML::Template}) { push @missing,{name=>"Date::Calc"} };
unless (eval {require Digest::MD5}) { push @missing,{name=>"Digest::MD5"} };
unless (eval {require MARC::Record}) { push @missing,{name=>"MARC::Record"} };
unless (eval {require Mail::Sendmail}) { push @missing,{name=>"Mail::Sendmail",usagemail=>1} };
unless (eval {require List::MoreUtils}) { push @missing,{name=>"List::MoreUtils"} };
unless (eval {require XML::RSS}) { push @missing,{name=>"XML::RSS"} };
# The following modules are not mandatory, depends on how the library want to use Koha
unless (eval {require PDF::API2}) {
if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
push @missing,{name=>"PDF::API2",usagebarcode=>1};
}
}
unless (eval {require GD::Barcorde}) {
if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
push @missing,{name=>"GD::Barcode",usagebarcode=>1,usagespine=>1};
unless ( eval { require PDF::API2 } ) {
if ( $#missing >= 0 ) { # only when $#missing >= 0 so this isn't fatal
push @missing, { name => "PDF::API2", usagebarcode => 1 };
}
}
}
unless (eval {require Data::Random}) {
if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
push @missing,{name=>"Data::Random",usagebarcode=>1};
unless ( eval { require GD::Barcorde } ) {
if ( $#missing >= 0 ) { # only when $#missing >= 0 so this isn't fatal
push @missing,
{ name => "GD::Barcode", usagebarcode => 1, usagespine => 1 };
}
}
}
unless (eval {require PDF::Reuse::Barcode}) {
if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
push @missing,{name=>"PDF::Reuse::Barcode",usagebarcode=>1};
unless ( eval { require Data::Random } ) {
if ( $#missing >= 0 ) { # only when $#missing >= 0 so this isn't fatal
push @missing, { name => "Data::Random", usagebarcode => 1 };
}
}
}
unless (eval {require PDF::Report}) {
if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
push @missing,{name=>"PDF::Report",usagebarcode=>1};
unless ( eval { require PDF::Reuse::Barcode } ) {
if ( $#missing >= 0 ) { # only when $#missing >= 0 so this isn't fatal
push @missing, { name => "PDF::Reuse::Barcode", usagebarcode => 1 };
}
}
}
unless (eval {require GD::Barcode::UPCE}) {
if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
push @missing,{name=>"GD::Barcode::UPCE",usagepine=>1};
unless ( eval { require PDF::Report } ) {
if ( $#missing >= 0 ) { # only when $#missing >= 0 so this isn't fatal
push @missing, { name => "PDF::Report", usagebarcode => 1 };
}
}
}
unless (eval {require Net::LDAP}) {
if ($#missing>=0) { # only when $#missing >= 0 so this isn't fatal
push @missing,{name=>"Net::LDAP",usageLDAP=>1};
unless ( eval { require GD::Barcode::UPCE } ) {
if ( $#missing >= 0 ) { # only when $#missing >= 0 so this isn't fatal
push @missing, { name => "GD::Barcode::UPCE", usagepine => 1 };
}
}
unless ( eval { require Net::LDAP } ) {
if ( $#missing >= 0 ) { # only when $#missing >= 0 so this isn't fatal
push @missing, { name => "Net::LDAP", usageLDAP => 1 };
}
}
}
$template->param(missings=>\@missing) if (scalar(@missing)>0);
$template->param('checkmodule'=>1) unless (scalar(@missing) && $problem);
} elsif ($step && $step==2){
# Check Database connection and access
$template->param(%info);
my $checkmysql=$query->param("checkmysql");
$template->param('mysqlconnection'=>$checkmysql);
if ($checkmysql){
if ($dbh){
# Can connect to the mysql
$template->param("checkdatabaseaccess"=>1);
if ($info{dbms} eq "mysql"){
#Check if database created
my $rv=$dbh->do("SHOW DATABASES LIKE \'$info{dbname}\'");
if ($rv==1){$template->param('checkdatabasecreated'=>1);}
#Check if user have all necessary grants on this database.
my $rq=$dbh->prepare("SHOW GRANTS FOR \'$info{user}\'\@'$info{hostname}'");
$rq->execute;
my $grantaccess;
while (my ($line)=$rq->fetchrow){
my $dbname=$info{dbname};
if ($line=~m/$dbname/ || index($line,'*.*')>0){
$grantaccess=1 if (index($line,'ALL PRIVILEGES')>0 ||
((index($line,'SELECT')>0)&&(index($line,'INSERT')>0)&&(index($line,'UPDATE')>0)&&(index($line,'DELETE')>0)&&(index($line,'CREATE')>0)&&(index($line,'DROP')>0)));
}
}
unless ($grantaccess){
$rq=$dbh->prepare("SHOW GRANTS FOR \'$info{user}\'\@'\%'");
$rq->execute;
while (my ($line)=$rq->fetchrow){
my $dbname=$info{dbname};
if ($line=~m/$dbname/ || index($line,'*.*')>0){
$grantaccess=1 if (index($line,'ALL PRIVILEGES')>0 ||
((index($line,'SELECT')>0)&&(index($line,'INSERT')>0)&&(index($line,'UPDATE')>0)&&(index($line,'DELETE')>0)&&(index($line,'CREATE')>0)&&(index($line,'DROP')>0)));
$template->param( missings => \@missing ) if ( scalar(@missing) > 0 );
$template->param( 'checkmodule' => 1 )
unless ( scalar(@missing) && $problem );
}
elsif ( $step && $step == 2 ) {
# Check Database connection and access
$template->param(%info);
my $checkmysql = $query->param("checkmysql");
$template->param( 'mysqlconnection' => $checkmysql );
if ($checkmysql) {
if ($dbh) {
# Can connect to the mysql
$template->param( "checkdatabaseaccess" => 1 );
if ( $info{dbms} eq "mysql" ) {
#Check if database created
my $rv = $dbh->do("SHOW DATABASES LIKE \'$info{dbname}\'");
if ( $rv == 1 ) {
$template->param( 'checkdatabasecreated' => 1 );
}
#Check if user have all necessary grants on this database.
my $rq =
$dbh->prepare(
"SHOW GRANTS FOR \'$info{user}\'\@'$info{hostname}'");
$rq->execute;
my $grantaccess;
while ( my ($line) = $rq->fetchrow ) {
my $dbname = $info{dbname};
if ( $line =~ m/$dbname/ || index( $line, '*.*' ) > 0 ) {
$grantaccess = 1
if (
index( $line, 'ALL PRIVILEGES' ) > 0
|| ( ( index( $line, 'SELECT' ) > 0 )
&& ( index( $line, 'INSERT' ) > 0 )
&& ( index( $line, 'UPDATE' ) > 0 )
&& ( index( $line, 'DELETE' ) > 0 )
&& ( index( $line, 'CREATE' ) > 0 )
&& ( index( $line, 'DROP' ) > 0 ) )
);
}
}
unless ($grantaccess) {
$rq =
$dbh->prepare("SHOW GRANTS FOR \'$info{user}\'\@'\%'");
$rq->execute;
while ( my ($line) = $rq->fetchrow ) {
my $dbname = $info{dbname};
if ( $line =~ m/$dbname/ || index( $line, '*.*' ) > 0 )
{
$grantaccess = 1
if (
index( $line, 'ALL PRIVILEGES' ) > 0
|| ( ( index( $line, 'SELECT' ) > 0 )
&& ( index( $line, 'INSERT' ) > 0 )
&& ( index( $line, 'UPDATE' ) > 0 )
&& ( index( $line, 'DELETE' ) > 0 )
&& ( index( $line, 'CREATE' ) > 0 )
&& ( index( $line, 'DROP' ) > 0 ) )
);
}
}
}
$template->param( "checkgrantaccess" => $grantaccess );
}
}
}
$template->param("checkgrantaccess"=>$grantaccess);
}
} else {
$template->param("error"=>DBI::err,"message"=>DBI::errstr);
else {
$template->param( "error" => DBI::err, "message" => DBI::errstr );
}
}
}
} elsif ($step && $step==3){
my $op=$query->param('op');
if ($op && $op eq 'finish'){
if (C4::Context->preference('Version')) {
warn "UPDATE Version";
my $finish=$dbh->prepare("UPDATE systempreferences SET value=? WHERE variable='Version'");
$finish->execute(C4::Context->config("kohaversion"));
} else {
warn "INSERT Version";
my $finish=$dbh->prepare("INSERT into systempreferences (variable,value,explanation) values ('Version',?,'The Koha database version. Don t change this value manually, it s holded by the webinstaller')");
$finish->execute(C4::Context->config("kohaversion"));
}
elsif ( $step && $step == 3 ) {
my $op = $query->param('op');
if ( $op && $op eq 'finish' ) {
if ( C4::Context->preference('Version') ) {
warn "UPDATE Version";
my $finish =
$dbh->prepare(
"UPDATE systempreferences SET value=? WHERE variable='Version'"
);
$finish->execute( C4::Context->config("kohaversion") );
}
else {
warn "INSERT Version";
my $finish =
$dbh->prepare(
"INSERT into systempreferences (variable,value,explanation) values ('Version',?,'The Koha database version. Don t change this value manually, it s holded by the webinstaller')"
);
$finish->execute( C4::Context->config("kohaversion") );
}
# Installation is finished.
# We just deny anybody acess to install
# And we redirect people to mainpage.
# The installer wil have to relogin since we donot pass cookie to redirection.
$template->param( "$op" => 1 );
}
# Installation is finished.
# We just deny anybody acess to install
# And we redirect people to mainpage.
# The installer wil have to relogin since we donot pass cookie to redirection.
$template->param("$op"=>1);
}elsif ($op && $op eq 'finished'){
print $query->redirect("/cgi-bin/koha/mainpage.pl");
exit 1;
} elsif ($op && $op eq 'addframeworks'){
#Framework importing and reports
my $lang;
my %hashlevel;
# sort by filename -> prepend with numbers to specify order of insertion.
my @fnames = sort { my @aa = split /\/|\\/, ($a); my @bb = split /\/|\\/, ($b); $aa[-1] lt $bb[-1] } $query->param('framework') ;
$dbh->do('SET FOREIGN_KEY_CHECKS=0');
my $request=$dbh->prepare("SELECT value FROM systempreferences WHERE variable='FrameworksLoaded'");
$request->execute;
my ($systempreference)=$request->fetchrow;
foreach my $file (@fnames){
# warn $file;
undef $/;
my $strcmd="mysql ".($info{hostname}?" -h $info{hostname} ":"").($info{port}?" -P $info{port} ":"").($info{user}?" -u $info{user} ":"").($info{password}?" -p$info{password}":"")." $info{dbname} ";
my $error = qx($strcmd < $file 2>&1);
my @file = split qr(\/|\\),$file;
$lang=$file[scalar(@file)-3] unless ($lang);
my $level=$file[scalar(@file)-2];
unless ($error){
$systempreference.="$file[scalar(@file)-1]|" unless(index($systempreference,$file[scalar(@file)-1])>=0);
}
#Bulding here a hierarchy to display files by level.
push @{$hashlevel{$level}},{"fwkname"=>$file[scalar(@file)-1],"error"=>$error};
elsif ( $op && $op eq 'finished' ) {
print $query->redirect("/cgi-bin/koha/mainpage.pl");
exit 1;
}
#systempreference contains an ending |
chop $systempreference;
my @list;
map {push @list,{"level"=>$_,"fwklist"=>$hashlevel{$_}}} keys %hashlevel;
my $fwk_language;
for my $each_language(@$all_languages) {
# warn "CODE".$each_language->{'language_code'};
# warn "LANG:".$lang;
if ($lang eq $each_language->{'language_code'}) {
$fwk_language = $each_language->{language_locale_name};
}
elsif ( $op && $op eq 'addframeworks' ) {
#Framework importing and reports
my $lang;
my %hashlevel;
# sort by filename -> prepend with numbers to specify order of insertion.
my @fnames = sort {
my @aa = split /\/|\\/, ($a);
my @bb = split /\/|\\/, ($b);
$aa[-1] lt $bb[-1]
} $query->param('framework');
$dbh->do('SET FOREIGN_KEY_CHECKS=0');
my $request =
$dbh->prepare(
"SELECT value FROM systempreferences WHERE variable='FrameworksLoaded'"
);
$request->execute;
my ($systempreference) = $request->fetchrow;
foreach my $file (@fnames) {
# warn $file;
undef $/;
my $strcmd = "mysql "
. ( $info{hostname} ? " -h $info{hostname} " : "" )
. ( $info{port} ? " -P $info{port} " : "" )
. ( $info{user} ? " -u $info{user} " : "" )
. ( $info{password} ? " -p$info{password}" : "" )
. " $info{dbname} ";
my $error = qx($strcmd < $file 2>&1);
my @file = split qr(\/|\\), $file;
$lang = $file[ scalar(@file) - 3 ] unless ($lang);
my $level = $file[ scalar(@file) - 2 ];
unless ($error) {
$systempreference .= "$file[scalar(@file)-1]|"
unless (
index( $systempreference, $file[ scalar(@file) - 1 ] ) >=
0 );
}
#Bulding here a hierarchy to display files by level.
push @{ $hashlevel{$level} },
{ "fwkname" => $file[ scalar(@file) - 1 ], "error" => $error };
}
#systempreference contains an ending |
chop $systempreference;
my @list;
map { push @list, { "level" => $_, "fwklist" => $hashlevel{$_} } }
keys %hashlevel;
my $fwk_language;
for my $each_language (@$all_languages) {
# warn "CODE".$each_language->{'language_code'};
# warn "LANG:".$lang;
if ( $lang eq $each_language->{'language_code'} ) {
$fwk_language = $each_language->{language_locale_name};
}
}
my $updateflag =
$dbh->do(
"UPDATE systempreferences set value=\"$systempreference\" where variable='FrameworksLoaded'"
);
unless ( $updateflag == 1 ) {
my $string =
"INSERT INTO systempreferences (value, variable, explanation, type) VALUES (\"$systempreference\",'FrameworksLoaded','Frameworks loaded through webinstaller','choice')";
my $rq = $dbh->prepare($string);
$rq->execute;
}
$template->param(
"fwklanguage" => $fwk_language,
"list" => \@list
);
$template->param( "$op" => 1 );
$dbh->do('SET FOREIGN_KEY_CHECKS=1');
}
my $updateflag=$dbh->do("UPDATE systempreferences set value=\"$systempreference\" where variable='FrameworksLoaded'");
unless ($updateflag==1){
my $string="INSERT INTO systempreferences (value, variable, explanation, type) VALUES (\"$systempreference\",'FrameworksLoaded','Frameworks loaded through webinstaller','choice')";
my $rq=$dbh->prepare($string);
$rq->execute;
elsif ( $op && $op eq 'selectframeworks' ) {
#Framework Selection
#sql data for import are supposed to be located in misc/sql-datas/<language>/<level>
# Where <language> is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.)
# Where <level> is a category of requirement : required, recommended optional
# level should contain :
# SQL File for import With a readable name.
# txt File taht explains what this SQL File is meant for.
# Could be VERY useful to have A Big file for a kind of library.
# But could also be useful to have some Authorised values data set prepared here.
# Framework Selection is achieved through checking boxes.
my $langchoice = $query->param('fwklanguage');
$langchoice = $query->cookie('KohaOpacLanguage') unless ($langchoice);
my $dir = C4::Context->config('intranetdir') . "/misc/sql-datas/";
opendir( MYDIR, $dir );
my @listdir = grep { !/^\.|CVS/ && -d "$dir/$_" } readdir(MYDIR);
closedir MYDIR;
my $frmwklangs = getFrameworkLanguages();
my @languages;
map {
push @languages,
{
'dirname' => $_->{'language_code'},
'languagedescription' => $_->{'language_name'},
'checked' => ( $_->{'language_code'} eq $langchoice )
}
if ( $_->{'language_code'} );
} @$frmwklangs;
$template->param( "languagelist" => \@languages );
undef $/;
$dir =
C4::Context->config('intranetdir') . "/misc/sql-datas/$langchoice";
opendir( MYDIR, $dir ) || warn "no open $dir";
@listdir = grep { !/^\.|CVS/ && -d "$dir/$_" } readdir(MYDIR);
closedir MYDIR;
my @levellist;
my $request =
$dbh->prepare(
"SELECT value FROM systempreferences WHERE variable='FrameworksLoaded'"
);
$request->execute;
my ($frameworksloaded) = $request->fetchrow;
my %frameworksloaded;
foreach ( split( /\|/, $frameworksloaded ) ) {
$frameworksloaded{$_} = 1;
}
foreach my $requirelevel (@listdir) {
$dir =
C4::Context->config('intranetdir')
. "/misc/sql-datas/$langchoice/$requirelevel";
opendir( MYDIR, $dir );
my @listname =
grep { !/^\.|CVS/ && -f "$dir/$_" && $_ =~ m/\.sql$/ }
readdir(MYDIR);
closedir MYDIR;
my %cell;
my @frameworklist;
map {
my $name = substr( $_, 0, -4 );
open FILE, "< $dir/$name.txt";
my $lines = <FILE>;
$lines =~ s/\n|\r/<br \/>/g;
use utf8;
utf8::encode($lines) unless ( utf8::is_utf8($lines) );
push @frameworklist,
{
'fwkname' => $name,
'fwkfile' => "$dir/$_",
'fwkdescription' => $lines,
'checked' => (
(
$frameworksloaded{$_}
|| ( $requirelevel =~
/(mandatory|requi|oblig|necess)/i )
) ? 1 : 0
)
};
} @listname;
my @fwks =
sort { $a->{'fwkname'} lt $b->{'fwkname'} } @frameworklist;
# $cell{"mandatory"}=($requirelevel=~/(mandatory|requi|oblig|necess)/i);
$cell{"frameworks"} = \@fwks;
$cell{"label"} = ucfirst($requirelevel);
$cell{"code"} = lc($requirelevel);
push @levellist, \%cell;
}
$template->param( "levelloop" => \@levellist );
$template->param( "$op" => 1 );
}
$template->param("fwklanguage"=>$fwk_language,
"list"=>\@list);
$template->param("$op"=>1);
$dbh->do('SET FOREIGN_KEY_CHECKS=1');
} elsif ( $op && $op eq 'selectframeworks'){
#Framework Selection
#sql data for import are supposed to be located in misc/sql-datas/<language>/<level>
# Where <language> is en|fr or any international abbreviation (provided language hash is updated... This will be a problem with internationlisation.)
# Where <level> is a category of requirement : required, recommended optional
# level should contain :
# SQL File for import With a readable name.
# txt File taht explains what this SQL File is meant for.
# Could be VERY useful to have A Big file for a kind of library.
# But could also be useful to have some Authorised values data set prepared here.
# Framework Selection is achieved through checking boxes.
my $langchoice=$query->param('fwklanguage') ;
$langchoice=$query->cookie('KohaOpacLanguage') unless ($langchoice);
my $dir=C4::Context->config('intranetdir')."/misc/sql-datas/";
opendir (MYDIR,$dir);
my @listdir= grep { !/^\.|CVS/ && -d "$dir/$_"} readdir(MYDIR);
closedir MYDIR;
my $frmwklangs = getFrameworkLanguages();
elsif ( $op && $op eq 'updatestructure' ) {
#Do updatedatabase And report
my $execstring =
C4::Context->config("intranetdir") . "/updater/updatedatabase";
undef $/;
my $string = qx|$execstring 2>&1|;
if ($string) {
$string =~ s/\n|\r/<br \/>/g;
$string =~
s/(DBD::mysql.*? failed: .*? line [0-9]*.|=================.*?====================)/<font color=red>$1<\/font>/g;
$template->param( "updatereport" => $string );
}
$template->param( $op => 1 );
}
elsif ( $op && $op eq 'importdatastructure' ) {
#Import data structure and show errors if any
#Uses DBI to read the file [MJR 2007-07-01]
my $dbh = DBI->connect(
"DBI:$info{dbms}:$info{dbname}:$info{hostname}"
. ( $info{port} ? ":$info{port}" : "" ),
$info{'user'}, $info{'password'}
);
open( INPUT, "<kohastructure.sql" );
my $file = do { local $/ = undef; <INPUT> };
my @commands = split( /;/, $file );
pop @commands;
map { $dbh->do($_) } @commands;
close(INPUT);
$template->param(
"error" => $dbh->errstr,
"$op" => 1,
);
$dbh->disconnect;
}
else {
#Check if there are enough tables.
# Paul has cleaned up tables so reduced the count
#I put it there because it implied a data import if condition was not satisfied.
my $dbh = DBI->connect(
"DBI:$info{dbms}:$info{dbname}:$info{hostname}"
. ( $info{port} ? ":$info{port}" : "" ),
$info{'user'}, $info{'password'}
);
my $rq = $dbh->prepare( "SHOW TABLES FROM " . $info{'dbname'} );
$rq->execute;
my $data = $rq->fetchall_arrayref( {} );
my $count = scalar(@$data);
if ( $count < 70 ) {
$template->param( "count" => $count, "proposeimport" => 1 );
}
else {
$template->param( "count" => $count, "default" => 1 );
}
$dbh->disconnect;
}
}
else {
# LANGUAGE SELECTION page by default
# using opendir + language Hash
my $langavail = getTranslatedLanguages();
my @languages;
map{
push @languages,{'dirname'=>$_->{'language_code'}, 'languagedescription'=>$_->{'language_name'},'checked'=>($_->{'language_code'} eq $langchoice) } if ($_->{'language_code'});
} @$frmwklangs;
$template->param("languagelist"=>\@languages);
undef $/;
$dir=C4::Context->config('intranetdir')."/misc/sql-datas/$langchoice";
opendir (MYDIR,$dir) || warn "no open $dir";
@listdir= grep { !/^\.|CVS/ && -d "$dir/$_"} readdir(MYDIR);
closedir MYDIR;
my @levellist;
my $request=$dbh->prepare("SELECT value FROM systempreferences WHERE variable='FrameworksLoaded'");
$request->execute;
my ($frameworksloaded)=$request->fetchrow;
my %frameworksloaded;
foreach (split(/\|/,$frameworksloaded)){
$frameworksloaded{$_}=1;
foreach (@$langavail) {
push @languages,
{
'value' => $_->{'language_code'},
'description' => $_->{'language_name'}
}
if ( $_->{'language_code'} );
}
foreach my $requirelevel (@listdir){
$dir =C4::Context->config('intranetdir')."/misc/sql-datas/$langchoice/$requirelevel";
opendir (MYDIR,$dir);
my @listname = grep { !/^\.|CVS/ && -f "$dir/$_" && $_=~m/\.sql$/} readdir(MYDIR);
closedir MYDIR;
my %cell;
my @frameworklist;
map{
my $name=substr($_,0,-4);
open FILE, "< $dir/$name.txt";
my $lines = <FILE>;
$lines=~s/\n|\r/<br \/>/g;
use utf8;
utf8::encode($lines) unless (utf8::is_utf8($lines));
push @frameworklist,
{'fwkname'=>$name,
'fwkfile'=>"$dir/$_",
'fwkdescription'=>$lines,
'checked'=>(($frameworksloaded{$_}||($requirelevel=~/(mandatory|requi|oblig|necess)/i))?1:0)
};
} @listname;
my @fwks = sort { $a->{'fwkname'} lt $b->{'fwkname'} } @frameworklist;
# $cell{"mandatory"}=($requirelevel=~/(mandatory|requi|oblig|necess)/i);
$cell{"frameworks"}=\@fwks;
$cell{"label"}=ucfirst($requirelevel);
$cell{"code"}=lc($requirelevel);
push @levellist,\%cell;
$template->param( languages => \@languages );
if ($dbh) {
my $rq =
$dbh->prepare(
"SELECT * from systempreferences WHERE variable='Version'");
if ( $rq->execute ) {
my ($version) = $rq->fetchrow;
if ($version) {
$query->redirect("install.pl?step=3");
}
}
}
$template->param("levelloop"=>\@levellist);
$template->param("$op"=>1);
} elsif ($op && $op eq 'updatestructure'){
#Do updatedatabase And report
my $execstring=C4::Context->config("intranetdir")."/updater/updatedatabase";
undef $/;
my $string= qx|$execstring 2>&1|;
if ($string){
$string=~s/\n|\r/<br \/>/g;
$string=~s/(DBD::mysql.*? failed: .*? line [0-9]*.|=================.*?====================)/<font color=red>$1<\/font>/g;
$template->param("updatereport"=>$string) ;
}
$template->param($op=>1)
}elsif ($op && $op eq 'importdatastructure'){
#Import data structure and show errors if any
#Uses DBI to read the file [MJR 2007-07-01]
my $dbh= DBI->connect("DBI:$info{dbms}:$info{dbname}:$info{hostname}".($info{port}?":$info{port}":""),$info{'user'}, $info{'password'});
open(INPUT,"<kohastructure.sql");
my $file=do{ local $/=undef; <INPUT>};
my @commands=split(/;/,$file);
pop @commands;
map { $dbh->do($_)} @commands;
close(INPUT);
$template->param("error"=>$dbh->errstr ,
"$op"=> 1, );
$dbh->disconnect;
} else {
#Check if there are enough tables.
# Paul has cleaned up tables so reduced the count
#I put it there because it implied a data import if condition was not satisfied.
my $dbh= DBI->connect("DBI:$info{dbms}:$info{dbname}:$info{hostname}".($info{port}?":$info{port}":""),$info{'user'}, $info{'password'});
my $rq=$dbh->prepare("SHOW TABLES FROM ".$info{'dbname'});
$rq->execute;
my $data=$rq->fetchall_arrayref({});
my $count=scalar(@$data);
if ($count < 70){
$template->param("count"=>$count,"proposeimport"=>1);
} else {
$template->param("count"=>$count,"default"=>1);
}
$dbh->disconnect;
}
}else {
# LANGUAGE SELECTION page by default
# using opendir + language Hash
my $langavail = getTranslatedLanguages();
my @languages;
foreach (@$langavail){
push @languages,{'value'=>$_->{'language_code'}, 'description'=>$_->{'language_name'} } if ($_->{'language_code'});
}
$template->param(languages=>\@languages);
if ($dbh){
my $rq=$dbh->prepare("SELECT * from systempreferences WHERE variable='Version'");
if ($rq->execute){
my ($version)=$rq->fetchrow;
if ($version){
$query->redirect("install.pl?step=3");
}
}
}
}
output_html_with_http_headers $query, $cookie, $template->output;

View file

@ -2,21 +2,28 @@
<link rel="shortcut icon" href="<!-- TMPL_VAR NAME='themelang' -->/includes/favicon.ico" type="image/x-icon" />
<link rel="stylesheet" type="text/css" media="print" href="<!-- TMPL_VAR name="themelang" -->/includes/intranet-print.css" />
<style type="text/css" media="screen">
<!-- TMPL_IF NAME="popup" -->
<!-- TMPL_IF NAME="popup" -->
@import url(<!-- TMPL_VAR NAME='themelang' -->/includes/intranet2popup.css);
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="login" -->
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="login" -->
@import url(<!-- TMPL_VAR NAME='themelang' -->/includes/login.css);
<!-- TMPL_ELSE -->
<!-- TMPL_IF NAME="intranetstylesheet" -->
@import url(<!-- TMPL_VAR NAME="intranetstylesheet" -->);
<!-- TMPL_ELSE -->
@import url(<!-- TMPL_VAR NAME='themelang' -->/includes/intranet2.css);
<!--/TMPL_IF-->
<!-- /TMPL_IF -->
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="wizard" -->
@import url(<!-- TMPL_VAR NAME='themelang' -->/includes/wizard.css);
<!-- TMPL_ELSE -->
<!-- TMPL_IF NAME="intranetstylesheet" -->
@import url(<!-- TMPL_VAR NAME="intranetstylesheet" -->);
<!-- TMPL_ELSE -->
@import url(<!-- TMPL_VAR NAME='themelang' -->/includes/intranet2.css);
<!--/TMPL_IF-->
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="intranetcolorstylesheet" -->
@import url(<!-- TMPL_VAR NAME="intranetcolorstylesheet" -->);
<!-- /TMPL_IF -->
@import url(<!-- TMPL_VAR NAME="intranetcolorstylesheet" -->);
<!-- /TMPL_IF -->
</style>
</head>
<body>

View file

@ -2,6 +2,13 @@
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
<style type="text/css" media="screen">
<!-- TMPL_IF NAME="login" -->
@import url(/intranet-tmpl/prog/en/includes/login.css);
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="wizard" -->
@import url(/intranet-tmpl/prog/en/includes/wizard.css);
<!-- /TMPL_IF -->
html { background: #eee; }
body {

View file

@ -6,26 +6,22 @@
<!-- TMPL_IF NAME="loginprompt" -->Koha &rsaquo; Welcome to the Koha Web Installer<!-- /TMPL_IF --></title>
<!-- TMPL_INCLUDE NAME="installer-doc-head-close.inc" -->
<div>
<h1 id="logo"><img alt="Koha" src="/intranet-tmpl/prog/en/images/koha.org-logo.gif" /></h1>
<div id="login">
<h1><a>Koha 3.0 Installer</a></h1>
<!-- TMPL_IF NAME="nopermission" -->
<!-- This is what is displayed if user doesn't have permission --><h3>Login Error</h3>
<p>Sorry, Koha doesn't think you have permission for this page.</p>
<div id="login_error"><strong>Error</strong>: unauthorized user <a href="/cgi-bin/koha/mainpage.pl?logout.x=1">click to log out</a></div>
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="timed_out" -->
<!-- This is what is displayed if login has timed out -->
<h3>Login Error</h3><p>Sorry, your session has timed out. Please login again.</p>
<div id="login_error"><strong>Error</strong>: session timed out, please log in again</div>
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="different_ip" -->
<!-- This is what is displayed if user's IP has changed -->
<h3>Login Error</h3><p>You are accessing Koha from a different IP address! Please login again.</p>
<div id="login_error"><strong>Error</strong>: IP address has changed, please log in again </div>
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="invalid_username_or_password" -->
<!-- This is what is displayed if the username or password doesn't work -->
<h3>Login Error</h3><p>You entered an incorrect username or password. Please try again.</p>
<div id="login_error"><strong>Error</strong>: Incorrect username or password</div>
<!-- /TMPL_IF -->
<!-- TMPL_IF NAME="loginprompt" -->
@ -38,12 +34,14 @@
<p>Before we begin, please verify you have the correct credentials to continue. Please log in
with the username and password given to you by your systems administrator and located in your
<code>koha.xml</code> configuration file.</p>
<table>
<caption>Please enter your username and password:</caption>
<tr><th scope="row"><label for="userid">Username:</label></th><td><input name="userid" id="userid" /></td></tr>
<tr><th scope="row"><label for="password">Password:</label></th><td><input type="password" name="password" id="password" /></td></tr>
</table>
<p><input type="submit" value="Submit" /></p>
<p>Please enter your username and password:</p>
<p><label>Username:<br />
<input type="text" name="userid" id="userid" class="input" value="<!-- TMPL_VAR NAME="userid" -->" size="20" tabindex="1" /></label>
</p>
<p><label>Password:<br />
<input type="password" name="password" id="password" class="input" value="" size="20" tabindex="2" /></label>
</p>
<p class="submit"><input id="submit" type="submit" value="Login &raquo;" tabindex="4" /></p>
</form>
<!-- /TMPL_IF -->