version 1.489, 2004/04/23 23:01:36
|
version 1.507, 2004/06/09 14:57:30
|
Line 434 sub overloaderror {
|
Line 434 sub overloaderror {
|
if ($overload>0) { |
if ($overload>0) { |
$r->err_headers_out->{'Retry-After'}=$overload; |
$r->err_headers_out->{'Retry-After'}=$overload; |
$r->log_error('Overload of '.$overload.' on '.$checkserver); |
$r->log_error('Overload of '.$overload.' on '.$checkserver); |
return 413; |
return 409; |
} |
} |
return ''; |
return ''; |
} |
} |
Line 642 sub assign_access_key {
|
Line 642 sub assign_access_key {
|
# a valid key looks like uname:udom#comments |
# a valid key looks like uname:udom#comments |
# comments are being appended |
# comments are being appended |
# |
# |
my ($ckey,$cdom,$cnum,$udom,$uname,$logentry)=@_; |
my ($ckey,$kdom,$knum,$cdom,$cnum,$udom,$uname,$logentry)=@_; |
|
$kdom= |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'} unless (defined($kdom)); |
|
$knum= |
|
$ENV{'course.'.$ENV{'request.course.id'}.'.num'} unless (defined($knum)); |
$cdom= |
$cdom= |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'} unless (defined($cdom)); |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'} unless (defined($cdom)); |
$cnum= |
$cnum= |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'} unless (defined($cnum)); |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'} unless (defined($cnum)); |
$udom=$ENV{'user.name'} unless (defined($udom)); |
$udom=$ENV{'user.name'} unless (defined($udom)); |
$uname=$ENV{'user.domain'} unless (defined($uname)); |
$uname=$ENV{'user.domain'} unless (defined($uname)); |
my %existing=&get('accesskeys',[$ckey],$cdom,$cnum); |
my %existing=&get('accesskeys',[$ckey],$kdom,$knum); |
if (($existing{$ckey}=~/^\#(.*)$/) || # - new key |
if (($existing{$ckey}=~/^\#(.*)$/) || # - new key |
($existing{$ckey}=~/^\Q$uname\E\:\Q$udom\E\#(.*)$/)) { |
($existing{$ckey}=~/^\Q$uname\E\:\Q$udom\E\#(.*)$/)) { |
# assigned to this person |
# assigned to this person |
Line 658 sub assign_access_key {
|
Line 662 sub assign_access_key {
|
# the first time around |
# the first time around |
# ready to assign |
# ready to assign |
$logentry=$1.'; '.$logentry; |
$logentry=$1.'; '.$logentry; |
if (&put('accesskey',{$ckey=>$uname.':'.$udom.'#'.$logentry}, |
if (&put('accesskeys',{$ckey=>$uname.':'.$udom.'#'.$logentry}, |
$cdom,$cnum) eq 'ok') { |
$kdom,$knum) eq 'ok') { |
# key now belongs to user |
# key now belongs to user |
my $envkey='key.'.$cdom.'_'.$cnum; |
my $envkey='key.'.$cdom.'_'.$cnum; |
if (&put('environment',{$envkey => $ckey}) eq 'ok') { |
if (&put('environment',{$envkey => $ckey}) eq 'ok') { |
Line 755 sub validate_access_key {
|
Line 759 sub validate_access_key {
|
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'} unless (defined($cdom)); |
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'} unless (defined($cdom)); |
$cnum= |
$cnum= |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'} unless (defined($cnum)); |
$ENV{'course.'.$ENV{'request.course.id'}.'.num'} unless (defined($cnum)); |
$udom=$ENV{'user.name'} unless (defined($udom)); |
$udom=$ENV{'user.domain'} unless (defined($udom)); |
$uname=$ENV{'user.domain'} unless (defined($uname)); |
$uname=$ENV{'user.name'} unless (defined($uname)); |
my %existing=&get('accesskeys',[$ckey],$cdom,$cnum); |
my %existing=&get('accesskeys',[$ckey],$cdom,$cnum); |
return ($existing{$ckey}=~/^\Q$uname\E\:\Q$udom\E\#/); |
return ($existing{$ckey}=~/^\Q$uname\E\:\Q$udom\E\#/); |
} |
} |
Line 1165 sub externalssi {
|
Line 1169 sub externalssi {
|
return $response->content; |
return $response->content; |
} |
} |
|
|
# ------- Add a token to a remote URI's query string to vouch for access rights |
# -------------------------------- Allow a /uploaded/ URI to be vouched for |
|
|
sub tokenwrapper { |
sub allowuploaded { |
my $uri=shift; |
my ($srcurl,$url)=@_; |
$uri=~s/^http\:\/\/([^\/]+)//; |
$url=&clutter(&declutter($url)); |
$uri=~s/^\///; |
my $dir=$url; |
$ENV{'user.environment'}=~/\/([^\/]+)\.id/; |
$dir=~s/\/[^\/]+$//; |
my $token=$1; |
my %httpref=(); |
# if ($uri=~/^uploaded\/([^\/]+)\/([^\/]+)\/([^\/]+)(\?\.*)*$/) { |
my $httpurl=&hreflocation('',$url); |
if ($uri=~m|^uploaded/([^/]+)/([^/]+)/(.+)(\?\.*)*$|) { |
$httpref{'httpref.'.$httpurl}=$srcurl; |
&appenv('userfile.'.$1.'/'.$2.'/'.$3 => $ENV{'request.course.id'}); |
&Apache::lonnet::appenv(%httpref); |
return 'http://'.$hostname{ &homeserver($2,$1)}.'/'.$uri. |
|
(($uri=~/\?/)?'&':'?').'token='.$token. |
|
'&tokenissued='.$perlvar{'lonHostID'}; |
|
} else { |
|
return '/adm/notfound.html'; |
|
} |
|
} |
} |
|
|
# --------- File operations in /home/httpd/html/userfiles/$domain/1/2/3/$course |
# --------- File operations in /home/httpd/html/userfiles/$domain/1/2/3/$course |
Line 1270 sub process_coursefile {
|
Line 1268 sub process_coursefile {
|
# output: url of file in userspace |
# output: url of file in userspace |
|
|
sub userfileupload { |
sub userfileupload { |
my ($formname,$coursedoc)=@_; |
my ($formname,$coursedoc,$subdir)=@_; |
|
if (!defined($subdir)) { $subdir='unknown'; } |
my $fname=$ENV{'form.'.$formname.'.filename'}; |
my $fname=$ENV{'form.'.$formname.'.filename'}; |
# Replace Windows backslashes by forward slashes |
# Replace Windows backslashes by forward slashes |
$fname=~s/\\/\//g; |
$fname=~s/\\/\//g; |
Line 1287 sub userfileupload {
|
Line 1286 sub userfileupload {
|
my $docuname=''; |
my $docuname=''; |
my $docudom=''; |
my $docudom=''; |
my $docuhome=''; |
my $docuhome=''; |
|
$fname="$subdir/$fname"; |
if ($coursedoc) { |
if ($coursedoc) { |
$docuname=$ENV{'course.'.$ENV{'request.course.id'}.'.num'}; |
$docuname=$ENV{'course.'.$ENV{'request.course.id'}.'.num'}; |
$docudom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; |
$docudom=$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; |
Line 1309 sub finishuserfileupload {
|
Line 1309 sub finishuserfileupload {
|
my ($docuname,$docudom,$docuhome,$formname,$fname)=@_; |
my ($docuname,$docudom,$docuhome,$formname,$fname)=@_; |
my $path=$docudom.'/'.$docuname.'/'; |
my $path=$docudom.'/'.$docuname.'/'; |
my $filepath=$perlvar{'lonDocRoot'}; |
my $filepath=$perlvar{'lonDocRoot'}; |
|
my ($fnamepath,$file); |
|
$file=$fname; |
|
if ($fname=~m|/|) { |
|
($fnamepath,$file) = ($fname =~ m|^(.*)/([^/]+)$|); |
|
$path.=$fnamepath.'/'; |
|
} |
my @parts=split(/\//,$filepath.'/userfiles/'.$path); |
my @parts=split(/\//,$filepath.'/userfiles/'.$path); |
my $count; |
my $count; |
for ($count=4;$count<=$#parts;$count++) { |
for ($count=4;$count<=$#parts;$count++) { |
Line 1319 sub finishuserfileupload {
|
Line 1325 sub finishuserfileupload {
|
} |
} |
# Save the file |
# Save the file |
{ |
{ |
open(my $fh,'>'.$filepath.'/'.$fname); |
#&Apache::lonnet::logthis("Saving to $filepath $file"); |
|
open(my $fh,'>'.$filepath.'/'.$file); |
print $fh $ENV{'form.'.$formname}; |
print $fh $ENV{'form.'.$formname}; |
close($fh); |
close($fh); |
} |
} |
# Notify homeserver to grep it |
# Notify homeserver to grep it |
# |
# |
my $fetchresult= &reply('fetchuserfile:'.$docudom.'/'.$docuname.'/'.$fname, |
my $fetchresult= &reply('fetchuserfile:'.$path.$file,$docuhome); |
$docuhome); |
|
if ($fetchresult eq 'ok') { |
if ($fetchresult eq 'ok') { |
# |
# |
# Return the URL to it |
# Return the URL to it |
return '/uploaded/'.$path.$fname; |
return '/uploaded/'.$path.$file; |
} else { |
} else { |
&logthis('Failed to transfer '.$docudom.'/'.$docuname.'/'.$fname. |
&logthis('Failed to transfer '.$path.$file.' to host '.$docuhome. |
' to host '.$docuhome.': '.$fetchresult); |
': '.$fetchresult); |
return '/adm/notfound.html'; |
return '/adm/notfound.html'; |
} |
} |
} |
} |
|
|
|
sub removeuploadedurl { |
|
my ($url)=@_; |
|
my (undef,undef,$udom,$uname,$fname)=split('/',$url,5); |
|
return &Apache::lonnet::removeuserfile($uname,$udom,$fname); |
|
} |
|
|
|
sub removeuserfile { |
|
my ($docuname,$docudom,$fname)=@_; |
|
my $home=&homeserver($docuname,$docudom); |
|
return &reply("removeuserfile:$docudom/$docuname/$fname",$home); |
|
} |
|
|
# ------------------------------------------------------------------------- Log |
# ------------------------------------------------------------------------- Log |
|
|
sub log { |
sub log { |
Line 1597 sub courseidput {
|
Line 1615 sub courseidput {
|
} |
} |
|
|
sub courseiddump { |
sub courseiddump { |
my ($domfilter,$descfilter,$sincefilter)=@_; |
my ($domfilter,$descfilter,$sincefilter,$hostid)=@_; |
my %returnhash=(); |
my %returnhash=(); |
unless ($domfilter) { $domfilter=''; } |
unless ($domfilter) { $domfilter=''; } |
foreach my $tryserver (keys %libserv) { |
foreach my $tryserver (keys %libserv) { |
if ((!$domfilter) || ($hostdom{$tryserver} eq $domfilter)) { |
if (($hostid && $tryserver eq $hostid) || (!$hostid)) { |
foreach ( |
if ((!$domfilter) || ($hostdom{$tryserver} eq $domfilter)) { |
split(/\&/,&reply('courseiddump:'.$hostdom{$tryserver}.':'. |
foreach ( |
|
split(/\&/,&reply('courseiddump:'.$hostdom{$tryserver}.':'. |
$sincefilter.':'.&escape($descfilter), |
$sincefilter.':'.&escape($descfilter), |
$tryserver))) { |
$tryserver))) { |
my ($key,$value)=split(/\=/,$_); |
my ($key,$value)=split(/\=/,$_); |
if (($key) && ($value)) { |
if (($key) && ($value)) { |
$returnhash{&unescape($key)}=&unescape($value); |
$returnhash{&unescape($key)}=&unescape($value); |
|
} |
} |
} |
} |
} |
|
|
} |
} |
} |
} |
return %returnhash; |
return %returnhash; |
Line 1620 sub courseiddump {
|
Line 1639 sub courseiddump {
|
# |
# |
# ----------------------------------------------------------- Check out an item |
# ----------------------------------------------------------- Check out an item |
|
|
|
sub get_first_access { |
|
my ($type,$argsymb)=@_; |
|
my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser(); |
|
if ($argsymb) { $symb=$argsymb; } |
|
my ($map,$id,$res)=&decode_symb($symb); |
|
if ($type eq 'map') { $res=$map; } |
|
my %times=&get('firstaccesstimes',[$res],$udom,$uname); |
|
return $times{$res}; |
|
} |
|
|
|
sub set_first_access { |
|
my ($type)=@_; |
|
my ($symb,$courseid,$udom,$uname)=&Apache::lonxml::whichuser(); |
|
my ($map,$id,$res)=&decode_symb($symb); |
|
if ($type eq 'map') { $res=$map; } |
|
my $firstaccess=&get_first_access($type); |
|
if (!$firstaccess) { |
|
return &put('firstaccesstimes',{$res=>time},$udom,$uname); |
|
} |
|
return 'already_set'; |
|
} |
|
|
sub checkout { |
sub checkout { |
my ($symb,$tuname,$tudom,$tcrsid)=@_; |
my ($symb,$tuname,$tudom,$tcrsid)=@_; |
my $now=time; |
my $now=time; |
Line 1798 sub hash2str {
|
Line 1839 sub hash2str {
|
sub hashref2str { |
sub hashref2str { |
my ($hashref)=@_; |
my ($hashref)=@_; |
my $result='__HASH_REF__'; |
my $result='__HASH_REF__'; |
foreach (keys(%$hashref)) { |
foreach (sort(keys(%$hashref))) { |
if (ref($_) eq 'ARRAY') { |
if (ref($_) eq 'ARRAY') { |
$result.=&arrayref2str($_).'='; |
$result.=&arrayref2str($_).'='; |
} elsif (ref($_) eq 'HASH') { |
} elsif (ref($_) eq 'HASH') { |
Line 2682 sub allowed {
|
Line 2723 sub allowed {
|
|
|
# URI is an uploaded document for this course |
# URI is an uploaded document for this course |
|
|
if (($priv eq 'bre') && |
if (($priv eq 'bre') && ($uri=~m|^uploaded/|)) { |
($uri=~/^uploaded\/$ENV{'course.'.$ENV{'request.course.id'}.'.domain'}\/$ENV{'course.'.$ENV{'request.course.id'}.'.num'}/)) { |
my $refuri=$ENV{'httpref.'.$orguri}; |
return 'F'; |
if ($refuri) { |
|
if ($refuri =~ m|^/adm/|) { |
|
$thisallowed='F'; |
|
} |
|
} |
} |
} |
|
|
# Full access at system, domain or course-wide level? Exit. |
# Full access at system, domain or course-wide level? Exit. |
|
|
if ($thisallowed=~/F/) { |
if ($thisallowed=~/F/) { |
Line 3008 sub log_query {
|
Line 3054 sub log_query {
|
return get_query_reply($queryid); |
return get_query_reply($queryid); |
} |
} |
|
|
|
# ------- Request retrieval of institutional classlists from course homerserver |
|
|
|
sub fetch_enrollment_query { |
|
my ($homeserver,$dom,$affiliatesref,$replyref) = @_; |
|
my $host=$hostname{$homeserver}; |
|
my $cmd = ''; |
|
foreach (keys %{$affiliatesref}) { |
|
$cmd .= $_.'='.join(",",@{$$affiliatesref{$_}}).'%%'; |
|
} |
|
$cmd =~ s/%%$//; |
|
$cmd = &escape($cmd); |
|
my $query = 'fetchenrollment'; |
|
my $queryid=&reply("querysend:".$query.':'.$dom.':'.$ENV{'user.name'}.':'.$cmd,$homeserver); |
|
unless ($queryid=~/^\Q$host\E\_/) { return 'error: '.$queryid; } |
|
my $reply = &get_query_reply($queryid); |
|
unless ( ($reply =~/^timeout/) || ($reply =~/^error/) ) { |
|
unless ($homeserver eq $perlvar{'lonHostID'}) { |
|
my @responses = split/:/,$reply; |
|
my $pathname = $perlvar{'lonDaemons'}.'/tmp'; |
|
foreach (@responses) { |
|
my ($key,$value) = split/=/,$_; |
|
$$replyref{$key} = $value; |
|
if ($value > 0) { |
|
foreach (@{$$affiliatesref{$key}}) { |
|
my $filename = $dom.'_'.$key.'_'.$_.'_classlist.xml'; |
|
my $destname = $pathname.'/'.$filename; |
|
my $xml_classlist = &reply("autoretrieve:".$filename,$homeserver); |
|
unless ($xml_classlist =~ /^error/) { |
|
if ( open(FILE,">$destname") ) { |
|
print FILE &unescape($xml_classlist); |
|
close(FILE); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return 'ok'; |
|
} |
|
return 'error'; |
|
} |
|
|
sub get_query_reply { |
sub get_query_reply { |
my $queryid=shift; |
my $queryid=shift; |
my $replyfile=$perlvar{'lonDaemons'}.'/tmp/'.$queryid; |
my $replyfile=$perlvar{'lonDaemons'}.'/tmp/'.$queryid; |
Line 3052 sub userlog_query {
|
Line 3140 sub userlog_query {
|
return &log_query($uname,$udom,'userlog',%filters); |
return &log_query($uname,$udom,'userlog',%filters); |
} |
} |
|
|
|
#--------- Call auto-enrollment subs in localenroll.pm for homeserver for course |
|
|
|
sub auto_run { |
|
my $homeserver = shift; |
|
my $response = &reply('autorun',$homeserver); |
|
return $response; |
|
} |
|
|
|
sub auto_get_sections { |
|
my ($homeserver,$coursecode) = @_; |
|
my @secs = (); |
|
my $response=&unescape(&reply('autogetsections:'.$coursecode,$homeserver)); |
|
unless ($response eq 'refused') { |
|
@secs = split/:/,$response; |
|
} |
|
return @secs; |
|
} |
|
|
|
sub auto_new_course { |
|
my ($homeserver,$course_id,$owner) = @_; |
|
my $response=&unescape(&reply('autonewcourse:'.$course_id.':'.$owner,$homeserver)); |
|
return $response; |
|
} |
|
|
|
sub auto_validate_courseID { |
|
my ($homeserver,$course_id) = @_; |
|
my $response=&unescape(&reply('autovalidatecourse:'.$course_id,$homeserver)); |
|
return $response; |
|
} |
|
|
|
sub auto_create_password { |
|
my ($homeserver,$authparam) = @_; |
|
my $create_passwd = 0; |
|
my $authchk = ''; |
|
my $response=&unescape(&reply('autocreatepassword:'.$authparam,$homeserver)); |
|
if ($response eq 'refused') { |
|
$authchk = 'refused'; |
|
} else { |
|
($authparam,$create_passwd,$authchk) = split/:/,$response; |
|
} |
|
return ($authparam,$create_passwd,$authchk); |
|
} |
|
|
# ------------------------------------------------------------------ Plain Text |
# ------------------------------------------------------------------ Plain Text |
|
|
sub plaintext { |
sub plaintext { |
Line 4276 sub symbclean {
|
Line 4407 sub symbclean {
|
# remove version from URL |
# remove version from URL |
$symb=~s/\.(\d+)\.(\w+)$/\.$2/; |
$symb=~s/\.(\d+)\.(\w+)$/\.$2/; |
|
|
|
# remove wrapper |
|
|
|
$symb=~s/(\_\_\_\d+\_\_\_)adm\/wrapper\//$1/; |
return $symb; |
return $symb; |
} |
} |
|
|
Line 4439 sub numval2 {
|
Line 4573 sub numval2 {
|
} |
} |
|
|
sub latest_rnd_algorithm_id { |
sub latest_rnd_algorithm_id { |
return '64bit2'; |
return '64bit3'; |
|
} |
|
|
|
sub get_rand_alg { |
|
my ($courseid)=@_; |
|
if (!$courseid) { $courseid=(&Apache::lonxml::whichuser())[1]; } |
|
if ($courseid) { |
|
return $ENV{"course.$courseid.rndseed"}; |
|
} |
|
return &latest_rnd_algorithm_id(); |
|
} |
|
|
|
sub getCODE { |
|
if (defined($ENV{'form.CODE'})) { return $ENV{'form.CODE'}; } |
|
if (defined($Apache::lonhomework::parsing_a_problem) && |
|
defined($Apache::lonhomework::history{'resource.CODE'})) { |
|
return $Apache::lonhomework::history{'resource.CODE'}; |
|
} |
|
return undef; |
} |
} |
|
|
sub rndseed { |
sub rndseed { |
Line 4452 sub rndseed {
|
Line 4604 sub rndseed {
|
if (!$courseid) { $courseid=$wcourseid; } |
if (!$courseid) { $courseid=$wcourseid; } |
if (!$domain) { $domain=$wdomain; } |
if (!$domain) { $domain=$wdomain; } |
if (!$username) { $username=$wusername } |
if (!$username) { $username=$wusername } |
my $which=$ENV{"course.$courseid.rndseed"}; |
my $which=&get_rand_alg(); |
my $CODE=$ENV{'form.CODE'}; |
if (defined(&getCODE())) { |
if (defined($CODE)) { |
|
return &rndseed_CODE_64bit($symb,$courseid,$domain,$username); |
return &rndseed_CODE_64bit($symb,$courseid,$domain,$username); |
|
} elsif ($which eq '64bit3') { |
|
return &rndseed_64bit3($symb,$courseid,$domain,$username); |
} elsif ($which eq '64bit2') { |
} elsif ($which eq '64bit2') { |
return &rndseed_64bit2($symb,$courseid,$domain,$username); |
return &rndseed_64bit2($symb,$courseid,$domain,$username); |
} elsif ($which eq '64bit') { |
} elsif ($which eq '64bit') { |
Line 4523 sub rndseed_64bit2 {
|
Line 4676 sub rndseed_64bit2 {
|
} |
} |
} |
} |
|
|
|
sub rndseed_64bit3 { |
|
my ($symb,$courseid,$domain,$username)=@_; |
|
{ |
|
use integer; |
|
# strings need to be an even # of cahracters long, it it is odd the |
|
# last characters gets thrown away |
|
my $symbchck=unpack("%32S*",$symb.' ') << 21; |
|
my $symbseed=numval2($symb) << 10; |
|
my $namechck=unpack("%32S*",$username.' '); |
|
|
|
my $nameseed=numval2($username) << 21; |
|
my $domainseed=unpack("%32S*",$domain.' ') << 10; |
|
my $courseseed=unpack("%32S*",$courseid.' '); |
|
|
|
my $num1=$symbchck+$symbseed+$namechck; |
|
my $num2=$nameseed+$domainseed+$courseseed; |
|
#&Apache::lonxml::debug("$symbseed:$nameseed;$domainseed|$courseseed;$namechck:$symbchck"); |
|
#&Apache::lonxml::debug("rndseed :$num:$symb"); |
|
return "$num1:$num2"; |
|
} |
|
} |
|
|
sub rndseed_CODE_64bit { |
sub rndseed_CODE_64bit { |
my ($symb,$courseid,$domain,$username)=@_; |
my ($symb,$courseid,$domain,$username)=@_; |
{ |
{ |
use integer; |
use integer; |
my $symbchck=unpack("%32S*",$symb.' ') << 16; |
my $symbchck=unpack("%32S*",$symb.' ') << 16; |
my $symbseed=numval2($symb); |
my $symbseed=numval2($symb); |
my $CODEchck=unpack("%32S*",$ENV{'form.CODE'}.' ') << 16; |
my $CODEchck=unpack("%32S*",&getCODE().' ') << 16; |
my $CODEseed=numval($ENV{'form.CODE'}); |
my $CODEseed=numval(&getCODE()); |
my $courseseed=unpack("%32S*",$courseid.' '); |
my $courseseed=unpack("%32S*",$courseid.' '); |
my $num1=$symbseed+$CODEchck; |
my $num1=$symbseed+$CODEchck; |
my $num2=$CODEseed+$courseseed+$symbchck; |
my $num2=$CODEseed+$courseseed+$symbchck; |
#&Apache::lonxml::debug("$symbseed:$CODEchck|$CODEseed:$courseseed:$symbchck"); |
#&Apache::lonxml::debug("$symbseed:$CODEchck|$CODEseed:$courseseed:$symbchck"); |
#&Apache::lonxml::debug("rndseed :$num1:$num2:$symb"); |
#&Apache::lonxml::debug("rndseed :$num1:$num2:$symb"); |
return "$num1,$num2"; |
return "$num1:$num2"; |
} |
} |
} |
} |
|
|
sub setup_random_from_rndseed { |
sub setup_random_from_rndseed { |
my ($rndseed)=@_; |
my ($rndseed)=@_; |
if ($rndseed =~/,/) { |
if ($rndseed =~/([,:])/) { |
my ($num1,$num2)=split(/,/,$rndseed); |
my ($num1,$num2)=split(/[,:]/,$rndseed); |
&Math::Random::random_set_seed(abs($num1),abs($num2)); |
&Math::Random::random_set_seed(abs($num1),abs($num2)); |
} else { |
} else { |
&Math::Random::random_set_seed_from_phrase($rndseed); |
&Math::Random::random_set_seed_from_phrase($rndseed); |