… | |
… | |
73 | my $peer = $_[0]{local_greeting}{peeraddr}; |
73 | my $peer = $_[0]{local_greeting}{peeraddr}; |
74 | return unless exists $SEEDS{$peer}; |
74 | return unless exists $SEEDS{$peer}; |
75 | $SEED_CONNECT{$peer} = 2; |
75 | $SEED_CONNECT{$peer} = 2; |
76 | }; |
76 | }; |
77 | |
77 | |
|
|
78 | push @AnyEvent::MP::Transport::HOOK_GREETING, sub { |
|
|
79 | # we rely on untrusted data here (the remote node name) |
|
|
80 | # this is hopefully ok, as we override it on successful |
|
|
81 | # connects, and this can at most be used for DOSing, |
|
|
82 | # which is easy when you can do MITM. |
|
|
83 | my $peer = $_[0]{local_greeting}{peeraddr}; |
|
|
84 | return unless exists $SEEDS{$peer}; |
|
|
85 | $SEEDS{$peer} ||= $_[0]{remote_node}; |
|
|
86 | }; |
|
|
87 | |
78 | push @AnyEvent::MP::Transport::HOOK_CONNECTED, sub { |
88 | push @AnyEvent::MP::Transport::HOOK_CONNECTED, sub { |
79 | my $peer = $_[0]{local_greeting}{peeraddr}; |
89 | my $peer = $_[0]{local_greeting}{peeraddr}; |
80 | return unless exists $SEEDS{$peer}; |
90 | return unless exists $SEEDS{$peer}; |
81 | $SEEDS{$peer} = $_[0]{remote_node}; |
91 | $SEEDS{$peer} = $_[0]{remote_node}; |
82 | }; |
92 | }; |
… | |
… | |
96 | |
106 | |
97 | my ($host, $port) = AnyEvent::Socket::parse_hostport $seed |
107 | my ($host, $port) = AnyEvent::Socket::parse_hostport $seed |
98 | or Carp::croak "$seed: unparsable seed address"; |
108 | or Carp::croak "$seed: unparsable seed address"; |
99 | |
109 | |
100 | return if $SEED_CONNECT{$seed}; |
110 | return if $SEED_CONNECT{$seed}; |
|
|
111 | return if defined $SEEDS{$seed} && node_is_up $SEEDS{$seed}; |
101 | |
112 | |
102 | $AnyEvent::MP::Kernel::WARN->(9, "trying connect to seed node $seed."); |
113 | $AnyEvent::MP::Kernel::WARN->(9, "trying connect to seed node $seed."); |
103 | |
114 | |
104 | # ughhh |
115 | # ughhh |
105 | $SEED_CONNECT{$seed} ||= AnyEvent::MP::Transport::mp_connect $host, $port, |
116 | $SEED_CONNECT{$seed} ||= AnyEvent::MP::Transport::mp_connect $host, $port, |