version 1.5, 2013/07/24 18:21:52
|
version 1.10, 2017/05/18 22:13:52
|
Line 37 use lib '/home/httpd/lib/perl/';
|
Line 37 use lib '/home/httpd/lib/perl/';
|
use LONCAPA; |
use LONCAPA; |
use Apache::lonnet; |
use Apache::lonnet; |
use GDBM_File; |
use GDBM_File; |
|
use Crypt::OpenSSL::X509; |
|
|
|
|
sub dump_with_regexp { |
sub dump_with_regexp { |
Line 333 sub dump_course_id_handler {
|
Line 334 sub dump_course_id_handler {
|
my ($udom,$since,$description,$instcodefilter,$ownerfilter,$coursefilter, |
my ($udom,$since,$description,$instcodefilter,$ownerfilter,$coursefilter, |
$typefilter,$regexp_ok,$rtn_as_hash,$selfenrollonly,$catfilter,$showhidden, |
$typefilter,$regexp_ok,$rtn_as_hash,$selfenrollonly,$catfilter,$showhidden, |
$caller,$cloner,$cc_clone_list,$cloneonly,$createdbefore,$createdafter, |
$caller,$cloner,$cc_clone_list,$cloneonly,$createdbefore,$createdafter, |
$creationcontext,$domcloner) = split(/:/,$tail); |
$creationcontext,$domcloner,$hasuniquecode,$reqcrsdom,$reqinstcode) = split(/:/,$tail); |
my $now = time; |
my $now = time; |
my ($cloneruname,$clonerudom,%cc_clone); |
my ($cloneruname,$clonerudom,%cc_clone); |
if (defined($description)) { |
if (defined($description)) { |
Line 406 sub dump_course_id_handler {
|
Line 407 sub dump_course_id_handler {
|
} else { |
} else { |
$creationcontext = '.'; |
$creationcontext = '.'; |
} |
} |
|
unless ($hasuniquecode) { |
|
$hasuniquecode = '.'; |
|
} |
|
if ($reqinstcode ne '') { |
|
$reqinstcode = &unescape($reqinstcode); |
|
} |
my $unpack = 1; |
my $unpack = 1; |
if ($description eq '.' && $instcodefilter eq '.' && $ownerfilter eq '.' && |
if ($description eq '.' && $instcodefilter eq '.' && $ownerfilter eq '.' && |
$typefilter eq '.') { |
$typefilter eq '.') { |
$unpack = 0; |
$unpack = 0; |
} |
} |
if (!defined($since)) { $since=0; } |
if (!defined($since)) { $since=0; } |
|
my (%gotcodedefaults,%otcodedefaults); |
my $qresult=''; |
my $qresult=''; |
|
|
my $hashref = &tie_domain_hash($udom, "nohist_courseids", &GDBM_WRCREAT()) |
my $hashref = &tie_domain_hash($udom, "nohist_courseids", &GDBM_WRCREAT()) |
Line 431 sub dump_course_id_handler {
|
Line 439 sub dump_course_id_handler {
|
$lasttime = $hashref->{$lasttime_key}; |
$lasttime = $hashref->{$lasttime_key}; |
next if ($lasttime<$since); |
next if ($lasttime<$since); |
} |
} |
my ($canclone,$valchange); |
my ($canclone,$valchange,$clonefromcode); |
my $items = &Apache::lonnet::thaw_unescape($value); |
my $items = &Apache::lonnet::thaw_unescape($value); |
if (ref($items) eq 'HASH') { |
if (ref($items) eq 'HASH') { |
if ($hashref->{$lasttime_key} eq '') { |
if ($hashref->{$lasttime_key} eq '') { |
next if ($since > 1); |
next if ($since > 1); |
} |
} |
|
if ($items->{'inst_code'}) { |
|
$clonefromcode = $items->{'inst_code'}; |
|
} |
$is_hash = 1; |
$is_hash = 1; |
if ($domcloner) { |
if ($domcloner) { |
$canclone = 1; |
$canclone = 1; |
Line 462 sub dump_course_id_handler {
|
Line 473 sub dump_course_id_handler {
|
} |
} |
} |
} |
} |
} |
|
unless ($canclone) { |
|
if (($reqcrsdom eq $udom) && ($reqinstcode) && ($clonefromcode)) { |
|
if (grep(/\=/,@cloneable)) { |
|
foreach my $cloner (@cloneable) { |
|
if (($cloner ne '*') && ($cloner !~ /^\*\:$LONCAPA::match_domain$/) && |
|
($cloner !~ /^$LONCAPA::match_username\:$LONCAPA::match_domain$/) && ($cloner ne '')) { |
|
if ($cloner =~ /=/) { |
|
my (%codedefaults,@code_order); |
|
if (ref($gotcodedefaults{$udom}) eq 'HASH') { |
|
if (ref($gotcodedefaults{$udom}{'defaults'}) eq 'HASH') { |
|
%codedefaults = %{$gotcodedefaults{$udom}{'defaults'}}; |
|
} |
|
if (ref($gotcodedefaults{$udom}{'order'}) eq 'ARRAY') { |
|
@code_order = @{$gotcodedefaults{$udom}{'order'}}; |
|
} |
|
} else { |
|
&Apache::lonnet::auto_instcode_defaults($udom, |
|
\%codedefaults, |
|
\@code_order); |
|
$gotcodedefaults{$udom}{'defaults'} = \%codedefaults; |
|
$gotcodedefaults{$udom}{'order'} = \@code_order; |
|
} |
|
if (@code_order > 0) { |
|
if (&Apache::lonnet::check_instcode_cloning(\%codedefaults,\@code_order, |
|
$cloner,$clonefromcode,$reqinstcode)) { |
|
$canclone = 1; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
} elsif (defined($cloneruname)) { |
} elsif (defined($cloneruname)) { |
if ($cc_clone{$unesc_key}) { |
if ($cc_clone{$unesc_key}) { |
$canclone = 1; |
$canclone = 1; |
Line 482 sub dump_course_id_handler {
|
Line 528 sub dump_course_id_handler {
|
} |
} |
} |
} |
} |
} |
|
unless (($canclone) || ($items->{'cloners'})) { |
|
my %domdefs = &Apache::lonnet::get_domain_defaults($udom); |
|
if ($domdefs{'canclone'}) { |
|
unless ($domdefs{'canclone'} eq 'none') { |
|
if ($domdefs{'canclone'} eq 'domain') { |
|
if ($clonerudom eq $udom) { |
|
$canclone = 1; |
|
} |
|
} elsif (($clonefromcode) && ($reqinstcode) && |
|
($udom eq $reqcrsdom)) { |
|
if (&Apache::lonnet::default_instcode_cloning($udom,$domdefs{'canclone'}, |
|
$clonefromcode,$reqinstcode)) { |
|
$canclone = 1; |
|
} |
|
} |
|
} |
|
} |
|
} |
} |
} |
if ($unpack || !$rtn_as_hash) { |
if ($unpack || !$rtn_as_hash) { |
$unesc_val{'descr'} = $items->{'description'}; |
$unesc_val{'descr'} = $items->{'description'}; |
Line 530 sub dump_course_id_handler {
|
Line 594 sub dump_course_id_handler {
|
next if !$showhidden; |
next if !$showhidden; |
} |
} |
} |
} |
|
if ($hasuniquecode ne '.') { |
|
next unless ($items->{'uniquecode'}); |
|
} |
} else { |
} else { |
next if ($catfilter ne ''); |
next if ($catfilter ne ''); |
next if ($selfenrollonly); |
next if ($selfenrollonly); |
Line 716 sub dump_profile_database {
|
Line 783 sub dump_profile_database {
|
return $qresult; |
return $qresult; |
} |
} |
|
|
|
sub server_certs { |
|
my ($perlvar) = @_; |
|
my %pemfiles = ( |
|
key => 'lonnetPrivateKey', |
|
host => 'lonnetCertificate', |
|
hostname => 'lonnetHostnameCertificate', |
|
ca => 'lonnetCertificateAuthority', |
|
); |
|
my (%md5hash,%info); |
|
if (ref($perlvar) eq 'HASH') { |
|
my $certsdir = $perlvar->{'lonCertificateDirectory'}; |
|
if (-d $certsdir) { |
|
foreach my $key (keys(%pemfiles)) { |
|
if ($perlvar->{$pemfiles{$key}}) { |
|
my $file = $certsdir.'/'.$perlvar->{$pemfiles{$key}}; |
|
if (-e $file) { |
|
if ($key eq 'key') { |
|
if (open(PIPE,"openssl rsa -noout -in $file -check |")) { |
|
my $check = <PIPE>; |
|
close(PIPE); |
|
chomp($check); |
|
$info{$key}{'status'} = $check; |
|
} |
|
if (open(PIPE,"openssl rsa -noout -modulus -in $file | openssl md5 |")) { |
|
$md5hash{$key} = <PIPE>; |
|
close(PIPE); |
|
} |
|
} else { |
|
if ($key eq 'ca') { |
|
if (open(PIPE,"openssl verify -CAfile $file $file |")) { |
|
my $check = <PIPE>; |
|
close(PIPE); |
|
chomp($check); |
|
if ($check eq "$file: OK") { |
|
$info{$key}{'status'} = 'ok'; |
|
} else { |
|
$check =~ s/^\Q$file\E\:?\s*//; |
|
$info{$key}{'status'} = $check; |
|
} |
|
} |
|
} else { |
|
if (open(PIPE,"openssl x509 -noout -modulus -in $file | openssl md5 |")) { |
|
$md5hash{$key} = <PIPE>; |
|
close(PIPE); |
|
} |
|
} |
|
my $x509 = Crypt::OpenSSL::X509->new_from_file($file); |
|
my @items = split(/,\s+/,$x509->subject()); |
|
foreach my $item (@items) { |
|
my ($name,$value) = split(/=/,$item); |
|
if ($name eq 'CN') { |
|
$info{$key}{'cn'} = $value; |
|
} |
|
} |
|
$info{$key}{'start'} = $x509->notBefore(); |
|
$info{$key}{'end'} = $x509->notAfter(); |
|
$info{$key}{'alg'} = $x509->sig_alg_name(); |
|
$info{$key}{'size'} = $x509->bit_length(); |
|
$info{$key}{'email'} = $x509->email(); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
foreach my $key ('host','hostname') { |
|
if ($md5hash{$key}) { |
|
if ($md5hash{$key} eq $md5hash{'key'}) { |
|
$info{$key}{'status'} = 'ok'; |
|
} elsif ($info{'key'}{'status'} =~ /ok/) { |
|
$info{$key}{'status'} = 'otherkey'; |
|
} else { |
|
$info{$key}{'status'} = 'nokey'; |
|
} |
|
} |
|
} |
|
my $result; |
|
foreach my $key (keys(%info)) { |
|
$result .= &escape($key).'='.&Apache::lonnet::freeze_escape($info{$key}).'&'; |
|
} |
|
$result =~ s/\&$//; |
|
return $result; |
|
} |
|
|
1; |
1; |
|
|