2 # Hello Thingy handling
4 # Note that this is a generator of pc19n and pc16n/pc16u
5 # and a consumer of fpc19n and fpc16n
9 # Copyright (c) 2005 Dirk Koopman G1TLH
14 package Thingy::Hello;
16 use vars qw($VERSION $BRANCH);
18 main::mkver($VERSION = q$Revision$);
24 use Thingy::RouteFilter;
27 use vars qw(@ISA $verify_on_login);
28 @ISA = qw(Thingy Thingy::RouteFilter);
30 $verify_on_login = 1; # make sure that a HELLO coming from
31 # the dxchan call is authentic
38 unless ($thing->{Aranea}) {
40 $thing->{h} ||= $dxchan->here;
43 $thing->{sw} ||= 'DXSp';
44 $thing->{v} ||= $main::version;
45 $thing->{b} ||= $main::build;
46 $thing->{h} ||= $main::me->here;
49 $thing->{Aranea} = Aranea::genmsg($thing, [qw(sw h v b s auth)]);
51 return $thing->{Aranea};
59 my $origin = $thing->{origin};
60 my $node = $dxchan->{call};
64 $thing->{pc19n} ||= [];
67 if ($node eq $origin) {
69 # for directly connected calls
70 if ($verify_on_login && !$thing->{user}) {
71 my $pp = $dxchan->user->passphrase;
73 dbglog('err', "Thingy::Hello::handle: verify on and $origin has no passphrase");
77 my $auth = Verify->new("DXSp,$origin,$thing->{s},$thing->{v},$thing->{b}");
78 unless ($auth->verify($thing->{auth}, $dxchan->user->passphrase)) {
79 dbglog('err', "Thingy::Hello::handle: verify on and $origin failed auth check");
84 if ($dxchan->{state} ne 'normal') {
85 $nref = $main::routeroot->add($origin, $thing->{v}, $thing->{h});
86 push @{$thing->{pc19n}}, $nref if $nref;
87 $dxchan->start($dxchan->{conn}->{csort}, $dxchan->{conn}->{outbound} ? 'O' : 'A');
88 if ($dxchan->{outbound}) {
89 my $thing = Thingy::Hello->new();
90 $thing->send($dxchan);
92 # broadcast our configuration to the world
93 $thing = Thingy::Rt->new_lcf;
97 $nref = Route::Node::get($origin);
101 # for otherwise connected calls, that come in relayed from other nodes
102 # note that we cannot do any connections at this point
103 $nref = Route::Node::get($origin);
105 my $v = $thing->{user} ? undef : $thing->{v};
106 $nref = Route::Node->new($origin, $v, 1);
107 push @{$thing->{pc19n}}, $nref;
113 if (my $user = $thing->{user}) {
114 my $ur = Route::get($user);
116 my $uref = DXUser->get_current($user);
117 if ($uref->is_node || $uref->is_aranea) {
118 $ur = $nref->add($user, $thing->{v}, $thing->{h});
119 push @{$thing->{pc19n}}, $ur if $ur;
121 $thing->{pc16n} = $nref;
122 $thing->{pc16u} = [$ur = $nref->add_user($user, $thing->{h})];
127 $nref->version($thing->{v}) unless $nref->version;
128 $nref->build($thing->{b}) unless $nref->build;
129 $nref->sw($thing->{sw}) unless $nref->sw;
130 $nref->here($thing->{h}) if exists $thing->{h};
133 RouteDB::update($origin, $node, $thing->{hopsaway});
134 RouteDB::update($thing->{user}, $node, $thing->{hopsaway}) if $thing->{user};
136 delete $thing->{pc19n} unless @{$thing->{pc19n}};
138 $thing->broadcast($dxchan);