version 1.489.2.23, 2016/09/24 19:16:57
|
version 1.489.2.27, 2017/03/20 03:21:08
|
Line 1429 sub du2_handler {
|
Line 1429 sub du2_handler {
|
# If the requested path contains /../ or is: |
# If the requested path contains /../ or is: |
# |
# |
# 1. for a directory, and the path does not begin with one of: |
# 1. for a directory, and the path does not begin with one of: |
# (a) /home/httpd/html/res/<domain>/ |
# (a) /home/httpd/html/res/<domain> |
# (b) /home/httpd/html/res/userfiles/ |
# (b) /home/httpd/html/res/userfiles/ |
# (c) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/userfiles |
# (c) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/userfiles |
# or is: |
# or is: |
Line 1466 sub ls_handler {
|
Line 1466 sub ls_handler {
|
} |
} |
if (-e $ulsdir) { |
if (-e $ulsdir) { |
if(-d $ulsdir) { |
if(-d $ulsdir) { |
unless (($ulsdir =~ m{/home/httpd/html/(res/$LONCAPA::match_domain|userfiles)/}) || |
unless (($ulsdir =~ m{/home/httpd/html/(res/$LONCAPA::match_domain|userfiles/)}) || |
($ulsdir =~ m{/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_username/userfiles/})) { |
($ulsdir =~ m{/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_username/userfiles/})) { |
&Failure($client,"refused\n",$userinput); |
&Failure($client,"refused\n",$userinput); |
return 1; |
return 1; |
Line 1526 sub ls_handler {
|
Line 1526 sub ls_handler {
|
# If the requested path contains /../ or is: |
# If the requested path contains /../ or is: |
# |
# |
# 1. for a directory, and the path does not begin with one of: |
# 1. for a directory, and the path does not begin with one of: |
# (a) /home/httpd/html/res/<domain>/ |
# (a) /home/httpd/html/res/<domain> |
# (b) /home/httpd/html/res/userfiles/ |
# (b) /home/httpd/html/res/userfiles/ |
# (c) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/userfiles |
# (c) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/userfiles |
# or is: |
# or is: |
Line 1562 sub ls2_handler {
|
Line 1562 sub ls2_handler {
|
} |
} |
if (-e $ulsdir) { |
if (-e $ulsdir) { |
if(-d $ulsdir) { |
if(-d $ulsdir) { |
unless (($ulsdir =~ m{/home/httpd/html/(res/$LONCAPA::match_domain|userfiles)/}) || |
unless (($ulsdir =~ m{/home/httpd/html/(res/$LONCAPA::match_domain|userfiles/)}) || |
($ulsdir =~ m{/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_username/userfiles/})) { |
($ulsdir =~ m{/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_username/userfiles/})) { |
&Failure($client,"refused\n","$userinput"); |
&Failure($client,"refused\n","$userinput"); |
return 1; |
return 1; |
Line 1615 sub ls2_handler {
|
Line 1615 sub ls2_handler {
|
# If the requested path (after prepending) contains /../ or is: |
# If the requested path (after prepending) contains /../ or is: |
# |
# |
# 1. for a directory, and the path does not begin with one of: |
# 1. for a directory, and the path does not begin with one of: |
# (a) /home/httpd/html/res/<domain>/ |
# (a) /home/httpd/html/res/<domain> |
# (b) /home/httpd/html/res/userfiles/ |
# (b) /home/httpd/html/res/userfiles/ |
# (c) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/userfiles |
# (c) /home/httpd/lonUsers/<domain>/<1>/<2>/<3>/<username>/userfiles |
# (d) /home/httpd/html/priv/<domain>/ and client is the homeserver |
# (d) /home/httpd/html/priv/<domain>/ and client is the homeserver |
Line 1700 sub ls3_handler {
|
Line 1700 sub ls3_handler {
|
if (-e $ulsdir) { |
if (-e $ulsdir) { |
if(-d $ulsdir) { |
if(-d $ulsdir) { |
unless (($getpropath) || ($getuserdir) || |
unless (($getpropath) || ($getuserdir) || |
($ulsdir =~ m{/home/httpd/html/(res/$LONCAPA::match_domain|userfiles)/}) || |
($ulsdir =~ m{/home/httpd/html/(res/$LONCAPA::match_domain|userfiles/)}) || |
($ulsdir =~ m{/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_username/userfiles/}) || |
($ulsdir =~ m{/home/httpd/lonUsers/$LONCAPA::match_domain(?:/[\w\-.@]){3}/$LONCAPA::match_username/userfiles/}) || |
(($ulsdir =~ m{/home/httpd/html/priv/$LONCAPA::match_domain/}) && ($islocal))) { |
(($ulsdir =~ m{/home/httpd/html/priv/$LONCAPA::match_domain/}) && ($islocal))) { |
&Failure($client,"refused\n",$userinput); |
&Failure($client,"refused\n",$userinput); |
Line 2151 sub hash_passwd {
|
Line 2151 sub hash_passwd {
|
my $plainsalt = substr($rest[1],0,22); |
my $plainsalt = substr($rest[1],0,22); |
$salt = Crypt::Eksblowfish::Bcrypt::de_base64($plainsalt); |
$salt = Crypt::Eksblowfish::Bcrypt::de_base64($plainsalt); |
} else { |
} else { |
my $defaultcost; |
my %domdefaults = &Apache::lonnet::get_domain_defaults($domain); |
my %domconfig = |
my $defaultcost = $domdefaults{'intauth_cost'}; |
&Apache::lonnet::get_dom('configuration',['password'],$domain); |
|
if (ref($domconfig{'password'}) eq 'HASH') { |
|
$defaultcost = $domconfig{'password'}{'cost'}; |
|
} |
|
if (($defaultcost eq '') || ($defaultcost =~ /D/)) { |
if (($defaultcost eq '') || ($defaultcost =~ /D/)) { |
$cost = 10; |
$cost = 10; |
} else { |
} else { |
Line 3794 sub send_query_handler {
|
Line 3790 sub send_query_handler {
|
|
|
my ($query,$arg1,$arg2,$arg3)=split(/\:/,$tail); |
my ($query,$arg1,$arg2,$arg3)=split(/\:/,$tail); |
$query=~s/\n*$//g; |
$query=~s/\n*$//g; |
|
if (($query eq 'usersearch') || ($query eq 'instdirsearch')) { |
|
my $usersearchconf = &get_usersearch_config($currentdomainid,'directorysrch'); |
|
my $earlyout; |
|
if (ref($usersearchconf) eq 'HASH') { |
|
if ($currentdomainid eq $clienthomedom) { |
|
if ($query eq 'usersearch') { |
|
if ($usersearchconf->{'lcavailable'} eq '0') { |
|
$earlyout = 1; |
|
} |
|
} else { |
|
if ($usersearchconf->{'available'} eq '0') { |
|
$earlyout = 1; |
|
} |
|
} |
|
} else { |
|
if ($query eq 'usersearch') { |
|
if ($usersearchconf->{'lclocalonly'}) { |
|
$earlyout = 1; |
|
} |
|
} else { |
|
if ($usersearchconf->{'localonly'}) { |
|
$earlyout = 1; |
|
} |
|
} |
|
} |
|
} |
|
if ($earlyout) { |
|
&Reply($client, "query_not_authorized\n"); |
|
return 1; |
|
} |
|
} |
&Reply($client, "". &sql_reply("$clientname\&$query". |
&Reply($client, "". &sql_reply("$clientname\&$query". |
"\&$arg1"."\&$arg2"."\&$arg3")."\n", |
"\&$arg1"."\&$arg2"."\&$arg3")."\n", |
$userinput); |
$userinput); |
Line 5463 sub auto_export_grades_handler {
|
Line 5490 sub auto_export_grades_handler {
|
# $cmd - The command that got us dispatched. |
# $cmd - The command that got us dispatched. |
# $tail - The tail of the command. In our case this is a colon |
# $tail - The tail of the command. In our case this is a colon |
# separated list that will be split into: |
# separated list that will be split into: |
# $filename - The name of the file to remove. |
# $filename - The name of the file to retrieve. |
# The filename is given as a path relative to |
# The filename is given as a path relative to |
# the LonCAPA temp file directory. |
# the LonCAPA temp file directory. |
# $client - Socket open on the client. |
# $client - Socket open on the client. |
Line 5479 sub retrieve_auto_file_handler {
|
Line 5506 sub retrieve_auto_file_handler {
|
my $source = $perlvar{'lonDaemons'}.'/tmp/'.$filename; |
my $source = $perlvar{'lonDaemons'}.'/tmp/'.$filename; |
if ($filename =~m{/\.\./}) { |
if ($filename =~m{/\.\./}) { |
&Failure($client, "refused\n", $userinput); |
&Failure($client, "refused\n", $userinput); |
|
} elsif ($filename !~ /^$LONCAPA::match_domain\_$LONCAPA::match_courseid\_.+_classlist\.xml$/) { |
|
&Failure($client, "refused\n", $userinput); |
} elsif ( (-e $source) && ($filename ne '') ) { |
} elsif ( (-e $source) && ($filename ne '') ) { |
my $reply = ''; |
my $reply = ''; |
if (open(my $fh,$source)) { |
if (open(my $fh,$source)) { |
Line 6936 sub make_new_child {
|
Line 6965 sub make_new_child {
|
."Attempted insecure connection disallowed </font>"); |
."Attempted insecure connection disallowed </font>"); |
close $client; |
close $client; |
$clientok = 0; |
$clientok = 0; |
|
|
} |
} |
} |
} |
} else { |
} else { |
Line 6945 sub make_new_child {
|
Line 6973 sub make_new_child {
|
."$clientip failed to initialize: >$remotereq< </font>"); |
."$clientip failed to initialize: >$remotereq< </font>"); |
&status('No init '.$clientip); |
&status('No init '.$clientip); |
} |
} |
|
|
} else { |
} else { |
&logthis( |
&logthis( |
"<font color='blue'>WARNING: Unknown client $clientip</font>"); |
"<font color='blue'>WARNING: Unknown client $clientip</font>"); |
Line 7103 sub password_filename {
|
Line 7130 sub password_filename {
|
# domain - domain of the user. |
# domain - domain of the user. |
# name - User's name. |
# name - User's name. |
# contents - New contents of the file. |
# contents - New contents of the file. |
|
# saveold - (optional). If true save old file in a passwd.bak file. |
# Returns: |
# Returns: |
# 0 - Failed. |
# 0 - Failed. |
# 1 - Success. |
# 1 - Success. |
# |
# |
sub rewrite_password_file { |
sub rewrite_password_file { |
my ($domain, $user, $contents) = @_; |
my ($domain, $user, $contents, $saveold) = @_; |
|
|
my $file = &password_filename($domain, $user); |
my $file = &password_filename($domain, $user); |
if (defined $file) { |
if (defined $file) { |
|
if ($saveold) { |
|
my $bakfile = $file.'.bak'; |
|
if (CopyFile($file,$bakfile)) { |
|
chmod(0400,$bakfile); |
|
&logthis("Old password saved in passwd.bak for internally authenticated user: $user:$domain"); |
|
} else { |
|
&logthis("Failed to save old password in passwd.bak for internally authenticated user: $user:$domain"); |
|
} |
|
} |
my $pf = IO::File->new(">$file"); |
my $pf = IO::File->new(">$file"); |
if($pf) { |
if($pf) { |
print $pf "$contents\n"; |
print $pf "$contents\n"; |
Line 7202 sub validate_user {
|
Line 7239 sub validate_user {
|
$contentpwd = $domdefaults{'auth_arg_def'}; |
$contentpwd = $domdefaults{'auth_arg_def'}; |
} |
} |
} |
} |
} |
} |
if ($howpwd ne 'nouser') { |
if ($howpwd ne 'nouser') { |
if($howpwd eq "internal") { # Encrypted is in local password file. |
if($howpwd eq "internal") { # Encrypted is in local password file. |
if (length($contentpwd) == 13) { |
if (length($contentpwd) == 13) { |
$validated = (crypt($password,$contentpwd) eq $contentpwd); |
$validated = (crypt($password,$contentpwd) eq $contentpwd); |
if ($validated) { |
if ($validated) { |
my $ncpass = &hash_passwd($domain,$password); |
my %domdefaults = &Apache::lonnet::get_domain_defaults($domain); |
if (&rewrite_password_file($domain,$user,"$howpwd:$ncpass")) { |
if ($domdefaults{'intauth_switch'}) { |
&update_passwd_history($user,$domain,$howpwd,'conversion'); |
my $ncpass = &hash_passwd($domain,$password); |
&logthis("Validated password hashed with bcrypt for $user:$domain"); |
my $saveold; |
|
if ($domdefaults{'intauth_switch'} == 2) { |
|
$saveold = 1; |
|
} |
|
if (&rewrite_password_file($domain,$user,"$howpwd:$ncpass",$saveold)) { |
|
&update_passwd_history($user,$domain,$howpwd,'conversion'); |
|
&logthis("Validated password hashed with bcrypt for $user:$domain"); |
|
} |
} |
} |
} |
} |
} else { |
} else { |
$validated = &check_internal_passwd($password,$contentpwd,$domain); |
$validated = &check_internal_passwd($password,$contentpwd,$domain,$user); |
} |
} |
} |
} |
elsif ($howpwd eq "unix") { # User is a normal unix user. |
elsif ($howpwd eq "unix") { # User is a normal unix user. |
Line 7285 sub validate_user {
|
Line 7329 sub validate_user {
|
} |
} |
|
|
sub check_internal_passwd { |
sub check_internal_passwd { |
my ($plainpass,$stored,$domain) = @_; |
my ($plainpass,$stored,$domain,$user) = @_; |
my (undef,$method,@rest) = split(/!/,$stored); |
my (undef,$method,@rest) = split(/!/,$stored); |
if ($method eq "bcrypt") { |
if ($method eq 'bcrypt') { |
my $result = &hash_passwd($domain,$plainpass,@rest); |
my $result = &hash_passwd($domain,$plainpass,@rest); |
if ($result ne $stored) { |
if ($result ne $stored) { |
return 0; |
return 0; |
} |
} |
# Upgrade to a larger number of rounds if necessary |
my %domdefaults = &Apache::lonnet::get_domain_defaults($domain); |
my $defaultcost; |
if ($domdefaults{'intauth_check'}) { |
my %domconfig = |
# Upgrade to a larger number of rounds if necessary |
&Apache::lonnet::get_dom('configuration',['password'],$domain); |
my $defaultcost = $domdefaults{'intauth_cost'}; |
if (ref($domconfig{'password'}) eq 'HASH') { |
if (($defaultcost eq '') || ($defaultcost =~ /D/)) { |
$defaultcost = $domconfig{'password'}{'cost'}; |
$defaultcost = 10; |
} |
} |
if (($defaultcost eq '') || ($defaultcost =~ /D/)) { |
if (int($rest[0])<int($defaultcost)) { |
$defaultcost = 10; |
if ($domdefaults{'intauth_check'} == 1) { |
|
my $ncpass = &hash_passwd($domain,$plainpass); |
|
if (&rewrite_password_file($domain,$user,"internal:$ncpass")) { |
|
&update_passwd_history($user,$domain,'internal','update cost'); |
|
&logthis("Validated password hashed with bcrypt for $user:$domain"); |
|
} |
|
return 1; |
|
} elsif ($domdefaults{'intauth_check'} == 2) { |
|
return 0; |
|
} |
|
} |
|
} else { |
|
return 1; |
} |
} |
return 1 unless($rest[0]<$defaultcost); |
|
} |
} |
return 0; |
return 0; |
} |
} |
Line 7732 sub get_usersession_config {
|
Line 7787 sub get_usersession_config {
|
return; |
return; |
} |
} |
|
|
|
sub get_usersearch_config { |
|
my ($dom,$name) = @_; |
|
my ($usersearchconf,$cached)=&Apache::lonnet::is_cached_new($name,$dom); |
|
if (defined($cached)) { |
|
return $usersearchconf; |
|
} else { |
|
my %domconfig = &Apache::lonnet::get_dom('configuration',['directorysrch'],$dom); |
|
&Apache::lonnet::do_cache_new($name,$dom,$domconfig{'directorysrch'},3600); |
|
return $domconfig{'directorysrch'}; |
|
} |
|
return; |
|
} |
|
|
sub distro_and_arch { |
sub distro_and_arch { |
return $dist.':'.$arch; |
return $dist.':'.$arch; |