version 1.1233, 2016/02/17 19:15:48
|
version 1.1244, 2016/05/18 03:21:15
|
Line 72 use Apache::lonuserstate();
|
Line 72 use Apache::lonuserstate();
|
use Apache::courseclassifier(); |
use Apache::courseclassifier(); |
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA qw(:DEFAULT :match); |
use DateTime::TimeZone; |
use DateTime::TimeZone; |
use DateTime::Locale::Catalog; |
use DateTime::Locale; |
use Encode(); |
use Encode(); |
use Text::Aspell; |
use Text::Aspell; |
use Authen::Captcha; |
use Authen::Captcha; |
use Captcha::reCAPTCHA; |
use Captcha::reCAPTCHA; |
|
use JSON::DWIW; |
|
use LWP::UserAgent; |
use Crypt::DES; |
use Crypt::DES; |
use DynaLoader; # for Crypt::DES version |
use DynaLoader; # for Crypt::DES version |
use MIME::Lite; |
use MIME::Lite; |
Line 588 sub coursebrowser_javascript {
|
Line 590 sub coursebrowser_javascript {
|
if (formname == 'ccrs') { |
if (formname == 'ccrs') { |
var ownername = document.forms[formid].ccuname.value; |
var ownername = document.forms[formid].ccuname.value; |
var ownerdom = document.forms[formid].ccdomain.options[document.forms[formid].ccdomain.selectedIndex].value; |
var ownerdom = document.forms[formid].ccdomain.options[document.forms[formid].ccdomain.selectedIndex].value; |
url += '&cloner='+ownername+':'+ownerdom+'&crscode='+document.forms[formid].crscode.value; |
url += '&cloner='+ownername+':'+ownerdom; |
|
if (type == 'Course') { |
|
url += '&crscode='+document.forms[formid].crscode.value; |
|
} |
} |
} |
if (formname == 'requestcrs') { |
if (formname == 'requestcrs') { |
url += '&crsdom=$domainfilter&crscode=$instcode'; |
url += '&crsdom=$domainfilter&crscode=$instcode'; |
Line 876 sub selectcourse_link {
|
Line 881 sub selectcourse_link {
|
my $linktext = &mt('Select Course'); |
my $linktext = &mt('Select Course'); |
if ($selecttype eq 'Community') { |
if ($selecttype eq 'Community') { |
$linktext = &mt('Select Community'); |
$linktext = &mt('Select Community'); |
|
} elsif ($selecttype eq 'Placement') { |
|
$linktext = &mt('Select Placement Test'); |
} elsif ($selecttype eq 'Course/Community') { |
} elsif ($selecttype eq 'Course/Community') { |
$linktext = &mt('Select Course/Community'); |
$linktext = &mt('Select Course/Community'); |
$type = ''; |
$type = ''; |
Line 967 sub select_datelocale {
|
Line 974 sub select_datelocale {
|
} |
} |
$output .= '> </option>'; |
$output .= '> </option>'; |
} |
} |
|
my @languages = &Apache::lonlocal::preferred_languages(); |
my (@possibles,%locale_names); |
my (@possibles,%locale_names); |
my @locales = DateTime::Locale::Catalog::Locales; |
my @locales = DateTime::Locale->ids(); |
foreach my $locale (@locales) { |
foreach my $id (@locales) { |
if (ref($locale) eq 'HASH') { |
if ($id ne '') { |
my $id = $locale->{'id'}; |
my ($en_terr,$native_terr); |
if ($id ne '') { |
my $loc = DateTime::Locale->load($id); |
my $en_terr = $locale->{'en_territory'}; |
if (ref($loc)) { |
my $native_terr = $locale->{'native_territory'}; |
$en_terr = $loc->name(); |
my @languages = &Apache::lonlocal::preferred_languages(); |
$native_terr = $loc->native_name(); |
if (grep(/^en$/,@languages) || !@languages) { |
if (grep(/^en$/,@languages) || !@languages) { |
if ($en_terr ne '') { |
if ($en_terr ne '') { |
$locale_names{$id} = '('.$en_terr.')'; |
$locale_names{$id} = '('.$en_terr.')'; |
Line 990 sub select_datelocale {
|
Line 998 sub select_datelocale {
|
} |
} |
} |
} |
$locale_names{$id} = Encode::encode('UTF-8',$locale_names{$id}); |
$locale_names{$id} = Encode::encode('UTF-8',$locale_names{$id}); |
push (@possibles,$id); |
push(@possibles,$id); |
} |
} |
} |
} |
} |
} |
foreach my $item (sort(@possibles)) { |
foreach my $item (sort(@possibles)) { |
Line 5480 Inputs:
|
Line 5488 Inputs:
|
|
|
=item * $args, optional argument valid values are |
=item * $args, optional argument valid values are |
no_auto_mt_title -> prevents &mt()ing the title arg |
no_auto_mt_title -> prevents &mt()ing the title arg |
inherit_jsmath -> when creating popup window in a page, |
|
should it have jsmath forced on by the |
|
current page |
|
|
|
=item * $advtoolsref, optional argument, ref to an array containing |
=item * $advtoolsref, optional argument, ref to an array containing |
inlineremote items to be added in "Functions" menu below |
inlineremote items to be added in "Functions" menu below |
Line 5550 sub bodytag {
|
Line 5555 sub bodytag {
|
|
|
# construct main body tag |
# construct main body tag |
my $bodytag = "<body $extra_body_attr>". |
my $bodytag = "<body $extra_body_attr>". |
&Apache::lontexconvert::init_math_support($args->{'inherit_jsmath'}); |
&Apache::lontexconvert::init_math_support(); |
|
|
&get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']); |
&get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['inhibitmenu']); |
|
|
Line 5574 sub bodytag {
|
Line 5579 sub bodytag {
|
$dc_info =~ s/\s+$//; |
$dc_info =~ s/\s+$//; |
} |
} |
|
|
$role = '<span class="LC_nobreak">('.$role.')</span>' if $role; |
my $crstype; |
|
if ($env{'request.course.id'}) { |
|
$crstype = $env{'course.'.$env{'request.course.id'}.'.type'}; |
|
} elsif ($args->{'crstype'}) { |
|
$crstype = $args->{'crstype'}; |
|
} |
|
if (($crstype eq 'Placement') && (!$env{'request.role.adv'})) { |
|
undef($role); |
|
} else { |
|
$role = '<span class="LC_nobreak">('.$role.')</span>' if ($role && !$env{'browser.mobile'}); |
|
} |
|
|
if ($env{'request.state'} eq 'construct') { $forcereg=1; } |
if ($env{'request.state'} eq 'construct') { $forcereg=1; } |
|
|
Line 5585 sub bodytag {
|
Line 5600 sub bodytag {
|
$bodytag .= Apache::lonhtmlcommon::scripttag( |
$bodytag .= Apache::lonhtmlcommon::scripttag( |
Apache::lonmenu::utilityfunctions($httphost), 'start'); |
Apache::lonmenu::utilityfunctions($httphost), 'start'); |
|
|
my ($left,$right) = Apache::lonmenu::primary_menu(); |
my ($left,$right) = Apache::lonmenu::primary_menu($crstype); |
|
|
if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { |
if ($env{'request.noversionuri'} =~ m{^/res/adm/pages/}) { |
if ($dc_info) { |
if ($dc_info) { |
Line 5703 sub endbodytag {
|
Line 5718 sub endbodytag {
|
unless ((ref($args) eq 'HASH') && ($args->{'notbody'})) { |
unless ((ref($args) eq 'HASH') && ($args->{'notbody'})) { |
$endbodytag='</body>'; |
$endbodytag='</body>'; |
} |
} |
$endbodytag=&Apache::lontexconvert::jsMath_process()."\n".$endbodytag; |
|
if ( exists( $env{'internal.head.redirect'} ) ) { |
if ( exists( $env{'internal.head.redirect'} ) ) { |
if (!(ref($args) eq 'HASH' && $args->{'noredirectlink'})) { |
if (!(ref($args) eq 'HASH' && $args->{'noredirectlink'})) { |
$endbodytag= |
$endbodytag= |
Line 5878 div.LC_confirm_box .LC_success img {
|
Line 5892 div.LC_confirm_box .LC_success img {
|
vertical-align: middle; |
vertical-align: middle; |
} |
} |
|
|
|
.LC_maxwidth { |
|
max-width: 100%; |
|
height: auto; |
|
} |
|
|
|
.LC_textsize_mobile { |
|
\@media only screen and (max-device-width: 480px) { |
|
-webkit-text-size-adjust:100%; -moz-text-size-adjust:100%; -ms-text-size-adjust:100%; |
|
} |
|
} |
|
|
.LC_icon { |
.LC_icon { |
border: none; |
border: none; |
vertical-align: middle; |
vertical-align: middle; |
Line 5983 ul.LC_breadcrumb_tools_outerlist li {
|
Line 6008 ul.LC_breadcrumb_tools_outerlist li {
|
float: right; |
float: right; |
} |
} |
|
|
|
.LC_placement_prog { |
|
padding-right: 20px; |
|
font-weight: bold; |
|
font-size: 90%; |
|
} |
|
|
table#LC_title_bar td { |
table#LC_title_bar td { |
background: $tabbg; |
background: $tabbg; |
} |
} |
Line 5999 table#LC_menubuttons img {
|
Line 6030 table#LC_menubuttons img {
|
vertical-align: middle; |
vertical-align: middle; |
} |
} |
|
|
|
.LC_breadcrumbs_hoverable { |
|
background: $sidebg; |
|
} |
|
|
td.LC_table_cell_checkbox { |
td.LC_table_cell_checkbox { |
text-align: center; |
text-align: center; |
} |
} |
Line 7942 OFFLOAD
|
Line 7977 OFFLOAD
|
$result .= '>' |
$result .= '>' |
.$inhibitprint |
.$inhibitprint |
.$head_extra; |
.$head_extra; |
if ($env{'browser.mobile'}) { |
my $clientmobile; |
|
if (($env{'user.name'} eq '') && ($env{'user.domain'} eq '')) { |
|
(undef,undef,undef,undef,undef,undef,$clientmobile) = &decode_user_agent(); |
|
} else { |
|
$clientmobile = $env{'browser.mobile'}; |
|
} |
|
if ($clientmobile) { |
$result .= ' |
$result .= ' |
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> |
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0"> |
<meta name="apple-mobile-web-app-capable" content="yes" />'; |
<meta name="apple-mobile-web-app-capable" content="yes" />'; |
Line 8124 $args - additional optional args support
|
Line 8165 $args - additional optional args support
|
head -> skip the <html><head> generation |
head -> skip the <html><head> generation |
body -> skip all <body> generation |
body -> skip all <body> generation |
no_auto_mt_title -> prevent &mt()ing the title arg |
no_auto_mt_title -> prevent &mt()ing the title arg |
inherit_jsmath -> when creating popup window in a page, |
|
should it have jsmath forced on by the |
|
current page |
|
bread_crumbs -> Array containing breadcrumbs |
bread_crumbs -> Array containing breadcrumbs |
bread_crumbs_component -> if exists show it as headline else show only the breadcrumbs |
bread_crumbs_component -> if exists show it as headline else show only the breadcrumbs |
group -> includes the current group, if page is for a |
group -> includes the current group, if page is for a |
Line 8198 sub start_page {
|
Line 8236 sub start_page {
|
#if bread_crumbs_component exists show it as headline else show only the breadcrumbs |
#if bread_crumbs_component exists show it as headline else show only the breadcrumbs |
if(exists($args->{'bread_crumbs_component'})){ |
if(exists($args->{'bread_crumbs_component'})){ |
$result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'}); |
$result .= &Apache::lonhtmlcommon::breadcrumbs($args->{'bread_crumbs_component'}); |
}else{ |
} elsif ($args->{'crstype'} eq 'Placement') { |
|
$result .= &Apache::lonhtmlcommon::breadcrumbs('','','','','','','','','', |
|
$args->{'crstype'}); |
|
} else { |
$result .= &Apache::lonhtmlcommon::breadcrumbs(); |
$result .= &Apache::lonhtmlcommon::breadcrumbs(); |
} |
} |
} |
} |
Line 9315 Incoming parameters:
|
Line 9356 Incoming parameters:
|
2. user's domain |
2. user's domain |
3. quota name - portfolio, author, or course |
3. quota name - portfolio, author, or course |
(if no quota name provided, defaults to portfolio). |
(if no quota name provided, defaults to portfolio). |
4. crstype - official, unofficial, textbook or community, if quota name is |
4. crstype - official, unofficial, textbook, placement or community, |
course |
if quota name is course |
|
|
Returns: |
Returns: |
1. Disk quota (in MB) assigned to student. |
1. Disk quota (in MB) assigned to student. |
Line 9390 sub get_user_quota {
|
Line 9431 sub get_user_quota {
|
if ($quotaname eq 'course') { |
if ($quotaname eq 'course') { |
my %domdefs = &Apache::lonnet::get_domain_defaults($udom); |
my %domdefs = &Apache::lonnet::get_domain_defaults($udom); |
if (($crstype eq 'official') || ($crstype eq 'unofficial') || |
if (($crstype eq 'official') || ($crstype eq 'unofficial') || |
($crstype eq 'community') || ($crstype eq 'textbook')) { |
($crstype eq 'community') || ($crstype eq 'textbook') || |
|
($crstype eq 'placement')) { |
$defquota = $domdefs{$crstype.'quota'}; |
$defquota = $domdefs{$crstype.'quota'}; |
} |
} |
if ($defquota eq '') { |
if ($defquota eq '') { |
Line 9538 Inputs: 7
|
Line 9580 Inputs: 7
|
4. filename of file for which action is being requested |
4. filename of file for which action is being requested |
5. filesize (kB) of file |
5. filesize (kB) of file |
6. action being taken: copy or upload. |
6. action being taken: copy or upload. |
7. quotatype (in course context -- official, unofficial, community or textbook). |
7. quotatype (in course context -- official, unofficial, textbook, placement or community). |
|
|
Returns: 1 scalar: HTML to display containing warning if quota would be exceeded, |
Returns: 1 scalar: HTML to display containing warning if quota would be exceeded, |
otherwise return null. |
otherwise return null. |
Line 14259 sub extract_categories {
|
Line 14301 sub extract_categories {
|
$trailstr = &mt('Official courses (with institutional codes)'); |
$trailstr = &mt('Official courses (with institutional codes)'); |
} elsif ($name eq 'communities') { |
} elsif ($name eq 'communities') { |
$trailstr = &mt('Communities'); |
$trailstr = &mt('Communities'); |
|
} elsif ($name eq 'placement') { |
|
$trailstr = &mt('Placement Tests'); |
} else { |
} else { |
$trailstr = $name; |
$trailstr = $name; |
} |
} |
Line 14397 sub assign_categories_table {
|
Line 14441 sub assign_categories_table {
|
next if ($parent eq 'instcode'); |
next if ($parent eq 'instcode'); |
if ($type eq 'Community') { |
if ($type eq 'Community') { |
next unless ($parent eq 'communities'); |
next unless ($parent eq 'communities'); |
|
} elsif ($type eq 'Placement') { |
|
next unless ($parent eq 'placement'); |
} else { |
} else { |
next if ($parent eq 'communities'); |
next if (($parent eq 'communities') || ($parent eq 'placement')); |
} |
} |
my $css_class = $itemcount%2?' class="LC_odd_row"':''; |
my $css_class = $itemcount%2?' class="LC_odd_row"':''; |
my $item = &escape($parent).'::0'; |
my $item = &escape($parent).'::0'; |
Line 14411 sub assign_categories_table {
|
Line 14457 sub assign_categories_table {
|
my $parent_title = $parent; |
my $parent_title = $parent; |
if ($parent eq 'communities') { |
if ($parent eq 'communities') { |
$parent_title = &mt('Communities'); |
$parent_title = &mt('Communities'); |
|
} elsif ($parent eq 'placement') { |
|
$parent_title = &mt('Placement Tests'); |
} |
} |
$table .= '<tr '.$css_class.'><td><span class="LC_nobreak">'. |
$table .= '<tr '.$css_class.'><td><span class="LC_nobreak">'. |
'<input type="checkbox" name="usecategory" value="'. |
'<input type="checkbox" name="usecategory" value="'. |
Line 14846 sub construct_course {
|
Line 14894 sub construct_course {
|
# |
# |
# Open course |
# Open course |
# |
# |
my $crstype = lc($args->{'crstype'}); |
my $showncrstype; |
|
if ($args->{'crstype'} eq 'Placement') { |
|
$showncrstype = 'placement test'; |
|
} else { |
|
$showncrstype = lc($args->{'crstype'}); |
|
} |
my %cenv=(); |
my %cenv=(); |
$$courseid=&Apache::lonnet::createcourse($args->{'course_domain'}, |
$$courseid=&Apache::lonnet::createcourse($args->{'course_domain'}, |
$args->{'cdescr'}, |
$args->{'cdescr'}, |
Line 14863 sub construct_course {
|
Line 14916 sub construct_course {
|
# Utils::Course. This needs to at least be output as a comment |
# Utils::Course. This needs to at least be output as a comment |
# if anyone ever decides to not show this, and Utils::Course::new |
# if anyone ever decides to not show this, and Utils::Course::new |
# will need to be suitably modified. |
# will need to be suitably modified. |
$outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$crstype,$$courseid).$linefeed; |
$outcome .= &mt('New LON-CAPA [_1] ID: [_2]',$showncrstype,$$courseid).$linefeed; |
if ($$courseid =~ /^error:/) { |
if ($$courseid =~ /^error:/) { |
return (0,$outcome); |
return (0,$outcome); |
} |
} |
Line 14883 sub construct_course {
|
Line 14936 sub construct_course {
|
# Do the cloning |
# Do the cloning |
# |
# |
if ($can_clone && $cloneid) { |
if ($can_clone && $cloneid) { |
$clonemsg = &mt('Cloning [_1] from [_2]',$crstype,$clonehome); |
$clonemsg = &mt('Cloning [_1] from [_2]',$showncrstype,$clonehome); |
if ($context ne 'auto') { |
if ($context ne 'auto') { |
$clonemsg = '<span class="LC_success">'.$clonemsg.'</span>'; |
$clonemsg = '<span class="LC_success">'.$clonemsg.'</span>'; |
} |
} |
Line 15188 sub construct_course {
|
Line 15241 sub construct_course {
|
$outcome .= ($fatal?$errtext:'write ok').$linefeed; |
$outcome .= ($fatal?$errtext:'write ok').$linefeed; |
} |
} |
|
|
|
# |
|
# Set params for Placement Tests |
|
# |
|
if ($args->{'crstype'} eq 'Placement') { |
|
my %storecontent; |
|
my $prefix=$$crsudom.'_'.$$crsunum.'.0.'; |
|
my %defaults = ( |
|
buttonshide => { value => 'yes', |
|
type => 'string_yesno',}, |
|
type => { value => 'randomizetry', |
|
type => 'string_questiontype',}, |
|
maxtries => { value => 1, |
|
type => 'int_pos',}, |
|
problemstatus => { value => 'no', |
|
type => 'string_problemstatus',}, |
|
); |
|
foreach my $key (keys(%defaults)) { |
|
$storecontent{$prefix.$key} = $defaults{$key}{'value'}; |
|
$storecontent{$prefix.$key.'.type'} = $defaults{$key}{'type'}; |
|
} |
|
&Apache::lonnet::cput |
|
('resourcedata',\%storecontent,$$crsudom,$$crsunum); |
|
} |
|
|
return (1,$outcome); |
return (1,$outcome); |
} |
} |
|
|
Line 15248 sub generate_code {
|
Line 15325 sub generate_code {
|
############################################################ |
############################################################ |
############################################################ |
############################################################ |
|
|
#SD |
# Community, Course and Placement Test |
# only Community and Course, or anything else? |
|
sub course_type { |
sub course_type { |
my ($cid) = @_; |
my ($cid) = @_; |
if (!defined($cid)) { |
if (!defined($cid)) { |
Line 15267 sub group_term {
|
Line 15343 sub group_term {
|
my %names = ( |
my %names = ( |
'Course' => 'group', |
'Course' => 'group', |
'Community' => 'group', |
'Community' => 'group', |
|
'Placement' => 'group', |
); |
); |
return $names{$crstype}; |
return $names{$crstype}; |
} |
} |
|
|
sub course_types { |
sub course_types { |
my @types = ('official','unofficial','community','textbook'); |
my @types = ('official','unofficial','community','textbook','placement'); |
my %typename = ( |
my %typename = ( |
official => 'Official course', |
official => 'Official course', |
unofficial => 'Unofficial course', |
unofficial => 'Unofficial course', |
community => 'Community', |
community => 'Community', |
textbook => 'Textbook course', |
textbook => 'Textbook course', |
|
placement => 'Placement test', |
); |
); |
return (\@types,\%typename); |
return (\@types,\%typename); |
} |
} |
Line 15492 sub init_user_environment {
|
Line 15570 sub init_user_environment {
|
undef,\%userenv,\%domdef,\%is_adv); |
undef,\%userenv,\%domdef,\%is_adv); |
} |
} |
|
|
foreach my $crstype ('official','unofficial','community','textbook') { |
foreach my $crstype ('official','unofficial','community','textbook','placement') { |
$userenv{'canrequest.'.$crstype} = |
$userenv{'canrequest.'.$crstype} = |
&Apache::lonnet::usertools_access($username,$domain,$crstype, |
&Apache::lonnet::usertools_access($username,$domain,$crstype, |
'reload','requestcourses', |
'reload','requestcourses', |
Line 15740 sub build_filters {
|
Line 15818 sub build_filters {
|
$createdfilterform = &timebased_select_form('createdfilter',$filter); |
$createdfilterform = &timebased_select_form('createdfilter',$filter); |
} |
} |
|
|
|
my $prefix = $crstype; |
|
if ($crstype eq 'Placement') { |
|
$prefix = 'Placement Test' |
|
} |
my %lt = &Apache::lonlocal::texthash( |
my %lt = &Apache::lonlocal::texthash( |
'cac' => "$crstype Activity", |
'cac' => "$prefix Activity", |
'ccr' => "$crstype Created", |
'ccr' => "$prefix Created", |
'cde' => "$crstype Title", |
'cde' => "$prefix Title", |
'cdo' => "$crstype Domain", |
'cdo' => "$prefix Domain", |
'ins' => 'Institutional Code', |
'ins' => 'Institutional Code', |
'inc' => 'Institutional Categorization', |
'inc' => 'Institutional Categorization', |
'cow' => "$crstype Owner/Co-owner", |
'cow' => "$prefix Owner/Co-owner", |
'cop' => "$crstype Personnel Includes", |
'cop' => "$prefix Personnel Includes", |
'cog' => 'Type', |
'cog' => 'Type', |
); |
); |
|
|
Line 15756 sub build_filters {
|
Line 15838 sub build_filters {
|
my $typeval = 'Course'; |
my $typeval = 'Course'; |
if ($crstype eq 'Community') { |
if ($crstype eq 'Community') { |
$typeval = 'Community'; |
$typeval = 'Community'; |
|
} elsif ($crstype eq 'Placement') { |
|
$typeval = 'Placement'; |
} |
} |
$typeselectform = '<input type="hidden" name="type" value="'.$typeval.'" />'; |
$typeselectform = '<input type="hidden" name="type" value="'.$typeval.'" />'; |
} else { |
} else { |
Line 15764 sub build_filters {
|
Line 15848 sub build_filters {
|
$typeselectform .= ' onchange="'.$onchange.'"'; |
$typeselectform .= ' onchange="'.$onchange.'"'; |
} |
} |
$typeselectform .= '>'."\n"; |
$typeselectform .= '>'."\n"; |
foreach my $posstype ('Course','Community') { |
foreach my $posstype ('Course','Community','Placement') { |
|
my $shown; |
|
if ($posstype eq 'Placement') { |
|
$shown = &mt('Placement Test'); |
|
} else { |
|
$shown = &mt($posstype); |
|
} |
$typeselectform.='<option value="'.$posstype.'"'. |
$typeselectform.='<option value="'.$posstype.'"'. |
($posstype eq $crstype ? ' selected="selected" ' : ''). ">".&mt($posstype)."</option>\n"; |
($posstype eq $crstype ? ' selected="selected" ' : ''). ">".$shown."</option>\n"; |
} |
} |
$typeselectform.="</select>"; |
$typeselectform.="</select>"; |
} |
} |
Line 16342 sub update_content_constraints {
|
Line 16432 sub update_content_constraints {
|
my ($reqdmajor,$reqdminor) = split(/\./,$curr_reqd_hash{'internal.releaserequired'}); |
my ($reqdmajor,$reqdminor) = split(/\./,$curr_reqd_hash{'internal.releaserequired'}); |
my %checkresponsetypes; |
my %checkresponsetypes; |
foreach my $key (keys(%Apache::lonnet::needsrelease)) { |
foreach my $key (keys(%Apache::lonnet::needsrelease)) { |
my ($item,$name,$value,$valmatch) = split(/:/,$key); |
my ($item,$name,$value) = split(/:/,$key); |
if ($item eq 'resourcetag') { |
if ($item eq 'resourcetag') { |
if ($name eq 'responsetype') { |
if ($name eq 'responsetype') { |
$checkresponsetypes{$value} = $Apache::lonnet::needsrelease{$key} |
$checkresponsetypes{$value} = $Apache::lonnet::needsrelease{$key} |
Line 16517 sub symb_to_docspath {
|
Line 16607 sub symb_to_docspath {
|
sub captcha_display { |
sub captcha_display { |
my ($context,$lonhost) = @_; |
my ($context,$lonhost) = @_; |
my ($output,$error); |
my ($output,$error); |
my ($captcha,$pubkey,$privkey) = &get_captcha_config($context,$lonhost); |
my ($captcha,$pubkey,$privkey,$version) = |
|
&get_captcha_config($context,$lonhost); |
if ($captcha eq 'original') { |
if ($captcha eq 'original') { |
$output = &create_captcha(); |
$output = &create_captcha(); |
unless ($output) { |
unless ($output) { |
$error = 'captcha'; |
$error = 'captcha'; |
} |
} |
} elsif ($captcha eq 'recaptcha') { |
} elsif ($captcha eq 'recaptcha') { |
$output = &create_recaptcha($pubkey); |
$output = &create_recaptcha($pubkey,$version); |
unless ($output) { |
unless ($output) { |
$error = 'recaptcha'; |
$error = 'recaptcha'; |
} |
} |
} |
} |
return ($output,$error,$captcha); |
return ($output,$error,$captcha,$version); |
} |
} |
|
|
sub captcha_response { |
sub captcha_response { |
my ($context,$lonhost) = @_; |
my ($context,$lonhost) = @_; |
my ($captcha_chk,$captcha_error); |
my ($captcha_chk,$captcha_error); |
my ($captcha,$pubkey,$privkey) = &get_captcha_config($context,$lonhost); |
my ($captcha,$pubkey,$privkey,$version) = &get_captcha_config($context,$lonhost); |
if ($captcha eq 'original') { |
if ($captcha eq 'original') { |
($captcha_chk,$captcha_error) = &check_captcha(); |
($captcha_chk,$captcha_error) = &check_captcha(); |
} elsif ($captcha eq 'recaptcha') { |
} elsif ($captcha eq 'recaptcha') { |
$captcha_chk = &check_recaptcha($privkey); |
$captcha_chk = &check_recaptcha($privkey,$version); |
} else { |
} else { |
$captcha_chk = 1; |
$captcha_chk = 1; |
} |
} |
Line 16548 sub captcha_response {
|
Line 16639 sub captcha_response {
|
|
|
sub get_captcha_config { |
sub get_captcha_config { |
my ($context,$lonhost) = @_; |
my ($context,$lonhost) = @_; |
my ($captcha,$pubkey,$privkey,$hashtocheck); |
my ($captcha,$pubkey,$privkey,$version,$hashtocheck); |
my $hostname = &Apache::lonnet::hostname($lonhost); |
my $hostname = &Apache::lonnet::hostname($lonhost); |
my $serverhomeID = &Apache::lonnet::get_server_homeID($hostname); |
my $serverhomeID = &Apache::lonnet::get_server_homeID($hostname); |
my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID); |
my $serverhomedom = &Apache::lonnet::host_domain($serverhomeID); |
Line 16564 sub get_captcha_config {
|
Line 16655 sub get_captcha_config {
|
} |
} |
if ($privkey && $pubkey) { |
if ($privkey && $pubkey) { |
$captcha = 'recaptcha'; |
$captcha = 'recaptcha'; |
|
$version = $hashtocheck->{'recaptchaversion'}; |
|
if ($version ne '2') { |
|
$version = 1; |
|
} |
} else { |
} else { |
$captcha = 'original'; |
$captcha = 'original'; |
} |
} |
Line 16581 sub get_captcha_config {
|
Line 16676 sub get_captcha_config {
|
$privkey = $domconfhash{$serverhomedom.'.login.recaptchakeys_private'}; |
$privkey = $domconfhash{$serverhomedom.'.login.recaptchakeys_private'}; |
if ($privkey && $pubkey) { |
if ($privkey && $pubkey) { |
$captcha = 'recaptcha'; |
$captcha = 'recaptcha'; |
|
$version = $domconfhash{$serverhomedom.'.login.recaptchaversion'}; |
|
if ($version ne '2') { |
|
$version = 1; |
|
} |
} else { |
} else { |
$captcha = 'original'; |
$captcha = 'original'; |
} |
} |
Line 16588 sub get_captcha_config {
|
Line 16687 sub get_captcha_config {
|
$captcha = 'original'; |
$captcha = 'original'; |
} |
} |
} |
} |
return ($captcha,$pubkey,$privkey); |
return ($captcha,$pubkey,$privkey,$version); |
} |
} |
|
|
sub create_captcha { |
sub create_captcha { |
Line 16647 sub check_captcha {
|
Line 16746 sub check_captcha {
|
} |
} |
|
|
sub create_recaptcha { |
sub create_recaptcha { |
my ($pubkey) = @_; |
my ($pubkey,$version) = @_; |
my $use_ssl; |
if ($version >= 2) { |
if ($ENV{'SERVER_PORT'} == 443) { |
return '<div class="g-recaptcha" data-sitekey="'.$pubkey.'"></div>'; |
$use_ssl = 1; |
} else { |
} |
my $use_ssl; |
my $captcha = Captcha::reCAPTCHA->new; |
if ($ENV{'SERVER_PORT'} == 443) { |
return $captcha->get_options_setter({theme => 'white'})."\n". |
$use_ssl = 1; |
$captcha->get_html($pubkey,undef,$use_ssl). |
} |
&mt('If the text is hard to read, [_1] will replace them.', |
my $captcha = Captcha::reCAPTCHA->new; |
'<img src="/res/adm/pages/refresh.gif" alt="reCAPTCHA refresh" />'). |
return $captcha->get_options_setter({theme => 'white'})."\n". |
'<br /><br />'; |
$captcha->get_html($pubkey,undef,$use_ssl). |
|
&mt('If the text is hard to read, [_1] will replace them.', |
|
'<img src="/res/adm/pages/refresh.gif" alt="reCAPTCHA refresh" />'). |
|
'<br /><br />'; |
|
} |
} |
} |
|
|
sub check_recaptcha { |
sub check_recaptcha { |
my ($privkey) = @_; |
my ($privkey,$version) = @_; |
my $captcha_chk; |
my $captcha_chk; |
my $captcha = Captcha::reCAPTCHA->new; |
if ($version >= 2) { |
my $captcha_result = |
my $ua = LWP::UserAgent->new; |
$captcha->check_answer( |
$ua->timeout(10); |
$privkey, |
my %info = ( |
$ENV{'REMOTE_ADDR'}, |
secret => $privkey, |
$env{'form.recaptcha_challenge_field'}, |
response => $env{'form.g-recaptcha-response'}, |
$env{'form.recaptcha_response_field'}, |
remoteip => $ENV{'REMOTE_ADDR'}, |
); |
); |
if ($captcha_result->{is_valid}) { |
my $response = $ua->post('https://www.google.com/recaptcha/api/siteverify',\%info); |
$captcha_chk = 1; |
if ($response->is_success) { |
|
my $data = JSON::DWIW->from_json($response->decoded_content); |
|
if (ref($data) eq 'HASH') { |
|
if ($data->{'success'}) { |
|
$captcha_chk = 1; |
|
} |
|
} |
|
} |
|
} else { |
|
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; |
return $captcha_chk; |
} |
} |
|
|
sub emailusername_info { |
sub emailusername_info { |
my @fields = ('firstname','lastname','institution','web','location','officialemail'); |
my @fields = ('firstname','lastname','institution','web','location','officialemail','id'); |
my %titles = &Apache::lonlocal::texthash ( |
my %titles = &Apache::lonlocal::texthash ( |
lastname => 'Last Name', |
lastname => 'Last Name', |
firstname => 'First Name', |
firstname => 'First Name', |
Line 16686 sub emailusername_info {
|
Line 16808 sub emailusername_info {
|
location => "School's city, state/province, country", |
location => "School's city, state/province, country", |
web => "School's web address", |
web => "School's web address", |
officialemail => 'E-mail address at institution (if different)', |
officialemail => 'E-mail address at institution (if different)', |
|
id => 'Student/Employee ID', |
); |
); |
return (\@fields,\%titles); |
return (\@fields,\%titles); |
} |
} |