Add latest RBN chnages and data stats
[spider.git] / perl / ExtMsg.pm
index 19aa3b47ca5e548e2d34c8c201e82934f767bc3b..064bd90af487df88730f7cd8b465115e1f1042c8 100644 (file)
@@ -37,7 +37,7 @@ sub enqueue
 {
        my ($conn, $msg) = @_;
        unless ($msg =~ /^[ABZ]/) {
-               if ($msg =~ /^E[-\w]+\|([01])/ && $conn->{csort} eq 'telnet') {
+               if ($msg =~ m{^E[-\w\/]+\|([01])} && $conn->{csort} eq 'telnet') {
                        $conn->{echo} = $1;
                        if ($1) {
 #                              $conn->send_raw("\xFF\xFC\x01");
@@ -45,7 +45,7 @@ sub enqueue
 #                              $conn->send_raw("\xFF\xFB\x01");
                        }
                } else {
-                       $msg =~ s/^[-\w]+\|//;
+                       $msg =~ s{^[-\w\/]+\|}{};
                        push (@{$conn->{outqueue}}, $msg . $conn->{lineend});
                }
        }
@@ -64,6 +64,24 @@ sub echo
        $conn->{echo} = shift;
 }
 
+sub _rcv
+{
+    my $conn = shift; # $rcv_now complement of $flush
+       my $msg = shift;
+    my $sock = $conn->{sock};
+    return unless defined($sock);
+       return if $conn->{disconnecting};
+
+       if ($conn->{state} eq 'WL' && $conn->{sort} =~ /^I/ && $msg =~ /^PROXY/) {
+               my $echo = $conn->{echo};
+               $conn->{echo} = 0;
+               $conn->SUPER::_rcv($msg);
+               $conn->{echo} = $echo;
+       } else {
+               $conn->SUPER::_rcv($msg);
+       }
+}
+
 sub dequeue
 {
        my $conn = shift;
@@ -89,6 +107,8 @@ sub dequeue
                } else {
                        $conn->{msg} =~ s/([^\cM\cJ]*)\cM?\cJ//g;
                }
+               $conn->{linesin} += @lines;
+               $Msg::total_lines_in += @lines;
                while (defined ($msg = shift @lines)) {
                        dbg("connect $conn->{cnum}: $msg") if $conn->{state} ne 'C' && isdbg('connect');
                
@@ -99,18 +119,35 @@ sub dequeue
                                &{$conn->{rproc}}($conn, "I$conn->{call}|$msg");
                        } elsif ($conn->{state} eq 'WL' ) {
                                $msg = uc $msg;
-                               if (is_callsign($msg) && $msg !~ m|/| ) {
-                                       my $sort = $conn->{csort};
-                                       $sort = 'local' if $conn->{peerhost} =~ /127\.\d+\.\d+\.\d+$/ || $conn->{peerhost} eq '::1';
-                                       my $uref;
-                                       if ($main::passwdreq || ($uref = DXUser::get_current($msg)) && $uref->passwd ) {
-                                               $conn->conns($msg);
-                                               $conn->{state} = 'WP';
-                                               $conn->{decho} = $conn->{echo};
-                                               $conn->{echo} = 0;
-                                               $conn->send_raw('password: ');
+                               if ($conn->{sort} =~ /^I/ && (my ($ip, $from) = $msg =~ /^PROXY TCP[46] ([\da-fA-F:\.]+) ([\da-fA-F:\.]+)/) ) {
+                                       # SOMEONE appears to have affixed an HA Proxy to my connection
+                                       $ip =~ s|^::ffff:||; # chop off leading pseudo IPV6 stuff on dual stack listeners
+                                       $from =~ s|^::ffff:||;
+                                       if ($from eq $conn->{peerhost}) {
+                                               dbg("ExtMsg: connect - PROXY IP change from '$conn->{peerhost}' -> '$ip'");
+                                               $conn->{peerhost} = $ip;
+                                       } else {
+                                               dbg("ExtMsg: connect - PROXY someone ($from) is trying to spoof '$ip'");
+                                               $conn->send_now("Sorry $msg is an invalid callsign");
+                                               $conn->disconnect;
+                                       }
+                               } elsif (is_callsign($msg)) {
+                                       if ($main::allowslashcall || $msg !~ m|/|) {
+                                               my $sort = $conn->{csort};
+                                               $sort = 'local' if $conn->{peerhost} =~ /127\.\d+\.\d+\.\d+$/ || $conn->{peerhost} eq '::1';
+                                               my $uref;
+                                               if ($main::passwdreq || ($uref = DXUser::get_current($msg)) && $uref->passwd ) {
+                                                       $conn->conns($msg);
+                                                       $conn->{state} = 'WP';
+                                                       $conn->{decho} = $conn->{echo};
+                                                       $conn->{echo} = 0;
+                                                       $conn->send_raw('password: ');
+                                               } else {
+                                                       $conn->to_connected($msg, 'A', $sort);
+                                               }
                                        } else {
-                                               $conn->to_connected($msg, 'A', $sort);
+                                               $conn->send_now("Sorry $msg is an invalid callsign");
+                                               $conn->disconnect;
                                        }
                                } else {
                                        $conn->send_now("Sorry $msg is an invalid callsign");
@@ -152,7 +189,7 @@ sub to_connected
        delete $conn->{timeout};
        $conn->{csort} = $sort;
        &{$conn->{rproc}}($conn, "$dir$call|$sort");
-       $conn->_send_file("$main::data/connected") unless $conn->{outgoing};
+       $conn->_send_file(localdata("connected")) unless $conn->{outgoing};
 }
 
 sub new_client {
@@ -162,10 +199,10 @@ sub new_client {
        my $conn = $server_conn->SUPER::new_client($client);
        # send login prompt
        $conn->{state} = 'WL';
-       $conn->_send_file("$main::data/issue");
+       $conn->_send_file(localdata("issue"));
        $conn->send_raw("login: ");
        $conn->_dotimeout(60);
-       $conn->{echo} = 1;
+#      $conn->{echo} = 1;
 }
 
 sub start_connect
@@ -326,7 +363,7 @@ sub _doclient
        $conn->conns($call);
        $conn->{csort} = $f[1] if $f[1];
        $conn->{state} = 'C';
-       eval {$conn->{peerhost} = $conn->{sock}->peerhost} unless $conn->ax25;
+       eval {$conn->{peerhost} = $conn->{sock}->handle->peerhost} unless $conn->ax25;
        &{$conn->{rproc}}($conn, "O$call|$conn->{csort}");
        delete $conn->{cmd};
        $conn->{timeout}->del if $conn->{timeout};