[LON-CAPA-cvs] cvs: loncom /publisher lonunauthorized.pm

raeburn raeburn at source.lon-capa.org
Sat Nov 12 20:07:10 EST 2011


raeburn		Sun Nov 13 01:07:10 2011 EDT

  Modified files:              
    /loncom/publisher	lonunauthorized.pm 
  Log:
  - More meaningful messages when HTTP_NOT_ACCEPTABLE encountered for:
    /adm/diff, /adm/upload, /adm/cfile, /adm/publish, adm/testbank, /adm/cleanup
  - Provide "Switch Server" link in case of a URL for Construction Space file or
    directory, for which current user has access, but homeserver is different server.
  
  
-------------- next part --------------
Index: loncom/publisher/lonunauthorized.pm
diff -u loncom/publisher/lonunauthorized.pm:1.10 loncom/publisher/lonunauthorized.pm:1.11
--- loncom/publisher/lonunauthorized.pm:1.10	Tue Jun  7 18:05:08 2011
+++ loncom/publisher/lonunauthorized.pm	Sun Nov 13 01:07:09 2011
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Unauthorized to access construction space
 #
-# $Id: lonunauthorized.pm,v 1.10 2011/06/07 18:05:08 www Exp $
+# $Id: lonunauthorized.pm,v 1.11 2011/11/13 01:07:09 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -35,6 +35,7 @@
 use Apache::loncacc;
 use Apache::lonlocal;
 use LONCAPA();
+use HTML::Entities();
 
 sub handler {
     my $r = shift;
@@ -45,57 +46,193 @@
 # ------------------------------------------------------------ Print the screen
 # Figure out who the user is and what they wanted to access
 
-    my ($ownername,$ownerdomain)=
-     &Apache::loncacc::constructaccess($env{'request.editurl'},$r->dir_config('lonDefDomain'));
+    my ($ownername,$ownerdomain,$ownerhome);
+    if ($env{'request.editurl'} ne '') {
+        ($ownername,$ownerdomain,$ownerhome) = 
+            &Apache::loncacc::constructaccess($env{'request.editurl'});
+    }
+
+    # Breadcrumbs
+    &Apache::lonhtmlcommon::clear_breadcrumbs();
+    if ($env{'request.role'} =~ /^(au|ca|aa)/) { 
+        &Apache::lonhtmlcommon::add_breadcrumb({
+            'text' => 'Construction Space',
+            'href' => &Apache::loncommon::authorspace(),
+        });
+    } elsif (($env{'request.course.id'}) && 
+             (&Apache::lonnet::allowed('mdc',$env{'request.course.id'}))) {
+        &Apache::lonhtmlcommon::add_breadcrumb({
+            'text' => 'Course Contents',
+            'href' => '/adm/coursedocs',
+        });
+    }
+
 # print header
     $r->print(&Apache::loncommon::start_page("Failed Access to Construction Space",
 					     undef,
-					     {'domain' => $ownerdomain,}));
+					     {'domain' => $ownerdomain,}).
+                                             &Apache::lonhtmlcommon::breadcrumbs());
 # figure out what went wrong
 
     if ($ownerdomain) {
-	$r->print('<p class="LC_error">'
-                 .&mt('The construction space for this resource is located on another server.')
-                 .'</p>'
-                 .'<p>'
-                 .&mt('Choose another server.')
-                 .'</p>');
-        my $ownerhome=&Apache::lonnet::homeserver($ownername,$ownerdomain);
-        unless ($ownerhome eq 'no_host') {
-	    $r->print('<p>'
-                     .&mt('Please log into [_1] to edit.'
-                         ,'<tt>'.&Apache::lonnet::hostname($ownerhome).'</tt>')
-                     .'</p>');
+        if ($ownerhome eq 'no_host') {
+            $r->print('<p class="LC_error">'.
+                      &mt('Unable to determine home server for this resource: [_1]',
+                      '<span class="LC_filename">'.$env{'request.editurl'}.'</span>').
+                      '</p>');
+        } else {
+            my @hosts = &Apache::lonnet::current_machine_ids();
+            if (!grep(/^\Q$ownerhome\E$/, at hosts)) {
+                my $switchlink = '/adm/switchserver?otherserver='.$ownerhome.
+                                 '&origurl='.&HTML::Entities::encode($env{'request.editurl'},'<>&"');
+	        $r->print('<p class="LC_warning">'.
+                          &mt('The construction space for this resource is located on a different server: [_1]',
+                          '<b><tt>'.&Apache::lonnet::hostname($ownerhome).'</b></tt>').
+                          '</p>'.
+                          '<p class="LC_error"><a href="'.$switchlink.'">'.
+                          &mt('Switch Server').'</a>'.
+                          '</p>');
+            } else {
+                $r->print('<p class="LC_error">'.
+                          &mt('You do not have authoring privileges for this resource').' '.
+                          '<span class="LC_filename">'.$env{'request.editurl'}.'</span>'.
+                          '</p>');
+            }
         }
     } elsif (!$env{'request.editurl'}) {
-        $r->print('<p class="LC_error">'
-                 .&mt('There may be a problem with the filename, e.g., you may be attempting to edit a versioned file (files in construction may not include a version number in front of the extension).')
-                 .'</p>');
+        if ($ENV{'REDIRECT_URL'} =~ m{^/adm/([^/]+)}) {
+            my $action = $1;   
+            my ($option,$filename,$filename1,$filename2,$decompress,
+                $qualifiedfilename);
+            if ($ENV{'REDIRECT_QUERY_STRING'} ne '') {
+                foreach my $pair (split(/&/,$ENV{'REDIRECT_QUERY_STRING'})) {
+                    my ($name,$value) = split(/=/,$pair);
+                    if ($name eq 'filename') {
+                        if (($action eq 'publish') || ($action eq 'cfile')) {
+                            $filename = &LONCAPA::unescape($value);
+                        } else {
+                            $filename = $value;
+                        }
+                    } elsif ($name eq 'filename1') {
+                        $filename1 = $value;
+                    } elsif ($name eq 'filename2') {
+                        $filename2 = $value;
+                    } elsif ($name eq 'decompress') {
+                        $decompress = $value;
+                        $option = 'decompress';
+                    } elsif ($name eq 'qualifiedfilename') {
+                        $qualifiedfilename = $value;
+                    } elsif ($name = 'versionone') {
+                        if ($value eq 'priv') {
+                            $option = 'cstr';
+                        }
+                    } elsif ($name eq 'versiontwo') {
+                        if ($value eq 'priv') {
+                            $option = 'cstr';
+                        }
+                    } elsif ($name eq 'filetwo') {
+                        $option = $value; 
+                    }
+                }
+                if (($action eq 'upload') || ($action eq 'testbank')) {
+                    if (($filename1 ne '') && ($filename ne '')) {
+                        $filename = $filename1.$filename2;
+                    }
+                } elsif ($action eq 'cfile') {
+                    if ($decompress ne '') {
+                        $filename = $decompress;
+                    } elsif ($qualifiedfilename ne '') {
+                        $filename = $qualifiedfilename;
+                    }
+                }
+                my %deniedactions = &get_denied_action_text();
+                my $warning;
+                if ($option eq 'decompress') {
+                    $warning = $deniedactions{$option};
+                } else {
+                    $warning = $deniedactions{$action};
+                }
+                if ($warning) {
+                    if (($action eq 'diff') && ($option ne 'cstr')) {
+                        $r->print('<p class="LC_error">'.
+                                  $deniedactions{$action}.'</p><p class="LC_warning">'
+                                  &mt('You do not have privileges to view the published resource').' '.
+                                      '<span class="LC_filename">'.$filename.'</span>'.
+                                  '</p>');
+                    } else {
+                        if (($action eq 'diff') && ($option eq 'cstr')) {
+                            $filename =~ s{^/res/}{/priv/};
+                        }
+                        $r->print('<p class="LC_error">'.
+                                  $deniedactions{$action}.'</p><p class="LC_warning">'.
+                                  &mt('You do not have authoring privileges for this resource').' '.
+                                      '<span class="LC_filename">'.$filename.'</span>'.
+                                  '</p>');
+                    }
+                } else {
+                    $r->print('<p class="LC_error">'.
+                              &mt('You are not permitted to take this action.').
+                              '</p>');
+                }
+            }
+        } elsif ($r->uri =~ m{priv/.+\.\d+\.[^.]+$}) {
+            $r->print('<p class="LC_error">'.
+                      &mt('There is a problem with the filename').' '.
+                      '<span class="LC_filename">'.$r->uri.'</span></p>'.
+                      '<p class="LC_warning">'.
+                      &mt('You may be attempting to edit a versioned file (files in construction space may not include a version number before the extension).').
+                      '</p>');
+        } else {
+            $r->print('<p class="LC_error">'.
+                      &mt('You are not permitted to take this action.').
+                      '</p>'); 
+        }
+    } elsif ($env{'request.editurl'} =~ m{priv/.+\.\d+\.[^.]+$}) {
+        $r->print('<p class="LC_error">'.
+                  &mt('There is a problem with the filename').' '.
+                  '<span class="LC_filename">'.$env{'request.editurl'}.'</span></p>'.
+                  '<p class="LC_warning">'.
+                  &mt('You may be attempting to edit a versioned file (files in construction space may not include a version number before the extension).').
+                  '</p>');
     } else {
         $r->print('<p class="LC_error">'
-                 .&mt('You do not have authoring privileges for this resource')
+                 .&mt('You do not have authoring privileges for this resource').' '
+                 .'<span class="LC_filename">'.$env{'request.editurl'}.'</span>'
                  .'</p>');
-        my ($realownername)=
-	    ($env{'request.editurl'}=~m{/(?:~|priv/|home/)($LONCAPA::username_re)});
+        my ($realownerdom,$realownername) =
+	    ($env{'request.editurl'}=~m{^/priv/($LONCAPA::domain_re)/($LONCAPA::username_re)});
         my $realownerhome=
-	    &Apache::lonnet::homeserver($realownername,
-					$r->dir_config('lonDefDomain'));
+	    &Apache::lonnet::homeserver($realownername,$realownerdom);
         unless ($realownerhome eq 'no_host') {
-            my $plainname=&Apache::loncommon::plainname($realownername,$r->dir_config('lonDefDomain'));
-            my $user=$realownername.':'.$r->dir_config('lonDefDomain');
+            my $plainname=&Apache::loncommon::plainname($realownername,$realownerdom);
+            my $user=$realownername.':'.$realownerdom;
             my $userlink=&Apache::loncommon::aboutmewrapper(
                              $plainname.' ('.$user.')'
                             ,$realownername
-                            ,$r->dir_config('lonDefDomain'));
+                            ,$realownerdom);
 	    $r->print('<p>'
                      .&mt('Contact [_1] for access.',$userlink)
                      .'</p>');
         }
     }
-    
     $r->print(&Apache::loncommon::end_page());
     return OK;
-} 
+}
+
+sub get_denied_action_text {
+    my %deniedtext = 
+        &Apache::lonlocal::texthash(
+           cfile      => 'Copying, moving, renaming or creating file not allowed.',
+           publish    => 'Publishing not allowed.',
+           upload     => 'Uploading file not allowed.',
+           testbank   => 'Uploading testbank file not allowed',
+           retrieve   => 'Retrieving version information not allowed.',
+           cleanup    => 'Clean up of file not allowed.',
+           diff       => 'Display of differences between file versions disallowed.',
+           decompress => 'Decompression of archive file disallowed.',
+    );
+    return %deniedtext;
+}
 
 1;
 __END__


More information about the LON-CAPA-cvs mailing list