'.&mt('Passphrase-protected files do not require log-in, but will require the viewer to enter the passphrase you set.');
$info .= '
'.&explain_conditionals();
$info .= '
'.
- &mt('A listing of files viewable without log-in is available at: ')."".&Apache::lonnet::absolute_url($ENV{'SERVER_NAME'})."/adm/$udom/$uname/aboutme/portfolio. ";
+ &mt('A listing of files viewable without log-in is available at: ')."".&Apache::lonnet::absolute_url()."/adm/$udom/$uname/aboutme/portfolio. ";
if ($group eq '') {
$info .= &mt("For logged in users a 'Display file listing' link will also appear (when there are viewable files) on your personal information page:");
} else {
$info .= &mt("For logged in users a 'Display file listing' link will also appear (when there are viewable files) on the course information page:");
}
- $info .= " ".&Apache::lonnet::absolute_url($ENV{'SERVER_NAME'})."/adm/$udom/$uname/aboutme ";
+ $info .= " ".&Apache::lonnet::absolute_url()."/adm/$udom/$uname/aboutme ";
if ($group ne '') {
- $info .= &mt("Users with privileges to edit course contents may add a course information page to a course using the 'Course Info' button in DOCS").' ';
+ $info .= &mt("Users with course editing rights may add a 'Group Portfolio' item using the Course Editor (Collaboration tab), to provide access to viewable group portfolio files.").' ';
}
} else {
$header = '
'.&mt('Conditional access controls for file: [_1]',$port_path.$env{'form.currentpath'}.$env{'form.access'}).'
'.
@@ -942,9 +947,11 @@ sub display_access {
sub explain_conditionals {
return
- &mt('Conditional files are accessible to logged-in users with accounts in the LON-CAPA network, who satisfy the conditions you set.').' '."\n".
- &mt('The conditions can include affiliation with a particular course or community, or a user account in a specific domain.').' '."\n".
- &mt('Alternatively access can be granted to people with specific LON-CAPA usernames and domains.');
+ &mt('Conditional files are accessible to users who satisfy the conditions you set.').'
'.
+ '
'.&mt('Conditions can be IP-based, in which case no log-in is required').'
'.
+ '
'.&mt("Conditions can also be based on a user's status, in which case the user needs an account in the LON-CAPA network, and needs to be logged in.").' '."\n".
+ &mt('The status-based conditions can include affiliation with a particular course or community, or a user account in a specific domain.').' '."\n".
+ &mt('Alternatively access can be granted to people with specific LON-CAPA usernames and domains.').'
';
}
sub view_access_settings {
@@ -985,8 +992,9 @@ sub build_access_summary {
domains => 'Conditional: domain-based',
users => 'Conditional: user-based',
course => 'Conditional: course/community-based',
+ ip => 'Conditional: IP-based',
);
- my @allscopes = ('public','guest','domains','users','course');
+ my @allscopes = ('public','guest','domains','users','course','ip');
foreach my $scope (@allscopes) {
if ((!(exists($todisplay{$scope}))) || (ref($todisplay{$scope}) ne 'HASH')) {
next;
@@ -1063,6 +1071,9 @@ sub build_access_summary {
} elsif ($scope eq 'users') {
my $curr_user_list = &sort_users($content->{'users'});
$r->print(&mt('Users: ').$curr_user_list);
+ } elsif ($scope eq 'ip') {
+ my $curr_ips_list = &sort_ips($content->{'ip'});
+ $r->print(&mt('IP(s):').' '.$curr_ips_list);
} else {
$r->print(' ');
}
@@ -1171,7 +1182,7 @@ sub update_access {
my $totalnew = 0;
my $status = 'new';
my ($firstitem,$lastitem);
- my @types = ('course','domains','users');
+ my @types = ('course','domains','users','ip');
foreach my $newitem (@types) {
$allnew += $env{'form.new'.$newitem};
}
@@ -1179,24 +1190,30 @@ sub update_access {
my $now = time;
my $then = $now + (60*60*24*180); # six months approx.
&open_form($r,$url);
- my %showtypes = &Apache::lonlocal::texthash (
+ my %showtypes = (
course => 'course/community',
domains => 'domain',
users => 'user',
+ ip => 'IP',
);
foreach my $newitem (@types) {
- if ($env{'form.new'.$newitem} > 0) {
- $r->print(' '.&mt('Add new [_1]-based[_2] access control for portfolio file: [_3]',''.$showtypes{$newitem},'',''.$env{'form.currentpath'}.$env{'form.selectfile'}.'').'
'.&mt("Format for users' username:domain information:").' sparty:msu,illini:uiuc ... etc.
'.&dateboxes($num,$start,$end).'
');
}
+sub ips_row {
+ my ($r,$status,$item,$access_controls,$now,$then) = @_;
+ my ($num,$scope,$end,$start) = &set_identifiers($status,$item,$now,$then,
+ 'ip');
+ my $curr_ips_list;
+ if ($status eq 'old') {
+ my $content = $$access_controls{$item};
+ $curr_ips_list = &sort_ips($content->{'ip'});
+ }
+ $r->print('
'.&actionbox($status,$num,$scope).'
'.&mt('Format for IP controls').' '.
+ &mt('[_1] or [_2] or [_3] or [_4] or [_5]','35.8.*','35.8.3.[34-56]',
+ '*.msu.edu','35.8.3.34','somehostname.pa.msu.edu').' '.
+ &mt('Use a comma to separate different ranges.').''.
+ '
'.
+ '
'.&dateboxes($num,$start,$end).'
');
+}
+
sub additional_item {
my ($type) = @_;
my $showtype;
if ($type eq 'course') {
- $showtype = &mt('course/community');
+ $showtype = 'course/community';
} elsif ($type eq 'domains') {
- $showtype = &mt('domains');
+ $showtype = 'domain';
} elsif ($type eq 'users') {
- $showtype = &mt('users');
+ $showtype = 'user';
+ } elsif ($type eq 'ip') {
+ $showtype = 'IP';
}
- my $output = &mt('Add new [_1] condition(s)?',$showtype).' '.&mt('Number to add: ').'';
- return $output;
+ return
+ &mt('Add new '.$showtype.'-based condition(s)?')
+ .' '.&mt('Number to add: ')
+ .'';
}
sub actionbox {
@@ -1712,7 +1772,7 @@ sub actionbox {
my $output = '';
+ $output .= '';
return $output;
}
@@ -2389,7 +2449,7 @@ sub get_group_quota {
if (%curr_groups) {
my %group_info = &Apache::longroup::get_group_settings(
$curr_groups{$group});
- $group_quota = $group_info{'quota'}; #expressed in Mb
+ $group_quota = $group_info{'quota'}; #expressed in MB
if ($group_quota) {
$group_quota = 1000 * $group_quota; #expressed in k
}
@@ -2489,13 +2549,15 @@ sub coursegrp_portfolio_header {
}
&Apache::lonhtmlcommon::add_breadcrumb
({href=>"/adm/$cdom/$cnum/$env{'form.group'}/smppg?ref=$env{'form.ref'}",
- text=>"$ucgpterm: $grp_desc",
- title=>"Go to group's home page"},
+ text=>&mt('Group').": $grp_desc",
+ title=>&mt("Go to group's home page"),
+ no_mt=>1},
{href=>"/adm/coursegrp_portfolio?".&group_args(),
text=>"Group Portfolio",
title=>"Display group portfolio"});
my $output = &Apache::lonhtmlcommon::breadcrumbs(
- &mt('[_1] portfolio files - [_2]',$gpterm,$grp_desc));
+ &mt('Group portfolio files - [_1]',$grp_desc),
+ undef,undef,undef,undef,1);
return $output;
}
@@ -2511,8 +2573,8 @@ sub get_quota {
}
} else {
$disk_quota = &Apache::loncommon::get_user_quota($env{'user.name'},
- $env{'user.domain'}); #expressed in Mb
- $disk_quota = 1000 * $disk_quota; # convert from Mb to kb
+ $env{'user.domain'}); #expressed in MB
+ $disk_quota = 1024 * $disk_quota; # convert from MB to kB
}
return $disk_quota;
}
@@ -2542,6 +2604,58 @@ STATE
return $state;
}
+# Find space available in a user's portfolio (convert to bytes)
+sub free_space {
+ my ($group) = @_;
+ my $disk_quota = &get_quota($group); # Expressed in kB
+ my ($uname,$udom) = &get_name_dom($group);
+ my $portfolio_root = &get_portfolio_root();
+ my $getpropath = 1;
+ my $current_disk_usage = &Apache::lonnet::diskusage($udom, $uname,
+ $portfolio_root, $getpropath); # Expressed in kB
+ my $free_space = 1024 * ($disk_quota - $current_disk_usage);
+ return $free_space;
+}
+
+sub valid_container {
+ my ($uname,$udom,$group) = @_;
+ my $container_prefix;
+ if ($group ne '') {
+ $container_prefix = "/uploaded/$udom/$uname/groups/$group/portfolio";
+ } else {
+ $container_prefix = "/uploaded/$udom/$uname/portfolio";
+ }
+ if ($env{'form.currentpath'}) {
+ $container_prefix .= $env{'form.currentpath'};
+ } else {
+ $container_prefix .= '/';
+ }
+ if ($env{'form.container'} =~ m{^\Q$container_prefix\E(.+)$}) {
+ my $filename = $1;
+ if ($filename eq &Apache::lonnet::clean_filename($filename)) {
+ return 1;
+ }
+ }
+ return;
+}
+
+sub invalid_parms {
+ my ($r,$url,$currentpath) = @_;
+ my $escpath = &HTML::Entities::encode($currentpath,'&<>"');
+ my $rtnlink = ''.&mt('Return to directory').'';
+ $r->print('
'.&mt('Action disallowed').'
');
+ $r->print(&mt('Some of the data included with this request were invalid'));
+ $r->print(' '.$rtnlink);
+ return;
+}
+
sub handler {
# this handles file management
my $r = shift;
@@ -2615,7 +2729,7 @@ sub handler {
} else {
($uname,$udom) = &get_name_dom();
$portfolio_root = &get_portfolio_root();
- $title = &mt('My Space');
+ $title = 'My Space';
$can_modify = 1;
$can_delete = 1;
$can_upload = 1;
@@ -2629,16 +2743,19 @@ sub handler {
# Give the LON-CAPA page header
my $brcrum = [{href=>"/adm/portfolio",text=>"Portfolio Manager"}];
+ my $js = '';
+
if ($env{"form.mode"} eq 'selectfile'){
- $r->print(&Apache::loncommon::start_page($title,undef,
+ $r->print(&Apache::loncommon::start_page($title, $js,
{'only_body' => 1}));
} elsif ($env{'form.action'} eq 'rolepicker') {
- $r->print(&Apache::loncommon::start_page('New role-based condition',undef,
+ $r->print(&Apache::loncommon::start_page('New role-based condition', $js,
{'no_nav_bar' => 1, }));
} elsif ($caller eq 'coursegrp_portfolio') {
- $r->print(&Apache::loncommon::start_page($title));
+ $r->print(&Apache::loncommon::start_page($title, $js));
} else {
- $r->print(&Apache::loncommon::start_page($title,undef,
+ $r->print(&Apache::loncommon::start_page($title, $js,
{'bread_crumbs' => $brcrum}));
if (!&Apache::lonnet::usertools_access($uname,$udom,'portfolio')) {
$r->print('
'.&mt('No user portfolio available') .'
'.
@@ -2652,8 +2769,9 @@ sub handler {
}
$r->rflush();
# Check if access to portfolio is blocked by one or more blocking events in courses.
+ my $clientip = &Apache::lonnet::get_requestor_ip($r);
my ($blocked,$blocktext) =
- &Apache::loncommon::blocking_status('port',$uname,$udom);
+ &Apache::loncommon::blocking_status('port',$clientip,$uname,$udom);
if ($blocked) {
my $evade_block;
# If portfolio display is in a window popped up from a "Select Portfolio Files"
@@ -2688,6 +2806,21 @@ sub handler {
return OK;
}
}
+ if (($env{'form.currentpath'}) && ($env{'form.currentpath'} ne '/')) {
+ my $clean_currentpath = '/'.&Apache::loncommon::clean_path($env{'form.currentpath'}).'/';
+ unless ($env{'form.currentpath'} eq $clean_currentpath) {
+ &invalid_parms($r,$url);
+ $r->print(&Apache::loncommon::end_page());
+ return OK;
+ }
+ }
+ if ($env{'form.container'}) {
+ unless (&valid_container($uname,$udom,$group)) {
+ &invalid_parms($r,$url,$env{'form.currentpath'});
+ $r->print(&Apache::loncommon::end_page());
+ return OK;
+ }
+ }
if (($env{'form.storeupl'}) & (!$env{'form.uploaddoc.filename'})){
$r->print(
'
'
@@ -2700,7 +2833,7 @@ sub handler {
}
if ($env{'form.meta'}) {
&open_form($r,$url);
- $r->print(&mt('Edit the meta data').' ');
+ $r->print(&mt('Edit Metadata').' ');
&close_form($r,$url);
}
if ($env{'form.uploaddoc.filename'}) {