svnpw2simple.pl

#!/usr/bin/perl -w
#      /* Construct the basename of the creds file.  It's just the
#         realmstring converted into an md5 hex string.  */
#                      ... config_auth.c from subversion src
use strict;
use Pod::Usage;
use File::Basename;
use Digest::MD5 qw(md5_hex);

my $RCS_VERSION   = '$Id: svnpw2simple 6698 2010-05-07 08:50:40Z bonaccos $';
my $shell_heredoc = 0;
my $homedir       = ( getpwuid $< )[-2];
my $filename      = '';
my $template      = <<TEMPLATE;
K 8
passtype
V 6
simple
K 8
password
V %d
%s
K 15
svn:realmstring
V %d
%s
K 8
username
V %d
%s
END
TEMPLATE

sub get_svn_simple($$);
sub get_realm_string($);
sub heredoc_me($);
sub main;
main;

sub main() {
    if ( $ARGV[0] && $ARGV[0] eq '-s' ) {
        $shell_heredoc = 1;
        shift @ARGV;
    }
    my $repobase = shift @ARGV or pod2usage(1);
    my $getuser  = shift @ARGV or pod2usage(1);

    print heredoc_me( get_svn_simple( $repobase, $getuser ) ) and exit(0)
        if ( -d $repobase && $getuser =~ /[0-9a-zA-Z_]+/ && $shell_heredoc );

    print get_svn_simple( $repobase, $getuser )
        if ( -d $repobase && $getuser =~ /[0-9a-zA-Z_]+/ )
        or pod2usage(1);
}

sub get_svn_simple($$) {
    my $repo       = shift;
    my $username   = shift;
    my $passwdpath = "$repo/conf/passwd";
    my $password   = '';

    my $realmstr = get_realm_string($repo);

    open( P, '<', "$passwdpath" )
        or die "Unable to open SVN passwd file $passwdpath";
    while (<P>) { $password = $1 if /^$usernames+=s+(S+)/; }
    close P;
    die "SVN password for $username not found in $passwdpath"
        if ( $password eq '' );

    $filename = md5_hex($realmstr);

    print STDERR "## svn simple auth filename: $filenamen"
        if ( !$shell_heredoc );
    return sprintf $template, length($password), $password,
        length($realmstr), $realmstr,
        length($username), $username;
}

sub get_realm_string($) {
    my $repo     = shift;
    my $svnserve = "$repo/conf/svnserve.conf";
    my $realm    = '';

    if ( -r $svnserve ) {
        open( P, '<', "$svnserve" )
            or die "Unable to open SVN passwd file $svnserve";
        while (<P>) { $realm = $1 if /^realms+=s+(.*)/; }
        close P;
        return sprintf "<svn://svn.ee.ethz.ch:3690> %s", $realm
            if ( $realm ne '' );
    }    # else
    my $shortname = basename($repo);
    return sprintf "<svn://svn.ee.ethz.ch:3690> %s", $shortname;
}

sub heredoc_me($) {
    my $doc     = shift;
    my $ret     = '';
    my $destdir = "$homedir/.subversion/auth/svn.simple";
    $ret = "## svnpw2simple for $destdir/$filenamen";
    $ret .= "[ -d $destdir ] || mkdir -p $destdirn";
    $ret .= "cat - <<UNTILHERE > $destdir/$filenamen";
    $ret .= $doc;
    $ret .= "UNTILHEREn";
    $ret .= "chmod 700 $homedir/.subversionnn";
    return $ret;
}

__END__

=head1 NAME

svnpw2simple - Generate insecure SVN simple auth-cache files
by reading credentials on a repository server.

=head1 SYNOPSIS

B<svnpw2simple> I</path/to/myrepo> I<USERNAME>

B<svnpw2simple> -s I</path/to/myrepo> I<USERNAME>

B<perldoc> B<svnpw2simple>

=head1 DESCRIPTION

For a given SVN repository and user, given access to the
repo's conf/passwd file, svnpw2simple will provide the
contents that would reside in a user's .subversion/auth/simple
directory whenever that user chose to store that password
in that "simple" form.

Theoretically, any Keychain should be prefered over this
simple method. For automatic deployment purposes however,
this toy may help to cheat against yourself.

The -s option may be used to get a heredoc shell fragment.

=head1 COPYRIGHT

Copyright (c) 2010 by ETH Zurich. All rights reserved.

=head1 LICENSE

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

=head1 AUTHORS

S<Jan Hacker E<lt>hacker@ee.ethz.chE<gt>>
S<Salvatore Bonaccorso E<lt>bonaccos@ee.ethz.chE<gt>>

=head1 HISTORY

2010-05-07 jh Initial release

=cut

# Emacs Configuration
#
# Local Variables:
# mode: cperl
# eval: (cperl-set-style "PerlStyle")
# mode: flyspell
# mode: flyspell-prog
# End:
#
# vi: sw=4

转载于:https://my.oschina.net/tadcat/blog/150851

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值