version 1.22, 2007/05/02 01:34:23
|
version 1.36, 2023/07/13 22:21:26
|
Line 55 sub handler {
|
Line 55 sub handler {
|
&Apache::loncommon::content_type($r,'text/html'); |
&Apache::loncommon::content_type($r,'text/html'); |
$r->send_http_header; |
$r->send_http_header; |
|
|
my $js = &Apache::loncommon::coursebrowser_javascript(); |
my $text = 'Authoring Space'; |
|
my $href = &Apache::loncommon::authorspace($r->uri); |
|
my ($crsauthor,$cdom,$cnum); |
|
if ($env{'request.course.id'}) { |
|
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
if ($href eq "/priv/$cdom/$cnum/") { |
|
$crsauthor = 1; |
|
$text = 'Course Authoring Space'; |
|
} |
|
} |
|
# Breadcrumbs |
|
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
|
&Apache::lonhtmlcommon::add_breadcrumb({ |
|
'text' => $text, |
|
'href' => $href, |
|
}); |
|
if ($crsauthor) { |
|
&Apache::lonhtmlcommon::add_breadcrumb({ |
|
'text' => 'Custom Rights', |
|
'title' => 'Custom Distribution Rights', |
|
'href' => '',}); |
|
} else { |
|
&Apache::lonhtmlcommon::add_breadcrumb({ |
|
'text' => 'Custom Rights Editor', |
|
'title' => 'Custom Distribution Rights Editor', |
|
'href' => '',}); |
|
} |
|
|
$r->print(&Apache::loncommon::start_page('Custom Distribution Rights',$js)); |
my $js = &Apache::loncommon::coursebrowser_javascript(). |
|
&Apache::loncommon::studentbrowser_javascript(); |
|
# Breadcrumbs are included by &start_page |
|
$r->print(&Apache::loncommon::start_page('Custom Distribution Rights',$js) |
|
.&Apache::loncommon::head_subbox( |
|
&Apache::loncommon::CSTR_pageheader()) |
|
); |
$r->rflush(); |
$r->rflush(); |
|
|
my $uri=$r->uri; |
my $uri=$r->uri; |
my $fn=&Apache::lonnet::filelocation('',$uri); |
my $fn=&Apache::lonnet::filelocation('',$uri); |
my $contents=''; |
my $contents=''; |
my $constructmode=($uri=~/^\/\~/); |
my $constructmode=($uri=~ m{^/priv/}); |
|
if ($constructmode) { |
|
if (($crsauthor) && ($uri eq "/priv/$cdom/$cnum/default.rights")) { |
|
undef($constructmode); |
|
} |
|
} |
|
|
# ============================================================ Modify and store |
# ============================================================ Modify and store |
if ($constructmode) { |
if ($constructmode && $env{'form.store'}) { |
if ($env{'form.store'}) { |
|
my @newrules=(); |
my @newrules; |
undef @newrules; |
|
# read rules from form |
# read rules from form |
foreach (keys %env) { |
foreach my $key (keys(%env)) { |
if ($_=~/^form\.effect\_(\d+)$/) { |
next if ($key!~/^form\.effect\_(\d+)$/); |
my $number=$1; |
my $number=$1; |
my %rulehash=(); |
my %rulehash; |
foreach ('effect','domain','course','section','role') { |
foreach my $action ('effect','type','domain','course','section','role') { |
$rulehash{$_}=$env{'form.'.$_.'_'.$number}; |
$rulehash{$action}=$env{'form.'.$action.'_'.$number}; |
} |
} |
if ($rulehash{'role'} eq 'au') { |
if ($rulehash{'type'} !~ /^(user|course)$/) { |
$rulehash{'course'}=''; |
$rulehash{'type'} = 'course'; |
$rulehash{'section'}=''; |
} |
} |
if ($rulehash{'type'} eq 'user') { |
if ($rulehash{'role'} eq 'cc') { |
$rulehash{'section'}=''; |
$rulehash{'section'}=''; |
$rulehash{'role'}=''; |
} |
} |
unless (($rulehash{'effect'} eq 'deny') || |
if ($rulehash{'role'} eq 'au') { |
($rulehash{'effect'} eq 'allow')) { |
$rulehash{'course'}=''; |
$rulehash{'effect'}='deny'; |
$rulehash{'section'}=''; |
} |
} |
$rulehash{'domain'} = &LONCAPA::clean_domain($rulehash{'domain'}); |
if ($rulehash{'role'} eq 'cc') { |
$rulehash{'course'} = &LONCAPA::clean_courseid($rulehash{'course'}); |
$rulehash{'section'}=''; |
$rulehash{'section'}=~s/\W//g; |
} |
unless ($rulehash{'domain'}) { |
unless (($rulehash{'effect'} eq 'deny') || |
$rulehash{'domain'}=$env{'user.domain'}; |
($rulehash{'effect'} eq 'allow')) { |
} |
$rulehash{'effect'}='deny'; |
my $realm=''; |
} |
if ($number) { |
$rulehash{'domain'} = |
$realm=$rulehash{'domain'}; |
&LONCAPA::clean_domain($rulehash{'domain'}); |
if ($rulehash{'course'}) { |
if ($rulehash{'type'} eq 'course') { |
$realm.='_'.$rulehash{'course'}; |
$rulehash{'course'} = |
} |
&LONCAPA::clean_courseid($rulehash{'course'}); |
if ($rulehash{'section'}) { |
} else { |
$realm.='_'.$rulehash{'section'}; |
$rulehash{'course'} = |
} |
&LONCAPA::clean_username($rulehash{'course'}); |
} |
} |
$newrules[$number]=$rulehash{'effect'}.':'. |
$rulehash{'section'}=~s/\W//g; |
$realm.':'.$rulehash{'role'}; |
if (!$rulehash{'domain'}) { |
} |
$rulehash{'domain'}=$env{'user.domain'}; |
} |
} |
# edit actions? |
my $realm=''; |
foreach (keys %env) { |
my $separator = ($rulehash{'type'} eq 'course') ? '_' : '/'; |
if ($_=~/^form\.action\_(\d+)$/) { |
if ($number) { |
my $number=$1; |
$realm=$rulehash{'domain'}; |
if ($env{$_} eq 'delete') { $newrules[$number]=''; } |
if ($rulehash{'course'}) { |
if (($env{$_} eq 'moveup') && ($number>1)) { |
$realm.=$separator.$rulehash{'course'}; |
my $buffer=$newrules[$number]; |
|
$newrules[$number]=$newrules[$number-1]; |
|
$newrules[$number-1]=$buffer; |
|
} |
|
if (($env{$_} eq 'movedown') && ($number<$#newrules)) { |
|
my $buffer=$newrules[$number]; |
|
$newrules[$number]=$newrules[$number+1]; |
|
$newrules[$number+1]=$buffer; |
|
} |
|
if ($env{$_} eq 'insertabove') { |
|
for (my $i=$#newrules;$i>=$number;$i--) { |
|
$newrules[$i+1]=$newrules[$i]; |
|
} |
|
$newrules[$number]='deny'; |
|
} |
|
if ($env{$_} eq 'insertbelow') { |
|
for (my $i=$#newrules;$i>$number;$i--) { |
|
$newrules[$i+1]=$newrules[$i]; |
|
} |
|
$newrules[$number+1]='deny'; |
|
} |
|
} |
} |
} |
if ($rulehash{'section'}) { |
|
$realm.=$separator.$rulehash{'section'}; |
|
} |
|
} |
|
$newrules[$number]=$rulehash{'effect'}.':'. |
|
$realm.':'.$rulehash{'role'}.':'.$rulehash{'type'}; |
|
} |
|
# edit actions? |
|
foreach my $key (keys(%env)) { |
|
next if ($key!~/^form\.action\_(\d+)$/); |
|
my $number=$1; |
|
if ($env{$key} eq 'delete') { splice(@newrules,$number,1); } |
|
if (($env{$key} eq 'moveup') && ($number>1)) { |
|
@newrules[$number-1,$number] = @newrules[$number,$number-1]; |
|
} |
|
if (($env{$key} eq 'movedown') && ($number<$#newrules)) { |
|
@newrules[$number+1,$number] = @newrules[$number,$number+1]; |
|
} |
|
if ($env{$key} eq 'insertabove') { |
|
splice(@newrules,$number,0,'deny'); |
|
} |
|
if ($env{$key} eq 'insertbelow') { |
|
splice(@newrules,$number+1,0,'deny'); |
|
} |
|
} |
|
|
# store file |
# store file |
my $fh=Apache::File->new('>'.$fn); |
my $fh=Apache::File->new('>'.$fn); |
foreach (my $i=0;$i<=$#newrules;$i++) { |
foreach (my $i=0;$i<=$#newrules;$i++) { |
if ($newrules[$i]) { |
if ($newrules[$i]) { |
my ($effect,$realm,$role)=split(/\:/,$newrules[$i]); |
my ($effect,$realm,$role,$type)=split(/\:/,$newrules[$i]); |
print $fh |
print $fh |
"<accessrule effect='$effect' realm='$realm' role='$role' />\n"; |
"<accessrule effect='$effect' realm='$realm' role='$role' type='$type' />\n"; |
} |
} |
} |
|
$fh->close; |
|
} |
} |
|
$fh->close; |
} |
} |
# ============================================================ Read and display |
# ============================================================ Read and display |
unless ($constructmode) { |
unless ($constructmode) { |
Line 163 sub handler {
|
Line 203 sub handler {
|
$contents=join('',<$fh>); |
$contents=join('',<$fh>); |
$fh->close(); |
$fh->close(); |
} |
} |
$r->print('<form name="rules" method="post">'); |
$r->print('<form name="rules" method="post" action="">'); |
} |
} |
unless ($contents=~/\<accessrule/s) { |
unless ($contents=~/\<accessrule/s) { |
$contents='<accessrule effect="deny" />'; |
$contents='<accessrule effect="deny" />'; |
Line 172 sub handler {
|
Line 212 sub handler {
|
my $token; |
my $token; |
my $rulecounter=0; |
my $rulecounter=0; |
my $colzero=&mt($constructmode?'Edit action':'Rule'); |
my $colzero=&mt($constructmode?'Edit action':'Rule'); |
my %lt=&Apache::lonlocal::texthash('ef' => 'Effect', |
my %lt=&Apache::lonlocal::texthash( |
|
'ef' => 'Effect', |
|
'ty' => 'Type', |
'do' => 'Domain', |
'do' => 'Domain', |
'co' => 'Course', |
'co' => 'Course / User', |
'se' => 'Section', |
'se' => 'Section', |
'ro' => 'Role'); |
'ro' => 'Role'); |
|
my %iconimg = ('allow' => '<img src="/adm/lonIcons/navmap.correct.gif"' |
|
.' alt="'.&mt('allow').'" title="'.&mt('allow').'" />', |
|
'deny' => '<img src="/adm/lonIcons/navmap.wrong.gif"' |
|
.' alt="'.&mt('deny').'" title="'.&mt('deny').'" />'); |
# ---------------------------------------------------------- Start table output |
# ---------------------------------------------------------- Start table output |
$r->print(<<ENDSTARTTABLE); |
$r->print(&Apache::loncommon::start_data_table(). |
<table border="2"> |
&Apache::loncommon::start_data_table_header_row(). |
<tr><th>$colzero</th><th>$lt{'ef'}</th><th>$lt{'do'}</th><th>$lt{'co'}</th> |
"<th>$colzero</th><th>$lt{'ef'}</th><th>$lt{'ty'}</th><th>$lt{'do'}</th>". |
<th>$lt{'se'}</th><th>$lt{'ro'}</th></tr> |
"<th>$lt{'co'}</th><th>$lt{'se'}</th><th>$lt{'ro'}</th>". |
ENDSTARTTABLE |
&Apache::loncommon::end_data_table_header_row()); |
# --------------------------------------------------------------------- Default |
# --------------------------------------------------------------------- Default |
# Fast forward to first rule |
# Fast forward to first rule |
$token=$parser->get_token; |
$token=$parser->get_token; |
while ($token->[1] ne 'accessrule') { $token=$parser->get_token; } |
while ($token->[1] ne 'accessrule') { $token=$parser->get_token; } |
# print default |
# print default |
$r->print('<tr><td align="right">'); |
$r->print(&Apache::loncommon::start_data_table_row().'<td align="right">'); |
if ($constructmode) { |
if ($constructmode) { |
$r->print(&Apache::loncommon::select_form('','action_0', |
$r->print(&Apache::loncommon::select_form('','action_0', |
('' => '', |
{'' => '', |
'insertbelow' => 'Insert rule below '))); |
'insertbelow' => &mt('Insert rule below')})); |
|
|
} else { |
} else { |
$r->print(' '); |
$r->print(' '); |
} |
} |
$r->print('</td><td>'); |
$r->print('</td><td>'); |
|
$r->print($iconimg{$token->[2]->{'effect'}}); |
if ($constructmode) { |
if ($constructmode) { |
$r->print(&Apache::loncommon::select_form |
my %lt = &Apache::lonlocal::texthash |
($token->[2]->{'effect'},'effect_0', |
|
('allow' => 'allow', |
('allow' => 'allow', |
'deny' => 'deny'))); |
'deny' => 'deny'); |
} else { |
$r->print(&Apache::loncommon::select_form |
$r->print($token->[2]->{'effect'}); |
($token->[2]->{'effect'},'effect_0',\%lt)); |
} |
} |
$r->print('</td><td colspan="4">Default'); |
$r->print('</td><td colspan="5">'.&mt('Default')); |
if (($token->[2]->{'realm'}) || ($token->[2]->{'role'})) { |
if (($token->[2]->{'realm'}) || ($token->[2]->{'role'})) { |
$r->print(' - <font color="red">'.&mt('Error! No default set.'). |
$r->print(' - <span class="LC_error">'.&mt('Error! No default set.'). |
'</font>'); |
'</span>'); |
} |
} |
$r->print('</td></tr>'); |
$r->print('</td>'.&Apache::loncommon::end_data_table_row()); |
# Additional roles |
# Additional roles |
while ($token=$parser->get_token) { |
while ($token=$parser->get_token) { |
if (($token->[0] eq 'S') && ($token->[1] eq 'accessrule')) { |
if (($token->[0] eq 'S') && ($token->[1] eq 'accessrule')) { |
$rulecounter++; |
$rulecounter++; |
$r->print('<tr><td align="right" rowspan="2">'); |
$r->print(&Apache::loncommon::start_data_table_row(). |
|
'<td align="right" rowspan="2">'); |
# insert, delete, etc |
# insert, delete, etc |
$r->print($rulecounter.'. '); |
$r->print('<span class="LC_nobreak">'.$rulecounter.'. '); |
if ($constructmode) { |
if ($constructmode) { |
|
my %lt = &Apache::lonlocal::texthash |
|
('' => '', |
|
'delete' => 'Delete this rule', |
|
'insertabove' => 'Insert rule above', |
|
'insertbelow' => 'Insert rule below', |
|
'moveup' => 'Move rule up', |
|
'movedown' => 'Move rule down' |
|
); |
|
|
$r->print(&Apache::loncommon::select_form( |
$r->print(&Apache::loncommon::select_form( |
'','action_'.$rulecounter, |
'','action_'.$rulecounter,\%lt)); |
('' => '', |
|
'delete' => 'Delete this rule', |
|
'insertabove' => 'Insert rule above', |
|
'insertbelow' => 'Insert rule below ', |
|
'moveup' => 'Move rule up', |
|
'movedown' => 'Move rule down'))); |
|
} |
} |
$r->print('</td><td rowspan="2">'); |
$r->print('</span></td>'. |
|
'<td rowspan="2">'); |
# effect |
# effect |
|
$r->print($iconimg{$token->[2]->{'effect'}}); |
if ($constructmode) { |
if ($constructmode) { |
|
my %lt = &Apache::lonlocal::texthash |
|
('allow' => 'allow', |
|
'deny' => 'deny'); |
$r->print(&Apache::loncommon::select_form |
$r->print(&Apache::loncommon::select_form |
($token->[2]->{'effect'}, |
($token->[2]->{'effect'}, |
'effect_'.$rulecounter, |
'effect_'.$rulecounter,\%lt)); |
('allow' => 'allow', |
} |
'deny' => 'deny'))); |
|
|
# type |
|
$r->print('</td><td rowspan="2">'); |
|
my $type = ($token->[2]{'type'} || 'course'); |
|
if ($constructmode) { |
|
my %lt = &Apache::lonlocal::texthash |
|
('course' => 'Course', |
|
'user' => 'User'); |
|
$r->print(&Apache::loncommon::select_form($type, |
|
'type_'.$rulecounter,\%lt)); |
} else { |
} else { |
$r->print($token->[2]->{'effect'}); |
$r->print(&mt($type)); |
} |
} |
$r->print('</td><td>'); |
|
# ---- realm |
# ---- realm |
my $realm=$token->[2]->{'realm'}; |
my $realm=$token->[2]->{'realm'}; |
my ($rdom,$rcourse,$rsec)=split(/[\/\_]/,$realm); |
my ($rdom,$rcourse,$rsec); |
$rdom = &LONCAPA::clean_domain($rdom); |
if ($type eq 'course') { |
$rcourse = &LONCAPA::clean_courseid($rcourse); |
($rdom,$rcourse,$rsec) = split(m{[/_]},$realm,3); |
|
$rcourse = &LONCAPA::clean_courseid($rcourse); |
|
} else { |
|
($rdom,$rcourse,$rsec) = split(m{/},$realm,3); |
|
$rcourse = &LONCAPA::clean_username($rcourse); |
|
} |
|
$r->print('</td><td>'); |
# realm domain |
# realm domain |
if ($constructmode) { |
if ($constructmode) { |
unless ($rdom) { $rdom=$env{'user.domain'}; } |
unless ($rdom) { $rdom=$env{'user.domain'}; } |
Line 257 ENDSTARTTABLE
|
Line 327 ENDSTARTTABLE
|
$r->print('</td><td>'); |
$r->print('</td><td>'); |
# realm course |
# realm course |
if ($constructmode) { |
if ($constructmode) { |
$r->print('<input input type="text" size="25" name="course_'. |
$r->print('<input type="text" size="25" name="course_'. |
$rulecounter.'" value="'.$rcourse.'" />'); |
$rulecounter.'" value="'.$rcourse.'" />'); |
} else { |
} else { |
$r->print($rcourse); |
$r->print($rcourse); |
} |
} |
|
|
$r->print('</td><td>'); |
$r->print('</td><td rowspan="2">'); |
# realm section |
# realm section |
if ($constructmode) { |
if ($type eq 'course') { |
$r->print('<input input type="text" size="5" name="section_'. |
if ($constructmode) { |
$rulecounter.'" value="'.$rsec.'" />'); |
$r->print('<input type="text" size="5" name="section_'. |
} else { |
$rulecounter.'" value="'.$rsec.'" />'); |
$r->print($rsec); |
} else { |
} |
$r->print($rsec); |
|
} |
|
} |
|
|
$r->print('</td><td rowspan="2">'); |
$r->print('</td><td rowspan="2">'); |
# role |
# role |
if ($constructmode) { |
if ($type eq 'course') { |
my %hash=('' => ''); |
if ($constructmode) { |
foreach ('au','cc','in','ta','st') { |
my %hash=('' => ''); |
$hash{$_}=&Apache::lonnet::plaintext($_); |
foreach ('au','cc','in','ta','st') { |
} |
$hash{$_}=&Apache::lonnet::plaintext($_); |
my $role=$token->[2]->{'role'}; |
} |
unless ($role) { $role=''; } |
my $role=$token->[2]->{'role'}; |
$r->print(&Apache::loncommon::select_form( |
unless ($role) { $role=''; } |
$role,'role_'.$rulecounter,%hash)); |
$r->print(&Apache::loncommon::select_form( |
} else { |
$role,'role_'.$rulecounter,\%hash)); |
$r->print(&Apache::lonnet::plaintext($token->[2]->{'role'})); |
} else { |
} |
$r->print(&Apache::lonnet::plaintext($token->[2]->{'role'})); |
|
} |
|
} |
# course selection link |
# course selection link |
$r->print('</td></tr><tr><td colspan="3" align="right">'); |
$r->print('</td>'. |
if ($rcourse) { |
&Apache::loncommon::end_data_table_row(). |
my %descript= |
&Apache::loncommon::continue_data_table_row(). |
&Apache::lonnet::coursedescription($rdom.'_'.$rcourse, |
'<td colspan="2" align="right">'); |
{'one_time' => 1}); |
if ($type eq 'course') { |
$r->print($descript{'description'}.' '); |
if ($rcourse) { |
} |
my %descript= |
if ($constructmode) { |
&Apache::lonnet::coursedescription($rdom.'_'.$rcourse, |
$r->print(&Apache::loncommon::selectcourse_link('rules', |
{'one_time' => 1}); |
'course_'.$rulecounter,'domain_'.$rulecounter)); |
$r->print($descript{'description'}.' '); |
|
} |
|
if ($constructmode) { |
|
$r->print(&Apache::loncommon::selectcourse_link('rules', |
|
'course_'.$rulecounter,'domain_'.$rulecounter)); |
|
} |
|
} else { |
|
if ($rcourse) { |
|
my $name = &Apache::loncommon::plainname($rcourse,$rdom); |
|
$r->print($name.' '); |
|
} |
|
if ($constructmode) { |
|
$r->print(&Apache::loncommon::selectstudent_link('rules','course_'.$rulecounter,'domain_'.$rulecounter)); |
|
} |
} |
} |
# close row |
# close row |
$r->print('</td></tr>'); |
$r->print('</td>'.&Apache::loncommon::end_data_table_row()); |
} |
} |
} |
} |
$r->print('</table>'); |
$r->print(&Apache::loncommon::end_data_table()); |
# ------------------------------------------------------------ End table output |
# ------------------------------------------------------------ End table output |
if ($constructmode) { |
if ($constructmode) { |
$r->print('<input type="submit" name="store" value="'.&mt('Save').'" /></form>'); |
$r->print('<input type="submit" name="store" value="'.&mt('Save').'" /></form>'); |