« iRedmine | Main | Tracで添付ファイルの削除権限を分離する »

2010.01.11

XML-RPCを用いて添付ファイルの一括アップロードを行う

Tracでは、添付ファイルは1個ずつしかアップロードできません。複数一括でアップロードできるようにしようと改造を試みたのですが、なかなか難しく、挫折(いろいろな例外ケースを考慮しだすとなかなかややこしくなってしまいますし)。

ってことで、XML-RPCを用いて、「1ファイルずつアップロード」する処理を「ループ」させることにより、複数ファイルを一括で指定したページにアップロードするような小物ツールを作ってみました(Javaで開発)。

その時に悩んだのが、「XML-RPCの認証」と「ファイルのアップロード者」を同一扱いするか否か?

多分、運用ポリシー次第になってくるとは思うのですが、僕のところでは、「XML-RPCは基本的にXML-RPC専用のアカウントで行う」という風に運用しています。この状態だと、添付ファイルの登録者が全てXML-RPC用のユーザになってしまいます。

ってことで、XML-RPCプラグインの方を改造して、任意の登録者を指定することができるようにしてみました。ベースとなるXML-RPCプラグインは結構古いバージョンになってしまっていますが、今(Trac本体も含めて)一式を更新していくだけの余力がなく、とりあえず、古いバージョンに手を加えていくので精一杯・・・。

yield ('WIKI_MODIFY', ((bool, str, str, str, xmlrpclib.Binary),
    (bool, str, str, str, xmlrpclib.Binary, bool)),
となっている部分を、
yield ('WIKI_MODIFY', ((bool, str, str, str, xmlrpclib.Binary),
    (bool, str, str, str, xmlrpclib.Binary, bool),
    (bool, str, str, str, xmlrpclib.Binary, bool, str)),
って感じで、引数違いの呼び出し方を定義。

呼び出される部分は、

def putAttachmentEx(self, req, pagename, filename, description, data, replace=True):

となっているので、引数を追加。互換性を考慮し、デフォルト値はNoneとしておきます。
def putAttachmentEx(self, req, pagename, filename, description, data, replace=True, author=None):

attachment.author = req.authname or 'anonymous'
となっている次の行に、以下の2行を追加。
if author:
    attachment.author = author

XML-RPC経由で呼び出された時にauthorが指定されている場合はそれを優先するようにしています。
(本当は or で連結して1行で書いてしまった方がいいのかも知れませんが)

ちなみに、authorで指定したユーザが適切な権限を有しているかどうかのチェックは行っていませんので、実はなりすましでアップロードできてしまいます(^^; ということで、このパッチを適用する場合は、その辺が問題にならないかどうかを考慮する必要があります(性悪説に立つと、こんな実装はありえない)。

#すごく久しぶりのTrac改造ネタですね(^^;

|

« iRedmine | Main | Tracで添付ファイルの削除権限を分離する »

Subversion・Trac・etc.」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference XML-RPCを用いて添付ファイルの一括アップロードを行う:

« iRedmine | Main | Tracで添付ファイルの削除権限を分離する »