xref: /openbsd-src/gnu/usr.bin/perl/cpan/libnet/lib/Net/Config.pm (revision e068048151d29f2562a32185e21a8ba885482260)
1b8851fccSafresh1# Net::Config.pm
2b8851fccSafresh1#
35759b3d2Safresh1# Copyright (C) 2000 Graham Barr.  All rights reserved.
4eac174f2Safresh1# Copyright (C) 2013-2014, 2016, 2020 Steve Hay.  All rights reserved.
5b8851fccSafresh1# This module is free software; you can redistribute it and/or modify it under
6b8851fccSafresh1# the same terms as Perl itself, i.e. under the terms of either the GNU General
7b8851fccSafresh1# Public License or the Artistic License, as specified in the F<LICENCE> file.
8b8851fccSafresh1
9b8851fccSafresh1package Net::Config;
10b8851fccSafresh1
11b8851fccSafresh1use 5.008001;
12b8851fccSafresh1
13b8851fccSafresh1use strict;
14b8851fccSafresh1use warnings;
15b8851fccSafresh1
16b8851fccSafresh1use Exporter;
17b8851fccSafresh1use Socket qw(inet_aton inet_ntoa);
18b8851fccSafresh1
19b8851fccSafresh1our @EXPORT  = qw(%NetConfig);
20b8851fccSafresh1our @ISA     = qw(Net::LocalCfg Exporter);
21*e0680481Safresh1our $VERSION = "3.15";
22b8851fccSafresh1
23b8851fccSafresh1our($CONFIGURE, $LIBNET_CFG);
24b8851fccSafresh1
25b8851fccSafresh1eval {
26b8851fccSafresh1  local @INC = @INC;
27b8851fccSafresh1  pop @INC if $INC[-1] eq '.';
28b8851fccSafresh1  local $SIG{__DIE__};
29b8851fccSafresh1  require Net::LocalCfg;
30b8851fccSafresh1};
31b8851fccSafresh1
32b8851fccSafresh1our %NetConfig = (
33b8851fccSafresh1  nntp_hosts      => [],
34b8851fccSafresh1  snpp_hosts      => [],
35b8851fccSafresh1  pop3_hosts      => [],
36b8851fccSafresh1  smtp_hosts      => [],
37b8851fccSafresh1  ph_hosts        => [],
38b8851fccSafresh1  daytime_hosts   => [],
39b8851fccSafresh1  time_hosts      => [],
40b8851fccSafresh1  inet_domain     => undef,
41b8851fccSafresh1  ftp_firewall    => undef,
42b8851fccSafresh1  ftp_ext_passive => 1,
43b8851fccSafresh1  ftp_int_passive => 1,
44b8851fccSafresh1  test_hosts      => 1,
45b8851fccSafresh1  test_exist      => 1,
46b8851fccSafresh1);
47b8851fccSafresh1
48b8851fccSafresh1#
49b8851fccSafresh1# Try to get as much configuration info as possible from InternetConfig
50b8851fccSafresh1#
51b8851fccSafresh1{
52b8851fccSafresh1## no critic (BuiltinFunctions::ProhibitStringyEval)
53b8851fccSafresh1$^O eq 'MacOS' and eval <<TRY_INTERNET_CONFIG;
54b8851fccSafresh1use Mac::InternetConfig;
55b8851fccSafresh1
56b8851fccSafresh1{
57b8851fccSafresh1my %nc = (
58b8851fccSafresh1    nntp_hosts      => [ \$InternetConfig{ kICNNTPHost() } ],
59b8851fccSafresh1    pop3_hosts      => [ \$InternetConfig{ kICMailAccount() } =~ /\@(.*)/ ],
60b8851fccSafresh1    smtp_hosts      => [ \$InternetConfig{ kICSMTPHost() } ],
61b8851fccSafresh1    ftp_testhost    => \$InternetConfig{ kICFTPHost() } ? \$InternetConfig{ kICFTPHost()} : undef,
62b8851fccSafresh1    ph_hosts        => [ \$InternetConfig{ kICPhHost() }   ],
63b8851fccSafresh1    ftp_ext_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0,
64b8851fccSafresh1    ftp_int_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0,
65b8851fccSafresh1    socks_hosts     =>
66b8851fccSafresh1        \$InternetConfig{ kICUseSocks() }    ? [ \$InternetConfig{ kICSocksHost() }    ] : [],
67b8851fccSafresh1    ftp_firewall    =>
68b8851fccSafresh1        \$InternetConfig{ kICUseFTPProxy() } ? [ \$InternetConfig{ kICFTPProxyHost() } ] : [],
69b8851fccSafresh1);
70b8851fccSafresh1\@NetConfig{keys %nc} = values %nc;
71b8851fccSafresh1}
72b8851fccSafresh1TRY_INTERNET_CONFIG
73b8851fccSafresh1}
74b8851fccSafresh1
75b8851fccSafresh1my $file = __FILE__;
76b8851fccSafresh1my $ref;
77b8851fccSafresh1$file =~ s/Config.pm/libnet.cfg/;
78b8851fccSafresh1if (-f $file) {
79b8851fccSafresh1  $ref = eval { local $SIG{__DIE__}; do $file };
80b8851fccSafresh1  if (ref($ref) eq 'HASH') {
81b8851fccSafresh1    %NetConfig = (%NetConfig, %{$ref});
82b8851fccSafresh1    $LIBNET_CFG = $file;
83b8851fccSafresh1  }
84b8851fccSafresh1}
85b8851fccSafresh1if ($< == $> and !$CONFIGURE) {
86b8851fccSafresh1  my $home = eval { local $SIG{__DIE__}; (getpwuid($>))[7] } || $ENV{HOME};
87b8851fccSafresh1  $home ||= $ENV{HOMEDRIVE} . ($ENV{HOMEPATH} || '') if defined $ENV{HOMEDRIVE};
88b8851fccSafresh1  if (defined $home) {
89b8851fccSafresh1    $file      = $home . "/.libnetrc";
90b8851fccSafresh1    $ref       = eval { local $SIG{__DIE__}; do $file } if -f $file;
91b8851fccSafresh1    %NetConfig = (%NetConfig, %{$ref})
92b8851fccSafresh1      if ref($ref) eq 'HASH';
93b8851fccSafresh1  }
94b8851fccSafresh1}
95b8851fccSafresh1my ($k, $v);
96b8851fccSafresh1while (($k, $v) = each %NetConfig) {
97b8851fccSafresh1  $NetConfig{$k} = [$v]
98b8851fccSafresh1    if ($k =~ /_hosts$/ and $k ne "test_hosts" and defined($v) and !ref($v));
99b8851fccSafresh1}
100b8851fccSafresh1
101b8851fccSafresh1# Take a hostname and determine if it is inside the firewall
102b8851fccSafresh1
103b8851fccSafresh1
104b8851fccSafresh1sub requires_firewall {
105b8851fccSafresh1  shift;    # ignore package
106b8851fccSafresh1  my $host = shift;
107b8851fccSafresh1
108b8851fccSafresh1  return 0 unless defined $NetConfig{'ftp_firewall'};
109b8851fccSafresh1
110b8851fccSafresh1  $host = inet_aton($host) or return -1;
111b8851fccSafresh1  $host = inet_ntoa($host);
112b8851fccSafresh1
113b8851fccSafresh1  if (exists $NetConfig{'local_netmask'}) {
114b8851fccSafresh1    my $quad = unpack("N", pack("C*", split(/\./, $host)));
115b8851fccSafresh1    my $list = $NetConfig{'local_netmask'};
116b8851fccSafresh1    $list = [$list] unless ref($list);
117b8851fccSafresh1    foreach (@$list) {
118b8851fccSafresh1      my ($net, $bits) = (m#^(\d+\.\d+\.\d+\.\d+)/(\d+)$#) or next;
119b8851fccSafresh1      my $mask = ~0 << (32 - $bits);
120b8851fccSafresh1      my $addr = unpack("N", pack("C*", split(/\./, $net)));
121b8851fccSafresh1
122b8851fccSafresh1      return 0 if (($addr & $mask) == ($quad & $mask));
123b8851fccSafresh1    }
124b8851fccSafresh1    return 1;
125b8851fccSafresh1  }
126b8851fccSafresh1
127b8851fccSafresh1  return 0;
128b8851fccSafresh1}
129b8851fccSafresh1
130b8851fccSafresh1*is_external = \&requires_firewall;
131b8851fccSafresh1
132b8851fccSafresh11;
133b8851fccSafresh1
134b8851fccSafresh1__END__
135b8851fccSafresh1
136b8851fccSafresh1=head1 NAME
137b8851fccSafresh1
138b8851fccSafresh1Net::Config - Local configuration data for libnet
139b8851fccSafresh1
140b8851fccSafresh1=head1 SYNOPSIS
141b8851fccSafresh1
142b8851fccSafresh1    use Net::Config qw(%NetConfig);
143b8851fccSafresh1
144b8851fccSafresh1=head1 DESCRIPTION
145b8851fccSafresh1
146b8851fccSafresh1C<Net::Config> holds configuration data for the modules in the libnet
147b8851fccSafresh1distribution. During installation you will be asked for these values.
148b8851fccSafresh1
149b8851fccSafresh1The configuration data is held globally in a file in the perl installation
150b8851fccSafresh1tree, but a user may override any of these values by providing their own. This
151b8851fccSafresh1can be done by having a C<.libnetrc> file in their home directory. This file
152b8851fccSafresh1should return a reference to a HASH containing the keys described below.
153b8851fccSafresh1For example
154b8851fccSafresh1
155b8851fccSafresh1    # .libnetrc
156b8851fccSafresh1    {
157b8851fccSafresh1        nntp_hosts => [ "my_preferred_host" ],
158b8851fccSafresh1        ph_hosts   => [ "my_ph_server" ],
159b8851fccSafresh1    }
160b8851fccSafresh1    __END__
161b8851fccSafresh1
162eac174f2Safresh1=head2 Class Methods
163b8851fccSafresh1
164b8851fccSafresh1C<Net::Config> defines the following methods. They are methods as they are
165b8851fccSafresh1invoked as class methods. This is because C<Net::Config> inherits from
166b8851fccSafresh1C<Net::LocalCfg> so you can override these methods if you want.
167b8851fccSafresh1
168b8851fccSafresh1=over 4
169b8851fccSafresh1
170eac174f2Safresh1=item C<requires_firewall($host)>
171b8851fccSafresh1
172b8851fccSafresh1Attempts to determine if a given host is outside your firewall. Possible
173b8851fccSafresh1return values are.
174b8851fccSafresh1
175b8851fccSafresh1  -1  Cannot lookup hostname
176b8851fccSafresh1   0  Host is inside firewall (or there is no ftp_firewall entry)
177b8851fccSafresh1   1  Host is outside the firewall
178b8851fccSafresh1
179b8851fccSafresh1This is done by using hostname lookup and the C<local_netmask> entry in
180b8851fccSafresh1the configuration data.
181b8851fccSafresh1
182b8851fccSafresh1=back
183b8851fccSafresh1
184eac174f2Safresh1=head2 NetConfig Values
185b8851fccSafresh1
186b8851fccSafresh1=over 4
187b8851fccSafresh1
188b8851fccSafresh1=item nntp_hosts
189b8851fccSafresh1
190b8851fccSafresh1=item snpp_hosts
191b8851fccSafresh1
192b8851fccSafresh1=item pop3_hosts
193b8851fccSafresh1
194b8851fccSafresh1=item smtp_hosts
195b8851fccSafresh1
196b8851fccSafresh1=item ph_hosts
197b8851fccSafresh1
198b8851fccSafresh1=item daytime_hosts
199b8851fccSafresh1
200b8851fccSafresh1=item time_hosts
201b8851fccSafresh1
202b8851fccSafresh1Each is a reference to an array of hostnames (in order of preference),
203b8851fccSafresh1which should be used for the given protocol
204b8851fccSafresh1
205b8851fccSafresh1=item inet_domain
206b8851fccSafresh1
207b8851fccSafresh1Your internet domain name
208b8851fccSafresh1
209b8851fccSafresh1=item ftp_firewall
210b8851fccSafresh1
211b8851fccSafresh1If you have an FTP proxy firewall (B<NOT> an HTTP or SOCKS firewall)
212b8851fccSafresh1then this value should be set to the firewall hostname. If your firewall
213b8851fccSafresh1does not listen to port 21, then this value should be set to
214b8851fccSafresh1C<"hostname:port"> (eg C<"hostname:99">)
215b8851fccSafresh1
216b8851fccSafresh1=item ftp_firewall_type
217b8851fccSafresh1
218b8851fccSafresh1There are many different ftp firewall products available. But unfortunately
219b8851fccSafresh1there is no standard for how to traverse a firewall.  The list below shows the
220b8851fccSafresh1sequence of commands that Net::FTP will use
221b8851fccSafresh1
222b8851fccSafresh1  user        Username for remote host
223b8851fccSafresh1  pass        Password for remote host
224b8851fccSafresh1  fwuser      Username for firewall
225b8851fccSafresh1  fwpass      Password for firewall
226b8851fccSafresh1  remote.host The hostname of the remote ftp server
227b8851fccSafresh1
228b8851fccSafresh1=over 4
229b8851fccSafresh1
230b8851fccSafresh1=item 0Z<>
231b8851fccSafresh1
232b8851fccSafresh1There is no firewall
233b8851fccSafresh1
234b8851fccSafresh1=item 1Z<>
235b8851fccSafresh1
236b8851fccSafresh1     USER user@remote.host
237b8851fccSafresh1     PASS pass
238b8851fccSafresh1
239b8851fccSafresh1=item 2Z<>
240b8851fccSafresh1
241b8851fccSafresh1     USER fwuser
242b8851fccSafresh1     PASS fwpass
243b8851fccSafresh1     USER user@remote.host
244b8851fccSafresh1     PASS pass
245b8851fccSafresh1
246b8851fccSafresh1=item 3Z<>
247b8851fccSafresh1
248b8851fccSafresh1     USER fwuser
249b8851fccSafresh1     PASS fwpass
250b8851fccSafresh1     SITE remote.site
251b8851fccSafresh1     USER user
252b8851fccSafresh1     PASS pass
253b8851fccSafresh1
254b8851fccSafresh1=item 4Z<>
255b8851fccSafresh1
256b8851fccSafresh1     USER fwuser
257b8851fccSafresh1     PASS fwpass
258b8851fccSafresh1     OPEN remote.site
259b8851fccSafresh1     USER user
260b8851fccSafresh1     PASS pass
261b8851fccSafresh1
262b8851fccSafresh1=item 5Z<>
263b8851fccSafresh1
264b8851fccSafresh1     USER user@fwuser@remote.site
265b8851fccSafresh1     PASS pass@fwpass
266b8851fccSafresh1
267b8851fccSafresh1=item 6Z<>
268b8851fccSafresh1
269b8851fccSafresh1     USER fwuser@remote.site
270b8851fccSafresh1     PASS fwpass
271b8851fccSafresh1     USER user
272b8851fccSafresh1     PASS pass
273b8851fccSafresh1
274b8851fccSafresh1=item 7Z<>
275b8851fccSafresh1
276b8851fccSafresh1     USER user@remote.host
277b8851fccSafresh1     PASS pass
278b8851fccSafresh1     AUTH fwuser
279b8851fccSafresh1     RESP fwpass
280b8851fccSafresh1
281b8851fccSafresh1=back
282b8851fccSafresh1
283b8851fccSafresh1=item ftp_ext_passive
284b8851fccSafresh1
285b8851fccSafresh1=item ftp_int_passive
286b8851fccSafresh1
287b8851fccSafresh1FTP servers can work in passive or active mode. Active mode is when
288b8851fccSafresh1you want to transfer data you have to tell the server the address and
289b8851fccSafresh1port to connect to.  Passive mode is when the server provide the
290b8851fccSafresh1address and port and you establish the connection.
291b8851fccSafresh1
292b8851fccSafresh1With some firewalls active mode does not work as the server cannot
293b8851fccSafresh1connect to your machine (because you are behind a firewall) and the firewall
294b8851fccSafresh1does not re-write the command. In this case you should set C<ftp_ext_passive>
295b8851fccSafresh1to a I<true> value.
296b8851fccSafresh1
297b8851fccSafresh1Some servers are configured to only work in passive mode. If you have
298b8851fccSafresh1one of these you can force C<Net::FTP> to always transfer in passive
299b8851fccSafresh1mode; when not going via a firewall, by setting C<ftp_int_passive> to
300b8851fccSafresh1a I<true> value.
301b8851fccSafresh1
302b8851fccSafresh1=item local_netmask
303b8851fccSafresh1
304b8851fccSafresh1A reference to a list of netmask strings in the form C<"134.99.4.0/24">.
305b8851fccSafresh1These are used by the C<requires_firewall> function to determine if a given
306b8851fccSafresh1host is inside or outside your firewall.
307b8851fccSafresh1
308b8851fccSafresh1=back
309b8851fccSafresh1
310b8851fccSafresh1The following entries are used during installation & testing on the
311b8851fccSafresh1libnet package
312b8851fccSafresh1
313b8851fccSafresh1=over 4
314b8851fccSafresh1
315b8851fccSafresh1=item test_hosts
316b8851fccSafresh1
317b8851fccSafresh1If true then C<make test> may attempt to connect to hosts given in the
318b8851fccSafresh1configuration.
319b8851fccSafresh1
320b8851fccSafresh1=item test_exists
321b8851fccSafresh1
322b8851fccSafresh1If true then C<Configure> will check each hostname given that it exists
323b8851fccSafresh1
324b8851fccSafresh1=back
325b8851fccSafresh1
326eac174f2Safresh1=head1 EXPORTS
327eac174f2Safresh1
328eac174f2Safresh1The following symbols are, or can be, exported by this module:
329eac174f2Safresh1
330eac174f2Safresh1=over 4
331eac174f2Safresh1
332eac174f2Safresh1=item Default Exports
333eac174f2Safresh1
334eac174f2Safresh1C<%NetConfig>.
335eac174f2Safresh1
336eac174f2Safresh1=item Optional Exports
337eac174f2Safresh1
338eac174f2Safresh1I<None>.
339eac174f2Safresh1
340eac174f2Safresh1=item Export Tags
341eac174f2Safresh1
342eac174f2Safresh1I<None>.
343eac174f2Safresh1
344eac174f2Safresh1=back
345eac174f2Safresh1
346eac174f2Safresh1=head1 KNOWN BUGS
347eac174f2Safresh1
348eac174f2Safresh1I<None>.
349eac174f2Safresh1
350b8851fccSafresh1=head1 AUTHOR
351b8851fccSafresh1
352eac174f2Safresh1Graham Barr E<lt>L<gbarr@pobox.com|mailto:gbarr@pobox.com>E<gt>.
353b8851fccSafresh1
354eac174f2Safresh1Steve Hay E<lt>L<shay@cpan.org|mailto:shay@cpan.org>E<gt> is now maintaining
355eac174f2Safresh1libnet as of version 1.22_02.
356b8851fccSafresh1
357b8851fccSafresh1=head1 COPYRIGHT
358b8851fccSafresh1
359eac174f2Safresh1Copyright (C) 2000 Graham Barr.  All rights reserved.
3605759b3d2Safresh1
361eac174f2Safresh1Copyright (C) 2013-2014, 2016, 2020 Steve Hay.  All rights reserved.
3625759b3d2Safresh1
3635759b3d2Safresh1=head1 LICENCE
364b8851fccSafresh1
365b8851fccSafresh1This module is free software; you can redistribute it and/or modify it under the
366b8851fccSafresh1same terms as Perl itself, i.e. under the terms of either the GNU General Public
367b8851fccSafresh1License or the Artistic License, as specified in the F<LICENCE> file.
368b8851fccSafresh1
369eac174f2Safresh1=head1 VERSION
370eac174f2Safresh1
371*e0680481Safresh1Version 3.15
372eac174f2Safresh1
373eac174f2Safresh1=head1 DATE
374eac174f2Safresh1
375*e0680481Safresh120 March 2023
376eac174f2Safresh1
377eac174f2Safresh1=head1 HISTORY
378eac174f2Safresh1
379eac174f2Safresh1See the F<Changes> file.
380eac174f2Safresh1
381b8851fccSafresh1=cut
382