--- loncom/lond 2022/02/20 20:58:26 1.489.2.43.2.3 +++ loncom/lond 2022/02/27 02:13:24 1.489.2.45 @@ -2,7 +2,7 @@ # The LearningOnline Network # lond "LON Daemon" Server (port "LOND" 5663) # -# $Id: lond,v 1.489.2.43.2.3 2022/02/20 20:58:26 raeburn Exp $ +# $Id: lond,v 1.489.2.45 2022/02/27 02:13:24 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -63,7 +63,7 @@ my $DEBUG = 0; # Non zero to ena my $status=''; my $lastlog=''; -my $VERSION='$Revision: 1.489.2.43.2.3 $'; #' stupid emacs +my $VERSION='$Revision: 1.489.2.45 $'; #' stupid emacs my $remoteVERSION; my $currenthostid="default"; my $currentdomainid; @@ -2407,6 +2407,36 @@ sub update_passwd_history { return; } +sub inst_unamemap_check { + my ($cmd, $tail, $client) = @_; + my $userinput = "$cmd:$tail"; + my %rulecheck; + my $outcome; + my ($udom,$uname,@rules) = split(/:/,$tail); + $udom = &unescape($udom); + $uname = &unescape($uname); + @rules = map {&unescape($_);} (@rules); + eval { + local($SIG{__DIE__})='DEFAULT'; + $outcome = &localenroll::unamemap_check($udom,$uname,\@rules,\%rulecheck); + }; + if (!$@) { + if ($outcome eq 'ok') { + my $result=''; + foreach my $key (keys(%rulecheck)) { + $result.=&escape($key).'='.&Apache::lonnet::freeze_escape($rulecheck{$key}).'&'; + } + &Reply($client,\$result,$userinput); + } else { + &Reply($client,"error\n", $userinput); + } + } else { + &Failure($client,"unknown_cmd\n",$userinput); + } +} +®ister_handler("instunamemapcheck",\&inst_unamemap_check,0,1,0); + + # # Determines if this is the home server for a user. The home server # for a user will have his/her lon-capa passwd file. Therefore all we need @@ -3536,47 +3566,6 @@ sub dump_with_regexp { } ®ister_handler("dump", \&dump_with_regexp, 0, 1, 0); -# -# Process the encrypted dump request. Original call should -# be from lonnet::dump() with seventh arg ($encrypt) set to -# 1, to ensure that both request and response are encrypted. -# -# Parameters: -# $cmd - Command keyword of request (edump). -# $tail - Tail of the command. -# See &dump_with_regexp for more -# information about this. -# $client - File open on the client. -# Returns: -# 1 - Continue processing -# 0 - server should exit. -# - -sub encrypted_dump_with_regexp { - my ($cmd, $tail, $client) = @_; - my $res = LONCAPA::Lond::dump_with_regexp($tail, $clientversion); - - if ($res =~ /^error:/) { - Failure($client, \$res, "$cmd:$tail"); - } else { - if ($cipher) { - my $cmdlength=length($res); - $res.=" "; - my $encres=''; - for (my $encidx=0;$encidx<=$cmdlength;$encidx+=8) { - $encres.= unpack("H16", - $cipher->encrypt(substr($res, - $encidx, - 8))); - } - &Reply( $client,"enc:$cmdlength:$encres\n","$cmd:$tail"); - } else { - &Failure( $client, "error:no_key\n","$cmd:$tail"); - } - } -} -®ister_handler("edump", \&encrypted_dump_with_regexp, 0, 1, 0); - # Store a set of key=value pairs associated with a versioned name. # # Parameters: @@ -4723,118 +4712,16 @@ sub get_domain_handler { my $userinput = "$cmd:$tail"; my ($udom,$namespace,$what)=split(/:/,$tail,3); - if (($namespace =~ /^enc/) || ($namespace eq 'private')) { - &Failure( $client, "refused\n", $userinput); - } else { - my $res = LONCAPA::Lond::get_dom($userinput); - if ($res =~ /^error:/) { - &Failure($client, \$res, $userinput); - } else { - &Reply($client, \$res, $userinput); - } - } - - return 1; -} -®ister_handler("getdom", \&get_domain_handler, 0, 1, 0); - -sub encrypted_get_domain_handler { - my ($cmd, $tail, $client) = @_; - - my $userinput = "$cmd:$tail"; - - my ($udom,$namespace,$what) = split(/:/,$tail,3); - if ($namespace eq 'private') { - &Failure( $client, "refused\n", $userinput); - } else { - my $res = LONCAPA::Lond::get_dom($userinput); - if ($res =~ /^error:/) { - &Failure($client, \$res, $userinput); - } else { - if ($cipher) { - my $cmdlength=length($res); - $res.=" "; - my $encres=''; - for (my $encidx=0;$encidx<=$cmdlength;$encidx+=8) { - $encres.= unpack("H16", - $cipher->encrypt(substr($res, - $encidx, - 8))); - } - &Reply( $client,"enc:$cmdlength:$encres\n",$userinput); - } else { - &Failure( $client, "error:no_key\n",$userinput); - } - } - } - return 1; -} -®ister_handler("egetdom", \&encrypted_get_domain_handler, 1, 1, 0); - -# -# Encrypted get from the namespace database file at the domain level. -# This function retrieves a keyed item from a specific named database in the -# domain directory. -# -# Parameters: -# $cmd - Command request keyword (lti). -# $tail - Tail of the command. This is a colon-separated list -# consisting of the domain, coursenum, if for LTI- -# enabled deep-linking to course content using -# link protection configured within a course, -# context (=deeplink) if for LTI-enabled deep-linking -# to course content using LTI Provider settings -# configured within a course's domain, the (escaped) -# launch URL, the (escaped) method (typically POST), -# and a frozen hash of the LTI launch parameters -# from the LTI payload. -# $client - File descriptor open on the client. -# Returns: -# 1 - Continue processing. -# 0 - Exit. -# Side effects: -# The reply will contain an LTI itemID, if the signed LTI payload -# could be verified using the consumer key and the shared secret -# available for that key (for the itemID) for either the course or domain, -# depending on values for cnum and context. The reply is encrypted before -# being written to $client. -# -sub lti_handler { - my ($cmd, $tail, $client) = @_; - - my $userinput = "$cmd:$tail"; - - my ($cdom,$cnum,$context,$escurl,$escmethod,$items) = split(/:/,$tail); - my $url = &unescape($escurl); - my $method = &unescape($escmethod); - my $params = &Apache::lonnet::thaw_unescape($items); - my $res; - if ($cnum ne '') { - $res = &LONCAPA::Lond::crslti_itemid($cdom,$cnum,$url,$method,$params,$perlvar{'lonVersion'}); - } else { - $res = &LONCAPA::Lond::domlti_itemid($cdom,$context,$url,$method,$params,$perlvar{'lonVersion'}); - } + my $res = LONCAPA::Lond::get_dom($userinput); if ($res =~ /^error:/) { &Failure($client, \$res, $userinput); } else { - if ($cipher) { - my $cmdlength=length($res); - $res.=" "; - my $encres=''; - for (my $encidx=0;$encidx<=$cmdlength;$encidx+=8) { - $encres.= unpack("H16", - $cipher->encrypt(substr($res, - $encidx, - 8))); - } - &Reply( $client,"enc:$cmdlength:$encres\n",$userinput); - } else { - &Failure( $client, "error:no_key\n",$userinput); - } + &Reply($client, \$res, $userinput); } + return 1; } -®ister_handler("lti", \<i_handler, 1, 1, 0); +®ister_handler("getdom", \&get_domain_handler, 0, 1, 0); # # Puts an id to a domains id database. @@ -6368,6 +6255,39 @@ sub get_institutional_selfcreate_rules { } ®ister_handler("instemailrules",\&get_institutional_selfcreate_rules,0,1,0); +sub get_unamemap_rules { + my ($cmd, $tail, $client) = @_; + my $userinput = "$cmd:$tail"; + my $dom = &unescape($tail); + my (%rules_hash,@rules_order); + my $outcome; + eval { + local($SIG{__DIE__})='DEFAULT'; + $outcome = &localenroll::unamemap_rules($dom,\%rules_hash,\@rules_order); + }; + if (!$@) { + if ($outcome eq 'ok') { + my $result; + foreach my $key (keys(%rules_hash)) { + $result .= &escape($key).'='.&Apache::lonnet::freeze_escape($rules_hash{$key}).'&'; + } + $result =~ s/\&$//; + $result .= ':'; + if (@rules_order > 0) { + foreach my $item (@rules_order) { + $result .= &escape($item).'&'; + } + } + $result =~ s/\&$//; + &Reply($client,\$result,$userinput); + } else { + &Reply($client,"error\n", $userinput); + } + } else { + &Failure($client,"unknown_cmd\n",$userinput); + } +} +®ister_handler("unamemaprules",\&get_unamemap_rules,0,1,0); sub institutional_username_check { my ($cmd, $tail, $client) = @_; @@ -7746,8 +7666,15 @@ sub validate_user { } elsif ((($domdefaults{'auth_def'} eq 'krb4') || ($domdefaults{'auth_def'} eq 'krb5')) && ($domdefaults{'auth_arg_def'} ne '')) { - $howpwd = $domdefaults{'auth_def'}; - $contentpwd = $domdefaults{'auth_arg_def'}; + # + # Don't attempt authentication for username and password supplied + # for user without an account if uername contains @ to avoid + # call to &Authen::Krb5::parse_name() which will result in con_lost + # + unless ($user =~ /\@/) { + $howpwd = $domdefaults{'auth_def'}; + $contentpwd = $domdefaults{'auth_arg_def'}; + } } } }