Annotation of loncom/auth/restrictedaccess.pm, revision 1.1

1.1     ! raeburn     1: # The LearningOnline Network
        !             2: # Passphrase Entry and Validation for Portfolio files 
        !             3: #
        !             4: # Copyright Michigan State University Board of Trustees
        !             5: #
        !             6: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
        !             7: #
        !             8: # LON-CAPA is free software; you can redistribute it and/or modify
        !             9: # it under the terms of the GNU General Public License as published by
        !            10: # the Free Software Foundation; either version 2 of the License, or
        !            11: # (at your option) any later version.
        !            12: #
        !            13: # LON-CAPA is distributed in the hope that it will be useful,
        !            14: # but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            15: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            16: # GNU General Public License for more details.
        !            17: #
        !            18: # You should have received a copy of the GNU General Public License
        !            19: # along with LON-CAPA; if not, write to the Free Software
        !            20: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
        !            21: #
        !            22: # /home/httpd/html/adm/gpl.txt
        !            23: #
        !            24: # http://www.lon-capa.org/
        !            25: #
        !            26: 
        !            27: package Apache::restrictedaccess;
        !            28: 
        !            29: use strict;
        !            30: use lib '/home/httpd/lib/perl/';
        !            31: use Apache::Constants qw(:common :http REDIRECT);
        !            32: use CGI::Cookie();
        !            33: use Apache::File ();
        !            34: use Apache::lonnet;
        !            35: use Apache::loncommon();
        !            36: use Apache::lonauth();
        !            37: use Apache::lonlocal;
        !            38: use Apache::lonacc;
        !            39: use Fcntl qw(:flock);
        !            40: use LONCAPA;
        !            41: 
        !            42: sub handler {
        !            43:     my $r = shift;
        !            44: 
        !            45:     &Apache::loncommon::get_unprocessed_cgi
        !            46:         ($ENV{'QUERY_STRING'}.'&'.$env{'request.querystring'},
        !            47:          ['origurl']);
        !            48: 
        !            49:     &Apache::lonacc::get_posted_cgi($r);
        !            50:     my $origurl = &unescape($env{'form.origurl'});
        !            51:     my $msg;
        !            52:     if (exists($env{'form.pass1'})) {
        !            53:         my ($result,$end) = &check_pass($r,$origurl);
        !            54:         if ($result eq 'ok') {
        !            55:             my $cookie_check = &print_redirect($r,$end,$origurl);
        !            56:             if ($cookie_check eq 'ok') {
        !            57:                 $env{'request.state'} = "published";
        !            58:                 $env{'request.filename'} = $origurl;
        !            59:                 $r->header_out(Location => 'http://'.$ENV{'HTTP_HOST'}.$origurl);
        !            60:                 return REDIRECT;
        !            61:             } else {
        !            62:                 &print_entryform($r,$origurl,$cookie_check);
        !            63:             }
        !            64:         } else {
        !            65:             $msg = "Invalid passphrase";
        !            66:             &print_entryform($r,$origurl,$msg);
        !            67:         }
        !            68:     } else {
        !            69:         &print_entryform($r,$origurl);
        !            70:     }
        !            71:     return OK;
        !            72: }
        !            73: 
        !            74: sub print_entryform {
        !            75:     my ($r,$origurl,$msg) = @_;
        !            76:     &Apache::lonlocal::get_language_handle($r);
        !            77:     &Apache::loncommon::content_type($r,'text/html');
        !            78:     $r->send_http_header;
        !            79:     return OK if $r->header_only;
        !            80: 
        !            81:     $r->print(&Apache::loncommon::start_page('Passphrase protected file'));
        !            82:     $r->print('<script type="text/javascript">
        !            83: function verify() {
        !            84:     if (document.passform.pass1.value == "") {
        !            85:         alert("You must enter a passphrase");
        !            86:         return;
        !            87:     }
        !            88:     if (document.passform.pass1.value != document.passform.pass2.value) {
        !            89:         alert("Passphrases do not match");
        !            90:         return;
        !            91:     }
        !            92:     document.passform.submit();
        !            93: } 
        !            94: </script>');
        !            95:     $r->print('<b>'.$msg.'</b>');
        !            96:     $r->print('<div align="center"><form name="passform" method="post" '.
        !            97:               'action="/adm/restrictedaccess">');
        !            98:     $r->print('<br /><br /><br />');
        !            99:     $r->print(&Apache::loncommon::start_data_table());
        !           100:     $r->print(&Apache::loncommon::start_data_table_row());     
        !           101:     $r->print('<td><nobr>'.&mt('Passphrase: ').'</nobr></td>'.
        !           102:               '<td><input type="password" size="20" name="pass1"></td>');
        !           103:     $r->print(&Apache::loncommon::end_data_table_row());
        !           104:     $r->print(&Apache::loncommon::start_data_table_row());
        !           105:     $r->print('<td><nobr>'.&mt('Confirm passphrase: ').'</nobr></td>');
        !           106:     $r->print('<td><input type="password" size="20" name="pass2" /></td>');
        !           107:     $r->print(&Apache::loncommon::end_data_table_row());
        !           108:     $r->print(&Apache::loncommon::start_data_table_row());
        !           109:     $r->print('<td align="center" colspan="2"><br />'.
        !           110:               '<input type="button" name="sendpass" value="'.
        !           111:               &mt('Submit passphrase').'" onClick="verify()" /></td>');
        !           112:     $r->print(&Apache::loncommon::end_data_table_row());
        !           113:     $r->print(&Apache::loncommon::end_data_table());
        !           114:     $r->print('<input type="hidden" name="origurl" value="'.
        !           115:               &escape($origurl).'" /></form></div>');
        !           116:     $r->print(&Apache::loncommon::end_page());
        !           117: }
        !           118: 
        !           119: sub print_redirect {
        !           120:     my ($r,$end,$requrl) = @_;
        !           121:     my %cookies=CGI::Cookie->parse($r->header_in('Cookie'));
        !           122:     my $lonid=$cookies{'lonID'};
        !           123:     my $lonidsdir=$r->dir_config('lonIDsDir');
        !           124:     my $cookie;
        !           125:     if ($lonid) {
        !           126:         $cookie=$lonid->value;
        !           127:         $cookie=~s/\W//g;
        !           128:     }
        !           129:     if ($cookie) {
        !           130:         my $envkey = 'user.passphrase_access_'.$requrl;
        !           131:         open(my $idf,">>$lonidsdir/$cookie.id");
        !           132:         if (!flock($idf,LOCK_EX)) {
        !           133:             &Apache::lonnet::logthis("<font color=blue>WARNING: ".
        !           134:                    'Could not obtain exclusive lock in restrictedaccess: '.$!);
        !           135:             close($idf);
        !           136:             return 'error: '.$!;
        !           137:         } else {
        !           138:             print $idf (&escape($envkey).'='.&escape($end)."\n");
        !           139:             close($idf);
        !           140:             return 'ok';
        !           141:         }
        !           142:     } else {
        !           143:         return 'error: no cookie set';
        !           144:     }
        !           145: }
        !           146: 
        !           147: sub check_pass {
        !           148:     my ($r,$origurl) = @_;
        !           149:     my $password = $env{'form.pass1'};
        !           150:     my ($udom,$unum,$group,$file_name,$result,$end);
        !           151:     if ($origurl =~  m-/+uploaded/([^/]+)/([^/]+)/portfolio(/.+)$-) {
        !           152:         $udom = $1;
        !           153:         $unum = $2;
        !           154:         $file_name = $3;
        !           155:     } elsif ($origurl =~ m-/+uploaded/([^/]+)/([^/]+)/groups/([^/]+)/portfolio/(.+)$-) {
        !           156:         $udom = $1;
        !           157:         $unum = $2;
        !           158:         $group = $3;
        !           159:         $file_name = $3.'/'.$4;
        !           160:     }
        !           161:     my $curr_perms = &Apache::lonnet::get_portfile_permissions($udom,$unum);
        !           162:     my %acc_controls = &Apache::lonnet::get_access_controls($curr_perms,
        !           163:                                                             $group,$file_name);
        !           164:     my $access_hash = $acc_controls{$file_name};
        !           165:     foreach my $key (sort(keys(%{$access_hash}))) {
        !           166:         if ($key =~ /^[^:]+:guest_(\d+)/) {
        !           167:             $end = $1;
        !           168:             my $content = $$access_hash{$key};
        !           169:             my $passwd = $content->{'password'};
        !           170:             if ($password eq $passwd) {
        !           171:                 $result = 'ok';
        !           172:             } else {
        !           173:                 $result = 'fail';
        !           174:             }
        !           175:             last;
        !           176:         }
        !           177:     }
        !           178:     return ($result,$end);
        !           179: }
        !           180: 
        !           181: 1;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>