+//
+
+ENDCLOSE
+ &start_loading_course($r,$title,$only_body);
+ if ($only_body) {
+ $r->print(''.$title.'
');
+ }
+ my %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,undef,$preamble);
+ &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Loading ...'));
+ $r->rflush();
+ if ($critmsg_check) {
+ my $blockcrit = &Apache::loncommon::blocking_status('alert',$clientip,$cnum,$cdom,undef,1);
+ if ($blockcrit) {
+ my $checkrole = "cm./$cdom/$cnum";
+ if ($csec ne '') {
+ $checkrole .= "/$csec";
+ }
+ unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) &&
+ ($trolecode !~ m{^st\./$cdom/$cnum})) {
+ $critmsg_check = 0;
+ }
+ }
+ }
+ my ($furl,$ferr)=
+ &Apache::lonuserstate::readmap($cdom.'/'.$cnum,$critmsg_check);
+ &Apache::lonhtmlcommon::Update_PrgWin($r,\%prog_state,&mt('Finished!'));
+ &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
+ $r->print($closure);
+ $r->rflush();
+ if ($ferr) {
+ $furl = '/adm/roles?tryagain=1';
+ } else {
+ &Apache::lonnet::appenv({'request.course.timechecked'=>$now});
+ unless (($env{'form.switchrole'}) ||
+ ($env{"environment.internal.$cdom.$cnum.$role.adhoc"})) {
+ &Apache::lonnet::put('nohist_crslastlogin',
+ {$env{'user.name'}.':'.$env{'user.domain'}.
+ ':'.$csec.':'.$role => $now},$cdom,$cnum);
+ }
+ if (($env{"environment.internal.$cdom.$cnum.$role.adhoc"}) &&
+ (&Apache::lonnet::allowed('vxc',$cdom.'_'.$cnum))) {
+ my $owner = $env{'course.'.$cdom.'_'.$cnum.'.internal.courseowner'};
+ my @coowners = split(/,/,$env{'course.'.$env{'request.course.id'}.'.internal.co-owners'});
+ my %auaccess;
+ foreach my $user ($owner,@coowners) {
+ my ($cpname,$cpdom) = split(/:/,$user);
+ my %auroles = &Apache::lonnet::get_my_roles($cpname,$cpdom,'userroles',undef,['au','ca','aa'],[$cdom]);
+ foreach my $key (keys(%auroles)) {
+ my ($auname,$audom,$aurole) = split(/:/,$key);
+ if ($aurole eq 'au') {
+ $auaccess{$cpname} = 1;
+ } else {
+ $auaccess{$auname} = 1;
+ }
+ }
+ }
+ &Apache::lonnet::appenv({'request.course.adhocsrcaccess' => join(',',sort(keys(%auaccess))) });
+ }
+ my ($feeds,$syllabus_time);
+ &Apache::lonrss::advertisefeeds($cnum,$cdom,undef,\$feeds);
+ &Apache::lonnet::appenv({'request.course.feeds' => $feeds});
+ unless ($env{'course.'.$cdom.'_'.$cnum.'.updatedsyllabus'}) {
+ unless (($env{'course.'.$cdom.'_'.$cnum.'.externalsyllabus'}) ||
+ ($env{'course.'.$cdom.'_'.$cnum.'.uploadedsyllabus'})) {
+ my %syllabus=&Apache::lonnet::dump('syllabus',$cdom,$cnum);
+ $syllabus_time = $syllabus{'uploaded.lastmodified'};
+ if ($syllabus_time) {
+ &Apache::lonnet::appenv({'request.course.syllabustime' => $syllabus_time});
+ }
+ }
+ }
+ }
+ if (($env{'form.orgurl'}) &&
+ ($env{'form.orgurl'}!~/^\/adm\/flip/) &&
+ ($env{'form.orgurl'} ne '/adm/roles')) {
+ my $dest=$env{'form.orgurl'};
+ if ($env{'form.symb'}) {
+ if ($dest =~ /\?/) {
+ $dest .= '&';
+ } else {
+ $dest .= '?';
+ }
+ $dest .= 'symb='.$env{'form.symb'};
+ }
+ if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }
+ &Apache::lonnet::appenv({'request.role.adv'=>$tadv});
+ if ($ferr) {
+ if ($env{'form.orgurl'}) {
+ $furl .= '&orgurl='.&HTML::Entities::encode($env{'form.orgurl'},'<>&"');
+ }
+ if ($env{'form.symb'}) {
+ $furl .= '&symb='.&HTML::Entities::encode($env{'form.symb'},'<>&"');
+ }
+ } else {
+ &set_supplemental_access($cnum,$cdom);
+ }
+ if (($ferr) && ($tadv)) {
+ &error_page($r,$ferr,$furl);
+ } else {
+ if ($env{'request.course.id'} eq $cdom.'_'.$cnum) {
+ if (($env{'form.orgurl'} ne '') && ($env{'form.symb'} ne '')) {
+ unless (&Apache::lonnet::symbverify($env{'form.symb'},$env{'form.orgurl'})) {
+ $dest=$env{'form.orgurl'};
+ }
+ }
+ }
+ if ($dest =~ m{^/adm/coursedocs\?folderpath}) {
+ if ($env{'request.course.id'} eq $cdom.'_'.$cnum) {
+ my $chome = &Apache::lonnet::homeserver($cnum,$cdom);
+ &Apache::loncommon::update_content_constraints($cdom,$cnum,$chome,
+ $cdom.'_'.$cnum);
+ }
+ }
+ if ($ferr) {
+ if (!$env{'request.course.id'}) {
+ &Apache::lonnet::appenv(
+ {"request.course.id" => $cdom.'_'.$cnum});
+ $r->print(''.
+ &mt('Could not initialize [_1] at this time.',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
'.
+ ''.
+ &mt('Please try again.').'
'.
+ &Apache::loncommon::end_page());
+ }
+ } else {
+ if (($env{'request.lti.login'}) &&
+ ($env{'request.lti.rosterid'} || $env{'request.lti.passbackid'})) {
+ &process_lti($r,$cdom,$cnum);
+ }
+ if ($env{'request.deeplink.login'}) {
+ &set_deeplink_target($cnum,$cdom);
+ }
+ $msg = ''.&mt('Entering [_1] ...',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
';
+ &finish_loading_course($r,$msg,$dest,$only_body);
+ }
+ }
+ $r->rflush();
+ return OK;
+ } else {
+ if (!$env{'request.course.id'}) {
+ &Apache::lonnet::appenv(
+ {"request.course.id" => $cdom.'_'.$cnum});
+ }
+ if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; }
+ &Apache::lonnet::appenv({'request.role.adv'=>$tadv});
+ if ($ferr) {
+ if ($tadv) {
+ &error_page($r,$ferr,$furl);
+ } else {
+ $r->print(''.
+ &mt('Could not initialize [_1] at this time.',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
'.
+ ''.&mt('Please try again.').'
'.
+ ''.
+ &Apache::loncommon::end_page());
+ }
+ } else {
+ &set_supplemental_access($cnum,$cdom);
+ if (($env{'request.lti.login'}) &&
+ ($env{'request.lti.rosterid'} || $env{'request.lti.passbackid'})) {
+ &process_lti($r,$cdom,$cnum);
+ }
+ if ($env{'request.deeplink.login'}) {
+ &set_deeplink_target($cnum,$cdom);
+ }
+ # Check to see if the user is a CC entering a course
+ # for the first time
+ if ((($role eq 'cc') || ($role eq 'co'))
+ && ($env{'course.'.$cdom.'_'.$cnum.'.course.helper.not.run'})) {
+ $furl = "/adm/helper/course.initialization.helper";
+ # Send the user to the course they selected
+ } elsif ($env{'request.course.id'}) {
+ if ((&Apache::loncommon::course_type() eq 'Placement') &&
+ (!$env{'request.role.adv'})) {
+ my ($score,$incomplete) =
+ &Apache::lonplacementtest::check_completion(undef,undef,1);
+ if (($incomplete) && ($incomplete < 100)) {
+ $msg = ''.&mt('Entering [_1] ...',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
';
+ &finish_loading_course($r,$msg,'/adm/placement',$only_body);
+ $r->rflush();
+ return OK;
+ }
+ }
+ my ($dest,$destsymb,$checkenc);
+ $dest = $env{'form.destinationurl'};
+ $destsymb = $env{'form.destsymb'};
+ if ($dest ne '') {
+ if ($env{'form.switchrole'}) {
+ if ($destsymb ne '') {
+ if ($destsymb !~ m{^/enc/}) {
+ unless ($env{'request.role.adv'}) {
+ $checkenc = 1;
+ }
+ }
+ }
+ if (($dest =~ m{^\Q/public/$cdom/$cnum/syllabus\E.*(\?|\&)usehttp=1}) ||
+ ($dest =~ m{^\Q/adm/wrapper/ext/\E(?!https:)})) {
+ if ($ENV{'SERVER_PORT'} == 443) {
+ my $hostname = $r->hostname();
+ unless ((&Apache::lonnet::uses_sts()) ||
+ (&Apache::lonnet::waf_allssl($hostname))) {
+ if ($hostname ne '') {
+ $dest = 'http://'.$hostname.$dest;
+ }
+ }
+ }
+ }
+ if ($dest =~ m{^/enc/}) {
+ if ($env{'request.role.adv'}) {
+ $dest = &Apache::lonenc::unencrypted($dest);
+ if ($destsymb eq '') {
+ ($destsymb) = ($dest =~ /(?:\?|\&)symb=([^\&]*)/);
+ $destsymb = &unescape($destsymb);
+ }
+ }
+ } else {
+ if ($destsymb eq '') {
+ ($destsymb) = ($dest =~ /(?:\?|\&)symb=([^\&]+)/);
+ $destsymb = &unescape($destsymb);
+ }
+ unless ($env{'request.role.adv'}) {
+ $checkenc = 1;
+ }
+ }
+ if (($checkenc) && ($destsymb ne '')) {
+ my ($encstate,$unencsymb,$res);
+ $unencsymb = &Apache::lonnet::symbclean($destsymb);
+ (undef,undef,$res) = &Apache::lonnet::decode_symb($unencsymb);
+ &Apache::lonnet::symbverify($unencsymb,$res,\$encstate);
+ if ($encstate) {
+ if (($dest ne '') && ($dest !~ m{^/enc/})) {
+ $dest=&Apache::lonenc::encrypted($dest);
+ }
+ }
+ }
+ }
+ unless (($dest =~ m{^/enc/}) || ($dest =~ /(\?|\&)symb=.+___\d+___.+/)) {
+ if (($destsymb ne '') && ($destsymb !~ m{^/enc/})) {
+ my $esc_symb = &escape($destsymb);
+ $dest .= (($dest =~/\?/)? '&':'?').'symb='.$esc_symb;
+ }
+ }
+ if ($env{'form.ttoken'}) {
+ $dest .= (($dest =~/\?/)? '&':'?').'ttoken='.$env{'form.ttoken'};
+ }
+ unless (($env{'request.lti.login'}) || ($env{'request.deeplink.login'})) {
+ $msg = ''.&mt('Entering [_1] ...',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
';
+ }
+ &finish_loading_course($r,$msg,$dest,$only_body);
+ $r->rflush();
+ return OK;
+ }
+ if (&Apache::lonnet::allowed('whn',
+ $env{'request.course.id'})
+ || &Apache::lonnet::allowed('whn',
+ $env{'request.course.id'}.'/'
+ .$env{'request.course.sec'})
+ ) {
+ my $startpage = &courseloadpage($env{'request.course.id'});
+ unless ($startpage eq 'firstres') {
+ $msg = ''.&mt('Entering [_1] ...',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
';
+ &finish_loading_course($r,$msg,'/adm/whatsnew?refpage=start',$only_body);
+ $r->rflush();
+ return OK;
+ }
+ }
+ }
+ # Are we allowed to look at the first resource?
+ #
+ # $furl returned by lonuserstate::readmap() has format:
+ # $url?symb=escaped($symb). If the resource has the
+ # encrypturl parameter in effect, the entire string
+ # $url?symb=escaped($symb) is encrypted as a string
+ # beginning /enc/.
+ #
+ my ($access,$unencfurl,$unencsymb);
+ if ($furl =~ m{^(.+)(?:\?|\&)symb=([^&]+)(?:$|&)}) {
+ my ($poss_url,$poss_symb) = ($1,$2);
+ $unencsymb = &unescape($poss_symb);
+ $unencfurl = $poss_url;
+ } elsif ($furl =~ m{^/enc/}) {
+ my $unenc = &Apache::lonenc::unencrypted($furl);
+ if ($unenc =~ m{^(.+)(?:\?|\&)symb=([^&]+)(?:$|&)}) {
+ ($unencfurl,$unencsymb) = ($1,$2);
+ $unencsymb = &unescape($unencsymb);
+ } else {
+ $unencfurl = $unenc;
+ }
+ } else {
+ $unencfurl = $furl;
+ }
+ if ($unencsymb) {
+ my $symb = &Apache::lonnet::symbclean($unencsymb);
+ if (($symb ne '') && (&Apache::lonnet::symbverify($symb,$unencfurl))) {
+ $access = &Apache::lonnet::allowed('bre',$unencfurl,$symb);
+ } else {
+ $access = &Apache::lonnet::allowed('bre',$unencfurl);
+ }
+ } else {
+ $access = &Apache::lonnet::allowed('bre',$unencfurl);
+ }
+ if ((!$access) || ($access eq 'B') || ($access eq 'D')) {
+ $furl = &Apache::lonpageflip::first_accessible_resource();
+ if ($furl eq '') {
+ $furl = '/adm/navmaps?showOnlyHomework=1';
+ }
+ }
+ if ($env{'request.lti.login'}) {
+ undef($msg);
+ &finish_loading_course($r,$msg,$furl,$only_body);
+ } else {
+ $msg = ''.&mt('Entering [_1] ...',
+ $env{'course.'.$cdom.'_'.$cnum.'.description'}).
+ '
';
+ &finish_loading_course($r,$msg,$furl,$only_body);
+ }
+ }
+ $r->rflush();
+ return OK;
+ }
+ }
+ #
+ # Send the user to the construction space they selected
+ if ($role =~ /^(au|ca|aa)$/) {
+ my $redirect_url = '/priv/';
+ if ($role eq 'au') {
+ $redirect_url.=$env{'user.domain'}.'/'.$env{'user.name'};
+ } else {
+ $redirect_url .= $where;
+ }
+ $redirect_url .= '/';
+ if ($env{'form.orgurl'} =~ /^\Q$redirect_url\E/) {
+ my ($path) = ($env{'form.orgurl'} =~ m{^(.+)/[^/]+$});
+ if (($path ne '') && (-e $Apache::lonnet::perlvar{'lonDocRoot'}.$path)) {
+ $redirect_url = $env{'form.orgurl'};
+ }
+ }
+ &redirect_user($r,&mt('Entering Authoring Space'),
+ $redirect_url);
+ return OK;
+ }
+ if ($role eq 'dc') {
+ my $redirect_url = '/adm/menu/';
+ &redirect_user($r,&mt('Loading Domain Coordinator Menu'),
+ $redirect_url);
+ return OK;
+ }
+ if ($role eq 'dh') {
+ my $redirect_url = '/adm/menu/';
+ &redirect_user($r,&mt('Loading Domain Helpdesk Menu'),
+ $redirect_url);
+ return OK;
+ }
+ if ($role eq 'da') {
+ my $redirect_url = '/adm/menu/';
+ &redirect_user($r,&mt('Loading Domain Helpdesk Assistant Menu'),
+ $redirect_url);
+ return OK;
+ }
+ if ($role eq 'sc') {
+ my $redirect_url = '/adm/grades?command=scantronupload';
+ &redirect_user($r,&mt('Loading Data Upload Page'),
+ $redirect_url);
+ return OK;
+ }
+ }
+ }
}
}
-
+
# =============================================================== No Roles Init
- $r->content_type('text/html');
+ &Apache::loncommon::content_type($r,'text/html');
+ &Apache::loncommon::no_cache($r);
$r->send_http_header;
return OK if $r->header_only;
- $r->print(<
-
-LON-CAPA User Roles
-
-ENDHEADER
+ my $crumbtext = 'User Roles';
+ my $pagetitle = 'My Roles';
+ my $recent = &mt('Recent Roles');
+ my $standby = &mt('Role selected. Please stand by.');
+ my $show_course=&Apache::loncommon::show_course();
+ if ($show_course) {
+ $crumbtext = 'Courses';
+ $pagetitle = 'My Courses';
+ $recent = &mt('Recent Courses');
+ $standby = &mt('Course selected. Please stand by.');
+ }
+ if (($norolelist) && ((split(/:/,$env{'user.error.msg'}))[2])) {
+ $crumbtext = 'Access Denied';
+ $pagetitle = 'Unauthorized';
+ }
+ my $brcrum =[{href=>"/adm/roles",text=>$crumbtext}];
-# ------------------------------------------ Get Error Message from Environment
+ my %roles_in_env;
+ my $showcount = &roles_from_env(\%roles_in_env,$update);
- my ($fn,$priv,$nochoose,$error,$msg)=split(/:/,$ENV{'user.error.msg'});
- if ($ENV{'user.error.msg'}) {
- $r->log_reason(
- "$msg for $ENV{'user.name'} domain $ENV{'user.domain'} access $priv",$fn);
+ my $swinfo=&Apache::lonmenu::rawconfig();
+ my %domdefs=&Apache::lonnet::get_domain_defaults($env{'user.domain'});
+ my $cattype = 'std';
+ if ($domdefs{'catauth'}) {
+ $cattype = $domdefs{'catauth'};
}
+ my $placementonly;
+ if ($showcount == 1) {
+ if ($env{'request.course.id'}) {
+ if ($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') {
+ $placementonly = 1;
+ }
+ } else {
+ foreach my $rolecode (keys(%roles_in_env)) {
+ my ($cid) = ($rolecode =~ m{^\Quser.role.st./\E($match_domain/$match_courseid)(?:/|$)});
+ if ($cid) {
+ my %coursedescription =
+ &Apache::lonnet::coursedescription($cid,{'one_time' => '1'});
+ if ($coursedescription{'type'} eq 'Placement') {
+ $placementonly = 1;
+ }
+ last;
+ }
+ }
+ }
+ }
+ my ($start_page,$funcs);
+ if ($placementonly) {
+ $start_page=&Apache::loncommon::start_page($pagetitle,undef,
+ {bread_crumbs=>$brcrum,crstype=>'Placement'});
+ } else {
+ my ($crumbsright,$crumbs_style);
+ unless (($norolelist) && ((split(/:/,$env{'user.error.msg'}))[2])) {
+ $funcs = &get_roles_functions($showcount,$cattype,$domdefs{'userapprovals'});
+ if ($env{'browser.mobile'}) {
+ $crumbsright = $funcs;
+ undef($funcs);
+ $crumbs_style = 'overflow: visible;';
+ }
+ }
+ $start_page=&Apache::loncommon::start_page($pagetitle,undef,{bread_crumbs=>$brcrum,
+ bread_crumbs_component=>$crumbsright,
+ bread_crumbs_style=>$crumbs_style,});
+ }
+ &js_escape(\$standby);
+ my $noscript='
'.&mt('Use of LON-CAPA requires Javascript to be enabled in your web browser.').'
'.&mt('As this is not the case, most functionality in the system will be unavailable.').'
';
-# ---------------------------------------------------------------- Who is this?
+ $r->print(<
+$noscript
+
+
+ENDHEADER
+
+# ------------------------------------------ Get Error Message from Environment
+
+ my ($fn,$priv,$nochoose,$error,$msg)=split(/:/,$env{'user.error.msg'});
+ if ($env{'user.error.msg'}) {
+ $r->log_reason(
+ "$msg for $env{'user.name'} domain $env{'user.domain'} access $priv",$fn);
+ }
-# ---------------------------------------------- Get cached course descriptions
+# ------------------------------------------------- Can this user re-init, etc?
- my %cdes=Apache::lonnet::dump('nohist_coursedescriptions');
+ my $advanced=$env{'user.adv'};
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['tryagain']);
+ my $tryagain=$env{'form.tryagain'};
+ my $reinit=$env{'user.reinit'};
+ delete $env{'user.reinit'};
# -------------------------------------------------------- Generate Page Output
# --------------------------------------------------------------- Error Header?
if ($error) {
- $r->print("LON-CAPA Access Control
");
- $r->print("
Access : ".
- Apache::lonnet::plaintext($priv)."\n");
- $r->print("Resource: $fn\n");
- $r->print("Action : $msg\n
");
+ $r->print("".&mt('LON-CAPA Access Control')."
");
+ $r->print("
");
+ if ($priv ne '') {
+ $r->print(&mt('Access : ').&Apache::lonnet::plaintext($priv)."\n");
+ }
+ if ($fn ne '') {
+ $r->print(&mt('Resource: ').&Apache::lonenc::check_encrypt($fn)."\n");
+ }
+ if ($msg ne '') {
+ $r->print(&mt('Action : ').$msg."\n");
+ }
+ $r->print("
");
+ my $url=$fn;
+ my $last;
+ if (tie(my %hash,'GDBM_File',$env{'request.course.fn'}.'_symb.db',
+ &GDBM_READER(),0640)) {
+ $last=$hash{'last_known'};
+ untie(%hash);
+ }
+ if ($last) { $fn.='?symb='.&escape($last); }
+
+ &Apache::londocs::changewarning($r,undef,'You have modified your course recently, [_1] may fix this access problem.',
+ &Apache::lonenc::check_encrypt($fn));
} else {
- $r->print("LON-CAPA User Roles
");
+ if ($env{'user.error.msg'}) {
+ if ($reinit) {
+ $r->print(
+ ''.
+ &mt('As your session file for the course or community has expired, you will need to re-select it.').'
');
+ } else {
+ $r->print(
+ ''.
+ &mt('You need to choose another user role or enter a specific course or community for this function.').
+ '
');
+ }
+ }
}
-# -------------------------------------------------------- Choice or no choice?
if ($nochoose) {
- if ($advanced) {
- $r->print("Assigned User Roles
\n");
- } else {
- $r->print("Sorry ...
\nThis resource might be part of");
- if ($ENV{'request.course.id'}) {
- $r->print(' another');
- } else {
- $r->print(' a certain');
- }
- $r->print(' course.