[LON-CAPA-cvs] cvs: modules /relate lonlogin.pm
raeburn
raeburn at source.lon-capa.org
Tue Feb 7 09:49:48 EST 2012
raeburn Tue Feb 7 14:49:48 2012 EDT
Added files:
/modules/relate lonlogin.pm
Log:
- Customization for MITrelate.
- Custom log-in page incorporating sign-up button for access to
prerequisite test.
-------------- next part --------------
Index: modules/relate/lonlogin.pm
+++ modules/relate/lonlogin.pm
# The LearningOnline Network
# Login Screen
#
# $Id: lonlogin.pm,v 1.1 2012/02/07 14:49:47 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA 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 LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
package Apache::lonlogin;
use strict;
use Apache::Constants qw(:common);
use Apache::File ();
use Apache::lonnet;
use Apache::loncommon();
use Apache::lonauth();
use Apache::lonlocal;
use Apache::migrateuser();
use lib '/home/httpd/lib/perl/';
use LONCAPA;
use HTML::Entities();
sub handler {
my $r = shift;
&Apache::loncommon::get_unprocessed_cgi
(join('&',$ENV{'QUERY_STRING'},$env{'request.querystring'},
$ENV{'REDIRECT_QUERY_STRING'}),
['username','domain','firsturl','localpath','localres',
'token','role','symb']);
if (!defined($env{'form.firsturl'})) {
&Apache::lonacc::get_posted_cgi($r,['firsturl']);
}
$env{'form.firsturl'} =~ s/(`)/'/g;
# -- check if they are a migrating user
if (defined($env{'form.token'})) {
return &Apache::migrateuser::handler($r);
}
&Apache::loncommon::no_cache($r);
&Apache::lonlocal::get_language_handle($r);
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
return OK if $r->header_only;
# --------------------------------------------------------- Are we re-routing?
my $londocroot = $r->dir_config('lonDocRoot');
if (-e "$londocroot/lon-status/reroute.txt") {
&Apache::lonauth::reroute($r);
return OK;
}
# -------------------------------- Prevent users from attempting to login twice
my $handle = &Apache::lonnet::check_for_valid_session($r);
if ($handle ne '') {
my $lonidsdir=$r->dir_config('lonIDsDir');
if ($handle=~/^publicuser\_/) {
# For "public user" - remove it, we apparently really want to login
unlink("$lonidsdir/$handle.id");
} else {
# Indeed, a valid token is found
&Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
my $start_page =
&Apache::loncommon::start_page('Already logged in');
my $end_page =
&Apache::loncommon::end_page();
my $dest = '/adm/roles';
if ($env{'form.role'}) {
$dest .= '?selectrole=1&'.$env{'form.role'}.'=1';
}
if ($env{'form.symb'}) {
$dest .= ($dest =~ /\?/) ? '&' : '?';
$dest .= 'destinationurl='.
&HTML::Entities::encode($env{'form.symb'},'"&<>');
}
if ($env{'form.firsturl'} ne '') {
$dest = $env{'form.firsturl'};
}
$r->print(
$start_page.
'<h1>'.&mt('You are already logged in!').'</h1>'.
'<p>'.
&mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].',
'<a href="'.$dest.'">','</a>',
'<a href="/adm/logout">','</a>').
'</p>'.
$end_page
);
return OK;
}
}
# ---------------------------------------------------- No valid token, continue
# ---------------------------- Not possible to really login to domain "public"
if ($env{'form.domain'} eq 'public') {
$env{'form.domain'}='';
$env{'form.username'}='';
}
# ----------------------------------------------------------- Process Interface
my $httpbrowser=$ENV{"HTTP_USER_AGENT"};
my $iconpath=
&Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));
# ----------------------------------------------------------------
my $lonhost = $r->dir_config('lonHostID');
my $domain = &Apache::lonnet::default_login_domain();
if ($lonhost ne '') {
my $redirect = &check_loginvia($domain,$lonhost);
if ($redirect) {
$r->print($redirect);
return OK;
}
}
if (($env{'form.domain'}) &&
(&Apache::lonnet::domain($env{'form.domain'},'description'))) {
$domain=$env{'form.domain'};
}
my $role = $r->dir_config('lonRole');
my $loadlim = $r->dir_config('lonLoadLim');
my $uloadlim= $r->dir_config('lonUserLoadLim');
my $servadm = $r->dir_config('lonAdmEMail');
my $tabdir = $r->dir_config('lonTabDir');
my $include = $r->dir_config('lonIncludes');
my $expire = $r->dir_config('lonExpire');
my $version = $r->dir_config('lonVersion');
my $host_name = &Apache::lonnet::hostname($lonhost);
# --------------------------------------------- Default values for login fields
my $authusername=($env{'form.username'}?$env{'form.username'}:'');
my $authdomain=($env{'form.domain'}?$env{'form.domain'}:$domain);
# ---------------------------------------------------------- Determine own load
my $loadavg;
{
my $loadfile=Apache::File->new('/proc/loadavg');
$loadavg=<$loadfile>;
}
$loadavg =~ s/\s.*//g;
my ($loadpercent,$userloadpercent);
if ($loadlim) {
$loadpercent=sprintf("%.1f",100*$loadavg/$loadlim);
}
if ($uloadlim) {
$userloadpercent=&Apache::lonnet::userload();
}
my $firsturl=
($env{'request.firsturl'}?$env{'request.firsturl'}:$env{'form.firsturl'});
# ----------------------------------------------------------- Get announcements
my $announcements=&Apache::lonnet::getannounce();
# -------------------------------------------------------- Set login parameters
my @hexstr=('0','1','2','3','4','5','6','7',
'8','9','a','b','c','d','e','f');
my $lkey='';
for (0..7) {
$lkey.=$hexstr[rand(15)];
}
my $ukey='';
for (0..7) {
$ukey.=$hexstr[rand(15)];
}
my $lextkey=hex($lkey);
if ($lextkey>2147483647) { $lextkey-=4294967296; }
my $uextkey=hex($ukey);
if ($uextkey>2147483647) { $uextkey-=4294967296; }
# -------------------------------------------------------- Store away log token
my $tokenextras;
if ($env{'form.role'}) {
$tokenextras = '&role='.&escape($env{'form.role'});
}
if ($env{'form.symb'}) {
if (!$tokenextras) {
$tokenextras = '&';
}
$tokenextras .= '&symb='.&escape($env{'form.symb'});
}
my $logtoken=Apache::lonnet::reply(
'tmpput:'.$ukey.$lkey.'&'.$firsturl.$tokenextras,
$lonhost);
# -- If we cannot talk to ourselves, or hostID does not map to a hostname
# we are in serious trouble
if (($logtoken eq 'con_lost') || ($logtoken eq 'no_such_host')) {
if ($logtoken eq 'no_such_host') {
&Apache::lonnet::logthis('No valid logtoken for log-in page -- '.
'unable to determine hostname for hostID: '.$lonhost.
'. Check entry in hosts.tab');
}
my $spares='';
my $last;
foreach my $hostid (sort
{
&Apache::lonnet::hostname($a) cmp
&Apache::lonnet::hostname($b);
}
keys(%Apache::lonnet::spareid)) {
next if ($hostid eq $lonhost);
my $hostname = &Apache::lonnet::hostname($hostid);
next if (($last eq $hostname) || ($hostname eq ''));
$spares.='<br /><span style="font-size: larger;"><a href="http://'.
$hostname.
'/adm/login?domain='.$authdomain.'">'.
$hostname.'</a>'.
' '.&mt('(preferred)').'</span>'.$/;
$last=$hostname;
}
if ($spares) {
$spares.= '<br />';
}
my %all_hostnames = &Apache::lonnet::all_hostnames();
foreach my $hostid (sort
{
&Apache::lonnet::hostname($a) cmp
&Apache::lonnet::hostname($b);
}
keys(%all_hostnames)) {
next if ($hostid eq $lonhost || $Apache::lonnet::spareid{$hostid});
my $hostname = &Apache::lonnet::hostname($hostid);
next if (($last eq $hostname) || ($hostname eq ''));
$spares.='<br /><a href="http://'.
$hostname.
'/adm/login?domain='.$authdomain.'">'.
$hostname.'</a>';
$last=$hostname;
}
$r->print(
'<html>'
.'<head><title>'
.&mt('The LearningOnline Network with CAPA')
.'</title></head>'
.'<body bgcolor="#FFFFFF">'
.'<h1>'.&mt('The LearningOnline Network with CAPA').'</h1>'
.'<img src="/adm/lonKaputt/lonlogo_broken.gif" align="right" />'
.'<h3>'.&mt("This Learn Physics server is temporarily not available for login.").'</h3>'
.'</body>'
.'</html>'
);
return OK;
}
# ----------------------------------------------- Apparently we are in business
$servadm=~s/\,/\<br \/\>/g;
# ----------------------------------------------------------------------- Texts
my $pagetitle = 'Learn Physics Login'; # Do not localize.
my %lt=&Apache::lonlocal::texthash(
'needu' => 'You must provide a username',
'needp' => 'You must provide a password',
'un' => 'Username',
'pw' => 'Password',
'dom' => 'Domain',
'perc' => 'percent',
'load' => 'Server Load',
'userload' => 'User Load',
'catalog' => 'Course/Community Catalog',
'log' => 'Log-in',
'help' => 'Log-in Help',
'serv' => 'Server',
'servadm' => 'Server Administration',
'helpdesk' => 'Contact Helpdesk',
'forgotpw' => 'Forgot your password?',
'newuser' => 'New User?',
'learn' => 'Learn Physics includes an online physics course, to which you may receive admission after successfully completing a pre-course test.',
'click' => 'Click here to sign up',
'plea' => 'Please log-in',
'supp' => 'Support from NSF, NIH, Google',
'note' => 'Please Note:',
'jscr' => 'Javascript must be enabled in your web browser in order to use this web site.',
);
# ----------------------------------------------------------- Front page design
my $font=&Apache::loncommon::designparm('login.font',$domain);
my $link=&Apache::loncommon::designparm('login.link',$domain);
my $vlink=&Apache::loncommon::designparm('login.vlink',$domain);
my $alink=&Apache::loncommon::designparm('login.alink',$domain);
my $mainbg=&Apache::loncommon::designparm('login.mainbg',$domain);
my $showadminmail=&Apache::loncommon::designparm('login.adminmail',$domain);
my $helpdeskscript;
my $contactblock = &contactdisplay(\%lt,$servadm,$showadminmail,
$authdomain,\$helpdeskscript);
# -------------------------------------------------- Change password field name
my $now=time;
# ---------------------------------------- Assemble Javascript to put in <head>
my $js = (<<ENDSCRIPT);
<script type="text/javascript" language="JavaScript">
// <![CDATA[
function send(caller) {
if (caller == "newaccount") {
this.document.signup.submit();
return false;
}
if (document.client.uname.value == "" || !document.client.uname.value) {
alert("$lt{'needu'}");
return false;
}
if (document.client.upass$now.value == "" ||
!document.client.upass$now.value) {
alert("$lt{'needp'}");
return false;
}
this.document.server.elements.uname.value
=this.document.client.elements.uname.value;
this.document.server.elements.udom.value
=this.document.client.elements.udom.value;
uextkey=this.document.client.elements.uextkey.value;
lextkey=this.document.client.elements.lextkey.value;
initkeys();
this.document.server.elements.upass0.value
=crypted(this.document.client.elements.upass$now.value.substr(0,15));
this.document.server.elements.upass1.value
=crypted(this.document.client.elements.upass$now.value.substr(15,15));
this.document.server.elements.upass2.value
=crypted(this.document.client.elements.upass$now.value.substr(30,15));
this.document.client.elements.uname.value='';
this.document.client.elements.upass$now.value='';
this.document.server.submit();
return false;
}
function enableInput() {
this.document.client.elements.upass$now.removeAttribute("readOnly");
this.document.client.elements.uname.removeAttribute("readOnly");
this.document.client.elements.udom.removeAttribute("readOnly");
return;
}
// ]]>
</script>
$helpdeskscript
ENDSCRIPT
# --------------------------------------------------- Print login screen header
my %add_entries = (
bgcolor => "$mainbg",
text => "$font",
link => "$link",
vlink => "$vlink",
alink => "$alink",
onload => 'javascript:enableInput();',);
my $css_url = "/css/$domain/login.css";
$js .= "\n".'<link type="text/css" rel="stylesheet" href="'.$css_url.'">'."\n";
$r->print(&Apache::loncommon::start_page($pagetitle,$js,
{'redirect' => [$expire,'/adm/roles'],
'add_entries' => \%add_entries,
'only_body' => 1,}));
# ------------------------------------------------------------ Additional Texts
$lt{'newto'} = &mt('New to the [_1]Learn Physics[_2] site?','<i>','</i>');
$lt{'runson'} = &mt('Learn Physics runs on [_1]LON-CAPA[_2] - an open source freeware distributed learning content management and assessment system.',
'<a href="http://loncapa.org/">','</a>');
$lt{'newhere'} = &mt('New to [_1]Learn Physics[_2]:','<i>','</i>');
$lt{'exist'} = &mt('Existing [_1]Learn Physics[_2] user','<i>','</i>');
$lt{'browser'} = &mt('Your browser must allow [_1]cookies[_2]',
'<a href="http://loncapa.msu.edu/cookies.html" style="color: #ffffff">','</a>');
# -------------------------------------------- Static cid for prerequisite test
$prereqcid = 'relate_9615072b469884921relatel1';
# ---------------------------------------------------- Warning if no Javascript
my $noscript_warning = '<noscript><span class="LC_warning">'.
'<b>'.$lt{'note'}.'</b>'.$lt{'jscr'}.'
'</span></noscript>';
# ---------------------------------------------------- Serve out DES JavaScript
{
my $jsh=Apache::File->new($include."/londes.js");
$r->print(<$jsh>);
}
# ---------------------------------------------------------- Serve rest of page
$r->print(<<"ENDLOGIN");
<br />
<div align="center">
<table class="LC_loginbox">
<tr>
<td align="left" valign="top" width="11">
<img src="/images/login/tlc_11_ffffff_e2e2e2.gif" width="10" height="10" border="0" alt="">
</td>
<td width="450" valign="top">
<table class="LC_loginbox_left">
<tr>
<td width="411" align="left"><br />
<img src="/images/login/LCrelateheader_sm.png" width="411" height="100" alt="Relate @ MIT" align="left"></td>
</tr>
<tr>
<td>
<div align="left" style="display:block; margin-top:5px; margin-bottom:5px; margin-left:0px; margin-right:0px; width:440px; height:5px;">
<div class="divider">
</div>
</div>
</td>
</tr>
</table>
<table class="LC_loginbox_left">
<tr>
<td width="10"> </td>
<td valign="top" class="bodyred" width="430" align="left"><br />
<span style="font-size: 18px; line-height: 22px; ">$lt{'newt'}</span>
<br />
<span class="bodyred">$lt{'learn'}<br /><br />$lt{'runson'}
<br /><br />
<form name="signup" method="post" action="/adm/createaccount?courseid=$prereqcid"><input type="hidden" name="process" value="signup"/>
<table class="LC_signup">
<tr>
<td align="left" valign="top" width="11" height="11"><img src="/images/login/tlc_11_993333_ffffff.gif" width="10" height="10" border="0" alt=""></td>
<td> </td>
<td align="right" valign="top" width="11" height="11"><img src="/images/login/tr_11_993333_ffffff.gif" width="11" height="11" border="0" alt=""></td>
</tr>
<tr>
<td> </td>
<td align="center" valign="middle"><span style="white-space: nowrap;"><b>$lt{'newhere'}</b>: <a href="javascript:send('newaccount')" style="color: #ffffff">$lt{'click'}</a></span></td>
<td> </td>
</tr>
<tr>
<td align="left" valign="bottom" width="11" height="11"><img src="/images/login/bl_11_993333_ffffff.gif" width="11" height="11" border="0" alt=""></td>
<td> </td>
<td align="right" valign="bottom" width="11" height="11"><img src="/images/login/br_11_993333_ffffff.gif" width="11" height="11" border="0" alt=""></td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</td>
<td width="10"> </td>
<td valign="top">
<form name="client" method="post" onsubmit="return(send());">
<table class="LC_loginbox_right">
<tr>
<td colspan="3" height="23" class="LC_loginbox_strip"> </td>
i </tr>
<tr>
<td align="left" valign="top" width="11" height="11"><img src="/images/login/tlc_11_993333_ffffff.gif" width="10" height="10" border="0" alt=""></td>
<td> </td>
<td align="right" valign="top" width="11" height="11"><img src="/images/login/tr_11_993333_ffffff.gif" width="11" height="11" border="0" alt=""></td>
</tr>
<tr>
<td width="10"> </td>
<td>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="right" class="bodywhite" heighta"=50"><br>
<span style="font-size: 15px; line-height: 17px; font-weight: bold;">
$lt{'exist'}</span>
<br />$lt{'plea'}<br />
<hr class="login"><br /><br />
</td>
</tr>
<tr>
<td>
<table border="0" cellpadding="2" cellspacing="0">
<tr>
<td align="right" class="bodywhite"><label for="uname">$lt{'un'}</label>:</td>
<td align="right"><input type="text" name="uname" size="17" value="" /></td>
</tr>
<tr>
<td align="right" class="bodywhite"><label for="upass$now">$lt{'pw'}</label>:</td>
<td align="right"><input name="upass$now" size="17" value="" type="password"><input type="hidden" name="udom" value="relate" /></td>
</tr>
<tr><td> </td></tr>
<tr>
<tr>
<td colspan="2" align="right"><input name="signin" type="submit" value="$lt{'log'}" class="buttonwhite" /></td>
</tr>
</table>
</td>
</tr>
<tr>
<td align="right" valign="top" class="bodywhite">
<br />
<br />
<span style="font-size: smaller;">$lt{'browser'}</span><br />
<hr class="login" />
<br />
<a href="/adm/resetpw" style="color: #ffffff">$lt{forgotpw'}</a><br>
<br />
</td>
</tr>
</table>
</td>
<td width="9"> </td>
</tr>
<tr>
<td align="left" valign="bottom" width="11" height="11"><img src="/images/login/bl_11_993333_ffffff.gif" width="11" height="11" border="0" alt=""></td>
<td> </td>
<td align="right" valign="bottom" width="11" height="11"><img src="/images/login/br_11_993333_ffffff.gif" width="11" height="11" border="0" alt=""></td>
</tr>
<tr>
<td colspan="3" height="10" class="LC_loginbox_strip"> $contactblock</td>
</tr>
</table>
</td>
<td align="right" valign="top" width="11"><img src="/images/login/tr_11_ffffff_e2e2e2.gif" width="11" height="11" border="0" alt=""></td>
</tr>
<tr>
<td colspan="4">
<div align="right">
<img src="/images/login/sponsors.png" alt="$lt{'supp'}" align="right" />
</div>
</td>
</tr>
<tr>
<td align="left" valign="bottom" width="11"><img src="/images/login/bl_11_ffffff_e2e2e2.gif" width="11" height="11" border="0" alt=""></td>
<td colspan="3" width="698"> </td>
<td align="right" valign="bottom" width="11"><img src="/images/login/br_11_ffffff_e2e2e2.gif" width="11" height="11" border="0" alt=""></td>
</tr>
</table>
</div>
<p> </p>
$noscript_warning
<input type="hidden" name="lextkey" value="$lextkey" />
<input type="hidden" name="uextkey" value="$uextkey" />
</form>
<form name="server" action="/adm/authenticate" method="post" target="_top">
<input type="hidden" name="logtoken" value="$logtoken" />
<input type="hidden" name="serverid" value="$lonhost" />
<input type="hidden" name="uname" value="" />
<input type="hidden" name="upass0" value="" />
<input type="hidden" name="upass1" value="" />
<input type="hidden" name="upass2" value="" />
<input type="hidden" name="udom" value="" />
<input type="hidden" name="localpath" value="$env{'form.localpath'}" />
<input type="hidden" name="localres" value="$env{'form.localres'}" />
</form>
<script type="text/javascript">
// <![CDATA[
// the if prevents the script error if the browser can not handle this
if ( document.client.uname ) { document.client.uname.focus(); }
// ]]>
</script>
ENDLOGIN
# -------------------------------------------------------- Standard page ending
my %endargs = ( 'noredirectlink' => 1, );
$r->print(&Apache::loncommon::end_page(\%endargs));
return OK;
}
sub check_loginvia {
my ($domain,$lonhost) = @_;
if ($domain eq '' || $lonhost eq '') {
return;
}
my %domconfhash = &Apache::loncommon::get_domainconf($domain);
my $loginvia = $domconfhash{$domain.'.login.loginvia_'.$lonhost};
my $loginvia_exempt = $domconfhash{$domain.'.login.loginvia_exempt_'.$lonhost};
my $output;
if ($loginvia ne '') {
my $noredirect;
my $ip = $ENV{'REMOTE_ADDR'};
if ($ip eq '127.0.0.1') {
$noredirect = 1;
} else {
if ($loginvia_exempt ne '') {
my @exempt = split(',',$loginvia_exempt);
if (grep(/^\Q$ip\E$/, at exempt)) {
$noredirect = 1;
}
}
}
unless ($noredirect) {
my ($newhost,$path);
if ($loginvia =~ /:/) {
($newhost,$path) = split(':',$loginvia);
} else {
$newhost = $loginvia;
}
if ($newhost ne $lonhost) {
if (&Apache::lonnet::hostname($newhost) ne '') {
$output = &redirect_page($newhost,$path);
}
}
}
}
return $output;
}
sub redirect_page {
my ($desthost,$path) = @_;
my $protocol = $Apache::lonnet::protocol{$desthost};
$protocol = 'http' if ($protocol ne 'https');
unless ($path =~ m{^/}) {
$path = '/'.$path;
}
my $url = $protocol.'://'.&Apache::lonnet::hostname($desthost).$path;
if ($env{'form.firsturl'} ne '') {
$url .='?firsturl='.$env{'form.firsturl'};
}
my $start_page = &Apache::loncommon::start_page('Switching Server ...',undef,
{'redirect' => [0,$url],});
my $end_page = &Apache::loncommon::end_page();
return $start_page.$end_page;
}
sub contactdisplay {
my ($lt,$servadm,$showadminmail,$authdomain,$helpdeskscript) = @_;
return unless(ref($lt) eq 'HASH');
my $contactblock;
my $showhelpdesk = 0;
my $requestmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
if ($requestmail =~ m/^[^\@]+\@[^\@]+$/) {
$showhelpdesk = 1;
}
if ($servadm && $showadminmail) {
$contactblock .= $lt->{'servadm'}.':<br />'.
'<tt>'.$servadm.'</tt><br />';
}
if ($showhelpdesk) {
$contactblock .= '<a href="javascript:helpdesk()">'.$lt->{'helpdesk'}.'</a><br />';
my $thisurl = &escape('/adm/login');
$$helpdeskscript = <<"ENDSCRIPT";
<script type="text/javascript">
// <![CDATA[
function helpdesk() {
var codedom = document.client.udom.value;
if (codedom == '') {
codedom = "$authdomain";
}
var querystr = "origurl=$thisurl&codedom="+codedom;
document.location.href = "/adm/helpdesk?"+querystr;
return;
}
// ]]>
</script>
ENDSCRIPT
}
return $contactblock;
}
1;
__END__
More information about the LON-CAPA-cvs
mailing list