--- loncom/interface/loncommon.pm 2011/11/08 02:27:47 1.948.2.33 +++ loncom/interface/loncommon.pm 2010/03/10 21:25:49 1.949 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.948.2.33 2011/11/08 02:27:47 raeburn Exp $ +# $Id: loncommon.pm,v 1.949 2010/03/10 21:25:49 droeschl Exp $ # # Copyright Michigan State University Board of Trustees # @@ -409,7 +409,7 @@ sub studentbrowser_javascript { - -ENDJS - -} - sub userbrowser_javascript { my $id_functions = &javascript_index_functions(); return <<"ENDUSERBRW"; @@ -815,9 +766,6 @@ sub selectcourse_link { } elsif ($selecttype eq 'Course/Community') { $linktext = &mt('Select Course/Community'); $type = ''; - } elsif ($selecttype eq 'Select') { - $linktext = &mt('Select'); - $type = ''; } return '' ."' .''.&mt('Help: [_1]',$topic).''; - if ($text ne "") { + if ($text ne "") { $template.=''; } return $template; @@ -1257,12 +1202,7 @@ ENDOUTPUT sub help_open_menu { my ($topic,$component_help,$faq,$bug,$stayOnPage,$width,$height,$text) = @_; - $stayOnPage = 0 if (not defined $stayOnPage); - # only use pop-up help (stayOnPage == 0) - # if environment.remote is on (using remote control UI) - if ($env{'environment.remote'} eq 'off' ) { - $stayOnPage=1; - } + $stayOnPage = 1; my $output; if ($component_help) { if (!$text) { @@ -1283,8 +1223,8 @@ sub help_open_menu { sub top_nav_help { my ($text) = @_; $text = &mt($text); - my $stay_on_page = - ($env{'environment.remote'} eq 'off' ); + my $stay_on_page = 1; + my $link = ($stay_on_page) ? "javascript:helpMenu('display')" : "javascript:helpMenu('open')"; my $banner_link = &update_help_link(undef,undef,undef,undef,$stay_on_page); @@ -1299,10 +1239,7 @@ END sub help_menu_js { my ($text) = @_; - - my $stayOnPage = - ($env{'environment.remote'} eq 'off' ); - + my $stayOnPage = 1; my $width = 620; my $height = 600; my $helptopic=&general_help(); @@ -1359,10 +1296,7 @@ sub help_open_bug { unless ($env{'user.adv'}) { return ''; } unless ($Apache::lonnet::perlvar{'BugzillaHost'}) { return ''; } $text = "" if (not defined $text); - $stayOnPage = 0 if (not defined $stayOnPage); - if ($env{'environment.remote'} eq 'off' ) { $stayOnPage=1; - } $width = 600 if (not defined $width); $height = 600 if (not defined $height); @@ -1403,10 +1337,7 @@ sub help_open_faq { unless ($env{'user.adv'}) { return ''; } unless ($Apache::lonnet::perlvar{'FAQHost'}) { return ''; } $text = "" if (not defined $text); - $stayOnPage = 0 if (not defined $stayOnPage); - if ($env{'environment.remote'} eq 'off' ) { $stayOnPage=1; - } $width = 350 if (not defined $width); $height = 400 if (not defined $height); @@ -1855,7 +1786,7 @@ sub domain_select { return &multiple_select_form($name,$value,4,\%domains); } else { $domains{'select_form_order'} = [sort {lc($a) cmp lc($b) } (keys(%domains))]; - return &select_form($name,$value,\%domains); + return &select_form($name,$value,%domains); } } @@ -1917,36 +1848,29 @@ sub multiple_select_form { =pod -=item * &select_form($defdom,$name,$hashref,$onchange) +=item * &select_form($defdom,$name,%hash) Returns a string containing a \n"; + my ($def,$name,%hash) = @_; + my $selectform = ""; return $selectform; @@ -1964,9 +1888,9 @@ sub display_filter { &mt('Filter [_1]', &select_form($env{'form.displayfilter'}, 'displayfilter', - {'currentfolder' => 'Current folder/page', + ('currentfolder' => 'Current folder/page', 'containing' => 'Containing phrase', - 'none' => 'None'})). + 'none' => 'None'))). ''; } @@ -2336,16 +2260,12 @@ function changed_text(choice,currentform } function set_auth_radio_buttons(newvalue,currentform) { - var numauthchoices = currentform.login.length; - if (typeof numauthchoices == "undefined") { - return; - } var i=0; - while (i < numauthchoices) { + while (i < currentform.login.length) { if (currentform.login[i].value == newvalue) { break; } i++; } - if (i == numauthchoices) { + if (i == currentform.login.length) { return; } current.radiovalue = newvalue; @@ -3312,7 +3232,8 @@ sub filemimetype { sub filecategoryselect { my ($name,$value)=@_; return &select_form($value,$name, - {'' => &mt('Any category'), map { $_,$_ } sort(keys(%category_extensions))}); + '' => &mt('Any category'), + map { $_,$_ } sort(keys(%category_extensions))); } =pod @@ -3477,21 +3398,17 @@ sub get_previous_attempt { } $prevattempts=&start_data_table().&start_data_table_header_row(); $prevattempts.=''.&mt('History').''; - my (%typeparts,%lasthidden); + my %typeparts; my $showsurv=&Apache::lonnet::allowed('vas',$env{'request.course.id'}); foreach my $key (sort(keys(%lasthash))) { my ($ign,@parts) = split(/\./,$key); if ($#parts > 0) { my $data=$parts[-1]; - next if ($data eq 'foilorder'); pop(@parts); if ($data eq 'type') { unless ($showsurv) { my $id = join(',',@parts); $typeparts{$ign.'.'.$id} = $lasthash{$key}; - if (($lasthash{$key} eq 'anonsurvey') || ($lasthash{$key} eq 'anonsurveycred')) { - $lasthidden{$ign.'.'.$id} = 1; - } } delete($lasthash{$key}); } else { @@ -3506,6 +3423,7 @@ sub get_previous_attempt { } } $prevattempts.=&end_data_table_header_row(); + my %lasthidden; if ($getattempt eq '') { for ($version=1;$version<=$returnhash{'version'};$version++) { my @hidden; @@ -3513,6 +3431,11 @@ sub get_previous_attempt { foreach my $id (keys(%typeparts)) { if (($returnhash{$version.':'.$id.'.type'} eq 'anonsurvey') || ($returnhash{$version.':'.$id.'.type'} eq 'anonsurveycred')) { push(@hidden,$id); + $lasthidden{$id} = 1; + } elsif ($lasthidden{$id}) { + if (exists($returnhash{$version.':'.$id.'.award'})) { + delete($lasthidden{$id}); + } } } } @@ -3520,7 +3443,6 @@ sub get_previous_attempt { ''.&mt('Transaction [_1]',$version).''; if (@hidden) { foreach my $key (sort(keys(%lasthash))) { - next if ($key =~ /\.foilorder$/); my $hide; foreach my $id (@hidden) { if ($key =~ /^\Q$id\E/) { @@ -3549,7 +3471,6 @@ sub get_previous_attempt { } } else { foreach my $key (sort(keys(%lasthash))) { - next if ($key =~ /\.foilorder$/); my $value = &format_previous_attempt_value($key, $returnhash{$version.':'.$key}); $prevattempts.=''.$value.' '; @@ -3561,7 +3482,6 @@ sub get_previous_attempt { my @currhidden = keys(%lasthidden); $prevattempts.=&start_data_table_row().''.&mt('Current').''; foreach my $key (sort(keys(%lasthash))) { - next if ($key =~ /\.foilorder$/); if (%typeparts) { my $hidden; foreach my $id (@currhidden) { @@ -3617,29 +3537,6 @@ sub format_previous_attempt_value { $value = &Apache::lonlocal::locallocaltime($value); } elsif (ref($value) eq 'ARRAY') { $value = '('.join(', ', @{ $value }).')'; - } elsif ($key =~ /answerstring$/) { - my %answers = &Apache::lonnet::str2hash($value); - my @anskeys = sort(keys(%answers)); - if (@anskeys == 1) { - my $answer = $answers{$anskeys[0]}; - if ($answer =~ m{\0}) { - $answer =~ s{\0}{,}g; - } - my $tag_internal_answer_name = 'INTERNAL'; - if ($anskeys[0] eq $tag_internal_answer_name) { - $value = $answer; - } else { - $value = $anskeys[0].'='.$answer; - } - } else { - foreach my $ans (@anskeys) { - my $answer = $answers{$ans}; - if ($answer =~ m{\0}) { - $answer =~ s{\0}{,}g; - } - $value .= $ans.'='.$answer.'
';; - } - } } else { $value = &unescape($value); } @@ -3790,13 +3687,10 @@ sub submlink { } if (!$symb) { $symb=&Apache::lonnet::symbread(); } $symb=&escape($symb); - if ($target) { $target=" target=\"$target\""; } - return - ''.$text.''; + if ($target) { $target="target=\"$target\""; } + return ''.$text.''; } ############################################## @@ -3918,9 +3812,7 @@ sub findallcourses { $udom = $env{'user.domain'}; } if (($uname ne $env{'user.name'}) || ($udom ne $env{'user.domain'})) { - my $extra = &Apache::lonnet::freeze_escape({'skipcheck' => 1}); - my %roleshash = &Apache::lonnet::dump('roles',$udom,$uname,'.',undef, - $extra); + my %roleshash = &Apache::lonnet::dump('roles',$udom,$uname); if (!%roles) { %roles = ( cc => 1, @@ -4334,7 +4226,8 @@ sub get_domainconf { if (ref($domconfig{'login'}{$key}) eq 'HASH') { if ($key eq 'loginvia') { if (ref($domconfig{'login'}{'loginvia'}) eq 'HASH') { - foreach my $hostname (keys(%{$domconfig{'login'}{'loginvia'}})) { + my @ids = &Apache::lonnet::current_machine_ids(); + foreach my $hostname (@ids) { if (ref($domconfig{'login'}{'loginvia'}{$hostname}) eq 'HASH') { if ($domconfig{'login'}{'loginvia'}{$hostname}{'server'}) { my $server = $domconfig{'login'}{'loginvia'}{$hostname}{'server'}; @@ -4343,7 +4236,7 @@ sub get_domainconf { $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'custompath'}; } else { - $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'}; + $designhash{$udom.'.login.loginvia_'.$hostname} = $server.':'.$domconfig{'login'}{'loginvia'}{$hostname}{'serverpath'}; } if ($domconfig{'login'}{'loginvia'}{$hostname}{'exempt'}) { $designhash{$udom.'.login.loginvia_exempt_'.$hostname} = $domconfig{'login'}{'loginvia'}{$hostname}{'exempt'}; @@ -4484,10 +4377,7 @@ sub designparm { return $env{'environment.color.'.$which}; } $domain=&determinedomain($domain); - my %domdesign; - unless ($domain eq 'public') { - %domdesign = &get_domainconf($domain); - } + my %domdesign = &get_domainconf($domain); my $output; if ($domdesign{$domain.'.'.$which} ne '') { $output = $domdesign{$domain.'.'.$which}; @@ -4550,7 +4440,7 @@ Returns: HTML div with $content sub head_subbox { my ($content)=@_; my $output = - '
' + '
' .$content .'
' } @@ -4560,9 +4450,7 @@ sub head_subbox { =item * &CSTR_pageheader() -Input: (optional) filename from which breadcrumb trail is built. - In most cases no input is needed, as $env{'request.filename'} - is appropriate for use in building the breadcrumb trail. +Inputs: ./. Returns: HTML div with CSTR path and recent box To be included on Construction Space pages @@ -4570,16 +4458,10 @@ Returns: HTML div with CSTR path and rec =cut sub CSTR_pageheader { - my ($trailfile) = @_; - if ($trailfile eq '') { - $trailfile = $env{'request.filename'}; - } - -# this is for resources; directories have customtitle, and crumbs -# and select recent are created in lonpubdir.pm - + # this is for resources; directories have customtitle, and crumbs + # and select recent are created in lonpubdir.pm my ($uname,$thisdisfn)= - ($trailfile =~ m|^/home/([^/]+)/public_html/(.*)|); + ($env{'request.filename'} =~ m|^/home/([^/]+)/public_html/(.*)|); my $formaction='/priv/'.$uname.'/'.$thisdisfn; $formaction=~s/\/+/\//g; @@ -4654,9 +4536,9 @@ Inputs: =item * $bgcolor, used to override the bgcolor on a webpage to a specific value -=item * $no_inline_link, if true and in remote mode, don't show the - 'Switch To Inline Menu' link - +#RC =item * $no_inline_link, if true and in remote mode, don't show the +#RC 'Switch To Inline Menu' link +#RC =item * $args, optional argument valid values are no_auto_mt_title -> prevents &mt()ing the title arg inherit_jsmath -> when creating popup window in a page, @@ -4676,11 +4558,6 @@ sub bodytag { my ($title,$function,$addentries,$bodyonly,$domain,$forcereg, $no_nav_bar,$bgcolor,$no_inline_link,$args)=@_; - my $public; - if ((($env{'user.name'} eq 'public') && ($env{'user.domain'} eq 'public')) - || ($env{'user.name'} eq '') && ($env{'user.domain'} eq '')) { - $public = 1; - } if (!$args->{'no_auto_mt_title'}) { $title = &mt($title); } $function = &get_users_function() if (!$function); @@ -4730,12 +4607,12 @@ sub bodytag { } my $name = &plainname($env{'user.name'},$env{'user.domain'}); - if ($public) { + if ($env{'user.name'} eq 'public' && $env{'user.domain'} eq 'public') { undef($role); } else { $name = &aboutmewrapper($name,$env{'user.name'},$env{'user.domain'}); } - + my $titleinfo = '

'.$title.'

'; # # Extra info if you are the DC @@ -4751,11 +4628,10 @@ sub bodytag { $role = '('.$role.')' if $role; &get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']); - if ($env{'environment.remote'} ne 'on') { # No Remote if ($no_nav_bar || $env{'form.inhibitmenu'} eq 'yes') { - return $bodytag; - } + return $bodytag; + } if ($env{'request.state'} eq 'construct') { $forcereg=1; } @@ -4773,10 +4649,6 @@ sub bodytag { $realm $dc_info
|; return $bodytag; } - if (($env{'request.noversionuri'} =~ m{^/adm/navmaps}) && - ($env{'environment.remotenavmap'} eq 'on')) { - return $bodytag; - } unless ($env{'request.symb'} =~ m/\.page___\d+___/) { $bodytag .= qq|
$name $role
|; @@ -4793,7 +4665,7 @@ sub bodytag { $bodytag .= qq|
$realm $dc_info
|; #don't show menus for public users - if (!$public){ + if($env{'user.name'} ne 'public' && $env{'user.domain'} ne 'public'){ $bodytag .= Apache::lonmenu::secondary_menu(); $bodytag .= Apache::lonmenu::serverform(); $bodytag .= Apache::lonhtmlcommon::scripttag('', 'end'); @@ -4811,48 +4683,11 @@ sub bodytag { } return $bodytag; - } - -# -# Top frame rendering, Remote is up -# - - my $imgsrc = $img; - if ($img =~ /^\/adm/) { - $imgsrc = &lonhttpdurl($img); - } - my $upperleft=''.$function.''; - - # Explicit link to get inline menu - my $menu= ($no_inline_link?'' - :''.&mt('Switch to Inline Menu Mode').''); - - if ($dc_info) { - $dc_info = qq|($dc_info)|; - } - - unless ($env{'form.inhibitmenu'}) { - $bodytag .= qq|
$name $role
-
    -
  1. $menu
  2. -
$realm $dc_info
|; - } - - return(< -$upperleft - $messages  - -$titleinfo $dc_info $menu - - -ENDBODY } sub dc_courseid_toggle { my ($dc_info) = @_; - return ' '. + return ' '. ''. &mt('(More ...)').''. '
'.$dc_info.'
'; @@ -4968,6 +4803,10 @@ sub standard_css { my $vlink = &designparm($function.'.vlink', $domain); my $link = &designparm($function.'.link', $domain); + my $loginbg = &designparm('login.sidebg',$domain); + my $bgcol = &designparm('login.bgcol',$domain); + my $textcol = &designparm('login.textcol',$domain); + my $sans = 'Verdana,Arial,Helvetica,sans-serif'; my $mono = 'monospace'; my $data_table_head = $sidebg; @@ -4986,12 +4825,12 @@ sub standard_css { my $table_header = '#DDDDDD'; my $feedback_link_bg = '#BBBBBB'; my $lg_border_color = '#C8C8C8'; - my $button_hover = '#BF2317'; my $border = ($env{'browser.type'} eq 'explorer' || $env{'browser.type'} eq 'safari' ) ? '0 2px 0 2px' : '0 3px 0 4px'; + return < legend { #LC_nav_bar { float: left; - background-color: $pgbg_or_bgcolor; - margin: 0 0 2px 0; + margin: 0; } #LC_realm { @@ -6224,7 +6040,6 @@ fieldset > legend { padding: 0; font-weight: bold; text-align: center; - background-color: $pgbg_or_bgcolor; } #LC_nav_bar em { @@ -6232,20 +6047,9 @@ fieldset > legend { font-style: normal; } -/* Preliminary fix to hide nav_bar inside bookmarks window */ -#LC_bookmarks #LC_nav_bar { - display:none; -} - ol.LC_primary_menu { float: right; margin: 0; - background-color: $pgbg_or_bgcolor; -} - -ol.LC_primary_menu a.LC_new_message { - font-weight:bold; - color: darkred; } ol#LC_PathBreadcrumbs { @@ -6268,28 +6072,9 @@ ol.LC_primary_menu a { text-decoration: none; } -ol.LC_docs_parameters { - margin-left: 0; - padding: 0; - list-style: none; -} - -ol.LC_docs_parameters li { - margin: 0; - padding-right: 20px; - display: inline; -} - -ol.LC_docs_parameters li:before { - content: "\\002022 \\0020"; -} - -li.LC_docs_parameters_title { - font-weight: bold; -} - -ol.LC_docs_parameters li.LC_docs_parameters_title:before { - content: ""; +ol.LC_primary_menu a.LC_new_message { + font-weight:bold; + color: darkred; } ul#LC_secondary_menu { @@ -6300,7 +6085,6 @@ ul#LC_secondary_menu { padding: 0; margin: 0; width: 100%; - text-align: left; } ul#LC_secondary_menu li { @@ -6332,15 +6116,14 @@ ul#LC_secondary_menu li a { } ul.LC_TabContent { - min-height:20px; + min-height:1.5em; } ul.LC_TabContent li { vertical-align:middle; - padding: 0 16px 0 10px; + padding: 0 10px 0 10px; background-color:$tabbg; border-bottom:solid 1px $lg_border_color; - border-right: solid 1px $font; } ul.LC_TabContent .right { @@ -6353,33 +6136,16 @@ ul.LC_TabContent li { text-decoration:none; font-size:95%; font-weight:bold; - min-height:20px; -} - -ul.LC_TabContent li a:hover, -ul.LC_TabContent li a:focus { - color: $button_hover; - background:none; - outline:none; -} - -ul.LC_TabContent li:hover { - color: $button_hover; - cursor:pointer; + padding-right: 16px; } +ul.LC_TabContent li:hover, ul.LC_TabContent li.active { - color: $font; background:#FFFFFF url(/adm/lonIcons/open.gif) no-repeat scroll right center; - border-bottom:solid 1px #FFFFFF; - cursor: default; + border-bottom:solid 2px #FFFFFF; + padding-right: 16px; } -ul.LC_TabContent li.active a { - color:$font; - background:#FFFFFF; - outline: none; -} #maincoursedoc { clear:both; } @@ -6398,10 +6164,6 @@ ul.LC_TabContentBigger li { color: #737373; } -ul.LC_TabContentBigger li.active { - position: relative; - top: 1px; -} ul.LC_TabContentBigger li a { background:url('/adm/lonIcons/tabbgleft.gif') left bottom no-repeat; @@ -6410,33 +6172,31 @@ ul.LC_TabContentBigger li a { text-align: center; display: block; text-decoration: none; - outline: none; } +ul.LC_TabContentBigger li:hover a, ul.LC_TabContentBigger li.active a { background:url('/adm/lonIcons/tabbgleft.gif') left top no-repeat; color:$font; + text-decoration: underline; } + ul.LC_TabContentBigger li b { background: url('/adm/lonIcons/tabbgright.gif') no-repeat right bottom; display: block; float: left; padding: 0 30px; - border-bottom: 1px solid $lg_border_color; -} - -ul.LC_TabContentBigger li:hover b { - color:$button_hover; } +ul.LC_TabContentBigger li:hover b, ul.LC_TabContentBigger li.active b { background:url('/adm/lonIcons/tabbgright.gif') right top no-repeat; color:$font; - border: 0; - cursor:default; + border-bottom: 1px solid #FFFFFF; } + ul.LC_CourseBreadcrumbs { background: $sidebg; line-height: 32px; @@ -6466,14 +6226,6 @@ ul.LC_CourseBreadcrumbs li a { font-size:90%; } -ol#LC_MenuBreadcrumbs h1 { - display: inline; - font-size: 90%; - line-height: 2.5em; - margin: 0; - padding: 0; -} - ol#LC_PathBreadcrumbs li a { text-decoration:none; font-size:100%; @@ -6570,6 +6322,52 @@ div.LC_columnSection>* { overflow:hidden; } +.LC_loginpage_container { + text-align:left; + margin : 0 auto; + width:90%; + padding: 10px; + height: auto; + background-color:#FFFFFF; + border:1px solid #CCCCCC; +} + + +.LC_loginpage_loginContainer { + float:left; + width: 182px; + padding: 2px; + border:1px solid #CCCCCC; + background-color:$loginbg; +} + +.LC_loginpage_loginContainer h2 { + margin-top: 0; + display:block; + background:$bgcol; + color:$textcol; + padding-left:5px; +} + +.LC_loginpage_loginInfo { + float:left; + width:182px; + border:1px solid #CCCCCC; + padding:2px; +} + +.LC_loginpage_space { + clear: both; + margin-bottom: 20px; + border-bottom: 1px solid #CCCCCC; +} + +.LC_loginpage_floatLeft { + float: left; + width: 200px; + margin: 0; +} + table em { font-weight: bold; font-style: normal; @@ -6816,6 +6614,10 @@ Inputs: none sub xml_begin { my $output=''; + if ($env{'internal.start_page'}==1) { + &Apache::lonhtmlcommon::init_htmlareafields(); + } + if ($env{'browser.mathml'}) { $output='' #.''."\n" @@ -6908,14 +6710,14 @@ $args - additional optional args support skip_phases -> hash ref of head -> skip the generation body -> skip all generation - no_inline_link -> if true and in remote mode, don't show the - 'Switch To Inline Menu' link +#RC no_inline_link -> if true and in remote mode, don't show the +#RC 'Switch To Inline Menu' link no_auto_mt_title -> prevent &mt()ing the title arg inherit_jsmath -> when creating popup window in a page, should it have jsmath forced on by the current page bread_crumbs -> Array containing breadcrumbs - bread_crumbs_component -> if exists show it as headline else show only the breadcrumbs + bread_crumbs_components -> if exists show it as headline else show only the breadcrumbs =back @@ -6975,7 +6777,8 @@ sub start_page { return $result if $args->{'only_body'}; #Breadcrumbs for Construction Space provided by &bodytag. - if (($env{'environment.remote'} eq 'off') && ($env{'request.state'} eq 'construct')) { + if ( + $env{'request.state'} eq 'construct') { return $result; } @@ -7110,26 +6913,15 @@ sub simple_error_page { { my @row_count; - - sub start_data_table_count { - unshift(@row_count, 0); - return; - } - - sub end_data_table_count { - shift(@row_count); - return; - } - sub start_data_table { my ($add_class) = @_; my $css_class = (join(' ','LC_data_table',$add_class)); - &start_data_table_count(); + unshift(@row_count,0); return ''."\n"; } sub end_data_table { - &end_data_table_count(); + shift(@row_count); return '
'."\n";; } @@ -7144,7 +6936,7 @@ sub simple_error_page { sub continue_data_table_row { my ($add_class) = @_; my $css_class = ($row_count[0] % 2)?'LC_odd_row':'LC_even_row'; - $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq ''); + $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq '');; return ''."\n";; } @@ -7308,8 +7100,7 @@ role status: active, previous or future. sub check_user_status { my ($udom,$uname,$cdom,$crs,$role,$sec) = @_; - my $extra = &Apache::lonnet::freeze_escape({'skipcheck' => 1}); - my %userinfo = &Apache::lonnet::dump('roles',$udom,$uname,'.',undef,$extra); + my %userinfo = &Apache::lonnet::dump('roles',$udom,$uname); my @uroles = keys %userinfo; my $srchstr; my $active_chk = 'none'; @@ -7892,7 +7683,7 @@ sub get_secgrprole_info { } sub user_picker { - my ($dom,$srch,$forcenewuser,$caller,$cancreate,$usertype,$context) = @_; + my ($dom,$srch,$forcenewuser,$caller,$cancreate,$usertype) = @_; my $currdom = $dom; my %curr_selected = ( srchin => 'dom', @@ -7983,15 +7774,10 @@ sub user_picker { $srchtypesel .= "\n \n"; my ($newuserscript,$new_user_create); - my $context_dom = $env{'request.role.domain'}; - if ($context eq 'requestcrs') { - if ($env{'form.coursedom'} ne '') { - $context_dom = $env{'form.coursedom'}; - } - } + if ($forcenewuser) { if (ref($srch) eq 'HASH') { - if ($srch->{'srchby'} eq 'uname' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchin'} eq 'dom' && $srch->{'srchdomain'} eq $context_dom) { + if ($srch->{'srchby'} eq 'uname' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchin'} eq 'dom' && $srch->{'srchdomain'} eq $env{'request.role.domain'}) { if ($cancreate) { $new_user_create = '

&"').'" onclick="javascript:setSearch(\'1\','.$caller.');" />

'; } else { @@ -8030,7 +7816,7 @@ function setSearch(createnew,callingForm } } for (var i=0; i'; + $upload_output .= $state; + $upload_output .= 'Upload embedded files:
'.&start_data_table(); + my $num = 0; - my $numremref = 0; - my $numinvalid = 0; - my $numpathchg = 0; - my $numexisting = 0; - my ($output,$upload_output,$toplevel,$url,$udom,$uname,$getpropath); - if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { - my $current_path='/'; - if ($env{'form.currentpath'}) { - $current_path = $env{'form.currentpath'}; - } - if ($actionurl eq '/adm/coursegrp_portfolio') { - $udom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - $uname = $env{'course.'.$env{'request.course.id'}.'.num'}; - $url = '/userfiles/groups/'.$env{'form.group'}.'/portfolio'; - } else { - $udom = $env{'user.domain'}; - $uname = $env{'user.name'}; - $url = '/userfiles/portfolio'; - } - $toplevel = $url.'/'; - $url .= $current_path; - $getpropath = 1; - } elsif (($actionurl eq '/adm/upload') || ($actionurl eq '/adm/testbank') || - ($actionurl eq '/adm/imsimport')) { - ($uname,my $rest) = ($args->{'current_path'} =~ m{/priv/($match_username)/?(.*)$}); - $url = '/home/'.$uname.'/public_html/'; - $toplevel = $url; - if ($rest ne '') { - $url .= $rest; - } - } elsif ($actionurl eq '/adm/coursedocs') { - if (ref($args) eq 'HASH') { - $url = $args->{'docs_url'}; - $toplevel = $url; - } - } - my $now = time(); - foreach my $embed_file (keys(%{$allfiles})) { - my $absolutepath; - if ($embed_file =~ m{^\w+://}) { - $newfiles{$embed_file} = 1; - $mapping{$embed_file} = $embed_file; - } else { - if ($embed_file =~ m{^/}) { - $absolutepath = $embed_file; - $embed_file =~ s{^(/+)}{}; - } - if ($embed_file =~ m{/}) { - my ($path,$fname) = ($embed_file =~ m{^(.+)/([^/]*)$}); - $path = &check_for_traversal($path,$url,$toplevel); - my $item = $fname; - if ($path ne '') { - $item = $path.'/'.$fname; - $subdependencies{$path}{$fname} = 1; - } else { - $dependencies{$item} = 1; - } - if ($absolutepath) { - $mapping{$item} = $absolutepath; - } else { - $mapping{$item} = $embed_file; - } - } else { - $dependencies{$embed_file} = 1; - if ($absolutepath) { - $mapping{$embed_file} = $absolutepath; - } else { - $mapping{$embed_file} = $embed_file; - } - } - } - } - foreach my $path (keys(%subdependencies)) { - my %currsubfile; - if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { - my @subdir_list = &Apache::lonnet::dirlist($url.$path,$udom,$uname,$getpropath); - foreach my $line (@subdir_list) { - my ($file_name,$rest) = split(/\&/,$line,2); - $currsubfile{$file_name} = 1; - } - } elsif (($actionurl eq '/adm/upload') || ($actionurl eq '/adm/testbank')) { - if (opendir(my $dir,$url.'/'.$path)) { - my @subdir_list = grep(!/^\./,readdir($dir)); - map {$currsubfile{$_} = 1;} @subdir_list; - } - } - foreach my $file (keys(%{$subdependencies{$path}})) { - if ($currsubfile{$file}) { - my $item = $path.'/'.$file; - unless ($mapping{$item} eq $item) { - $pathchanges{$item} = 1; - } - $existing{$item} = 1; - $numexisting ++; - } else { - $newfiles{$path.'/'.$file} = 1; - } - } - } - my %currfile; - if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { - my @dir_list = &Apache::lonnet::dirlist($url,$udom,$uname,$getpropath); - foreach my $line (@dir_list) { - my ($file_name,$rest) = split(/\&/,$line,2); - $currfile{$file_name} = 1; - } - } elsif (($actionurl eq '/adm/upload') || ($actionurl eq '/adm/testbank')) { - if (opendir(my $dir,$url)) { - my @dir_list = grep(!/^\./,readdir($dir)); - map {$currfile{$_} = 1;} @dir_list; - } - } - foreach my $file (keys(%dependencies)) { - if ($currfile{$file}) { - unless ($mapping{$file} eq $file) { - $pathchanges{$file} = 1; - } - $existing{$file} = 1; - $numexisting ++; - } else { - $newfiles{$file} = 1; - } - } - foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%newfiles)) { + foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%{$allfiles})) { $upload_output .= &start_data_table_row(). - ''.$embed_file.''; - unless ($mapping{$embed_file} eq $embed_file) { - $upload_output .= '
'.&mt('changed from: [_1]',$mapping{$embed_file}).''; - } - $upload_output .= ''; + ''.$embed_file.''; if ($args->{'ignore_remote_references'} && $embed_file =~ m{^\w+://}) { $upload_output.=''.&mt("URL points to other server.").''; - $numremref++; } elsif ($args->{'error_on_invalid_names'} && $embed_file ne &Apache::lonnet::clean_filename($embed_file,{'keep_path' => 1,})) { - $upload_output.=''.&mt('Invalid characters').''; - $numinvalid++; + $upload_output.=''.&mt("Invalid characters").''; + } else { - $upload_output .= &embedded_file_element('upload_embedded',$num, - $embed_file,\%mapping, - $allfiles,$codebase); - $num++; - } - $upload_output .= ''.&Apache::loncommon::end_data_table_row()."\n"; - } - foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%existing)) { - $upload_output .= &start_data_table_row(). - ''.$embed_file.''. - ''.&mt('Already exists').''. - &Apache::loncommon::end_data_table_row()."\n"; - } - if ($upload_output) { - $upload_output = &start_data_table(). - $upload_output. - &end_data_table()."\n"; - } - my $applies = 0; - if ($numremref) { - $applies ++; - } - if ($numinvalid) { - $applies ++; - } - if ($numexisting) { - $applies ++; - } - if ($num) { - $output = '
'."\n". - $state. - '

'.&mt('Upload embedded files'). - ':

'.$upload_output.'
'."\n". - ''."\n"; - if ($actionurl eq '') { - $output .= ''; - } - } elsif ($applies) { - $output = ''.&mt('Referenced files').':
'; - if ($applies > 1) { - $output .= - &mt('No files need to be uploaded, as one of the following applies to each reference:').'
    '; - if ($numremref) { - $output .= '
  • '.&mt('reference is to a URL which points to another server').'
  • '."\n"; - } - if ($numinvalid) { - $output .= '
  • '.&mt('reference is to file with a name containing invalid characters').'
  • '."\n"; - } - if ($numexisting) { - $output .= '
  • '.&mt('reference is to an existing file at the specified location').'
  • '."\n"; - } - $output .= '

'; - } elsif ($numremref) { - $output .= '

'.&mt('None to upload, as all references are to URLs pointing to another server.').'

'; - } elsif ($numinvalid) { - $output .= '

'.&mt('None to upload, as all references are to files with names containing invalid characters.').'

'; - } elsif ($numexisting) { - $output .= '

'.&mt('None to upload, as all references are to existing files.').'

'; - } - $output .= $upload_output.'
'; - } - my ($pathchange_output,$chgcount); - $chgcount = $num; - if (keys(%pathchanges) > 0) { - foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%pathchanges)) { - if ($num) { - $output .= &embedded_file_element('pathchange',$chgcount, - $embed_file,\%mapping, - $allfiles,$codebase); - } else { - $pathchange_output .= - &start_data_table_row(). - ''. - ''.$mapping{$embed_file}.''. - ''.$embed_file. - &embedded_file_element('pathchange',$numpathchg,$embed_file, - \%mapping,$allfiles,$codebase). - ''.&end_data_table_row(); - } - $numpathchg ++; - $chgcount ++; - } - } - if ($num) { - if ($numpathchg) { - $output .= ''."\n"; - } - if (($actionurl eq '/adm/upload') || ($actionurl eq '/adm/testbank') || - ($actionurl eq '/adm/imsimport')) { - $output .= ''."\n"; - } elsif ($actionurl eq '/adm/portfolio' || $actionurl eq '/adm/coursegrp_portfolio') { - $output .= ''; - } - $output .= ''."\n". - &mt('(only files for which a location has been provided will be uploaded)').'
'."\n"; - } elsif ($numpathchg) { - my %pathchange = (); - $output .= &modify_html_form('pathchange',$actionurl,$state,\%pathchange,$pathchange_output); - if (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { - $output .= '

'.&mt('or').'

'; - } - } - return ($output,$num,$numpathchg); -} - -sub embedded_file_element { - my ($context,$num,$embed_file,$mapping,$allfiles,$codebase) = @_; - return unless ((ref($mapping) eq 'HASH') && (ref($allfiles) eq 'HASH') && - (ref($codebase) eq 'HASH')); - my $output; - if ($context eq 'upload_embedded') { - $output = ''."\n"; - } - $output .= ''; - unless (($context eq 'upload_embedded') && - ($mapping->{$embed_file} eq $embed_file)) { - $output .=' - '; - } - my $attrib; - if (ref($allfiles->{$mapping->{$embed_file}}) eq 'ARRAY') { - $attrib = &escape(join(':',@{$allfiles->{$mapping->{$embed_file}}})); - } - $output .= - "\n\t\t". - ''; - if (exists($codebase->{$mapping->{$embed_file}})) { - $output .= - "\n\t\t". - ''; - } - return $output; + $upload_output .=' + + '; + my $attrib = join(':',@{$$allfiles{$embed_file}}); + $upload_output .= + "\n\t\t". + ''; + if (exists($$codebase{$embed_file})) { + $upload_output .= + "\n\t\t". + ''; + } + } + $upload_output .= ''.&Apache::loncommon::end_data_table_row(); + $num++; + } + $upload_output .= &Apache::loncommon::end_data_table().'
+ + + '.&mt('(only files for which a location has been provided will be uploaded)').' + '; + return $upload_output; } sub upload_embedded { my ($context,$dirpath,$uname,$udom,$dir_root,$url_root,$group,$disk_quota, - $current_disk_usage,$hiddenstate,$actionurl) = @_; - my (%pathchange,$output,$modifyform,$footer,$returnflag); + $current_disk_usage) = @_; + my $output; for (my $i=0; $i<$env{'form.number_embedded_items'}; $i++) { next if (!exists($env{'form.embedded_item_'.$i.'.filename'})); my $orig_uploaded_filename = $env{'form.embedded_item_'.$i.'.filename'}; - foreach my $type ('orig','ref','attrib','codebase') { - if ($env{'form.embedded_'.$type.'_'.$i} ne '') { - $env{'form.embedded_'.$type.'_'.$i} = - &unescape($env{'form.embedded_'.$type.'_'.$i}); - } - } + + $env{'form.embedded_orig_'.$i} = + &unescape($env{'form.embedded_orig_'.$i}); my ($path,$fname) = ($env{'form.embedded_orig_'.$i} =~ m{(.*/)([^/]*)}); # no path, whole string is fname if (!$fname) { $fname = $env{'form.embedded_orig_'.$i} }; + + $path = $env{'form.currentpath'}.$path; $fname = &Apache::lonnet::clean_filename($fname); # See if there is anything left next if ($fname eq ''); @@ -8860,12 +8403,12 @@ sub upload_embedded { if ($group ne '') { $port_path = "groups/$group/$port_path"; } - ($state,$msg) = &check_for_upload($env{'form.currentpath'}.$path, - $fname,$group,'embedded_item_'.$i, + ($state,$msg) = &check_for_upload($path,$fname,$group,'embedded_item_'.$i, $dir_root,$port_path,$disk_quota, $current_disk_usage,$uname,$udom); if ($state eq 'will_exceed_quota' - || $state eq 'file_locked') { + || $state eq 'file_locked' + || $state eq 'file_exists' ) { $output .= $msg; next; } @@ -8879,53 +8422,31 @@ sub upload_embedded { # Check if extension is valid if (($fname =~ /\.(\w+)$/) && (&Apache::loncommon::fileembstyle($1) eq 'hdn')) { - $output .= &mt('Invalid file extension ([_1]) - reserved for LONCAPA use - rename the file with a different extension and re-upload. ',$1).'
'; + $output .= &mt('Invalid file extension ([_1]) - reserved for LONCAPA use - rename the file with a different extension and re-upload. ',$1); next; } elsif (($fname =~ /\.(\w+)$/) && (!defined(&Apache::loncommon::fileembstyle($1)))) { - $output .= &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1).'
'; + $output .= &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1); next; } elsif ($fname=~/\.(\d+)\.(\w+)$/) { - $output .= &mt('File name not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2).'
'; + $output .= &mt('File name not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2); next; } $env{'form.embedded_item_'.$i.'.filename'}=$fname; if ($context eq 'portfolio') { - my $result; - if ($state eq 'existingfile') { - $result= - &Apache::lonnet::userfileupload('embedded_item_'.$i,'existingfile', - $dirpath.$env{'form.currentpath'}.$path); - } else { - $result= - &Apache::lonnet::userfileupload('embedded_item_'.$i,'', - $dirpath. - $env{'form.currentpath'}.$path); - if ($result !~ m|^/uploaded/|) { - $output .= '' - .&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].' - ,$result,$orig_uploaded_filename,$env{'form.embedded_orig_'.$i}) - .'
'; - next; - } else { - $output .= &mt('Uploaded [_1]',''. - $path.$fname.'').'
'; - } - } - } elsif ($context eq 'coursedoc') { - my $result = - &Apache::lonnet::userfileupload('embedded_item_'.$i,'coursedoc', - $dirpath.'/'.$path); + my $result= + &Apache::lonnet::userfileupload('embedded_item_'.$i,'', + $dirpath.$path); if ($result !~ m|^/uploaded/|) { $output .= '' - .&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].' + .&mt('An error occurred ([_1]) while trying to upload [_2] for embedded element [_3].' ,$result,$orig_uploaded_filename,$env{'form.embedded_orig_'.$i}) - .'
'; - next; + .'

'; + next; } else { - $output .= &mt('Uploaded [_1]',''. - $path.$fname.'').'
'; + $output .= '

'.&mt('Uploaded [_1]',''. + $path.$fname.'').'

'; } } else { # Save the file @@ -8955,189 +8476,18 @@ sub upload_embedded { &mt('An error occurred while writing the file [_1] for embedded element [_2].',$orig_uploaded_filename,$env{'form.embedded_orig_'.$i}). '
'; } else { - $output .= &mt('Uploaded [_1]',''. - $url.'').'
'; - unless ($context eq 'testbank') { - $footer .= &mt('View embedded file: [_1]', - ''.$fname.'').'
'; - } - } - close($fh); - } - } - if ($env{'form.embedded_ref_'.$i}) { - $pathchange{$i} = 1; - } - } - if ($output) { - $output = '

'.$output.'

'; - } - $output .= &modify_html_form('upload_embedded',$actionurl,$hiddenstate,\%pathchange); - $returnflag = 'ok'; - if (keys(%pathchange) > 0) { - if ($context eq 'portfolio') { - $output .= '

'.&mt('or').'

'; - } elsif ($context eq 'testbank') { - $output .= '

'.&mt('Or [_1]continue[_2] the testbank import without modifying the reference(s).','','').'

'; - $returnflag = 'modify_orightml'; - } - } - return ($output.$footer,$returnflag); -} - -sub modify_html_form { - my ($context,$actionurl,$hiddenstate,$pathchange,$pathchgtable) = @_; - my $end = 0; - my $modifyform; - if ($context eq 'upload_embedded') { - return unless (ref($pathchange) eq 'HASH'); - if ($env{'form.number_embedded_items'}) { - $end += $env{'form.number_embedded_items'}; - } - if ($env{'form.number_pathchange_items'}) { - $end += $env{'form.number_pathchange_items'}; - } - if ($end) { - for (my $i=0; $i<$end; $i++) { - if ($i < $env{'form.number_embedded_items'}) { - next unless($pathchange->{$i}); - } - $modifyform .= - &start_data_table_row(). - ''. - ''.$env{'form.embedded_ref_'.$i}. - ''. - ''. - ''. - ''.$env{'form.embedded_orig_'.$i}. - ''. - &end_data_table_row(); - } - } - } else { - $modifyform = $pathchgtable; - if (($actionurl eq '/adm/upload') || ($actionurl eq '/adm/testbank')) { - $hiddenstate .= ''; - } elsif (($actionurl eq '/adm/portfolio') || ($actionurl eq '/adm/coursegrp_portfolio')) { - $hiddenstate .= ''; - } - } - if ($modifyform) { - return '

'.&mt('Changes in content of HTML file required').'

'."\n". - '

'.&mt('Changes need to be made to the reference(s) used for one or more of the dependencies, if your HTML file is to work correctly:').'

    '."\n". - '
  1. '.&mt('For consistency between the reference(s) and the location of the corresponding stored file within LON-CAPA.').'
  2. '."\n". - '
  3. '.&mt('To change absolute paths to relative paths, or replace directory traversal via "../" within the original reference.').'
  4. '."\n". - '

'."\n".'

'. - &mt('LON-CAPA can make the required changes to your HTML file.').'

'."\n". - '
'. - &start_data_table()."\n". - &start_data_table_header_row(). - ''.&mt('Change?').''. - ''.&mt('Current reference').''. - ''.&mt('Required reference').''. - &end_data_table_header_row()."\n". - $modifyform. - &end_data_table().'
'."\n".$hiddenstate. - ''. - '
'."\n"; - } - return; -} - -sub modify_html_refs { - my ($context,$dirpath,$uname,$udom,$dir_root) = @_; - my $container; - if ($context eq 'portfolio') { - $container = $env{'form.container'}; - } elsif ($context eq 'coursedoc') { - $container = $env{'form.primaryurl'}; - } else { - $container = $env{'form.filename'}; - $container =~ s{^/priv/(\Q$uname\E)/(.*)}{/home/$1/public_html/$2}; - } - my (%allfiles,%codebase,$output,$content); - my @changes = &get_env_multiple('form.namechange'); - return unless (@changes > 0); - if (($context eq 'portfolio') || ($context eq 'coursedoc')) { - return unless ($container =~ m{^/uploaded/\Q$udom\E/\Q$uname\E/}); - $content = &Apache::lonnet::getfile($container); - return if ($content eq '-1'); - } else { - return unless ($container =~ /^\Q$dir_root\E/); - if (open(my $fh,"<$container")) { - $content = join('', <$fh>); - close($fh); - } else { - return; - } - } - my ($count,$codebasecount) = (0,0); - my $mm = new File::MMagic; - my $mime_type = $mm->checktype_contents($content); - if ($mime_type eq 'text/html') { - my $parse_result = - &Apache::lonnet::extract_embedded_items($container,\%allfiles, - \%codebase,\$content); - if ($parse_result eq 'ok') { - foreach my $i (@changes) { - my $orig = &unescape($env{'form.embedded_orig_'.$i}); - my $ref = &unescape($env{'form.embedded_ref_'.$i}); - if ($allfiles{$ref}) { - my $newname = $orig; - my ($attrib_regexp,$codebase); - $attrib_regexp = &unescape($env{'form.embedded_attrib_'.$i}); - if ($attrib_regexp =~ /:/) { - $attrib_regexp =~ s/\:/|/g; - } - if ($content =~ m{($attrib_regexp\s*=\s*['"]?)\Q$ref\E(['"]?)}) { - my $numchg = ($content =~ s{($attrib_regexp\s*=\s*['"]?)\Q$ref\E(['"]?)}{$1$newname$2}gi); - $count += $numchg; - } - if ($env{'form.embedded_codebase_'.$i} ne '') { - $codebase = &unescape($env{'form.embedded_codebase_'.$i}); - my $numchg = ($content =~ s/(codebase\s*=\s*["']?)\Q$codebase\E(["']?)/$1.$2/i); #' stupid emacs - $codebasecount ++; - } - } - } - if ($count || $codebasecount) { - my $saveresult; - if ($context eq 'portfolio' || $context eq 'coursedoc') { - my $url = &Apache::lonnet::store_edited_file($container,$content,$udom,$uname,\$saveresult); - if ($url eq $container) { - my ($fname) = ($container =~ m{/([^/]+)$}); - $output = '

'.&mt('Updated [quant,_1,reference] in [_2].', - $count,''. - $fname.'').'

'; - } else { - $output = '

'. - &mt('Error: update failed for: [_1].', - ''. - $container.'').'

'; - } - } else { - if (open(my $fh,">$container")) { - print $fh $content; - close($fh); - $output = '

'.&mt('Updated [quant,_1,reference] in [_2].', - $count,''. - $container.'').'

'; + if ($context eq 'testbank') { + $output .= &mt('Embedded file uploaded successfully:'). + ' '. + $orig_uploaded_filename.'
'; } else { - $output = '

'. - &mt('Error: could not update [_1].', - ''. - $container.'').'

'; + $output .= ''. + &mt('View embedded file: [_1]',''. + $orig_uploaded_filename.'').'
'; } } + close($fh); } - } else { - &logthis('Failed to parse '.$container. - ' to modify references: '.$parse_result); } } return $output; @@ -9162,71 +8512,22 @@ sub check_for_existing { sub check_for_upload { my ($path,$fname,$group,$element,$portfolio_root,$port_path, $disk_quota,$current_disk_usage,$uname,$udom) = @_; - my $filesize = length($env{'form.'.$element}); - if (!$filesize) { - my $msg = ''. - &mt('Unable to upload [_1]. (size = [_2] bytes)', - ''.$fname.'', - $filesize).'
'. - &mt('Either the file you attempted to upload was empty, or your web browser was unable to read its contents.').'
'. - '
'; - return ('zero_bytes',$msg); - } - $filesize = $filesize/1000; #express in k (1024?) + my $filesize = (length($env{'form.'.$element})) / 1000; #express in k (1024?) my $getpropath = 1; my @dir_list = &Apache::lonnet::dirlist($portfolio_root.$path,$udom,$uname, $getpropath); my $found_file = 0; my $locked_file = 0; - my @lockers; - my $navmap; - if ($env{'request.course.id'}) { - $navmap = Apache::lonnavmaps::navmap->new(); - } foreach my $line (@dir_list) { - my ($file_name,$rest)=split(/\&/,$line,2); + my ($file_name)=split(/\&/,$line,2); if ($file_name eq $fname){ $file_name = $path.$file_name; if ($group ne '') { $file_name = $group.$file_name; } $found_file = 1; - if (&Apache::lonnet::is_locked($file_name,$udom,$uname,\@lockers) eq 'true') { - foreach my $lock (@lockers) { - if (ref($lock) eq 'ARRAY') { - my ($symb,$crsid) = @{$lock}; - if ($crsid eq $env{'request.course.id'}) { - if (ref($navmap)) { - my $res = $navmap->getBySymb($symb); - foreach my $part (@{$res->parts()}) { - my ($slot_status,$slot_time,$slot_name)=$res->check_for_slot($part); - unless (($slot_status == $res->RESERVED) || - ($slot_status == $res->RESERVED_LOCATION)) { - $locked_file = 1; - } - } - } else { - $locked_file = 1; - } - } else { - $locked_file = 1; - } - } - } - } else { - my @info = split(/\&/,$rest); - my $currsize = $info[6]/1000; - if ($currsize < $filesize) { - my $extra = $filesize - $currsize; - if (($current_disk_usage + $extra) > $disk_quota) { - my $msg = ''. - &mt('Unable to upload [_1]. (size = [_2] kilobytes). Disk quota will be exceeded if existing (smaller) file with same name (size = [_3] kilobytes) is replaced.', - ''.$fname.'',$filesize,$currsize).''. - '
'.&mt('Disk quota is [_1] kilobytes. Your current disk usage is [_2] kilobytes.', - $disk_quota,$current_disk_usage); - return ('will_exceed_quota',$msg); - } - } + if (&Apache::lonnet::is_locked($file_name,$udom,$uname) eq 'true') { + $locked_file = 1; } } } @@ -9244,55 +8545,15 @@ sub check_for_upload { return ('file_locked',$msg); } else { my $msg = ''; - $msg .= &mt(' A file by that name: [_1] was found in [_2].',''.$fname.'',$port_path.$env{'form.currentpath'}); + $msg .= &mt('Unable to upload [_1]. A file by that name was found in [_2].',''.$fname.'',$port_path.$env{'form.currentpath'}); $msg .= ''; - return ('existingfile',$msg); + $msg .= '
'; + $msg .= &mt('To upload, rename or delete existing [_1] in [_2].',''.$fname.'', $port_path.$env{'form.currentpath'}); + return ('file_exists',$msg); } } } -sub check_for_traversal { - my ($path,$url,$toplevel) = @_; - my @parts=split(/\//,$path); - my $cleanpath; - my $fullpath = $url; - for (my $i=0;$i<@parts;$i++) { - next if ($parts[$i] eq '.'); - if ($parts[$i] eq '..') { - $fullpath =~ s{([^/]+/)$}{}; - } else { - $fullpath .= $parts[$i].'/'; - } - } - if ($fullpath =~ /^\Q$url\E(.*)$/) { - $cleanpath = $1; - } elsif ($fullpath =~ /^\Q$toplevel\E(.*)$/) { - my $curr_toprel = $1; - my @parts = split(/\//,$curr_toprel); - my ($url_toprel) = ($url =~ /^\Q$toplevel\E(.*)$/); - my @urlparts = split(/\//,$url_toprel); - my $doubledots; - my $startdiff = -1; - for (my $i=0; $i<@urlparts; $i++) { - if ($startdiff == -1) { - unless ($urlparts[$i] eq $parts[$i]) { - $startdiff = $i; - $doubledots .= '../'; - } - } else { - $doubledots .= '../'; - } - } - if ($startdiff > -1) { - $cleanpath = $doubledots; - for (my $i=$startdiff; $i<@parts; $i++) { - $cleanpath .= $parts[$i].'/'; - } - } - } - $cleanpath =~ s{(/)$}{}; - return $cleanpath; -} =pod @@ -10948,10 +10209,6 @@ sub construct_course { $cenv{'url'}=$oldcenv{'url'}; # Restore title $cenv{'description'}=$oldcenv{'description'}; -# Restore creation date, creator and creation context. - $cenv{'internal.created'}=$oldcenv{'internal.created'}; - $cenv{'internal.creator'}=$oldcenv{'internal.creator'}; - $cenv{'internal.creationcontext'}=$oldcenv{'internal.creationcontext'}; # Mark as cloned $cenv{'clonedfrom'}=$cloneid; # Need to clone grading mode @@ -11198,7 +10455,7 @@ sub construct_course { $title=&mt('Syllabus'); $url='/public/'.$$crsudom.'/'.$$crsunum.'/syllabus'; } else { - $title=&mt('Table of Contents'); + $title=&mt('Navigate Contents'); $url='/adm/navmaps'; } @@ -11380,15 +10637,12 @@ sub init_user_environment { my %userenv = &Apache::lonnet::dump('environment',$domain,$username); my ($tmp) = keys(%userenv); if ($tmp !~ /^(con_lost|error|no_such_host)/i) { - # default remote control to off - if ($userenv{'remote'} ne 'on') { $userenv{'remote'} = 'off'; } } else { undef(%userenv); } if (($userenv{'interface'}) && (!$form->{'interface'})) { $form->{'interface'}=$userenv{'interface'}; } - $env{'environment.remote'}=$userenv{'remote'}; if ($userenv{'texengine'} eq 'ttm') { $clientmathml=1; } # --------------- Do not trust query string to be put directly into environment @@ -11420,31 +10674,21 @@ sub init_user_environment { $initial_env{"browser.localres"} = $form->{'localres'}; } - if ($public) { - $initial_env{"environment.remote"} = "off"; - } if ($form->{'interface'}) { $form->{'interface'}=~s/\W//gs; $initial_env{"browser.interface"} = $form->{'interface'}; $env{'browser.interface'}=$form->{'interface'}; } - my %is_adv = ( is_adv => $env{'user.adv'} ); - my %domdef; - unless ($domain eq 'public') { - %domdef = &Apache::lonnet::get_domain_defaults($domain); - } foreach my $tool ('aboutme','blog','portfolio') { $userenv{'availabletools.'.$tool} = - &Apache::lonnet::usertools_access($username,$domain,$tool,'reload', - undef,\%userenv,\%domdef,\%is_adv); + &Apache::lonnet::usertools_access($username,$domain,$tool,'reload'); } foreach my $crstype ('official','unofficial','community') { $userenv{'canrequest.'.$crstype} = &Apache::lonnet::usertools_access($username,$domain,$crstype, - 'reload','requestcourses', - \%userenv,\%domdef,\%is_adv); + 'reload','requestcourses'); } $env{'user.environment'} = "$lonids/$cookie.id"; @@ -11523,36 +10767,6 @@ sub clean_symb { return ($symb,$enc); } -sub build_release_hashes { - my ($checkparms,$checkresponsetypes,$checkcrstypes,$anonsurvey,$randomizetry) = @_; - return unless((ref($checkparms) eq 'HASH') && (ref($checkresponsetypes) eq 'HASH') && - (ref($checkcrstypes) eq 'HASH') && (ref($anonsurvey) eq 'HASH') && - (ref($randomizetry) eq 'HASH')); - foreach my $key (keys(%Apache::lonnet::needsrelease)) { - my ($item,$name,$value) = split(/:/,$key); - if ($item eq 'parameter') { - if (ref($checkparms->{$name}) eq 'ARRAY') { - unless(grep(/^\Q$name\E$/,@{$checkparms->{$name}})) { - push(@{$checkparms->{$name}},$value); - } - } else { - push(@{$checkparms->{$name}},$value); - } - } elsif ($item eq 'resourcetag') { - if ($name eq 'responsetype') { - $checkresponsetypes->{$value} = $Apache::lonnet::needsrelease{$key} - } - } elsif ($item eq 'course') { - if ($name eq 'crstype') { - $checkcrstypes->{$value} = $Apache::lonnet::needsrelease{$key}; - } - } - } - ($anonsurvey->{major},$anonsurvey->{minor}) = split(/\./,$Apache::lonnet::needsrelease{'parameter:type:anonsurvey'}); - ($randomizetry->{major},$randomizetry->{minor}) = split(/\./,$Apache::lonnet::needsrelease{'parameter:type:randomizetry'}); - return; -} - =pod =back