--- loncom/interface/loncommon.pm 2013/04/30 13:25:45 1.1075.2.34
+++ loncom/interface/loncommon.pm 2012/07/07 21:58:14 1.1086
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common routines
#
-# $Id: loncommon.pm,v 1.1075.2.34 2013/04/30 13:25:45 raeburn Exp $
+# $Id: loncommon.pm,v 1.1086 2012/07/07 21:58:14 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -67,13 +67,9 @@ use Apache::lonhtmlcommon();
use Apache::loncoursedata();
use Apache::lontexconvert();
use Apache::lonclonecourse();
-use Apache::lonuserutils();
-use Apache::lonuserstate();
use LONCAPA qw(:DEFAULT :match);
use DateTime::TimeZone;
use DateTime::Locale::Catalog;
-use Authen::Captcha;
-use Captcha::reCAPTCHA;
# ---------------------------------------------- Designs
use vars qw(%defaultdesign);
@@ -528,8 +524,7 @@ ENDAUTHORBRW
}
sub coursebrowser_javascript {
- my ($domainfilter,$sec_element,$formname,$role_element,$crstype,
- $credits_element) = @_;
+ my ($domainfilter,$sec_element,$formname,$role_element,$crstype) = @_;
my $wintitle = 'Course_Browser';
if ($crstype eq 'Community') {
$wintitle = 'Community_Browser';
@@ -592,9 +587,8 @@ sub coursebrowser_javascript {
}
$id_functions
ENDSTDBRW
- if (($sec_element ne '') || ($role_element ne '') || ($credits_element ne '')) {
- $output .= &setsec_javascript($sec_element,$formname,$role_element,
- $credits_element);
+ if (($sec_element ne '') || ($role_element ne '')) {
+ $output .= &setsec_javascript($sec_element,$formname,$role_element);
}
$output .= '
// ]]>
@@ -751,7 +745,7 @@ ENDUSERBRW
}
sub setsec_javascript {
- my ($sec_element,$formname,$role_element,$credits_element) = @_;
+ my ($sec_element,$formname,$role_element) = @_;
my (@courserolenames,@communityrolenames,$rolestr,$courserolestr,
$communityrolestr);
if ($role_element ne '') {
@@ -846,14 +840,6 @@ function setRole(crstype) {
}
|;
}
- if ($credits_element) {
- $setsections .= qq|
-function setCredits(defaultcredits) {
- document.$formname.$credits_element.value = defaultcredits;
- return;
-}
-|;
- }
return $setsections;
}
@@ -899,14 +885,10 @@ sub check_uncheck_jscript {
function checkAll(field) {
if (field.length > 0) {
for (i = 0; i < field.length; i++) {
- if (!field[i].disabled) {
- field[i].checked = true;
- }
+ field[i].checked = true ;
}
} else {
- if (!field.disabled) {
- field.checked = true;
- }
+ field.checked = true
}
}
@@ -1008,7 +990,6 @@ sub select_language {
$langchoices{$code} = &plainlanguagedescription($id);
}
}
- %langchoices = &Apache::lonlocal::texthash(%langchoices);
return &select_form($selected,$name,\%langchoices);
}
@@ -1040,12 +1021,6 @@ linked_select_forms takes the following
=item * $menuorder, the order of values in the first menu
-=item * $onchangefirst, additional javascript call to execute for an onchange
- event for the first
';
}
return $result;
}
@@ -7791,9 +7604,11 @@ sub LCprogressbar {
$LCcurrentid=$$.'_'.$LCidcnt;
my $starting=&mt('Starting');
my $content=(<
$starting
+
ENDPROGBAR
&r_print($r,$content.&LCprogressbar_script($LCcurrentid));
}
@@ -7914,7 +7729,7 @@ sub simple_error_page {
my ($r,$title,$msg) = @_;
my $page =
&Apache::loncommon::start_page($title).
- ''.&mt($msg).'
'.
+ &mt($msg).
&Apache::loncommon::end_page();
if (ref($r)) {
$r->print($page);
@@ -8207,19 +8022,7 @@ sub get_sections {
my %sectioncount;
my $now = time;
- my $check_students = 1;
- my $only_students = 0;
- if (ref($possible_roles) eq 'ARRAY') {
- if (grep(/^st$/,@{$possible_roles})) {
- if (@{$possible_roles} == 1) {
- $only_students = 1;
- }
- } else {
- $check_students = 0;
- }
- }
-
- if ($check_students) {
+ if (!defined($possible_roles) || (grep(/^st$/,@$possible_roles))) {
my ($classlist) = &Apache::loncoursedata::get_classlist($cdom,$cnum);
my $sec_index = &Apache::loncoursedata::CL_SECTION();
my $status_index = &Apache::loncoursedata::CL_STATUS();
@@ -8246,9 +8049,6 @@ sub get_sections {
}
}
}
- if ($only_students) {
- return %sectioncount;
- }
my %courseroles = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum);
foreach my $user (sort(keys(%courseroles))) {
if ($user !~ /^(\w{2})/) { next; }
@@ -9046,10 +8846,7 @@ sub user_rule_formats {
my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($domain,$check);
if ((ref($rules) eq 'HASH') && (ref($ruleorder) eq 'ARRAY')) {
if (@{$ruleorder} > 0) {
- $output = '
'.
- &mt($text{$check}.' with the following format(s) may [_1]only[_2] be used for verified users at [_3]:',
- '','',$domdesc).
- ' ';
+ $output = '
'.&mt("$text{$check} with the following format(s) may only be used for verified users at [_1]:",$domdesc).' ';
foreach my $rule (@{$ruleorder}) {
if (ref($curr_rules) eq 'ARRAY') {
if (grep(/^\Q$rule\E$/,@{$curr_rules})) {
@@ -9567,13 +9364,13 @@ sub ask_for_embedded_content {
$toplevel = $url;
if ($args->{'context'} eq 'paste') {
($cdom,$cnum) = ($url =~ m{^\Q/uploaded/\E($match_domain)/($match_courseid)/});
- ($path) =
+ ($path) =
($toplevel =~ m{^(\Q/uploaded/$cdom/$cnum/\E(?:docs|supplemental)/(?:default|\d+)/\d+)/});
$fileloc = &Apache::lonnet::filelocation('',$toplevel);
$fileloc =~ s{^/}{};
}
}
- } elsif ($actionurl eq '/adm/dependencies') {
+ } elsif ($actionurl eq '/adm/dependencies') {
if ($env{'request.course.id'} ne '') {
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
@@ -9761,7 +9558,7 @@ sub ask_for_embedded_content {
($args->{'context'} eq 'paste')) {
$counter = scalar(keys(%existing));
$numpathchg = scalar(keys(%pathchanges));
- return ($output,$counter,$numpathchg,\%existing);
+ return ($output,$counter,$numpathchg,\%existing);
}
foreach my $embed_file (sort {lc($a) cmp lc($b)} keys(%newfiles)) {
if ($actionurl eq '/adm/dependencies') {
@@ -10105,7 +9902,7 @@ sub upload_embedded {
$output .= &mt('Unrecognized file extension ([_1]) - rename the file with a proper extension and re-upload.',$1).'
';
next;
} elsif ($fname=~/\.(\d+)\.(\w+)$/) {
- $output .= &mt('Filename not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2).'
';
+ $output .= &mt('File name not allowed - rename the file to remove the number immediately before the file extension([_1]) and re-upload.',$2).'
';
next;
}
$env{'form.embedded_item_'.$i.'.filename'}=$fname;
@@ -10807,8 +10604,8 @@ sub process_decompression {
my ($docudom,$docuname,$file,$destination,$dir_root,$hiddenelem) = @_;
my ($dir,$error,$warning,$output);
if ($file !~ /\.(zip|tar|bz2|gz|tar.gz|tar.bz2|tgz)$/) {
- $error = &mt('Filename not a supported archive file type.').
- '
'.&mt('Filename should end with one of: [_1].',
+ $error = &mt('File name not a supported archive file type.').
+ '
'.&mt('File name should end with one of: [_1].',
'.zip, .tar, .bz2, .gz, .tar.gz, .tar.bz2, .tgz');
} else {
my $docuhome = &Apache::lonnet::homeserver($docuname,$docudom);
@@ -11382,11 +11179,11 @@ sub process_extracted_files {
if ($env{'form.folderpath'}) {
my @items = split('&',$env{'form.folderpath'});
$folders{'0'} = $items[-2];
- if ($env{'form.folderpath'} =~ /\:1$/) {
- $containers{'0'}='page';
- } else {
- $containers{'0'}='sequence';
- }
+ $containers{'0'}='sequence';
+ } elsif ($env{'form.pagepath'}) {
+ my @items = split('&',$env{'form.pagepath'});
+ $folders{'0'} = $items[-2];
+ $containers{'0'}='page';
}
my @archdirs = &get_env_multiple('form.archive_directory');
if ($numitems) {
@@ -11461,7 +11258,7 @@ sub process_extracted_files {
my ($outtext,$errtext) =
&LONCAPA::map::storemap('/uploaded/'.$docudom.'/'.
$docuname.'/'.$folders{$outer}.
- '.'.$containers{$outer},1,1);
+ '.'.$containers{$outer},1);
$newseqid{$i} = $newidx;
unless ($errtext) {
$result .= '- '.&mt('Folder: [_1] added to course',$docstitle).'
'."\n";
@@ -11494,7 +11291,7 @@ sub process_extracted_files {
my ($outtext,$errtext)=
&LONCAPA::map::storemap('/uploaded/'.$docudom.'/'.
$docuname.'/'.$folders{$outer}.
- '.'.$containers{$outer},1,1);
+ '.'.$containers{$outer},1);
unless ($errtext) {
if (-e "$prefix$dir/$docstype/$mapinner{$outer}/$newidx/$title") {
$result .= '- '.&mt('File: [_1] added to course',$docstitle).'
'."\n";
@@ -11504,7 +11301,7 @@ sub process_extracted_files {
}
}
} else {
- $warning .= &mt('Item extracted from archive: [_1] has unexpected path.',$path).'
';
+ $warning .= &mt('Item extracted from archive: [_1] has unexpected path.',$path).'
';
}
}
for (my $i=1; $i<=$numitems; $i++) {
@@ -11526,7 +11323,7 @@ sub process_extracted_files {
}
if ($itemidx eq '') {
$itemidx = 0;
- }
+ }
if (grep(/^\Q$referrer{$i}\E$/,@archdirs)) {
if ($mapinner{$referrer{$i}}) {
$fullpath = "$prefix$dir/$docstype/$mapinner{$referrer{$i}}";
@@ -11573,12 +11370,12 @@ sub process_extracted_files {
$showpath = "$relpath/$title";
} else {
$showpath = "/$title";
- }
+ }
$result .= '- '.&mt('[_1] included as a dependency',$showpath).'
'."\n";
- }
+ }
unless ($ishome) {
my $fetch = "$fullpath/$title";
- $fetch =~ s/^\Q$prefix$dir\E//;
+ $fetch =~ s/^\Q$prefix$dir\E//;
$prompttofetch{$fetch} = 1;
}
}
@@ -11588,7 +11385,7 @@ sub process_extracted_files {
$path,$env{'form.archive_content_'.$referrer{$i}}).'
';
}
} else {
- $warning .= &mt('Item extracted from archive: [_1] has unexpected path.',$path).'
';
+ $warning .= &mt('Item extracted from archive: [_1] has unexpected path.',$path).'
';
}
}
if (keys(%todelete)) {
@@ -11647,7 +11444,7 @@ sub cleanup_empty_dirs {
my $numitems = 0;
foreach my $item (@dircontents) {
if (-d "$path/$item") {
- &cleanup_empty_dirs("$path/$item");
+ &recurse_dirs("$path/$item");
if (-e "$path/$item") {
$numitems ++;
}
@@ -13196,7 +12993,7 @@ sub commit_customrole {
}
sub commit_standardrole {
- my ($udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context,$credits) = @_;
+ my ($udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_;
my ($output,$logmsg,$linefeed);
if ($context eq 'auto') {
$linefeed = "\n";
@@ -13205,7 +13002,7 @@ sub commit_standardrole {
}
if ($three eq 'st') {
my $result = &commit_studentrole(\$logmsg,$udom,$uname,$url,$three,$start,$end,
- $one,$two,$sec,$context,$credits);
+ $one,$two,$sec,$context);
if (($result =~ /^error/) || ($result eq 'not_in_class') ||
($result eq 'unknown_course') || ($result eq 'refused')) {
$output = $logmsg.' '.&mt('Error: ').$result."\n";
@@ -13236,8 +13033,7 @@ sub commit_standardrole {
}
sub commit_studentrole {
- my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context,
- $credits) = @_;
+ my ($logmsg,$udom,$uname,$url,$three,$start,$end,$one,$two,$sec,$context) = @_;
my ($result,$linefeed,$oldsecurl,$newsecurl);
if ($context eq 'auto') {
$linefeed = "\n";
@@ -13284,11 +13080,7 @@ sub commit_studentrole {
}
}
if (($expire_role_result eq 'ok') || ($secchange == 0)) {
- $modify_section_result =
- &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,
- undef,undef,undef,$sec,
- $end,$start,'','',$cid,
- '',$context,$credits);
+ $modify_section_result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,'','',$cid,'',$context);
if ($modify_section_result =~ /^ok/) {
if ($secchange == 1) {
if ($sec eq '') {
@@ -13319,7 +13111,7 @@ sub commit_studentrole {
$result = $modify_section_result;
} elsif ($secchange == 1) {
if ($oldsec eq '') {
- $$logmsg .= &mt('Error when attempting to expire existing role without a section for [_1] in course [_2] -error: ',$uname,$cid).' '.$expire_role_result.$linefeed;
+ $$logmsg .= &mt('Error when attempting to expire existing role without a section for [_1] in course [_3] -error: ',$uname,$cid).' '.$expire_role_result.$linefeed;
} else {
$$logmsg .= &mt('Error when attempting to expire existing role for [_1] in section [_2] in course [_3] -error: ',$uname,$oldsec,$cid).' '.$expire_role_result.$linefeed;
}
@@ -13345,26 +13137,6 @@ sub commit_studentrole {
return $result;
}
-sub show_role_extent {
- my ($scope,$context,$role) = @_;
- $scope =~ s{^/}{};
- my @courseroles = &Apache::lonuserutils::roles_by_context('course',1);
- push(@courseroles,'co');
- my @authorroles = &Apache::lonuserutils::roles_by_context('author');
- if (($context eq 'course') || (grep(/^\Q$role\E/,@courseroles))) {
- $scope =~ s{/}{_};
- return ''.$env{'course.'.$scope.'.description'}.'';
- } elsif (($context eq 'author') || (grep(/^\Q$role\E/,@authorroles))) {
- my ($audom,$auname) = split(/\//,$scope);
- return &mt('[_1] Author Space',''.
- &Apache::loncommon::plainname($auname,$audom).'');
- } else {
- $scope =~ s{/$}{};
- return &mt('Domain: [_1]',''.
- &Apache::lonnet::domain($scope,'description').'');
- }
-}
-
############################################################
############################################################
@@ -13557,9 +13329,6 @@ sub construct_course {
} else {
$cenv{'internal.courseowner'} = $args->{'curruser'};
}
- if ($args->{'defaultcredits'}) {
- $cenv{'internal.defaultcredits'} = $args->{'defaultcredits'};
- }
my @badclasses = (); # Used to accumulate sections/crosslistings that did not pass classlist access check for course owner.
if ($args->{'crssections'}) {
$cenv{'internal.sectionnums'} = '';
@@ -14009,20 +13778,6 @@ sub init_user_environment {
\%userenv,\%domdef,\%is_adv);
}
- $userenv{'canrequest.author'} =
- &Apache::lonnet::usertools_access($username,$domain,'requestauthor',
- 'reload','requestauthor',
- \%userenv,\%domdef,\%is_adv);
- my %reqauthor = &Apache::lonnet::get('requestauthor',['author_status','author'],
- $domain,$username);
- my $reqstatus = $reqauthor{'author_status'};
- if ($reqstatus eq 'approval' || $reqstatus eq 'approved') {
- if (ref($reqauthor{'author'}) eq 'HASH') {
- $userenv{'requestauthorqueued'} = $reqstatus.':'.
- $reqauthor{'author'}{'timestamp'};
- }
- }
-
$env{'user.environment'} = "$lonids/$cookie.id";
if (tie(my %disk_env,'GDBM_File',"$lonids/$cookie.id",
@@ -14174,32 +13929,6 @@ sub update_content_constraints {
return;
}
-sub allmaps_incourse {
- my ($cdom,$cnum,$chome,$cid) = @_;
- if ($cdom eq '' || $cnum eq '' || $chome eq '' || $cid eq '') {
- $cid = $env{'request.course.id'};
- $cdom = $env{'course.'.$cid.'.domain'};
- $cnum = $env{'course.'.$cid.'.num'};
- $chome = $env{'course.'.$cid.'.home'};
- }
- my %allmaps = ();
- my $lastchange =
- &Apache::lonnet::get_coursechange($cdom,$cnum);
- if ($lastchange > $env{'request.course.tied'}) {
- my ($furl,$ferr) = &Apache::lonuserstate::readmap("$cdom/$cnum");
- unless ($ferr) {
- &update_content_constraints($cdom,$cnum,$chome,$cid);
- }
- }
- my $navmap = Apache::lonnavmaps::navmap->new();
- if (defined($navmap)) {
- foreach my $res ($navmap->retrieveResources(undef,sub { $_[0]->is_map() },1,0,1)) {
- $allmaps{$res->src()} = 1;
- }
- }
- return \%allmaps;
-}
-
sub parse_supplemental_title {
my ($title) = @_;
@@ -14223,232 +13952,6 @@ sub parse_supplemental_title {
return $title;
}
-sub symb_to_docspath {
- my ($symb) = @_;
- return unless ($symb);
- my ($mapurl,$id,$resurl) = &Apache::lonnet::decode_symb($symb);
- if ($resurl=~/\.(sequence|page)$/) {
- $mapurl=$resurl;
- } elsif ($resurl eq 'adm/navmaps') {
- $mapurl=$env{'course.'.$env{'request.course.id'}.'.url'};
- }
- my $mapresobj;
- my $navmap = Apache::lonnavmaps::navmap->new();
- if (ref($navmap)) {
- $mapresobj = $navmap->getResourceByUrl($mapurl);
- }
- $mapurl=~s{^.*/([^/]+)\.(\w+)$}{$1};
- my $type=$2;
- my $path;
- if (ref($mapresobj)) {
- my $pcslist = $mapresobj->map_hierarchy();
- if ($pcslist ne '') {
- foreach my $pc (split(/,/,$pcslist)) {
- next if ($pc <= 1);
- my $res = $navmap->getByMapPc($pc);
- if (ref($res)) {
- my $thisurl = $res->src();
- $thisurl=~s{^.*/([^/]+)\.\w+$}{$1};
- my $thistitle = $res->title();
- $path .= '&'.
- &Apache::lonhtmlcommon::entity_encode($thisurl).'&'.
- &Apache::lonhtmlcommon::entity_encode($thistitle).
- ':'.$res->randompick().
- ':'.$res->randomout().
- ':'.$res->encrypted().
- ':'.$res->randomorder().
- ':'.$res->is_page();
- }
- }
- }
- $path =~ s/^\&//;
- my $maptitle = $mapresobj->title();
- if ($mapurl eq 'default') {
- $maptitle = 'Main Course Documents';
- }
- $path .= (($path ne '')? '&' : '').
- &Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
- &Apache::lonhtmlcommon::entity_encode($maptitle).
- ':'.$mapresobj->randompick().
- ':'.$mapresobj->randomout().
- ':'.$mapresobj->encrypted().
- ':'.$mapresobj->randomorder().
- ':'.$mapresobj->is_page();
- } else {
- my $maptitle = &Apache::lonnet::gettitle($mapurl);
- my $ispage = (($type eq 'page')? 1 : '');
- if ($mapurl eq 'default') {
- $maptitle = 'Main Course Documents';
- }
- $path = &Apache::lonhtmlcommon::entity_encode($mapurl).'&'.
- &Apache::lonhtmlcommon::entity_encode($maptitle).':::::'.$ispage;
- }
- unless ($mapurl eq 'default') {
- $path = 'default&'.
- &Apache::lonhtmlcommon::entity_encode('Main Course Documents').
- ':::::&'.$path;
- }
- return $path;
-}
-
-sub captcha_display {
- my ($context,$lonhost) = @_;
- my ($output,$error);
- my ($captcha,$pubkey,$privkey) = &get_captcha_config($context,$lonhost);
- if ($captcha eq 'original') {
- $output = &create_captcha();
- unless ($output) {
- $error = 'captcha';
- }
- } elsif ($captcha eq 'recaptcha') {
- $output = &create_recaptcha($pubkey);
- unless ($output) {
- $error = 'recaptcha';
- }
- }
- return ($output,$error);
-}
-
-sub captcha_response {
- my ($context,$lonhost) = @_;
- my ($captcha_chk,$captcha_error);
- my ($captcha,$pubkey,$privkey) = &get_captcha_config($context,$lonhost);
- if ($captcha eq 'original') {
- ($captcha_chk,$captcha_error) = &check_captcha();
- } elsif ($captcha eq 'recaptcha') {
- $captcha_chk = &check_recaptcha($privkey);
- } else {
- $captcha_chk = 1;
- }
- return ($captcha_chk,$captcha_error);
-}
-
-sub get_captcha_config {
- my ($context,$lonhost) = @_;
- my ($captcha,$pubkey,$privkey,$hashtocheck);
- my $hostname = &Apache::lonnet::hostname($lonhost);
- my $serverhomeID = &Apache::lonnet::get_server_homeID($hostname);
- my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID);
- if ($context eq 'usercreation') {
- my %domconfig = &Apache::lonnet::get_dom('configuration',[$context],$serverhomedom);
- if (ref($domconfig{$context}) eq 'HASH') {
- $hashtocheck = $domconfig{$context}{'cancreate'};
- if (ref($hashtocheck) eq 'HASH') {
- if ($hashtocheck->{'captcha'} eq 'recaptcha') {
- if (ref($hashtocheck->{'recaptchakeys'}) eq 'HASH') {
- $pubkey = $hashtocheck->{'recaptchakeys'}{'public'};
- $privkey = $hashtocheck->{'recaptchakeys'}{'private'};
- }
- if ($privkey && $pubkey) {
- $captcha = 'recaptcha';
- } else {
- $captcha = 'original';
- }
- } elsif ($hashtocheck->{'captcha'} ne 'notused') {
- $captcha = 'original';
- }
- }
- } else {
- $captcha = 'captcha';
- }
- } elsif ($context eq 'login') {
- my %domconfhash = &Apache::loncommon::get_domainconf($serverhomedom);
- if ($domconfhash{$serverhomedom.'.login.captcha'} eq 'recaptcha') {
- $pubkey = $domconfhash{$serverhomedom.'.login.recaptchakeys_public'};
- $privkey = $domconfhash{$serverhomedom.'.login.recaptchakeys_private'};
- if ($privkey && $pubkey) {
- $captcha = 'recaptcha';
- } else {
- $captcha = 'original';
- }
- } elsif ($domconfhash{$serverhomedom.'.login.captcha'} eq 'original') {
- $captcha = 'original';
- }
- }
- return ($captcha,$pubkey,$privkey);
-}
-
-sub create_captcha {
- my %captcha_params = &captcha_settings();
- my ($output,$maxtries,$tries) = ('',10,0);
- while ($tries < $maxtries) {
- $tries ++;
- my $captcha = Authen::Captcha->new (
- output_folder => $captcha_params{'output_dir'},
- data_folder => $captcha_params{'db_dir'},
- );
- my $md5sum = $captcha->generate_code($captcha_params{'numchars'});
-
- if (-e $Apache::lonnet::perlvar{'lonCaptchaDir'}.'/'.$md5sum.'.png') {
- $output = ''."\n".
- &mt('Type in the letters/numbers shown below').' '.
- '
'.
- '
';
- last;
- }
- }
- return $output;
-}
-
-sub captcha_settings {
- my %captcha_params = (
- output_dir => $Apache::lonnet::perlvar{'lonCaptchaDir'},
- www_output_dir => "/captchaspool",
- db_dir => $Apache::lonnet::perlvar{'lonCaptchaDb'},
- numchars => '5',
- );
- return %captcha_params;
-}
-
-sub check_captcha {
- my ($captcha_chk,$captcha_error);
- my $code = $env{'form.code'};
- my $md5sum = $env{'form.crypt'};
- my %captcha_params = &captcha_settings();
- my $captcha = Authen::Captcha->new(
- output_folder => $captcha_params{'output_dir'},
- data_folder => $captcha_params{'db_dir'},
- );
- $captcha_chk = $captcha->check_code($code,$md5sum);
- my %captcha_hash = (
- 0 => 'Code not checked (file error)',
- -1 => 'Failed: code expired',
- -2 => 'Failed: invalid code (not in database)',
- -3 => 'Failed: invalid code (code does not match crypt)',
- );
- if ($captcha_chk != 1) {
- $captcha_error = $captcha_hash{$captcha_chk}
- }
- return ($captcha_chk,$captcha_error);
-}
-
-sub create_recaptcha {
- my ($pubkey) = @_;
- my $captcha = Captcha::reCAPTCHA->new;
- return $captcha->get_options_setter({theme => 'white'})."\n".
- $captcha->get_html($pubkey).
- &mt('If either word is hard to read, [_1] will replace them.',
- '').
- '
';
-}
-
-sub check_recaptcha {
- my ($privkey) = @_;
- my $captcha_chk;
- my $captcha = Captcha::reCAPTCHA->new;
- my $captcha_result =
- $captcha->check_answer(
- $privkey,
- $ENV{'REMOTE_ADDR'},
- $env{'form.recaptcha_challenge_field'},
- $env{'form.recaptcha_response_field'},
- );
- if ($captcha_result->{is_valid}) {
- $captcha_chk = 1;
- }
- return $captcha_chk;
-}
-
=pod
=back