|
Packit |
bd23c0 |
#!perl
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
use 5.008001;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
use strict;
|
|
Packit |
bd23c0 |
use warnings;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
BEGIN {
|
|
Packit |
bd23c0 |
if (!eval { require Socket }) {
|
|
Packit |
bd23c0 |
print "1..0 # no Socket\n"; exit 0;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
if (ord('A') == 193 && !eval { require Convert::EBCDIC }) {
|
|
Packit |
bd23c0 |
print "1..0 # EBCDIC but no Convert::EBCDIC\n"; exit 0;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
use Cwd;
|
|
Packit |
bd23c0 |
print "1..20\n";
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# for testing _readrc
|
|
Packit |
bd23c0 |
$ENV{HOME} = Cwd::cwd();
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# avoid "used only once" warning
|
|
Packit |
bd23c0 |
local (*CORE::GLOBAL::getpwuid, *CORE::GLOBAL::stat);
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
*CORE::GLOBAL::getpwuid = sub ($) {
|
|
Packit |
bd23c0 |
((undef) x 7, Cwd::cwd());
|
|
Packit |
bd23c0 |
};
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# for testing _readrc
|
|
Packit |
bd23c0 |
my @stat;
|
|
Packit |
bd23c0 |
*CORE::GLOBAL::stat = sub (*) {
|
|
Packit |
bd23c0 |
return @stat;
|
|
Packit |
bd23c0 |
};
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# for testing _readrc
|
|
Packit |
bd23c0 |
$INC{'FileHandle.pm'} = 1;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
(my $libnet_t = __FILE__) =~ s/\w+.t$/libnet_t.pl/;
|
|
Packit |
bd23c0 |
require $libnet_t;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# now that the tricks are out of the way...
|
|
Packit |
bd23c0 |
eval { require Net::Netrc; };
|
|
Packit |
bd23c0 |
ok( !$@, 'should be able to require() Net::Netrc safely' );
|
|
Packit |
bd23c0 |
ok( exists $INC{'Net/Netrc.pm'}, 'should be able to use Net::Netrc' );
|
|
Packit |
bd23c0 |
$Net::Netrc::TESTING=$Net::Netrc::TESTING=1;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
SKIP: {
|
|
Packit |
bd23c0 |
skip('incompatible stat() handling for OS', 4), next SKIP
|
|
Packit |
bd23c0 |
if $^O =~ /os2|win32|macos|cygwin/i;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
my $warn;
|
|
Packit |
bd23c0 |
local $SIG{__WARN__} = sub {
|
|
Packit |
bd23c0 |
$warn = shift;
|
|
Packit |
bd23c0 |
};
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# add write access for group/other
|
|
Packit |
bd23c0 |
$stat[2] = 077; ## no critic (ValuesAndExpressions::ProhibitLeadingZeros)
|
|
Packit |
bd23c0 |
ok( !defined(Net::Netrc->_readrc()),
|
|
Packit |
bd23c0 |
'_readrc() should not read world-writable file' );
|
|
Packit |
bd23c0 |
ok( scalar($warn =~ /^Bad permissions:/),
|
|
Packit |
bd23c0 |
'... and should warn about it' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# the owner field should still not match
|
|
Packit |
bd23c0 |
$stat[2] = 0;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
if ($<) {
|
|
Packit |
bd23c0 |
ok( !defined(Net::Netrc->_readrc()),
|
|
Packit |
bd23c0 |
'_readrc() should not read file owned by someone else' );
|
|
Packit |
bd23c0 |
ok( scalar($warn =~ /^Not owner:/),
|
|
Packit |
bd23c0 |
'... and should warn about it' );
|
|
Packit |
bd23c0 |
} else {
|
|
Packit |
bd23c0 |
skip("testing as root",2);
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# this field must now match, to avoid the last-tested warning
|
|
Packit |
bd23c0 |
$stat[4] = $<;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# this curious mix of spaces and quotes tests a regex at line 79 (version 2.11)
|
|
Packit |
bd23c0 |
FileHandle::set_lines(split(/\n/, <
|
|
Packit |
bd23c0 |
macdef bar
|
|
Packit |
bd23c0 |
login baz
|
|
Packit |
bd23c0 |
machine "foo"
|
|
Packit |
bd23c0 |
login nigol "password" drowssap
|
|
Packit |
bd23c0 |
machine foo "login" l2
|
|
Packit |
bd23c0 |
password p2
|
|
Packit |
bd23c0 |
account tnuocca
|
|
Packit |
bd23c0 |
default login "baz" password p2
|
|
Packit |
bd23c0 |
default "login" baz password p3
|
|
Packit |
bd23c0 |
macdef
|
|
Packit |
bd23c0 |
LINES
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# having set several lines and the uid, this should succeed
|
|
Packit |
bd23c0 |
is( Net::Netrc->_readrc(), 1, '_readrc() should succeed now' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# on 'foo', the login is 'nigol'
|
|
Packit |
bd23c0 |
is( Net::Netrc->lookup('foo')->{login}, 'nigol',
|
|
Packit |
bd23c0 |
'lookup() should find value by host name' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# on 'foo' with login 'l2', the password is 'p2'
|
|
Packit |
bd23c0 |
is( Net::Netrc->lookup('foo', 'l2')->{password}, 'p2',
|
|
Packit |
bd23c0 |
'lookup() should find value by hostname and login name' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# the default password is 'p3', as later declarations have priority
|
|
Packit |
bd23c0 |
is( Net::Netrc->lookup()->{password}, 'p3',
|
|
Packit |
bd23c0 |
'lookup() should find default value' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# lookup() ignores the login parameter when using default data
|
|
Packit |
bd23c0 |
is( Net::Netrc->lookup('default', 'baz')->{password}, 'p3',
|
|
Packit |
bd23c0 |
'lookup() should ignore passed login when searching default' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# lookup() goes to default data if hostname cannot be found in config data
|
|
Packit |
bd23c0 |
is( Net::Netrc->lookup('abadname')->{login}, 'baz',
|
|
Packit |
bd23c0 |
'lookup() should use default for unknown machine name' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# now test these accessors
|
|
Packit |
bd23c0 |
my $instance = bless({}, 'Net::Netrc');
|
|
Packit |
bd23c0 |
for my $accessor (qw( login account password )) {
|
|
Packit |
bd23c0 |
is( $instance->$accessor(), undef,
|
|
Packit |
bd23c0 |
"$accessor() should return undef if $accessor is not set" );
|
|
Packit |
bd23c0 |
$instance->{$accessor} = $accessor;
|
|
Packit |
bd23c0 |
is( $instance->$accessor(), $accessor,
|
|
Packit |
bd23c0 |
"$accessor() should return value when $accessor is set" );
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# and the three-for-one accessor
|
|
Packit |
bd23c0 |
is( scalar( () = $instance->lpa()), 3,
|
|
Packit |
bd23c0 |
'lpa() should return login, password, account');
|
|
Packit |
bd23c0 |
is( join(' ', $instance->lpa), 'login password account',
|
|
Packit |
bd23c0 |
'lpa() should return appropriate values for l, p, and a' );
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
package FileHandle;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
sub new {
|
|
Packit |
bd23c0 |
tie *FH, 'FileHandle', @_;
|
|
Packit |
bd23c0 |
bless \*FH, $_[0];
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
sub TIEHANDLE {
|
|
Packit |
bd23c0 |
my ($class, $file, $mode) = @_[0,2,3];
|
|
Packit |
bd23c0 |
bless({ file => $file, mode => $mode }, $class);
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
my @lines;
|
|
Packit |
bd23c0 |
sub set_lines {
|
|
Packit |
bd23c0 |
@lines = @_;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
sub READLINE {
|
|
Packit |
bd23c0 |
shift @lines;
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
sub close { 1 }
|
|
Packit |
bd23c0 |
|