Blame lib/Net/Config.pm

Packit bd23c0
# Net::Config.pm
Packit bd23c0
#
Packit bd23c0
# Copyright (C) 2000 Graham Barr.  All rights reserved.
Packit bd23c0
# Copyright (C) 2013-2014, 2016 Steve Hay.  All rights reserved.
Packit bd23c0
# This module is free software; you can redistribute it and/or modify it under
Packit bd23c0
# the same terms as Perl itself, i.e. under the terms of either the GNU General
Packit bd23c0
# Public License or the Artistic License, as specified in the F<LICENCE> file.
Packit bd23c0
Packit bd23c0
package Net::Config;
Packit bd23c0
Packit bd23c0
use 5.008001;
Packit bd23c0
Packit bd23c0
use strict;
Packit bd23c0
use warnings;
Packit bd23c0
Packit bd23c0
use Exporter;
Packit bd23c0
use Socket qw(inet_aton inet_ntoa);
Packit bd23c0
Packit bd23c0
our @EXPORT  = qw(%NetConfig);
Packit bd23c0
our @ISA     = qw(Net::LocalCfg Exporter);
Packit bd23c0
our $VERSION = "3.11";
Packit bd23c0
Packit bd23c0
our($CONFIGURE, $LIBNET_CFG);
Packit bd23c0
Packit bd23c0
eval {
Packit bd23c0
  local @INC = @INC;
Packit bd23c0
  pop @INC if $INC[-1] eq '.';
Packit bd23c0
  local $SIG{__DIE__};
Packit bd23c0
  require Net::LocalCfg;
Packit bd23c0
};
Packit bd23c0
Packit bd23c0
our %NetConfig = (
Packit bd23c0
  nntp_hosts      => [],
Packit bd23c0
  snpp_hosts      => [],
Packit bd23c0
  pop3_hosts      => [],
Packit bd23c0
  smtp_hosts      => [],
Packit bd23c0
  ph_hosts        => [],
Packit bd23c0
  daytime_hosts   => [],
Packit bd23c0
  time_hosts      => [],
Packit bd23c0
  inet_domain     => undef,
Packit bd23c0
  ftp_firewall    => undef,
Packit bd23c0
  ftp_ext_passive => 1,
Packit bd23c0
  ftp_int_passive => 1,
Packit bd23c0
  test_hosts      => 1,
Packit bd23c0
  test_exist      => 1,
Packit bd23c0
);
Packit bd23c0
Packit bd23c0
#
Packit bd23c0
# Try to get as much configuration info as possible from InternetConfig
Packit bd23c0
#
Packit bd23c0
{
Packit bd23c0
## no critic (BuiltinFunctions::ProhibitStringyEval)
Packit bd23c0
$^O eq 'MacOS' and eval <
Packit bd23c0
use Mac::InternetConfig;
Packit bd23c0
Packit bd23c0
{
Packit bd23c0
my %nc = (
Packit bd23c0
    nntp_hosts      => [ \$InternetConfig{ kICNNTPHost() } ],
Packit bd23c0
    pop3_hosts      => [ \$InternetConfig{ kICMailAccount() } =~ /\@(.*)/ ],
Packit bd23c0
    smtp_hosts      => [ \$InternetConfig{ kICSMTPHost() } ],
Packit bd23c0
    ftp_testhost    => \$InternetConfig{ kICFTPHost() } ? \$InternetConfig{ kICFTPHost()} : undef,
Packit bd23c0
    ph_hosts        => [ \$InternetConfig{ kICPhHost() }   ],
Packit bd23c0
    ftp_ext_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0,
Packit bd23c0
    ftp_int_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0,
Packit bd23c0
    socks_hosts     => 
Packit bd23c0
        \$InternetConfig{ kICUseSocks() }    ? [ \$InternetConfig{ kICSocksHost() }    ] : [],
Packit bd23c0
    ftp_firewall    => 
Packit bd23c0
        \$InternetConfig{ kICUseFTPProxy() } ? [ \$InternetConfig{ kICFTPProxyHost() } ] : [],
Packit bd23c0
);
Packit bd23c0
\@NetConfig{keys %nc} = values %nc;
Packit bd23c0
}
Packit bd23c0
TRY_INTERNET_CONFIG
Packit bd23c0
}
Packit bd23c0
Packit bd23c0
my $file = __FILE__;
Packit bd23c0
my $ref;
Packit bd23c0
$file =~ s/Config.pm/libnet.cfg/;
Packit bd23c0
if (-f $file) {
Packit bd23c0
  $ref = eval { local $SIG{__DIE__}; do $file };
Packit bd23c0
  if (ref($ref) eq 'HASH') {
Packit bd23c0
    %NetConfig = (%NetConfig, %{$ref});
Packit bd23c0
    $LIBNET_CFG = $file;
Packit bd23c0
  }
Packit bd23c0
}
Packit bd23c0
if ($< == $> and !$CONFIGURE) {
Packit bd23c0
  my $home = eval { local $SIG{__DIE__}; (getpwuid($>))[7] } || $ENV{HOME};
Packit bd23c0
  $home ||= $ENV{HOMEDRIVE} . ($ENV{HOMEPATH} || '') if defined $ENV{HOMEDRIVE};
Packit bd23c0
  if (defined $home) {
Packit bd23c0
    $file      = $home . "/.libnetrc";
Packit bd23c0
    $ref       = eval { local $SIG{__DIE__}; do $file } if -f $file;
Packit bd23c0
    %NetConfig = (%NetConfig, %{$ref})
Packit bd23c0
      if ref($ref) eq 'HASH';
Packit bd23c0
  }
Packit bd23c0
}
Packit bd23c0
my ($k, $v);
Packit bd23c0
while (($k, $v) = each %NetConfig) {
Packit bd23c0
  $NetConfig{$k} = [$v]
Packit bd23c0
    if ($k =~ /_hosts$/ and $k ne "test_hosts" and defined($v) and !ref($v));
Packit bd23c0
}
Packit bd23c0
Packit bd23c0
# Take a hostname and determine if it is inside the firewall
Packit bd23c0
Packit bd23c0
Packit bd23c0
sub requires_firewall {
Packit bd23c0
  shift;    # ignore package
Packit bd23c0
  my $host = shift;
Packit bd23c0
Packit bd23c0
  return 0 unless defined $NetConfig{'ftp_firewall'};
Packit bd23c0
Packit bd23c0
  $host = inet_aton($host) or return -1;
Packit bd23c0
  $host = inet_ntoa($host);
Packit bd23c0
Packit bd23c0
  if (exists $NetConfig{'local_netmask'}) {
Packit bd23c0
    my $quad = unpack("N", pack("C*", split(/\./, $host)));
Packit bd23c0
    my $list = $NetConfig{'local_netmask'};
Packit bd23c0
    $list = [$list] unless ref($list);
Packit bd23c0
    foreach (@$list) {
Packit bd23c0
      my ($net, $bits) = (m#^(\d+\.\d+\.\d+\.\d+)/(\d+)$#) or next;
Packit bd23c0
      my $mask = ~0 << (32 - $bits);
Packit bd23c0
      my $addr = unpack("N", pack("C*", split(/\./, $net)));
Packit bd23c0
Packit bd23c0
      return 0 if (($addr & $mask) == ($quad & $mask));
Packit bd23c0
    }
Packit bd23c0
    return 1;
Packit bd23c0
  }
Packit bd23c0
Packit bd23c0
  return 0;
Packit bd23c0
}
Packit bd23c0
Packit bd23c0
*is_external = \&requires_firewall;
Packit bd23c0
Packit bd23c0
1;
Packit bd23c0
Packit bd23c0
__END__
Packit bd23c0
Packit bd23c0
=head1 NAME
Packit bd23c0
Packit bd23c0
Net::Config - Local configuration data for libnet
Packit bd23c0
Packit bd23c0
=head1 SYNOPSIS
Packit bd23c0
Packit bd23c0
    use Net::Config qw(%NetConfig);
Packit bd23c0
Packit bd23c0
=head1 DESCRIPTION
Packit bd23c0
Packit bd23c0
C<Net::Config> holds configuration data for the modules in the libnet
Packit bd23c0
distribution. During installation you will be asked for these values.
Packit bd23c0
Packit bd23c0
The configuration data is held globally in a file in the perl installation
Packit bd23c0
tree, but a user may override any of these values by providing their own. This
Packit bd23c0
can be done by having a C<.libnetrc> file in their home directory. This file
Packit bd23c0
should return a reference to a HASH containing the keys described below.
Packit bd23c0
For example
Packit bd23c0
Packit bd23c0
    # .libnetrc
Packit bd23c0
    {
Packit bd23c0
        nntp_hosts => [ "my_preferred_host" ],
Packit bd23c0
        ph_hosts   => [ "my_ph_server" ],
Packit bd23c0
    }
Packit bd23c0
    __END__
Packit bd23c0
Packit bd23c0
=head1 METHODS
Packit bd23c0
Packit bd23c0
C<Net::Config> defines the following methods. They are methods as they are
Packit bd23c0
invoked as class methods. This is because C<Net::Config> inherits from
Packit bd23c0
C<Net::LocalCfg> so you can override these methods if you want.
Packit bd23c0
Packit bd23c0
=over 4
Packit bd23c0
Packit bd23c0
=item requires_firewall ( HOST )
Packit bd23c0
Packit bd23c0
Attempts to determine if a given host is outside your firewall. Possible
Packit bd23c0
return values are.
Packit bd23c0
Packit bd23c0
  -1  Cannot lookup hostname
Packit bd23c0
   0  Host is inside firewall (or there is no ftp_firewall entry)
Packit bd23c0
   1  Host is outside the firewall
Packit bd23c0
Packit bd23c0
This is done by using hostname lookup and the C<local_netmask> entry in
Packit bd23c0
the configuration data.
Packit bd23c0
Packit bd23c0
=back
Packit bd23c0
Packit bd23c0
=head1 NetConfig VALUES
Packit bd23c0
Packit bd23c0
=over 4
Packit bd23c0
Packit bd23c0
=item nntp_hosts
Packit bd23c0
Packit bd23c0
=item snpp_hosts
Packit bd23c0
Packit bd23c0
=item pop3_hosts
Packit bd23c0
Packit bd23c0
=item smtp_hosts
Packit bd23c0
Packit bd23c0
=item ph_hosts
Packit bd23c0
Packit bd23c0
=item daytime_hosts
Packit bd23c0
Packit bd23c0
=item time_hosts
Packit bd23c0
Packit bd23c0
Each is a reference to an array of hostnames (in order of preference),
Packit bd23c0
which should be used for the given protocol
Packit bd23c0
Packit bd23c0
=item inet_domain
Packit bd23c0
Packit bd23c0
Your internet domain name
Packit bd23c0
Packit bd23c0
=item ftp_firewall
Packit bd23c0
Packit bd23c0
If you have an FTP proxy firewall (B<NOT> an HTTP or SOCKS firewall)
Packit bd23c0
then this value should be set to the firewall hostname. If your firewall
Packit bd23c0
does not listen to port 21, then this value should be set to
Packit bd23c0
C<"hostname:port"> (eg C<"hostname:99">)
Packit bd23c0
Packit bd23c0
=item ftp_firewall_type
Packit bd23c0
Packit bd23c0
There are many different ftp firewall products available. But unfortunately
Packit bd23c0
there is no standard for how to traverse a firewall.  The list below shows the
Packit bd23c0
sequence of commands that Net::FTP will use
Packit bd23c0
Packit bd23c0
  user        Username for remote host
Packit bd23c0
  pass        Password for remote host
Packit bd23c0
  fwuser      Username for firewall
Packit bd23c0
  fwpass      Password for firewall
Packit bd23c0
  remote.host The hostname of the remote ftp server
Packit bd23c0
Packit bd23c0
=over 4
Packit bd23c0
Packit bd23c0
=item 0Z<>
Packit bd23c0
Packit bd23c0
There is no firewall
Packit bd23c0
Packit bd23c0
=item 1Z<>
Packit bd23c0
Packit bd23c0
     USER user@remote.host
Packit bd23c0
     PASS pass
Packit bd23c0
Packit bd23c0
=item 2Z<>
Packit bd23c0
Packit bd23c0
     USER fwuser
Packit bd23c0
     PASS fwpass
Packit bd23c0
     USER user@remote.host
Packit bd23c0
     PASS pass
Packit bd23c0
Packit bd23c0
=item 3Z<>
Packit bd23c0
Packit bd23c0
     USER fwuser
Packit bd23c0
     PASS fwpass
Packit bd23c0
     SITE remote.site
Packit bd23c0
     USER user
Packit bd23c0
     PASS pass
Packit bd23c0
Packit bd23c0
=item 4Z<>
Packit bd23c0
Packit bd23c0
     USER fwuser
Packit bd23c0
     PASS fwpass
Packit bd23c0
     OPEN remote.site
Packit bd23c0
     USER user
Packit bd23c0
     PASS pass
Packit bd23c0
Packit bd23c0
=item 5Z<>
Packit bd23c0
Packit bd23c0
     USER user@fwuser@remote.site
Packit bd23c0
     PASS pass@fwpass
Packit bd23c0
Packit bd23c0
=item 6Z<>
Packit bd23c0
Packit bd23c0
     USER fwuser@remote.site
Packit bd23c0
     PASS fwpass
Packit bd23c0
     USER user
Packit bd23c0
     PASS pass
Packit bd23c0
Packit bd23c0
=item 7Z<>
Packit bd23c0
Packit bd23c0
     USER user@remote.host
Packit bd23c0
     PASS pass
Packit bd23c0
     AUTH fwuser
Packit bd23c0
     RESP fwpass
Packit bd23c0
Packit bd23c0
=back
Packit bd23c0
Packit bd23c0
=item ftp_ext_passive
Packit bd23c0
Packit bd23c0
=item ftp_int_passive
Packit bd23c0
Packit bd23c0
FTP servers can work in passive or active mode. Active mode is when
Packit bd23c0
you want to transfer data you have to tell the server the address and
Packit bd23c0
port to connect to.  Passive mode is when the server provide the
Packit bd23c0
address and port and you establish the connection.
Packit bd23c0
Packit bd23c0
With some firewalls active mode does not work as the server cannot
Packit bd23c0
connect to your machine (because you are behind a firewall) and the firewall
Packit bd23c0
does not re-write the command. In this case you should set C<ftp_ext_passive>
Packit bd23c0
to a I<true> value.
Packit bd23c0
Packit bd23c0
Some servers are configured to only work in passive mode. If you have
Packit bd23c0
one of these you can force C<Net::FTP> to always transfer in passive
Packit bd23c0
mode; when not going via a firewall, by setting C<ftp_int_passive> to
Packit bd23c0
a I<true> value.
Packit bd23c0
Packit bd23c0
=item local_netmask
Packit bd23c0
Packit bd23c0
A reference to a list of netmask strings in the form C<"134.99.4.0/24">.
Packit bd23c0
These are used by the C<requires_firewall> function to determine if a given
Packit bd23c0
host is inside or outside your firewall.
Packit bd23c0
Packit bd23c0
=back
Packit bd23c0
Packit bd23c0
The following entries are used during installation & testing on the
Packit bd23c0
libnet package
Packit bd23c0
Packit bd23c0
=over 4
Packit bd23c0
Packit bd23c0
=item test_hosts
Packit bd23c0
Packit bd23c0
If true then C<make test> may attempt to connect to hosts given in the
Packit bd23c0
configuration.
Packit bd23c0
Packit bd23c0
=item test_exists
Packit bd23c0
Packit bd23c0
If true then C<Configure> will check each hostname given that it exists
Packit bd23c0
Packit bd23c0
=back
Packit bd23c0
Packit bd23c0
=head1 AUTHOR
Packit bd23c0
Packit bd23c0
Graham Barr E<lt>F<gbarr@pobox.com>E<gt>.
Packit bd23c0
Packit bd23c0
Steve Hay E<lt>F<shay@cpan.org>E<gt> is now maintaining libnet as of version
Packit bd23c0
1.22_02.
Packit bd23c0
Packit bd23c0
=head1 COPYRIGHT
Packit bd23c0
Packit bd23c0
Copyright (C) 1998-2011 Graham Barr.  All rights reserved.
Packit bd23c0
Packit bd23c0
Copyright (C) 2013-2014, 2016 Steve Hay.  All rights reserved.
Packit bd23c0
Packit bd23c0
=head1 LICENCE
Packit bd23c0
Packit bd23c0
This module is free software; you can redistribute it and/or modify it under the
Packit bd23c0
same terms as Perl itself, i.e. under the terms of either the GNU General Public
Packit bd23c0
License or the Artistic License, as specified in the F<LICENCE> file.
Packit bd23c0
Packit bd23c0
=cut