SVN::Webのリモート・リポジトリの認証への場当たり的対応
SVN::Webは、perlで書かれた、SubversionのWebフロントエンド。Tracのリポジトリ・ブラウザだけを抜き出した感じで、大抵の設定はconfig.yamlに書くだけでOKというお手軽さ。
ローカルだけではなく、リモートのリポジトリに対応しているのもうれしいが、残念ながらリモート・リポジトリの認証には対応していない模様がうまくいかない。
そこで、/usr/share/perl5/SVN/Web.pmをちょろちょろっと書き換えて対応してみた。といっても、SVN::ClientのSYNOPSYSをそのままコピペしただけ。
--- Web.pm.org 2007-04-30 04:22:51.000000000 +0900 +++ Web.pm 2010-05-30 12:01:06.495000000 +0900 @@ -116,6 +116,13 @@ my $repospool = SVN::Pool->new(); +sub simple_prompt { + my ($cred,$realm,$default_username,$may_save,$pool) = @_; + + $cred->username($config->{auth}{username}); + $cred->password($config->{auth}{password}); +} + sub get_repos { my($repos) = @_; @@ -142,8 +149,11 @@ eval { $REPOS{$repos}{uri} ||= $repo_uri; - $REPOS{$repos}{ra} ||= SVN::Ra->new(url => $repo_uri, - pool => $repospool); + if(exists $config->{auth}{username} and exists $config->{auth}{password}) { + $REPOS{$repos}{ra} ||= SVN::Ra->new(auth => [SVN::Client::get_simple_provider(),SVN::Client::get_simple_prompt_provider(\&simple_prompt,2),SVN::Client::get_username_provider()],url => $repo_uri,pool => $repospool); + } else { + $REPOS{$repos}{ra} ||= SVN::Ra->new(url => $repo_uri,pool => $repospool); + } }; if($@) { @@ -161,6 +171,7 @@ } } + sub get_action { my $cfg = shift; my $action_pkg; @@ -263,7 +274,11 @@ # Create a default pool for the action's allocation my $pool = SVN::Pool->new_default(); - $REPOS{$cfg->{repos}}{client} = SVN::Client->new(config => {}); + if(exists $config->{auth}{username} and exists $config->{auth}{password}) { + $REPOS{$cfg->{repos}}{client} = new SVN::Client(auth => [SVN::Client::get_simple_provider(),SVN::Client::get_simple_prompt_provider(\&simple_prompt,2),SVN::Client::get_username_provider()],config => {}); + } else { + $REPOS{$cfg->{repos}}{client} = SVN::Client->new(config => {}); + } $html = $action->run();
これにより、config.yamlに
auth: username: yamada password: nanntokakanntoka
とか書いておけば、アクセスするのに認証が必要なリモート・リポジトリもブラウズすることができるようになる。
本来は、リポジトリごとに認証情報を指定できるようにした方がいいのだろうが、自分がそこまで必要としてないので……。
なお、この対応はUbuntu 10.04 LTSで試してみたのだが、apt-getでlibsvn-web-perlをインストールした場合には、そもそもSVN::Web自体がエラーを吐いて動かない。
ググって見つけたこちらのページの#3のコメントにある対処(要するに、足りないモジュールをCPANで入れる)により、うまく動作するようになった。参考まで。
追記
遅ればせながら、こんなページを見つけた。
正論。お説ごもっとも。
でも、「piggy back でうまくやれ」と言われても、それがうまくいかないから、こんなことしてるわけで……。