… | |
… | |
116 | peername => $peername, # for verification |
116 | peername => $peername, # for verification |
117 | ; |
117 | ; |
118 | |
118 | |
119 | =cut |
119 | =cut |
120 | |
120 | |
121 | our @FRAMINGS = qw(json storable); # the framing types we accept and send, in order of preference |
|
|
122 | our @AUTH_SND = qw(tls_md6_64_256 hmac_md6_64_256); # auth types we send |
|
|
123 | our @AUTH_RCV = (@AUTH_SND, qw(tls_anon cleartext)); # auth types we accept |
|
|
124 | |
|
|
125 | #AnyEvent::Handle::register_write_type mp_record => sub { |
|
|
126 | #}; |
|
|
127 | |
|
|
128 | sub new { |
121 | sub new { |
129 | my ($class, %arg) = @_; |
122 | my ($class, %arg) = @_; |
130 | |
123 | |
131 | my $self = bless \%arg, $class; |
124 | my $self = bless \%arg, $class; |
132 | |
125 | |
133 | $self->{queue} = []; |
126 | $self->{queue} = []; |
134 | |
127 | |
135 | { |
128 | { |
136 | Scalar::Util::weaken (my $self = $self); |
129 | Scalar::Util::weaken (my $self = $self); |
137 | |
130 | |
138 | my $config = AnyEvent::MP::Config::config; |
131 | my $config = $AnyEvent::MP::Kernel::CONFIG; |
139 | |
132 | |
140 | my $timeout = $self->{timeout} || $config->{monitor_timeout}; |
133 | my $timeout = $config->{monitor_timeout}; |
|
|
134 | my $lframing = $config->{data_format}; |
|
|
135 | my $auth_snd = $config->{auth_offer}; |
|
|
136 | my $auth_rcv = $config->{auth_accept}; |
141 | |
137 | |
142 | $self->{secret} = $config->{secret} |
138 | $self->{secret} = $config->{secret} |
143 | unless exists $self->{secret}; |
139 | unless exists $self->{secret}; |
144 | |
140 | |
145 | my $secret = $self->{secret}; |
141 | my $secret = $self->{secret}; |
… | |
… | |
178 | $greeting_kv->{timeout} = $self->{timeout}; |
174 | $greeting_kv->{timeout} = $self->{timeout}; |
179 | |
175 | |
180 | # send greeting |
176 | # send greeting |
181 | my $lgreeting1 = "aemp;$PROTOCOL_VERSION" |
177 | my $lgreeting1 = "aemp;$PROTOCOL_VERSION" |
182 | . ";$self->{local_node}" |
178 | . ";$self->{local_node}" |
183 | . ";" . (join ",", @AUTH_RCV) |
179 | . ";" . (join ",", @$auth_rcv) |
184 | . ";" . (join ",", @FRAMINGS) |
180 | . ";" . (join ",", @$lframing) |
185 | . (join "", map ";$_=$greeting_kv->{$_}", keys %$greeting_kv); |
181 | . (join "", map ";$_=$greeting_kv->{$_}", keys %$greeting_kv); |
186 | |
182 | |
187 | my $lgreeting2 = MIME::Base64::encode_base64 AnyEvent::MP::Kernel::nonce (66), ""; |
183 | my $lgreeting2 = MIME::Base64::encode_base64 AnyEvent::MP::Kernel::nonce (66), ""; |
188 | |
184 | |
189 | $self->{hdl}->push_write ("$lgreeting1\012$lgreeting2\012"); |
185 | $self->{hdl}->push_write ("$lgreeting1\012$lgreeting2\012"); |
… | |
… | |
224 | |
220 | |
225 | my $tls = $self->{tls_ctx} && 1 == int $self->{remote_greeting}{tls}; |
221 | my $tls = $self->{tls_ctx} && 1 == int $self->{remote_greeting}{tls}; |
226 | |
222 | |
227 | my $s_auth; |
223 | my $s_auth; |
228 | for my $auth_ (split /,/, $auths) { |
224 | for my $auth_ (split /,/, $auths) { |
229 | if (grep $auth_ eq $_, @AUTH_SND and ($auth_ !~ /^tls_/ or $tls)) { |
225 | if (grep $auth_ eq $_, @$auth_snd and ($auth_ !~ /^tls_/ or $tls)) { |
230 | $s_auth = $auth_; |
226 | $s_auth = $auth_; |
231 | last; |
227 | last; |
232 | } |
228 | } |
233 | } |
229 | } |
234 | |
230 | |
235 | defined $s_auth |
231 | defined $s_auth |
236 | or return $self->error ("$auths: no common auth type supported"); |
232 | or return $self->error ("$auths: no common auth type supported"); |
237 | |
233 | |
238 | my $s_framing; |
234 | my $s_framing; |
239 | for my $framing_ (split /,/, $framings) { |
235 | for my $framing_ (split /,/, $framings) { |
240 | if (grep $framing_ eq $_, @FRAMINGS) { |
236 | if (grep $framing_ eq $_, @$lframing) { |
241 | $s_framing = $framing_; |
237 | $s_framing = $framing_; |
242 | last; |
238 | last; |
243 | } |
239 | } |
244 | } |
240 | } |
245 | |
241 | |
… | |
… | |
336 | sub error { |
332 | sub error { |
337 | my ($self, $msg) = @_; |
333 | my ($self, $msg) = @_; |
338 | |
334 | |
339 | delete $self->{keepalive}; |
335 | delete $self->{keepalive}; |
340 | |
336 | |
341 | # $AnyEvent::MP::Kernel::WARN->(9, "$self->{peerhost}:$self->{peerport} $msg");#d# |
337 | $AnyEvent::MP::Kernel::WARN->(9, "$self->{peerhost}:$self->{peerport} $msg");#d# |
342 | |
338 | |
343 | $self->{node}->transport_error (transport_error => $self->{node}{id}, $msg) |
339 | $self->{node}->transport_error (transport_error => $self->{node}{id}, $msg) |
344 | if $self->{node} && $self->{node}{transport} == $self; |
340 | if $self->{node} && $self->{node}{transport} == $self; |
345 | |
341 | |
346 | (delete $self->{release})->() |
342 | (delete $self->{release})->() |