svnserveの認証と認可の設定をする。

上に続けて、ファイルを編集して、コミットしようとしたら、

Commit failed (detailes follow)
Connection is read-only

と怒られる。。

どうやら、リポジトリにあるconf/svnserve.confをいじる必要があるらしい。
とりあえず、以下の設定をしたい。

  1. AnonymouseユーザはReadOnly
  2. 認証されたユーザは書き込みできる。
  3. tagsディレクトリは認証されていようがいまいがReadOnly


まず、「AnonymouseユーザはReadOnly」「認証されたユーザは書き込みできる。」だが、これはデフォルトの振る舞いなので、わざわざ設定する必要はないが、一応、明示的に書いておく。

[/home/svn/repository/conf/svnserve.conf]

[general]
anon-access=read
auth-access=write

Anonymouseユーザを拒否したければ、anon-access=noneとすればいい。


あとは、ユーザの定義。
svnserve.confを以下のように編集。

[/home/svn/repository/conf/svnserve.conf]

[general]
anon-access=read
auth-access=write
password-db=hogemoge.pwd
realm=test relam

password-dbには、ユーザIDとそのパスワードを記述するためのファイル名を書く。上記の通りにかくと、svnserve.confと同じディレクトリにhogemoge.pwdというファイルを用意すればよい。
以下、hogemoge.pwdの内容。

[/home/svn/repository/conf/hogemoge.conf]

[users]
#USER=PASSWORD
svn=xxxxxx
masakas=xxxxxx

特に、svnserveを起動しなおすとかはしなくてもいいみたい。
これで、自マシンからコミットしてみるとユーザとパスワードを求められるので、入力すると、コミットが成功する。

特定のディレクトリにアクセス制御を設ける。

あとは、「tagsディレクトリは認証されていようがいまいがReadOnly」だけなんだけど、

リポジトリ中の特定のパスに対する詳細なアクセス制御は存在しません。多くのプロジェクトとサイトではこのレベルのアクセス制御は十分すぎるものです。しかしもしディレクトリごとのアクセス制御が必要なら、サーバプロセスとしてsvnserve のかわりに Apache を利用する必要があるでしょう。

とあり、svnserveにはそんな機能はないらしい。

しかし、pre-commitフックというものを使うと実現できるらしい。(以下の引用)

pre-commit フックを使ってファイルパス名ごとの書き込みアクセス制御を強制することができ ます。Subversion 配布パッケージには commit-access-control.pl と、より洗練された sophisticated svnperms.py スクリプトが含ま れていて、pre-commitスクリプトとして使うことができます。

けど、commit-access-control.plやら、svnperms.pyがなかったので、適当に見てみたら、リポジトリ内のhooksディレクトリにそれっぽいのがあった。

$ls /home/svn/repository/hooks/
./  ../  post-commit.tmpl  post-revprop-change.tmpl  pre-commit.tmpl  pre-revprop-change.tmpl  start-commit.tmpl

そういうわけで、pre-commit.tmplをいじって、自前のフックを作ってみよう。

続きは、明日。。。