X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FExtMsg.pm;h=c5d6d85486ff5092ec958e89f4714ded0ae2743b;hb=af8dd78669c2badfd6a6cf5e4724500a78da2d0d;hp=19aa3b47ca5e548e2d34c8c201e82934f767bc3b;hpb=61e7e8734559481ea454bb3facca88139e51addd;p=spider.git diff --git a/perl/ExtMsg.pm b/perl/ExtMsg.pm index 19aa3b47..c5d6d854 100644 --- a/perl/ExtMsg.pm +++ b/perl/ExtMsg.pm @@ -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}); } } @@ -99,18 +99,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 +169,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,7 +179,7 @@ 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; @@ -326,7 +343,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};