version 1.1075.2.101, 2016/08/05 22:24:31
|
version 1.1075.2.111, 2016/09/01 01:27:25
|
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 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 |
|
|
Line 965 sub select_datelocale {
|
Line 967 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 988 sub select_datelocale {
|
Line 991 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); |
} |
} |
} |
} |
} |
} |
Line 4682 END_BLOCK
|
Line 4685 END_BLOCK
|
############################################### |
############################################### |
|
|
sub check_ip_acc { |
sub check_ip_acc { |
my ($acc)=@_; |
my ($acc,$clientip)=@_; |
&Apache::lonxml::debug("acc is $acc"); |
&Apache::lonxml::debug("acc is $acc"); |
if (!defined($acc) || $acc =~ /^\s*$/ || $acc =~/^\s*no\s*$/i) { |
if (!defined($acc) || $acc =~ /^\s*$/ || $acc =~/^\s*no\s*$/i) { |
return 1; |
return 1; |
} |
} |
my $allowed=0; |
my $allowed=0; |
my $ip=$env{'request.host'} || $ENV{'REMOTE_ADDR'}; |
my $ip=$ENV{'REMOTE_ADDR'} || $clientip || $env{'request.host'}; |
|
|
my $name; |
my $name; |
foreach my $pattern (split(',',$acc)) { |
foreach my $pattern (split(',',$acc)) { |
Line 5220 sub bodytag {
|
Line 5223 sub bodytag {
|
$dc_info =~ s/\s+$//; |
$dc_info =~ s/\s+$//; |
} |
} |
|
|
$role = '<span class="LC_nobreak">('.$role.')</span>' if $role; |
$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 5597 div.LC_confirm_box .LC_success img {
|
Line 5600 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 5718 table#LC_menubuttons img {
|
Line 5732 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 7529 OFFLOAD
|
Line 7547 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 9871 reservable_now - ref to hash of student_
|
Line 9895 reservable_now - ref to hash of student_
|
|
|
Keys in inner hash are: |
Keys in inner hash are: |
(a) symb: either blank or symb to which slot use is restricted. |
(a) symb: either blank or symb to which slot use is restricted. |
(b) endreserve: end date of reservation period. |
(b) endreserve: end date of reservation period. |
|
(c) uniqueperiod: start,end dates when slot is to be uniquely |
|
selected. |
|
|
sorted_future - ref to array of student_schedulable slots reservable in |
sorted_future - ref to array of student_schedulable slots reservable in |
the future, ordered by start date of reservation period. |
the future, ordered by start date of reservation period. |
Line 9882 future_reservable - ref to hash of stude
|
Line 9908 future_reservable - ref to hash of stude
|
Keys in inner hash are: |
Keys in inner hash are: |
(a) symb: either blank or symb to which slot use is restricted. |
(a) symb: either blank or symb to which slot use is restricted. |
(b) startreserve: start date of reservation period. |
(b) startreserve: start date of reservation period. |
|
(c) uniqueperiod: start,end dates when slot is to be uniquely |
|
selected. |
|
|
=back |
=back |
|
|
Line 9935 sub get_future_slots {
|
Line 9963 sub get_future_slots {
|
my $startreserve = $slots{$slot}->{'startreserve'}; |
my $startreserve = $slots{$slot}->{'startreserve'}; |
my $endreserve = $slots{$slot}->{'endreserve'}; |
my $endreserve = $slots{$slot}->{'endreserve'}; |
my $symb = $slots{$slot}->{'symb'}; |
my $symb = $slots{$slot}->{'symb'}; |
|
my $uniqueperiod; |
|
if (ref($slots{$slot}->{'uniqueperiod'}) eq 'ARRAY') { |
|
$uniqueperiod = join(',',@{$slots{$slot}->{'uniqueperiod'}}); |
|
} |
if (($startreserve < $now) && |
if (($startreserve < $now) && |
(!$endreserve || $endreserve > $now)) { |
(!$endreserve || $endreserve > $now)) { |
my $lastres = $endreserve; |
my $lastres = $endreserve; |
Line 9943 sub get_future_slots {
|
Line 9975 sub get_future_slots {
|
} |
} |
$reservable_now{$slot} = { |
$reservable_now{$slot} = { |
symb => $symb, |
symb => $symb, |
endreserve => $lastres |
endreserve => $lastres, |
|
uniqueperiod => $uniqueperiod, |
}; |
}; |
} elsif (($startreserve > $now) && |
} elsif (($startreserve > $now) && |
(!$endreserve || $endreserve > $startreserve)) { |
(!$endreserve || $endreserve > $startreserve)) { |
$future_reservable{$slot} = { |
$future_reservable{$slot} = { |
symb => $symb, |
symb => $symb, |
startreserve => $startreserve |
startreserve => $startreserve, |
|
uniqueperiod => $uniqueperiod, |
}; |
}; |
} |
} |
} |
} |
Line 14568 sub construct_course {
|
Line 14602 sub construct_course {
|
if ($args->{'setcontent'}) { |
if ($args->{'setcontent'}) { |
$cenv{'question.email'}=$args->{'ccuname'}.':'.$args->{'ccdomain'}; |
$cenv{'question.email'}=$args->{'ccuname'}.':'.$args->{'ccdomain'}; |
} |
} |
|
if ($args->{'setcomment'}) { |
|
$cenv{'comment.email'}=$args->{'ccuname'}.':'.$args->{'ccdomain'}; |
|
} |
} |
} |
if ($args->{'reshome'}) { |
if ($args->{'reshome'}) { |
$cenv{'reshome'}=$args->{'reshome'}.'/'; |
$cenv{'reshome'}=$args->{'reshome'}.'/'; |
Line 16003 sub symb_to_docspath {
|
Line 16040 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 16034 sub captcha_response {
|
Line 16072 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 16050 sub get_captcha_config {
|
Line 16088 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 16067 sub get_captcha_config {
|
Line 16109 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 16074 sub get_captcha_config {
|
Line 16120 sub get_captcha_config {
|
$captcha = 'original'; |
$captcha = 'original'; |
} |
} |
} |
} |
return ($captcha,$pubkey,$privkey); |
return ($captcha,$pubkey,$privkey,$version); |
} |
} |
|
|
sub create_captcha { |
sub create_captcha { |
Line 16133 sub check_captcha {
|
Line 16179 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 16172 sub emailusername_info {
|
Line 16241 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); |
} |
} |
Line 16252 sub des_decrypt {
|
Line 16322 sub des_decrypt {
|
} else { |
} else { |
$cypher=new DES $keybin; |
$cypher=new DES $keybin; |
} |
} |
my $plaintext= |
my $plaintext=''; |
$cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,0,16)))); |
my $cypherlength = length($cyphertext); |
$plaintext.= |
my $numchunks = int($cypherlength/32); |
$cypher->decrypt(unpack("a8",pack("H16",substr($cyphertext,16,16)))); |
for (my $j=0; $j<$numchunks; $j++) { |
$plaintext=substr($plaintext,1,ord(substr($plaintext,0,1)) ); |
my $start = $j*32; |
|
my $cypherblock = substr($cyphertext,$start,32); |
|
my $chunk = |
|
$cypher->decrypt(unpack("a8",pack("H16",substr($cypherblock,0,16)))); |
|
$chunk .= |
|
$cypher->decrypt(unpack("a8",pack("H16",substr($cypherblock,16,16)))); |
|
$chunk=substr($chunk,1,ord(substr($chunk,0,1)) ); |
|
$plaintext .= $chunk; |
|
} |
return $plaintext; |
return $plaintext; |
} |
} |
|
|