Annotation of modules/relate/lonlogin.pm, revision 1.9
1.1 raeburn 1: # The LearningOnline Network
2: # Login Screen
3: #
1.9 ! relate 4: # $Id: lonlogin.pm,v 1.8 2012/03/01 00:23:46 relate Exp $
1.1 raeburn 5: #
6: # Copyright Michigan State University Board of Trustees
7: #
8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
9: #
10: # LON-CAPA is free software; you can redistribute it and/or modify
11: # it under the terms of the GNU General Public License as published by
12: # the Free Software Foundation; either version 2 of the License, or
13: # (at your option) any later version.
14: #
15: # LON-CAPA is distributed in the hope that it will be useful,
16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: # GNU General Public License for more details.
19: #
20: # You should have received a copy of the GNU General Public License
21: # along with LON-CAPA; if not, write to the Free Software
22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23: #
24: # /home/httpd/html/adm/gpl.txt
25: #
26: # http://www.lon-capa.org/
27: #
28:
29: package Apache::lonlogin;
30:
31: use strict;
32: use Apache::Constants qw(:common);
33: use Apache::File ();
34: use Apache::lonnet;
35: use Apache::loncommon();
36: use Apache::lonauth();
37: use Apache::lonlocal;
38: use Apache::migrateuser();
39: use lib '/home/httpd/lib/perl/';
40: use LONCAPA;
41: use HTML::Entities();
42:
43: sub handler {
44: my $r = shift;
45:
46: &Apache::loncommon::get_unprocessed_cgi
47: (join('&',$ENV{'QUERY_STRING'},$env{'request.querystring'},
48: $ENV{'REDIRECT_QUERY_STRING'}),
49: ['username','domain','firsturl','localpath','localres',
50: 'token','role','symb']);
51: if (!defined($env{'form.firsturl'})) {
52: &Apache::lonacc::get_posted_cgi($r,['firsturl']);
53: }
54: $env{'form.firsturl'} =~ s/(`)/'/g;
55:
56: # -- check if they are a migrating user
57: if (defined($env{'form.token'})) {
58: return &Apache::migrateuser::handler($r);
59: }
60:
61: &Apache::loncommon::no_cache($r);
62: &Apache::lonlocal::get_language_handle($r);
63: &Apache::loncommon::content_type($r,'text/html');
64: $r->send_http_header;
65: return OK if $r->header_only;
66:
67: # --------------------------------------------------------- Are we re-routing?
68: my $londocroot = $r->dir_config('lonDocRoot');
69: if (-e "$londocroot/lon-status/reroute.txt") {
70: &Apache::lonauth::reroute($r);
71: return OK;
72: }
73:
74: # -------------------------------- Prevent users from attempting to login twice
75: my $handle = &Apache::lonnet::check_for_valid_session($r);
76: if ($handle ne '') {
77: my $lonidsdir=$r->dir_config('lonIDsDir');
78: if ($handle=~/^publicuser\_/) {
79: # For "public user" - remove it, we apparently really want to login
80: unlink("$lonidsdir/$handle.id");
81: } else {
82: # Indeed, a valid token is found
83: &Apache::lonnet::transfer_profile_to_env($lonidsdir,$handle);
84: my $start_page =
85: &Apache::loncommon::start_page('Already logged in');
86: my $end_page =
87: &Apache::loncommon::end_page();
88: my $dest = '/adm/roles';
89: if ($env{'form.role'}) {
90: $dest .= '?selectrole=1&'.$env{'form.role'}.'=1';
91: }
92: if ($env{'form.symb'}) {
93: $dest .= ($dest =~ /\?/) ? '&' : '?';
94: $dest .= 'destinationurl='.
95: &HTML::Entities::encode($env{'form.symb'},'"&<>');
96: }
97: if ($env{'form.firsturl'} ne '') {
98: $dest = $env{'form.firsturl'};
99: }
100: $r->print(
101: $start_page.
102: '<h1>'.&mt('You are already logged in!').'</h1>'.
103: '<p>'.
104: &mt('Please either [_1]continue the current session[_2] or [_3]log out[_4].',
105: '<a href="'.$dest.'">','</a>',
106: '<a href="/adm/logout">','</a>').
107: '</p>'.
108: $end_page
109: );
110: return OK;
111: }
112: }
113:
114: # ---------------------------------------------------- No valid token, continue
115:
116: # ---------------------------- Not possible to really login to domain "public"
117: if ($env{'form.domain'} eq 'public') {
118: $env{'form.domain'}='';
119: $env{'form.username'}='';
120: }
121: # ----------------------------------------------------------- Process Interface
122: my $httpbrowser=$ENV{"HTTP_USER_AGENT"};
123:
124: my $iconpath=
125: &Apache::loncommon::lonhttpdurl($r->dir_config('lonIconsURL'));
126:
127: # ----------------------------------------------------------------
128:
129: my $lonhost = $r->dir_config('lonHostID');
130: my $domain = &Apache::lonnet::default_login_domain();
131: if ($lonhost ne '') {
132: my $redirect = &check_loginvia($domain,$lonhost);
133: if ($redirect) {
134: $r->print($redirect);
135: return OK;
136: }
137: }
138:
139: if (($env{'form.domain'}) &&
140: (&Apache::lonnet::domain($env{'form.domain'},'description'))) {
141: $domain=$env{'form.domain'};
142: }
143:
144: my $role = $r->dir_config('lonRole');
145: my $loadlim = $r->dir_config('lonLoadLim');
146: my $uloadlim= $r->dir_config('lonUserLoadLim');
147: my $servadm = $r->dir_config('lonAdmEMail');
148: my $tabdir = $r->dir_config('lonTabDir');
149: my $include = $r->dir_config('lonIncludes');
150: my $expire = $r->dir_config('lonExpire');
151: my $version = $r->dir_config('lonVersion');
152: my $host_name = &Apache::lonnet::hostname($lonhost);
153:
154: # --------------------------------------------- Default values for login fields
155:
156: my $authusername=($env{'form.username'}?$env{'form.username'}:'');
157: my $authdomain=($env{'form.domain'}?$env{'form.domain'}:$domain);
158:
159: # ---------------------------------------------------------- Determine own load
160: my $loadavg;
161: {
162: my $loadfile=Apache::File->new('/proc/loadavg');
163: $loadavg=<$loadfile>;
164: }
165: $loadavg =~ s/\s.*//g;
166:
167: my ($loadpercent,$userloadpercent);
168: if ($loadlim) {
169: $loadpercent=sprintf("%.1f",100*$loadavg/$loadlim);
170: }
171: if ($uloadlim) {
172: $userloadpercent=&Apache::lonnet::userload();
173: }
174:
175: my $firsturl=
176: ($env{'request.firsturl'}?$env{'request.firsturl'}:$env{'form.firsturl'});
177:
178: # ----------------------------------------------------------- Get announcements
179: my $announcements=&Apache::lonnet::getannounce();
180: # -------------------------------------------------------- Set login parameters
181:
182: my @hexstr=('0','1','2','3','4','5','6','7',
183: '8','9','a','b','c','d','e','f');
184: my $lkey='';
185: for (0..7) {
186: $lkey.=$hexstr[rand(15)];
187: }
188:
189: my $ukey='';
190: for (0..7) {
191: $ukey.=$hexstr[rand(15)];
192: }
193:
194: my $lextkey=hex($lkey);
195: if ($lextkey>2147483647) { $lextkey-=4294967296; }
196:
197: my $uextkey=hex($ukey);
198: if ($uextkey>2147483647) { $uextkey-=4294967296; }
199:
200: # -------------------------------------------------------- Store away log token
201: my $tokenextras;
202: if ($env{'form.role'}) {
203: $tokenextras = '&role='.&escape($env{'form.role'});
204: }
205: if ($env{'form.symb'}) {
206: if (!$tokenextras) {
207: $tokenextras = '&';
208: }
209: $tokenextras .= '&symb='.&escape($env{'form.symb'});
210: }
211: my $logtoken=Apache::lonnet::reply(
212: 'tmpput:'.$ukey.$lkey.'&'.$firsturl.$tokenextras,
213: $lonhost);
214:
215: # -- If we cannot talk to ourselves, or hostID does not map to a hostname
216: # we are in serious trouble
217:
218: if (($logtoken eq 'con_lost') || ($logtoken eq 'no_such_host')) {
219: if ($logtoken eq 'no_such_host') {
220: &Apache::lonnet::logthis('No valid logtoken for log-in page -- '.
221: 'unable to determine hostname for hostID: '.$lonhost.
222: '. Check entry in hosts.tab');
223: }
224: my $spares='';
225: my $last;
226: foreach my $hostid (sort
227: {
228: &Apache::lonnet::hostname($a) cmp
229: &Apache::lonnet::hostname($b);
230: }
231: keys(%Apache::lonnet::spareid)) {
232: next if ($hostid eq $lonhost);
233: my $hostname = &Apache::lonnet::hostname($hostid);
234: next if (($last eq $hostname) || ($hostname eq ''));
235: $spares.='<br /><span style="font-size: larger;"><a href="http://'.
236: $hostname.
237: '/adm/login?domain='.$authdomain.'">'.
238: $hostname.'</a>'.
239: ' '.&mt('(preferred)').'</span>'.$/;
240: $last=$hostname;
241: }
242: if ($spares) {
243: $spares.= '<br />';
244: }
245: my %all_hostnames = &Apache::lonnet::all_hostnames();
246: foreach my $hostid (sort
247: {
248: &Apache::lonnet::hostname($a) cmp
249: &Apache::lonnet::hostname($b);
250: }
251: keys(%all_hostnames)) {
252: next if ($hostid eq $lonhost || $Apache::lonnet::spareid{$hostid});
253: my $hostname = &Apache::lonnet::hostname($hostid);
254: next if (($last eq $hostname) || ($hostname eq ''));
255: $spares.='<br /><a href="http://'.
256: $hostname.
257: '/adm/login?domain='.$authdomain.'">'.
258: $hostname.'</a>';
259: $last=$hostname;
260: }
261: $r->print(
262: '<html>'
263: .'<head><title>'
264: .&mt('The LearningOnline Network with CAPA')
265: .'</title></head>'
266: .'<body bgcolor="#FFFFFF">'
267: .'<h1>'.&mt('The LearningOnline Network with CAPA').'</h1>'
268: .'<img src="/adm/lonKaputt/lonlogo_broken.gif" align="right" />'
1.5 raeburn 269: .'<h3>'.&mt("This Mechanics Online course server is temporarily not available for login.").'</h3>'
1.1 raeburn 270: .'</body>'
271: .'</html>'
272: );
273: return OK;
274: }
275:
276: # ----------------------------------------------- Apparently we are in business
277: $servadm=~s/\,/\<br \/\>/g;
278:
279: # ----------------------------------------------------------------------- Texts
1.5 raeburn 280: my $pagetitle = 'Mechanics Online Log-in'; # Do not localize.
1.1 raeburn 281: my %lt=&Apache::lonlocal::texthash(
282: 'needu' => 'You must provide a username',
283: 'needp' => 'You must provide a password',
284: 'un' => 'Username',
285: 'pw' => 'Password',
286: 'dom' => 'Domain',
287: 'perc' => 'percent',
288: 'load' => 'Server Load',
289: 'userload' => 'User Load',
290: 'catalog' => 'Course/Community Catalog',
291: 'log' => 'Log-in',
292: 'help' => 'Log-in Help',
293: 'serv' => 'Server',
294: 'servadm' => 'Server Administration',
295: 'helpdesk' => 'Contact Helpdesk',
1.5 raeburn 296: 'exist' => 'Existing user?',
1.1 raeburn 297: 'forgotpw' => 'Forgot your password?',
298: 'newuser' => 'New User?',
1.5 raeburn 299: 'click' => 'Click here to sign up',
300: 'plea' => 'Please log-in',
301: 'supp' => 'Support from NSF, NIH, Google',
302: 'note' => 'Please Note:',
303: 'jscr' => 'Javascript must be enabled in your web browser in order to use this web site.',
1.1 raeburn 304: );
305: # ----------------------------------------------------------- Front page design
306: my $font=&Apache::loncommon::designparm('login.font',$domain);
307: my $link=&Apache::loncommon::designparm('login.link',$domain);
308: my $vlink=&Apache::loncommon::designparm('login.vlink',$domain);
309: my $alink=&Apache::loncommon::designparm('login.alink',$domain);
310: my $mainbg=&Apache::loncommon::designparm('login.mainbg',$domain);
311: my $showadminmail=&Apache::loncommon::designparm('login.adminmail',$domain);
312:
313: my $helpdeskscript;
314: my $contactblock = &contactdisplay(\%lt,$servadm,$showadminmail,
315: $authdomain,\$helpdeskscript);
316:
317: # -------------------------------------------------- Change password field name
318: my $now=time;
319:
320: # ---------------------------------------- Assemble Javascript to put in <head>
321:
322: my $js = (<<ENDSCRIPT);
323:
324: <script type="text/javascript" language="JavaScript">
325: // <![CDATA[
326:
327: function send(caller) {
328: if (caller == "newaccount") {
329: this.document.signup.submit();
330: return false;
331: }
332: if (document.client.uname.value == "" || !document.client.uname.value) {
333: alert("$lt{'needu'}");
334: return false;
335: }
336: if (document.client.upass$now.value == "" ||
337: !document.client.upass$now.value) {
338: alert("$lt{'needp'}");
339: return false;
340: }
341:
342: this.document.server.elements.uname.value
343: =this.document.client.elements.uname.value;
344:
345: this.document.server.elements.udom.value
346: =this.document.client.elements.udom.value;
347:
348: uextkey=this.document.client.elements.uextkey.value;
349: lextkey=this.document.client.elements.lextkey.value;
350: initkeys();
351:
352: this.document.server.elements.upass0.value
353: =crypted(this.document.client.elements.upass$now.value.substr(0,15));
354: this.document.server.elements.upass1.value
355: =crypted(this.document.client.elements.upass$now.value.substr(15,15));
356: this.document.server.elements.upass2.value
357: =crypted(this.document.client.elements.upass$now.value.substr(30,15));
358:
359: this.document.client.elements.uname.value='';
360: this.document.client.elements.upass$now.value='';
361:
362: this.document.server.submit();
363: return false;
364: }
365:
366: function enableInput() {
367: this.document.client.elements.upass$now.removeAttribute("readOnly");
368: this.document.client.elements.uname.removeAttribute("readOnly");
369: this.document.client.elements.udom.removeAttribute("readOnly");
370: return;
371: }
372:
373: // ]]>
374: </script>
375:
376: $helpdeskscript
377:
378: ENDSCRIPT
379:
380: # --------------------------------------------------- Print login screen header
381: my %add_entries = (
382: bgcolor => "$mainbg",
383: text => "$font",
384: link => "$link",
385: vlink => "$vlink",
386: alink => "$alink",
387: onload => 'javascript:enableInput();',);
388:
1.4 raeburn 389: my $css_url = "/css/relate/login.css";
1.2 raeburn 390: $js .= "\n".'<link type="text/css" rel="stylesheet" href="'.$css_url.'" />'."\n";
1.1 raeburn 391: $r->print(&Apache::loncommon::start_page($pagetitle,$js,
392: {'redirect' => [$expire,'/adm/roles'],
393: 'add_entries' => \%add_entries,
394: 'only_body' => 1,}));
395:
396: # ------------------------------------------------------------ Additional Texts
1.5 raeburn 397: $lt{'newto'} = &mt('New to the [_1]Mechanics Online[_2] site?','<i>','</i>');
398: $lt{'mech'} = &mt('Mechanics Online is a Newtonian Mechanics course developed by Professor David Pritchard and the RELATE education group at MIT. [_1]Learn more[_2]','<a href="http://relate.mit.edu/physicscourse" style="text-decoration: underline;">','</a>');
1.9 ! relate 399: $lt{'thco'} = &mt('The course opens on March 1st at 10:00am EST. If you sign up before then you will be automatically enrolled in the course.');
1.5 raeburn 400: $lt{'runson'} = &mt('Mechanics Online runs on [_1]LON-CAPA[_2] - an open source, freeware, distributed learning content management and assessment system.',
1.2 raeburn 401: '<a href="http://loncapa.org/" style="text-decoration: underline;">',
1.7 raeburn 402: '</a>');
1.5 raeburn 403: $lt{'newhere'} = &mt('New to [_1]Mechanics Online[_2]:','<i>','</i>');
1.1 raeburn 404: $lt{'browser'} = &mt('Your browser must allow [_1]cookies[_2]',
1.2 raeburn 405: '<a href="http://loncapa.msu.edu/cookies.html" style="color: #ffffff; text-decoration:underline;">','</a>');
406:
407: my ($contactrow,$domainrow,$serverrow,$loadrow,$userloadrow,$versionrow);
408: $contactrow = <<"END";
409: <tr>
1.6 raeburn 410: <td align="left" colspan="2">
1.2 raeburn 411: $contactblock
412: </td>
413: </tr>
414: END
415: $domainrow = <<"END";
416: <tr>
417: <td align="left" valign="top">
418: <small><b>$lt{'dom'}: </b></small>
419: </td>
420: <td align="left" valign="top">
421: <small><tt> $domain</tt></small>
422: </td>
423: </tr>
424: END
425: $serverrow = <<"END";
426: <tr>
427: <td align="left" valign="top">
428: <small><b>$lt{'serv'}: </b></small>
429: </td>
430: <td align="left" valign="top">
431: <small><tt> $lonhost ($role)</tt></small>
432: </td>
433: </tr>
434: END
435: if ($loadlim) {
436: $loadrow = <<"END";
437: <tr>
438: <td align="left" valign="top">
439: <small><b>$lt{'load'}: </b></small>
440: </td>
441: <td align="left" valign="top">
442: <small><tt> $loadpercent $lt{'perc'}</tt></small>
443: </td>
444: </tr>
445: END
446: }
447: if ($uloadlim) {
448: $userloadrow = <<"END";
449: <tr>
450: <td align="left" valign="top">
451: <small><b>$lt{'userload'}: </b></small>
452: </td>
453: <td align="left" valign="top">
454: <small><tt> $userloadpercent $lt{'perc'}</tt></small>
455: </td>
456: </tr>
457: END
458: }
459: if (($version ne '') && ($version ne '<!-- VERSION -->')) {
460: $versionrow = <<"END";
461: <tr>
462: <td colspan="2" align="left">
1.7 raeburn 463: <a href="/adm/about.html">
464: <img src="/images/login/lclogosm.gif" width="16" height="14" alt="LC" border="0" /> <small>$version</small></a>
1.2 raeburn 465: </td>
466: </tr>
467: END
468: }
1.1 raeburn 469:
470: # -------------------------------------------- Static cid for prerequisite test
1.8 relate 471: my $prereqcid = 'relate_3e100973b27484f2drelatel1';
1.1 raeburn 472:
473: # ---------------------------------------------------- Warning if no Javascript
1.4 raeburn 474: my $noscript_warning = '<noscript><br /><span class="LC_warning">'.
1.2 raeburn 475: '<b>'.$lt{'note'}.'</b>'.$lt{'jscr'}.
1.1 raeburn 476: '</span></noscript>';
477:
478: # ---------------------------------------------------- Serve out DES JavaScript
479: {
480: my $jsh=Apache::File->new($include."/londes.js");
481: $r->print(<$jsh>);
482: }
483: # ---------------------------------------------------------- Serve rest of page
484:
485: $r->print(<<"ENDLOGIN");
486: <br />
487: <div align="center">
488: <table class="LC_loginbox">
489: <tr>
1.6 raeburn 490: <td align="left" valign="top" width="11"><img src="/images/login/tlc_11_ffffff_e2e2e2.gif" width="10" height="10" border="0" alt="" /></td>
1.1 raeburn 491: <td width="450" valign="top">
492: <table class="LC_loginbox_left">
493: <tr>
1.4 raeburn 494: <td width="441" align="left"><br />
495: <img src="/images/login/LCrelateheader_sm.png" width="441" height="100" alt="Relate @ MIT" align="left" /></td>
1.1 raeburn 496: </tr>
497: <tr>
498: <td>
499: <div align="left" style="display:block; margin-top:5px; margin-bottom:5px; margin-left:0px; margin-right:0px; width:440px; height:5px;">
500: <div class="divider">
501: </div>
502: </div>
503: </td>
504: </tr>
505: </table>
506: <table class="LC_loginbox_left">
507: <tr>
508: <td width="10"> </td>
509: <td valign="top" class="bodyred" width="430" align="left"><br />
1.2 raeburn 510: <span style="font-size: 18px; line-height: 22px; ">$lt{'newto'}</span>
1.5 raeburn 511: <p class="bodyred">$lt{'mech'}</p>
1.9 ! relate 512: <p class="bodyred">$lt{'thco'}</p>
1.5 raeburn 513: <p class="bodyred">$lt{'runson'}</p>
1.1 raeburn 514: <br />
1.3 raeburn 515: <form name="signup" method="post" action="/adm/createaccount?courseid=$prereqcid"><input type="hidden" name="process" value="signup" />
1.1 raeburn 516: <table class="LC_signup">
517: <tr>
1.3 raeburn 518: <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>
1.1 raeburn 519: <td> </td>
1.3 raeburn 520: <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>
1.1 raeburn 521: </tr>
522: <tr>
523: <td> </td>
1.2 raeburn 524: <td align="center" valign="middle"><span style="white-space: nowrap;"><b>$lt{'newhere'}</b> <a href="javascript:send('newaccount')" style="color: #ffffff; text-decoration:underline;">$lt{'click'}</a></span></td>
1.1 raeburn 525: <td> </td>
526: </tr>
527: <tr>
1.3 raeburn 528: <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>
1.1 raeburn 529: <td> </td>
1.3 raeburn 530: <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>
1.1 raeburn 531: </tr>
532: </table>
533: </form>
534: </td>
535: </tr>
536: </table>
537: </td>
538: <td width="10"> </td>
539: <td valign="top">
1.3 raeburn 540: <form name="client" method="post" onsubmit="return(send());" action="">
1.1 raeburn 541: <table class="LC_loginbox_right">
542: <tr>
543: <td colspan="3" height="23" class="LC_loginbox_strip"> </td>
1.2 raeburn 544: </tr>
1.1 raeburn 545: <tr>
1.3 raeburn 546: <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>
1.1 raeburn 547: <td> </td>
1.3 raeburn 548: <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>
1.1 raeburn 549: </tr>
550: <tr>
551: <td width="10"> </td>
552: <td>
553: <table border="0" cellspacing="0" cellpadding="0">
554: <tr>
1.3 raeburn 555: <td align="right" class="bodywhite" height="50"><br />
1.1 raeburn 556: <span style="font-size: 15px; line-height: 17px; font-weight: bold;">
557: $lt{'exist'}</span>
558: <br />$lt{'plea'}<br />
1.3 raeburn 559: <hr class="login" /><br /><br />
1.1 raeburn 560: </td>
561: </tr>
562: <tr>
563: <td>
564: <table border="0" cellpadding="2" cellspacing="0">
565: <tr>
1.3 raeburn 566: <td align="right" class="bodywhite"><label>$lt{'un'}</label>:</td>
1.1 raeburn 567: <td align="right"><input type="text" name="uname" size="17" value="" /></td>
568: </tr>
569: <tr>
1.3 raeburn 570: <td align="right" class="bodywhite"><label>$lt{'pw'}</label>:</td>
1.5 raeburn 571: <td align="right"><input name="upass$now" size="17" value="" type="password" /><input type="hidden" name="udom" value="$domain" /></td>
1.1 raeburn 572: </tr>
573: <tr><td> </td></tr>
574: <tr>
575: <td colspan="2" align="right"><input name="signin" type="submit" value="$lt{'log'}" class="buttonwhite" /></td>
576: </tr>
577: </table>
578: </td>
579: </tr>
580: <tr>
581: <td align="right" valign="top" class="bodywhite">
582: <br />
583: <br />
584: <span style="font-size: smaller;">$lt{'browser'}</span><br />
585: <hr class="login" />
586: <br />
1.3 raeburn 587: <a href="/adm/resetpw" style="color: #ffffff; text-decoration:underline;">$lt{'forgotpw'}</a><br />
1.1 raeburn 588: <br />
589: </td>
590: </tr>
591: </table>
592: </td>
593: <td width="9"> </td>
594: </tr>
595: <tr>
1.3 raeburn 596: <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>
1.1 raeburn 597: <td> </td>
1.3 raeburn 598: <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>
1.1 raeburn 599: </tr>
600: </table>
1.3 raeburn 601: <input type="hidden" name="lextkey" value="$lextkey" />
602: <input type="hidden" name="uextkey" value="$uextkey" />
603: </form>
1.1 raeburn 604: </td>
1.3 raeburn 605: <td align="right" valign="top" width="11"><img src="/images/login/tr_11_ffffff_e2e2e2.gif" width="11" height="11" border="0" alt="" /></td>
1.1 raeburn 606: </tr>
607: <tr>
1.3 raeburn 608: <td width="10"> </td>
609: <td colspan="3">
1.2 raeburn 610: <br />
1.4 raeburn 611: $noscript_warning
1.2 raeburn 612: <hr style="clear:both;" />
613: </td>
1.3 raeburn 614: <td width="10"> </td>
1.2 raeburn 615: </tr>
616: <tr>
617: <td width="10"> </td>
1.3 raeburn 618: <td colspan="4">
1.2 raeburn 619: <div style="float: left;">
620: <table border="0" cellspacing="0" cellpadding="0">
621: $contactrow
622: $domainrow
623: $serverrow
624: $loadrow
625: $userloadrow
626: $versionrow
627: </table>
628: </div>
629: <div style="float: right;">
630: <img src="/images/login/sponsors.png" alt="$lt{'supp'}" align="right" />
631: <br style="clear:both;" />
632: </div>
1.1 raeburn 633: </td>
634: </tr>
635: <tr>
1.3 raeburn 636: <td align="left" valign="bottom" width="11"><img src="/images/login/bl_11_ffffff_e2e2e2.gif" width="11" height="11" border="0" alt="" /></td>
1.1 raeburn 637: <td colspan="3" width="698"> </td>
1.3 raeburn 638: <td align="right" valign="bottom" width="11"><img src="/images/login/br_11_ffffff_e2e2e2.gif" width="11" height="11" border="0" alt="" /></td>
1.1 raeburn 639: </tr>
640: </table>
641: </div>
642: <p> </p>
643: <form name="server" action="/adm/authenticate" method="post" target="_top">
644: <input type="hidden" name="logtoken" value="$logtoken" />
645: <input type="hidden" name="serverid" value="$lonhost" />
646: <input type="hidden" name="uname" value="" />
647: <input type="hidden" name="upass0" value="" />
648: <input type="hidden" name="upass1" value="" />
649: <input type="hidden" name="upass2" value="" />
650: <input type="hidden" name="udom" value="" />
651: <input type="hidden" name="localpath" value="$env{'form.localpath'}" />
652: <input type="hidden" name="localres" value="$env{'form.localres'}" />
653: </form>
654:
655: <script type="text/javascript">
656: // <![CDATA[
657: // the if prevents the script error if the browser can not handle this
658: if ( document.client.uname ) { document.client.uname.focus(); }
659: // ]]>
660: </script>
661:
662: ENDLOGIN
663:
664: # -------------------------------------------------------- Standard page ending
665: my %endargs = ( 'noredirectlink' => 1, );
666: $r->print(&Apache::loncommon::end_page(\%endargs));
667: return OK;
668: }
669:
670: sub check_loginvia {
671: my ($domain,$lonhost) = @_;
672: if ($domain eq '' || $lonhost eq '') {
673: return;
674: }
675: my %domconfhash = &Apache::loncommon::get_domainconf($domain);
676: my $loginvia = $domconfhash{$domain.'.login.loginvia_'.$lonhost};
677: my $loginvia_exempt = $domconfhash{$domain.'.login.loginvia_exempt_'.$lonhost};
678: my $output;
679: if ($loginvia ne '') {
680: my $noredirect;
681: my $ip = $ENV{'REMOTE_ADDR'};
682: if ($ip eq '127.0.0.1') {
683: $noredirect = 1;
684: } else {
685: if ($loginvia_exempt ne '') {
686: my @exempt = split(',',$loginvia_exempt);
687: if (grep(/^\Q$ip\E$/,@exempt)) {
688: $noredirect = 1;
689: }
690: }
691: }
692: unless ($noredirect) {
693: my ($newhost,$path);
694: if ($loginvia =~ /:/) {
695: ($newhost,$path) = split(':',$loginvia);
696: } else {
697: $newhost = $loginvia;
698: }
699: if ($newhost ne $lonhost) {
700: if (&Apache::lonnet::hostname($newhost) ne '') {
701: $output = &redirect_page($newhost,$path);
702: }
703: }
704: }
705: }
706: return $output;
707: }
708:
709: sub redirect_page {
710: my ($desthost,$path) = @_;
711: my $protocol = $Apache::lonnet::protocol{$desthost};
712: $protocol = 'http' if ($protocol ne 'https');
713: unless ($path =~ m{^/}) {
714: $path = '/'.$path;
715: }
716: my $url = $protocol.'://'.&Apache::lonnet::hostname($desthost).$path;
717: if ($env{'form.firsturl'} ne '') {
718: $url .='?firsturl='.$env{'form.firsturl'};
719: }
720: my $start_page = &Apache::loncommon::start_page('Switching Server ...',undef,
721: {'redirect' => [0,$url],});
722: my $end_page = &Apache::loncommon::end_page();
723: return $start_page.$end_page;
724: }
725:
726: sub contactdisplay {
727: my ($lt,$servadm,$showadminmail,$authdomain,$helpdeskscript) = @_;
728: return unless(ref($lt) eq 'HASH');
729: my $contactblock;
730: my $showhelpdesk = 0;
731: my $requestmail = $Apache::lonnet::perlvar{'lonSupportEMail'};
732: if ($requestmail =~ m/^[^\@]+\@[^\@]+$/) {
733: $showhelpdesk = 1;
734: }
735: if ($servadm && $showadminmail) {
736: $contactblock .= $lt->{'servadm'}.':<br />'.
737: '<tt>'.$servadm.'</tt><br />';
738: }
739: if ($showhelpdesk) {
1.2 raeburn 740: $contactblock .= '<a href="javascript:helpdesk()" style="text-decoration:underline;">'.$lt->{'helpdesk'}.'</a><br />';
1.1 raeburn 741: my $thisurl = &escape('/adm/login');
742: $$helpdeskscript = <<"ENDSCRIPT";
743: <script type="text/javascript">
744: // <![CDATA[
745: function helpdesk() {
746: var codedom = document.client.udom.value;
747: if (codedom == '') {
748: codedom = "$authdomain";
749: }
750: var querystr = "origurl=$thisurl&codedom="+codedom;
751: document.location.href = "/adm/helpdesk?"+querystr;
752: return;
753: }
754: // ]]>
755: </script>
756: ENDSCRIPT
757: }
758: return $contactblock;
759: }
760:
761: 1;
762: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>