ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/myhttpd/access.pl
Revision: 1.18
Committed: Sat Dec 1 01:37:24 2001 UTC (22 years, 7 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.17: +9 -17 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.11 package transferqueue;
2    
3     sub new {
4     my $class = shift;
5     bless {
6     conns => $_[0],
7     }, $class;
8     }
9    
10     sub start_transfer {
11     my $self = shift;
12    
13 root 1.15 my $trans = bless [ $self ], transfer::;
14 root 1.11
15     push @{$self->{wait}}, $trans;
16 root 1.13 Scalar::Util::weaken($self->{wait}[-1]);
17 root 1.11
18 root 1.18 if (--$self->{conns} >= 0) {
19     $self->wake_next;
20     }
21 root 1.11
22     $trans;
23     }
24    
25     sub wake_next {
26     my $self = shift;
27    
28 root 1.18 while(@{$self->{wait}}) {
29     my $transfer = shift @{$self->{wait}};
30     if ($transfer) {
31     $transfer->wake;
32     last;
33 root 1.13 }
34     }
35 root 1.11 }
36    
37     sub waiters {
38     map $_->[1], @{$_[0]{wait}};
39     }
40    
41     package transfer;
42    
43     use Coro::Timer ();
44    
45 root 1.16 sub wake {
46     my $self = shift;
47     $self->[2] = 1;
48     ref $self->[1] and $self->[1]->ready;
49     }
50    
51 root 1.11 sub try {
52     my $self = shift;
53    
54 root 1.15 unless ($self->[2]) {
55 root 1.16 my $timeout = Coro::Timer::timeout $_[0];
56 root 1.17 local $self->[1] = $Coro::current;
57 root 1.16
58 root 1.15 Coro::schedule;
59     }
60 root 1.11
61     return $self->[2];
62     }
63    
64     sub DESTROY {
65     my $self = shift;
66     $self->[0]{conns}++;
67 root 1.18 $self->[0]->wake_next if $self->[2];
68 root 1.11 }
69    
70 root 1.8 package conn;
71 root 1.1
72 root 1.8 our %blockuri;
73     our $blockref;
74 root 1.1
75 root 1.6 sub read_blockuri {
76 root 1.1 local *B;
77     my %group;
78 root 1.8 %blockuri = ();
79 root 1.6 if (open B, "<blockuri") {
80 root 1.1 while (<B>) {
81     chomp;
82     if (/^group\s+(\S+)\s+(.*)/i) {
83     $group{$1} = [split /\s+/, $2];
84     } elsif (/^!([^\t]*)\t\s*(.*)/) {
85     my $g = $1;
86     my @r;
87     for (split /\s+/, $2) {
88     push @r, $group{$_} ? @{$group{$_}} : $_;
89     }
90     print "not($g) => (@r)\n";
91 root 1.8 push @{$blockuri{$_}}, $g for @r;
92 root 1.6 push @blockuri, [qr/$g/i, \@r];
93 root 1.1 } elsif (/\S/) {
94 root 1.6 print "blockuri: unparsable line: $_\n";
95 root 1.1 }
96     }
97 root 1.8 for (keys %blockuri) {
98     my $qr = join ")|(?:", @{$blockuri{$_}};
99     $blockuri{$_} = qr{(?:$qr)}i;
100     }
101 root 1.1 } else {
102 root 1.6 print "no blockuri\n";
103 root 1.1 }
104     }
105    
106 root 1.6 sub read_blockref {
107     local *B;
108 root 1.8 my @blockref;
109 root 1.6 if (open B, "<blockreferer") {
110     while (<B>) {
111     chomp;
112     if (/^([^\t]*)\t\s*(.*)/) {
113 root 1.8 push @blockref, $1;
114 root 1.6 } elsif (/\S/) {
115     print "blockref: unparsable line: $_\n";
116     }
117     }
118 root 1.8 $blockref = join ")|(?:", @blockref;
119     $blockref = qr{^(?:$blockref)}i;
120 root 1.6 } else {
121     print "no blockref\n";
122 root 1.8 $blockref = qr{^x^};
123 root 1.6 }
124     }
125    
126     read_blockuri;
127     read_blockref;
128 root 1.1
129 root 1.5 use Tie::Cache;
130 root 1.10 tie %whois_cache, Tie::Cache::, 32;
131 root 1.1
132 root 1.8 sub access_check {
133 root 1.6 my $self = shift;
134    
135     my $ref = $self->{h}{referer};
136     my $uri = $self->{path};
137     my %disallow;
138    
139 root 1.8 $self->err_block_referer
140     if $self->{h}{referer} =~ $blockref;
141 root 1.6
142     my $whois = $whois_cache{$self->{remote_addr}}
143 root 1.9 ||= netgeo::ip_request($self->{remote_addr});
144 root 1.6
145     my $country = "XX";
146    
147     if ($whois =~ /^\*cy: (\S+)/m) {
148     $country = uc $1;
149     } else {
150     $self->slog(9, "no country($whois)");
151     }
152    
153     $self->{country} = $country;
154    
155 root 1.8 $self->err_block_country($whois)
156     if $self->{path} =~ $blockuri{$country};
157 root 1.1 }
158    
159     1;