![]() ![]() | ![]() |
Bug #1019. Allow limited HTML in templates.
1: # The LearningOnline Network 2: # Syllabus 3: # 4: # $Id: lonsyllabus.pm,v 1.11 2003/02/10 16:22:28 www Exp $ 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::lonsyllabus; 30: 31: use strict; 32: use Apache::Constants qw(:common); 33: use Apache::loncommon; 34: use Apache::lonnet; 35: use Apache::lontexconvert; 36: use Apache::lonfeedback; 37: 38: sub handler { 39: my $r = shift; 40: $r->content_type('text/html'); 41: $r->send_http_header; 42: return OK if $r->header_only; 43: 44: # ------------------------------------------------------------ Print the screen 45: $r->print(<<ENDDOCUMENT); 46: <html> 47: <head> 48: <title>The LearningOnline Network with CAPA</title> 49: </head> 50: ENDDOCUMENT 51: my (undef,undef,$cdom,$cnum)=split(/\//,$r->uri); 52: # Is this even a course? 53: my $homeserver=&Apache::lonnet::homeserver($cnum,$cdom); 54: if ($homeserver eq 'no_host') { 55: $r->print('<body>No syllabus available</body>'); 56: return OK; 57: } 58: # --------------------------------------------------------- The syllabus fields 59: my %syllabusfields=( 60: 'aaa_instructorinfo' => 'Instructor Information', 61: 'bbb_description' => 'Course Description', 62: 'ccc_prereq' => 'Prerequisites', 63: 'cdc_classhours' => 'Class Hours', 64: 'ddd_officehours' => 'Office Hours', 65: 'eee_helproom' => 'Helproom Hours', 66: 'efe_projectinfo' => 'Project Information', 67: 'fff_examinfo' => 'Exam Information', 68: 'fgf_deadlines' => 'Deadlines', 69: 'ggg_grading' => 'Grading Information', 70: 'hhh_readings' => 'Readings', 71: 'iii_coursepack' => 'Coursepack', 72: 'jjj_weblinks' => 'Web Links', 73: 'kkk_textbook' => 'Textbook', 74: 'lll_includeurl' => 'URLs To Include in Syllabus'); 75: 76: # --------------------------------------------------------------- Force Student 77: &Apache::loncommon::get_unprocessed_cgi 78: ($ENV{'QUERY_STRING'},['forcestudent']); 79: my $forcestudent=''; 80: if ($ENV{'form.forcestudent'}) { $forcestudent='student'; }; 81: 82: # ------------------------------------- There is such a course, get environment 83: my %courseenv=&Apache::lonnet::dump('environment',$cdom,$cnum); 84: $r->print(&Apache::loncommon::bodytag 85: ("Syllabus",$forcestudent,'','',$cdom)); 86: $r->print('<h1>'.$courseenv{'description'}.'</h1><h3>'. 87: $Apache::lonnet::domaindescription{$cdom}.'</h3>'); 88: my %syllabus=&Apache::lonnet::dump('syllabus',$cdom,$cnum); 89: my $allowed=0; 90: 91: # This handler might be called anonymously ... 92: # ----------------------------------------------------- Only if not public call 93: if ($ENV{'user.environment'}) { 94: # does this user have privileges to post, etc? 95: if ($ENV{'request.course.id'}) { 96: $allowed=&Apache::lonnet::allowed('srm',$ENV{'request.course.id'}); 97: if ($forcestudent) { $allowed=0; } 98: } 99: if ($allowed) { 100: $r->print('<p>This syllabus can be publically viewed at <tt>http://'. 101: $Apache::lonnet::hostname{$homeserver}.$r->uri.'</tt>'. 102: &Apache::loncommon::help_open_topic('Syllabus_ExtLink').'</p>'. 103: '<p><a href="'.$r->uri.'?forcestudent=1">Show Student View</a>'. 104: &Apache::loncommon::help_open_topic('Uploaded_Templates_PublicView'). 105: '</p>'); 106: } 107: if (($allowed) && ($ENV{'form.storesyl'})) { 108: foreach (keys %syllabusfields) { 109: my $field=$ENV{'form.'.$_}; 110: $field=~s/\s+$//s; 111: $field=&Apache::lonfeedback::clear_out_html($field,1); 112: $syllabus{$_}=$field; 113: if ($_ eq 'lll_includeurl') { # clean up included URLs 114: my $field=''; 115: foreach (split(/\n/,$syllabus{$_})) { 116: my $url=$_; 117: # get rid of leading and trailing spaces 118: $url=~s/^\s+//; 119: $url=~s/\s+$//; 120: if ($url=~/^http\:\/\/([^\/]+)\/(.+)$/) { 121: my $remainder=$2; 122: # remove the hostname from internal URLs 123: foreach (keys %Apache::lonnet::hostname) { 124: if ($1=~/$Apache::lonnet::hostname{$_}/i) { 125: $url=$remainder; 126: } 127: } 128: } 129: # norm internal URLs 130: unless ($url=~/^http\:/) { 131: $url=&Apache::lonnet::clutter($url); 132: } 133: # re-assemble field 134: if ($url) { 135: $field.=$url."\n"; 136: } 137: } 138: $syllabus{$_}=$field; 139: } 140: } 141: $syllabus{'uploaded.domain'}=$ENV{'user.domain'}; 142: $syllabus{'uploaded.name'}=$ENV{'user.name'}; 143: $syllabus{'uploaded.lastmodified'}=time; 144: &Apache::lonnet::put('syllabus',\%syllabus,$cdom,$cnum); 145: } 146: } 147: # ---------------------------------------------------------------- Get syllabus 148: if (($syllabus{'uploaded.lastmodified'}) || ($allowed)) { 149: my $lastmod=$syllabus{'uploaded.lastmodified'}; 150: $lastmod=($lastmod?localtime($lastmod):'never'); 151: 152: $r->print('<table><tr><td>Uploaded:</td><td>'. 153: &Apache::loncommon::aboutmewrapper( 154: &Apache::loncommon::plainname($syllabus{'uploaded.name'}, 155: $syllabus{'uploaded.domain'}),$syllabus{'uploaded.name'}, 156: $syllabus{'uploaded.domain'}). 157: '</td></tr><tr><td>Last updated:</td><td>'. 158: $lastmod. 159: '</td></tr></table><p>'); 160: if ($allowed) { 161: $r->print('<form method="post">'); 162: } 163: foreach (sort keys %syllabusfields) { 164: if (($syllabus{$_}) || ($allowed)) { 165: my $message=$syllabus{$_}; 166: if ($_ eq 'lll_includeurl') { # this is the "included" field 167: my $urls=$message; 168: $message=''; 169: foreach my $filelink (split(/\n/,$urls)) { 170: my $output=''; 171: # embed style? 172: my ($curfext)=($filelink=~/\.([^\.]+)$/); 173: my $embstyle=&Apache::loncommon::fileembstyle($curfext); 174: if ($embstyle eq 'ssi') { 175: # make ssi call and remove everything but the body contents 176: $output=&Apache::lonnet::ssi($filelink); 177: $output=~s/^.*\<body[^\>]*\>//si; 178: $output=~s/\<\/body\s*\>.*$//si; 179: } elsif ($embstyle eq 'img') { 180: # embed as an image 181: $output='<img src="'.$filelink.'" />'; 182: } 183: $message.='<p>'.$output.'</p>'; 184: } 185: if ($allowed) { 186: $r->print('<h3>'.$syllabusfields{$_}. 187: &Apache::loncommon::help_open_topic('Syllabus_URLs').'</h3>'. 188: '<p><a href="'.$r->uri.'?forcestudent=1">Show Student View</a>'. 189: &Apache::loncommon::help_open_topic('Uploaded_Templates_PublicView').'</p>'); 190: } else { 191: $r->print($message); 192: } 193: } else { 194: $message=~s/\n/\<br \/\>/g; 195: $message 196: =~s/(http\:\/\/[^\s]+)/\<a href=\"$1\"\>\<tt\>$1\<\/tt\>\<\/a\>/g; 197: $message=&Apache::lontexconvert::msgtexconverted($message); 198: $r->print('<h3>'.$syllabusfields{$_}.'</h3><blockquote>'. 199: $message.'</blockquote>'); 200: } 201: if ($allowed) { 202: $r->print('<br /><textarea cols="80" rows="6" name="'.$_.'">'. 203: $syllabus{$_}. 204: '</textarea><input type="submit" name="storesyl" value="Store" />'); 205: } 206: } 207: } 208: if ($allowed) { 209: $r->print('</form>'); 210: } 211: $r->print('</p>'); 212: } else { 213: $r->print('<p>No syllabus information provided.</p>'); 214: } 215: $r->print('</body></html>'); 216: return OK; 217: } 218: 219: 1; 220: __END__