ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/staticperl/perl/lib/Net/Netrc.pm
Revision: 1.1
Committed: Thu Jun 30 14:27:14 2005 UTC (21 years, 3 months ago) by root
Branch: MAIN
CVS Tags: HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 # Net::Netrc.pm
2     #
3     # Copyright (c) 1995-1998 Graham Barr <gbarr@pobox.com>. All rights reserved.
4     # This program is free software; you can redistribute it and/or
5     # modify it under the same terms as Perl itself.
6    
7     package Net::Netrc;
8    
9     use Carp;
10     use strict;
11     use FileHandle;
12     use vars qw($VERSION);
13    
14     $VERSION = "2.12"; # $Id: //depot/libnet/Net/Netrc.pm#13 $
15    
16     my %netrc = ();
17    
18     sub _readrc
19     {
20     my $host = shift;
21     my($home,$file);
22    
23     if($^O eq "MacOS") {
24     $home = $ENV{HOME} || `pwd`;
25     chomp($home);
26     $file = ($home =~ /:$/ ? $home . "netrc" : $home . ":netrc");
27     } else {
28     # Some OS's don't have `getpwuid', so we default to $ENV{HOME}
29     $home = eval { (getpwuid($>))[7] } || $ENV{HOME};
30     $home ||= $ENV{HOMEDRIVE} . ($ENV{HOMEPATH}||'') if defined $ENV{HOMEDRIVE};
31     $file = $home . "/.netrc";
32     }
33    
34     my($login,$pass,$acct) = (undef,undef,undef);
35     my $fh;
36     local $_;
37    
38     $netrc{default} = undef;
39    
40     # OS/2 and Win32 do not handle stat in a way compatable with this check :-(
41     unless($^O eq 'os2'
42     || $^O eq 'MSWin32'
43     || $^O eq 'MacOS'
44     || $^O =~ /^cygwin/)
45     {
46     my @stat = stat($file);
47    
48     if(@stat)
49     {
50     if($stat[2] & 077)
51     {
52     carp "Bad permissions: $file";
53     return;
54     }
55     if($stat[4] != $<)
56     {
57     carp "Not owner: $file";
58     return;
59     }
60     }
61     }
62    
63     if($fh = FileHandle->new($file,"r"))
64     {
65     my($mach,$macdef,$tok,@tok) = (0,0);
66    
67     while(<$fh>)
68     {
69     undef $macdef if /\A\n\Z/;
70    
71     if($macdef)
72     {
73     push(@$macdef,$_);
74     next;
75     }
76    
77     s/^\s*//;
78     chomp;
79    
80     while(length && s/^("((?:[^"]+|\\.)*)"|((?:[^\\\s]+|\\.)*))\s*//) {
81     (my $tok = $+) =~ s/\\(.)/$1/g;
82     push(@tok, $tok);
83     }
84    
85     TOKEN:
86     while(@tok)
87     {
88     if($tok[0] eq "default")
89     {
90     shift(@tok);
91     $mach = bless {};
92     $netrc{default} = [$mach];
93    
94     next TOKEN;
95     }
96    
97     last TOKEN
98     unless @tok > 1;
99    
100     $tok = shift(@tok);
101    
102     if($tok eq "machine")
103     {
104     my $host = shift @tok;
105     $mach = bless {machine => $host};
106    
107     $netrc{$host} = []
108     unless exists($netrc{$host});
109     push(@{$netrc{$host}}, $mach);
110     }
111     elsif($tok =~ /^(login|password|account)$/)
112     {
113     next TOKEN unless $mach;
114     my $value = shift @tok;
115     # Following line added by rmerrell to remove '/' escape char in .netrc
116     $value =~ s/\/\\/\\/g;
117     $mach->{$1} = $value;
118     }
119     elsif($tok eq "macdef")
120     {
121     next TOKEN unless $mach;
122     my $value = shift @tok;
123     $mach->{macdef} = {}
124     unless exists $mach->{macdef};
125     $macdef = $mach->{machdef}{$value} = [];
126     }
127     }
128     }
129     $fh->close();
130     }
131     }
132    
133     sub lookup
134     {
135     my($pkg,$mach,$login) = @_;
136    
137     _readrc()
138     unless exists $netrc{default};
139    
140     $mach ||= 'default';
141     undef $login
142     if $mach eq 'default';
143    
144     if(exists $netrc{$mach})
145     {
146     if(defined $login)
147     {
148     my $m;
149     foreach $m (@{$netrc{$mach}})
150     {
151     return $m
152     if(exists $m->{login} && $m->{login} eq $login);
153     }
154     return undef;
155     }
156     return $netrc{$mach}->[0]
157     }
158    
159     return $netrc{default}->[0]
160     if defined $netrc{default};
161    
162     return undef;
163     }
164    
165     sub login
166     {
167     my $me = shift;
168    
169     exists $me->{login}
170     ? $me->{login}
171     : undef;
172     }
173    
174     sub account
175     {
176     my $me = shift;
177    
178     exists $me->{account}
179     ? $me->{account}
180     : undef;
181     }
182    
183     sub password
184     {
185     my $me = shift;
186    
187     exists $me->{password}
188     ? $me->{password}
189     : undef;
190     }
191    
192     sub lpa
193     {
194     my $me = shift;
195     ($me->login, $me->password, $me->account);
196     }
197    
198     1;
199    
200     __END__
201    
202     =head1 NAME
203    
204     Net::Netrc - OO interface to users netrc file
205    
206     =head1 SYNOPSIS
207    
208     use Net::Netrc;
209    
210     $mach = Net::Netrc->lookup('some.machine');
211     $login = $mach->login;
212     ($login, $password, $account) = $mach->lpa;
213    
214     =head1 DESCRIPTION
215    
216     C<Net::Netrc> is a class implementing a simple interface to the .netrc file
217     used as by the ftp program.
218    
219     C<Net::Netrc> also implements security checks just like the ftp program,
220     these checks are, first that the .netrc file must be owned by the user and
221     second the ownership permissions should be such that only the owner has
222     read and write access. If these conditions are not met then a warning is
223     output and the .netrc file is not read.
224    
225     =head1 THE .netrc FILE
226    
227     The .netrc file contains login and initialization information used by the
228     auto-login process. It resides in the user's home directory. The following
229     tokens are recognized; they may be separated by spaces, tabs, or new-lines:
230    
231     =over 4
232    
233     =item machine name
234    
235     Identify a remote machine name. The auto-login process searches
236     the .netrc file for a machine token that matches the remote machine
237     specified. Once a match is made, the subsequent .netrc tokens
238     are processed, stopping when the end of file is reached or an-
239     other machine or a default token is encountered.
240    
241     =item default
242    
243     This is the same as machine name except that default matches
244     any name. There can be only one default token, and it must be
245     after all machine tokens. This is normally used as:
246    
247     default login anonymous password user@site
248    
249     thereby giving the user automatic anonymous login to machines
250     not specified in .netrc.
251    
252     =item login name
253    
254     Identify a user on the remote machine. If this token is present,
255     the auto-login process will initiate a login using the
256     specified name.
257    
258     =item password string
259    
260     Supply a password. If this token is present, the auto-login
261     process will supply the specified string if the remote server
262     requires a password as part of the login process.
263    
264     =item account string
265    
266     Supply an additional account password. If this token is present,
267     the auto-login process will supply the specified string
268     if the remote server requires an additional account password.
269    
270     =item macdef name
271    
272     Define a macro. C<Net::Netrc> only parses this field to be compatible
273     with I<ftp>.
274    
275     =back
276    
277     =head1 CONSTRUCTOR
278    
279     The constructor for a C<Net::Netrc> object is not called new as it does not
280     really create a new object. But instead is called C<lookup> as this is
281     essentially what it does.
282    
283     =over 4
284    
285     =item lookup ( MACHINE [, LOGIN ])
286    
287     Lookup and return a reference to the entry for C<MACHINE>. If C<LOGIN> is given
288     then the entry returned will have the given login. If C<LOGIN> is not given then
289     the first entry in the .netrc file for C<MACHINE> will be returned.
290    
291     If a matching entry cannot be found, and a default entry exists, then a
292     reference to the default entry is returned.
293    
294     If there is no matching entry found and there is no default defined, or
295     no .netrc file is found, then C<undef> is returned.
296    
297     =back
298    
299     =head1 METHODS
300    
301     =over 4
302    
303     =item login ()
304    
305     Return the login id for the netrc entry
306    
307     =item password ()
308    
309     Return the password for the netrc entry
310    
311     =item account ()
312    
313     Return the account information for the netrc entry
314    
315     =item lpa ()
316    
317     Return a list of login, password and account information fir the netrc entry
318    
319     =back
320    
321     =head1 AUTHOR
322    
323     Graham Barr <gbarr@pobox.com>
324    
325     =head1 SEE ALSO
326    
327     L<Net::Netrc>
328     L<Net::Cmd>
329    
330     =head1 COPYRIGHT
331    
332     Copyright (c) 1995-1998 Graham Barr. All rights reserved.
333     This program is free software; you can redistribute it and/or modify
334     it under the same terms as Perl itself.
335    
336     =for html <hr>
337    
338     $Id: //depot/libnet/Net/Netrc.pm#13 $
339    
340     =cut