SVN::Webのリモート・リポジトリの認証への場当たり的対応

最終更新時間:2010年06月08日 19時55分50秒

SVN::Webのリモート・リポジトリの認証への場当たり的対応


 SVN::Webは、perlで書かれた、SubversionのWebフロントエンド。Tracのリポジトリ・ブラウザだけを抜き出した感じで、大抵の設定はconfig.yamlに書くだけでOKというお手軽さ。
 ローカルだけではなく、リモートのリポジトリに対応しているのもうれしいが、残念ながらリモート・リポジトリの認証には対応していない模様がうまくいかない。
 そこで、/usr/share/perl5/SVN/Web.pmをちょろちょろっと書き換えて対応してみた。といっても、SVN::ClientSYNOPSYSをそのままコピペしただけ。

--- 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 でうまくやれ」と言われても、それがうまくいかないから、こんなことしてるわけで……。