/[echolot]/trunk/Echolot/Pinger.pm
ViewVC logotype

Contents of /trunk/Echolot/Pinger.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 18 - (show annotations) (download)
Tue Jun 11 11:05:52 2002 UTC (10 years, 11 months ago) by weasel
File size: 3294 byte(s)
Removed debug some output
1 package Echolot::Pinger;
2
3 # (c) 2002 Peter Palfrader <peter@palfrader.org>
4 # $Id: Pinger.pm,v 1.4 2002/06/11 11:05:52 weasel Exp $
5 #
6
7 =pod
8
9 =head1 Name
10
11 Echolot::Pinger - actual sending and receiving of Pings.
12
13 =head1 DESCRIPTION
14
15 This package provides functions for sending out and receiving pings.
16
17 =cut
18
19 use strict;
20 use warnings;
21 use Carp qw{cluck};
22 use English;
23 use Echolot::Pinger::Mix;
24
25 sub makeHash($) {
26 my ($text) = @_;
27 my $sum = 0;
28 for (my $i=0; $i < length($text); $i++) {
29 $sum += ord( substr($text, $i, 1) )
30 };
31 return $sum;
32 };
33
34 sub do_mix_ping($$$$$) {
35 my ($address, $keyid, $time, $to, $body) = @_;
36
37 my %key = Echolot::Globals::get()->{'storage'}->get_key($address, 'mix', $keyid);
38 Echolot::Pinger::Mix::ping(
39 $body,
40 $to,
41 $key{'nick'},
42 { $keyid => \%key } ) or
43 return 0;
44
45 return 1;
46 };
47
48 sub do_ping($$$) {
49 my ($type, $address, $key) = @_;
50
51 my $now = time();
52 my $token = $address.':'.$type.':'.$key.':'.$now;
53 my $mac = Echolot::Tools::make_mac($token);
54 my $body = "remailer: $address\n".
55 "type: $type\n".
56 "key: $key\n".
57 "sent: $now\n".
58 "mac: $mac\n";
59
60 my $to = Echolot::Tools::make_address('ping');
61 if ($type eq 'mix') {
62 do_mix_ping($address, $key, $now, $to, $body);
63 } else {
64 cluck ("Don't know how to handle ping type $type");
65 return 0;
66 };
67
68 Echolot::Globals::get()->{'storage'}->register_pingout($address, $type, $key, $now);
69 return 1;
70 };
71
72 sub send_pings() {
73 my $call_intervall = Echolot::Config::get()->{'pinger_interval'};
74 my $send_every_n_calls = Echolot::Config::get()->{'ping_every_nth_time'};
75
76 my $now = time();
77
78 my @remailers = Echolot::Globals::get()->{'storage'}->get_remailers();
79 for my $remailer (@remailers) {
80 my $timemod = ($now / $call_intervall);
81 my $this_call_id = $timemod % $send_every_n_calls;
82
83 my $this_remailer_id = makeHash($remailer) % $send_every_n_calls;
84
85 next unless ($this_call_id eq $this_remailer_id);
86
87 for my $type (Echolot::Globals::get()->{'storage'}->get_types($remailer)) {
88 for my $key (Echolot::Globals::get()->{'storage'}->get_keys($remailer, $type)) {
89 do_ping($type, $remailer, $key);
90 }
91 };
92 };
93 return 1;
94 };
95
96
97 sub receive($$$) {
98 my ($body, $token, $timestamp) = @_;
99
100 my $now = time();
101
102 my ($addr) = $body =~ /^remailer: (.*)$/m;
103 my ($type) = $body =~ /^type: (.*)$/m;
104 my ($key) = $body =~ /^key: (.*)$/m;
105 my ($sent) = $body =~ /^sent: (.*)$/m;
106 my ($mac) = $body =~ /^mac: (.*)$/m;
107
108 my $cleanstring = (defined $addr ? $addr : 'undef') . ':' .
109 (defined $type ? $type : 'undef') . ':' .
110 (defined $key ? $key : 'undef') . ':' .
111 (defined $sent ? $sent : 'undef') . ':' .
112 (defined $mac ? $mac : 'undef') . ':';
113
114 print "Foo\n";
115 (defined $addr && defined $type && defined $key && defined $sent && defined $mac) or
116 warn ("Received ping at $timestamp has undefined values: $cleanstring\n"), #FIXME: logging
117 return 0;
118
119 print "Foo\n";
120 Echolot::Tools::verify_mac($addr.':'.$type.':'.$key.':'.$sent, $mac) or
121 warn ("Received ping at $timestamp has wrong mac; $cleanstring\n"), #FIXME: logging
122 return 0;
123
124 print "Foo\n";
125 Echolot::Globals::get()->{'storage'}->register_pingdone($addr, $type, $key, $sent, $now - $sent) or
126 return 0;
127
128 return 1;
129 };
130
131 1;
132 # vim: set ts=4 shiftwidth=4:

  ViewVC Help
Powered by ViewVC 1.1.5