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