# The LearningOnline Network with CAPA
# Handler to show and edit custom distribution rights
#
# $Id: lonrights.pm,v 1.5 2003/03/20 20:58:40 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
#
###
package Apache::lonrights;
use strict;
use Apache::Constants qw(:common :http);
use Apache::lonnet();
use Apache::loncommon();
use HTML::LCParser;
use Apache::File;
sub handler {
my $r=shift;
$r->content_type('text/html');
$r->send_http_header;
$r->print(
'<html><head><title>LON-CAPA Custom Distribution Rights</title></head>');
$r->print(&Apache::loncommon::bodytag('Custom Distribution Rights'));
$r->rflush();
my $uri=$r->uri;
my $fn=&Apache::lonnet::filelocation('',$uri);
my $contents='';
my $constructmode=($uri=~/^\/\~/);
# ============================================================ Modify and store
if ($constructmode) {
if ($ENV{'form.store'}) {
my @newrules=();
undef @newrules;
# read rules from form
foreach (keys %ENV) {
if ($_=~/^form\.effect\_(\d+)$/) {
my $number=$1;
my %rulehash=();
foreach ('effect','domain','course','section','role') {
$rulehash{$_}=$ENV{'form.'.$_.'_'.$number};
}
if ($rulehash{'role'} eq 'au') {
$rulehash{'course'}='';
$rulehash{'section'}='';
}
if ($rulehash{'role'} eq 'cc') {
$rulehash{'section'}='';
}
unless (($rulehash{'effect'} eq 'deny') ||
($rulehash{'effect'} eq 'allow')) {
$rulehash{'effect'}='deny';
}
$rulehash{'domain'}=~s/\W//g;
$rulehash{'course'}=~s/\W//g;
$rulehash{'section'}=~s/\W//g;
unless ($rulehash{'domain'}) {
$rulehash{'domain'}=$ENV{'user.domain'};
}
my $realm='';
if ($number) {
$realm=$rulehash{'domain'};
if ($rulehash{'course'}) {
$realm.='_'.$rulehash{'course'};
}
if ($rulehash{'section'}) {
$realm.='_'.$rulehash{'section'};
}
}
$newrules[$number]=$rulehash{'effect'}.':'.
$realm.':'.$rulehash{'role'};
}
}
# edit actions?
# store file
my $fh=Apache::File->new('>'.$fn);
foreach (my $i=0;$i<=$#newrules;$i++) {
if ($newrules[$i]) {
my ($effect,$realm,$role)=split(/\:/,$newrules[$i]);
print $fh
"<accessrule effect='$effect' realm='$realm' role='$role' />\n";
}
}
$fh->close;
}
}
# ============================================================ Read and display
unless ($constructmode) {
# =========================================== This is not in construction space
$contents=&Apache::lonnet::getfile($fn);
if ($contents==-1) { $contents=''; }
} else {
# =============================================== This is in construction space
if (-e $fn) {
my $fh=Apache::File->new($fn);
$contents=join('',<$fh>);
$fh->close();
}
$r->print('<form method="post">');
}
unless ($contents=~/\<accessrule/s) {
$contents='<accessrule effect="deny" />';
}
my $parser=HTML::LCParser->new(\$contents);
my $token;
my $rulecounter=0;
my $colzero=($constructmode?'Edit action':'Rule');
# ---------------------------------------------------------- Start table output
$r->print(<<ENDSTARTTABLE);
<table border="2">
<tr><th>$colzero</th><th>Effect</th><th>Domain</th><th>Course</th>
<th>Section</th><th>Role</th></tr>
ENDSTARTTABLE
# --------------------------------------------------------------------- Default
# Fast forward to first rule
$token=$parser->get_token;
while ($token->[1] ne 'accessrule') { $token=$parser->get_token; }
# print default
$r->print('<tr><td> </td><td>');
if ($constructmode) {
$r->print(&Apache::loncommon::select_form
($token->[2]->{'effect'},'effect_0',
('allow' => 'allow',
'deny' => 'deny')));
} else {
$r->print($token->[2]->{'effect'});
}
$r->print('</td><td colspan="4">Default');
if (($token->[2]->{'realm'}) || ($token->[2]->{'role'})) {
$r->print(' - <font color="red">Error! No default set.</font>');
}
$r->print('</td></tr>');
# Additional roles
while ($token=$parser->get_token) {
if (($token->[0] eq 'S') && ($token->[1] eq 'accessrule')) {
$rulecounter++;
$r->print('<tr><td>');
# insert, delete, etc
$r->print($rulecounter.'. ');
if ($constructmode) {
$r->print(&Apache::loncommon::select_form(
'','action_'.$rulecounter,
('' => '',
'delete' => 'Delete this rule',
'insertabove' => 'Insert rule above',
'insertbelow' => 'Insert rule below',
'moveup' => 'Move rule up',
'movedown' => 'Move rule down')));
}
$r->print('</td><td>');
# effect
if ($constructmode) {
$r->print(&Apache::loncommon::select_form
($token->[2]->{'effect'},
'effect_'.$rulecounter,
('allow' => 'allow',
'deny' => 'deny')));
} else {
$r->print($token->[2]->{'effect'});
}
$r->print('</td><td>');
# ---- realm
my $realm=$token->[2]->{'realm'};
$realm=~s/^\W//;
my ($rdom,$rcourse,$rsec)=split(/[\/\_]/,$realm);
# realm role
if ($constructmode) {
$r->print(&Apache::loncommon::select_dom_form($rdom,
'domain_'.$rulecounter));
} else {
$r->print($rdom);
}
$r->print('</td><td>');
# realm course
if ($constructmode) {
$r->print('<input input type="text" size="25" name="course_'.
$rulecounter.'" value="'.$rcourse.'" />');
} else {
$r->print($rcourse);
}
$r->print('</td><td>');
# realm section
if ($constructmode) {
$r->print('<input input type="text" size="5" name="section_'.
$rulecounter.'" value="'.$rsec.'" />');
} else {
$r->print($rsec);
}
$r->print('</td><td>');
# role
if ($constructmode) {
my %hash=('' => '');
foreach ('au','cc','in','ta','st') {
$hash{$_}=&Apache::lonnet::plaintext($_);
}
my $role=$token->[2]->{'role'};
unless ($role) { $role=''; }
$r->print(&Apache::loncommon::select_form(
$role,'role_'.$rulecounter,%hash));
} else {
$r->print(&Apache::lonnet::plaintext($token->[2]->{'role'}));
}
# close row
$r->print('</td></tr>');
}
}
$r->print('</table>');
# ------------------------------------------------------------ End table output
if ($constructmode) {
$r->print('<input type="submit" name="store" value="Store" /></form>');
}
$r->print('</body></html>');
return OK;
}
1;
__END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>