|
|
|
@ -227,6 +227,31 @@ sub new {
@@ -227,6 +227,31 @@ sub new {
|
|
|
|
|
return $self; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sub find_password_entry { |
|
|
|
|
my ($cvspass, @cvsroot) = @_; |
|
|
|
|
my ($file, $delim) = @$cvspass; |
|
|
|
|
my $pass; |
|
|
|
|
local ($_); |
|
|
|
|
|
|
|
|
|
if (open(my $fh, $file)) { |
|
|
|
|
# :pserver:cvs@mea.tmt.tele.fi:/cvsroot/zmailer Ah<Z |
|
|
|
|
CVSPASSFILE: |
|
|
|
|
while (<$fh>) { |
|
|
|
|
chomp; |
|
|
|
|
s/^\/\d+\s+//; |
|
|
|
|
my ($w, $p) = split($delim,$_,2); |
|
|
|
|
for my $cvsroot (@cvsroot) { |
|
|
|
|
if ($w eq $cvsroot) { |
|
|
|
|
$pass = $p; |
|
|
|
|
last CVSPASSFILE; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
close($fh); |
|
|
|
|
} |
|
|
|
|
return $pass; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sub conn { |
|
|
|
|
my $self = shift; |
|
|
|
|
my $repo = $self->{'fullrep'}; |
|
|
|
@ -259,19 +284,23 @@ sub conn {
@@ -259,19 +284,23 @@ sub conn {
|
|
|
|
|
if ($pass) { |
|
|
|
|
$pass = $self->_scramble($pass); |
|
|
|
|
} else { |
|
|
|
|
open(H,$ENV{'HOME'}."/.cvspass") and do { |
|
|
|
|
# :pserver:cvs@mea.tmt.tele.fi:/cvsroot/zmailer Ah<Z |
|
|
|
|
while (<H>) { |
|
|
|
|
chomp; |
|
|
|
|
s/^\/\d+\s+//; |
|
|
|
|
my ($w,$p) = split(/\s/,$_,2); |
|
|
|
|
if ($w eq $rr or $w eq $rr2) { |
|
|
|
|
$pass = $p; |
|
|
|
|
last; |
|
|
|
|
} |
|
|
|
|
my @cvspass = ([$ENV{'HOME'}."/.cvspass", qr/\s/], |
|
|
|
|
[$ENV{'HOME'}."/.cvs/cvspass", qr/=/]); |
|
|
|
|
my @loc = (); |
|
|
|
|
foreach my $cvspass (@cvspass) { |
|
|
|
|
my $p = find_password_entry($cvspass, $rr, $rr2); |
|
|
|
|
if ($p) { |
|
|
|
|
push @loc, $cvspass->[0]; |
|
|
|
|
$pass = $p; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
$pass = "A" unless $pass; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (1 < @loc) { |
|
|
|
|
die("Multiple cvs password files have ". |
|
|
|
|
"entries for CVSROOT $opt_d: @loc"); |
|
|
|
|
} elsif (!$pass) { |
|
|
|
|
$pass = "A"; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
my ($s, $rep); |
|
|
|
|