Trac にダイジェスト認証で接続する

Trac に HttpWebRequest で接続するときは、UserAgent を設定する
http://www.moonmile.net/blog/archives/2679

の続き。C# から XML-RPC で接続するので、http://www.xml-rpc.net/ を使いました。なんとなくオーバーヘッドが多そうなので気になるところですが、wordpress の post ツールを作ったことなので、その流用も兼ねて利用します。

public class TracTools
{
	public _Setting Setting { get; set; }

	public class _Setting
	{
		public string UserName { get; set; }
		public string Password { get; set; }
		public string Url { get; set; }
	}
	public TracTools()
	{
		this.Setting = new _Setting();
	}

	/// <summary>
	/// プロキシを作成する
	/// </summary>
	/// <returns></returns>
	private ITrac CreateProxy()
	{
		ITrac proxy = CookComputing.XmlRpc.XmlRpcProxyGen.Create<ITrac>();
		proxy.Url = this.Setting.Url;
		proxy.UserAgent = "trac-tools";
		proxy.Credentials = new NetworkCredential(
			Setting.UserName, Setting.Password);
		return proxy;
	}
	/// <summary>
	/// api をリストアップ
	/// </summary>
	/// <returns></returns>
	public List<string> ListMethods()
	{
		//プロキシクラスのインスタンスを作成
		ITrac proxy = CreateProxy();
		string [] res = proxy.SystemListMethods();
		List<string> lst = res.ToList<string>();
		return lst;
	}
}

実際は、下記のようなプロキシのクラスを作るのですが、api をリストアップするメソッドは、既に IXmlRpcProxy インターフェース内で SystemListMethods として定義済みなので、このまま使います。xml-rpc で「system.listMethods」として呼び出されます。

public interface ITrac : IXmlRpcProxy
{
	[XmlRpcMethod("ticket.get")]
	object[] TicketGet(int id);
	[XmlRpcMethod("ticket.create")]
	int TicketCreate(string summary, string desc, XmlRpcStruct attrs);
	[XmlRpcMethod("ticket.update")]
	object[] TicketUpdate(int id,  string comment, XmlRpcStruct attrs);
	[XmlRpcMethod("ticket.getActions")]
	object[] TicketGetActions(int id);
}

ダイジェスト認証を使う場合は、プロキシの Credentials プロパティに情報を設定します。

呼出はこんな感じ。

static void Main(string[] args)
{
TracTools trac = new TracTools();

trac.Setting.Url = "http://localhost:8000/trac/gokui-ios5/login/rpc";
trac.Setting.UserName = "masuda";
trac.Setting.Password = "masuda";

if (args.Length == 0)
{
	Usage();
	return;
}
else
{
	switch (args[0])
	{
		case "apilist":
			List<string> lst = trac.ListMethods();
			foreach (string name in lst)
			{
				Console.WriteLine(name);
			}
	}
}

■実行結果

D:\work\blog\src\trac\TracTools\TracPost\bin\Debug>tracpost apilist
system.multicall
system.listMethods
system.methodHelp
system.methodSignature
system.getAPIVersion
ticket.query
ticket.getRecentChanges
ticket.getAvailableActions
ticket.getActions
ticket.get
ticket.create
ticket.update
ticket.delete
ticket.changeLog
ticket.listAttachments
ticket.getAttachment
ticket.putAttachment
ticket.deleteAttachment
ticket.getTicketFields
ticket.status.getAll
ticket.status.get
ticket.status.delete
ticket.status.create
ticket.status.update
ticket.component.getAll
ticket.component.get
ticket.component.delete
ticket.component.create
ticket.component.update
ticket.version.getAll
ticket.version.get
ticket.version.delete
ticket.version.create
ticket.version.update
ticket.milestone.getAll
ticket.milestone.get
ticket.milestone.delete
ticket.milestone.create
ticket.milestone.update
ticket.type.getAll
ticket.type.get
ticket.type.delete
ticket.type.create
ticket.type.update
ticket.resolution.getAll
ticket.resolution.get
ticket.resolution.delete
ticket.resolution.create
ticket.resolution.update
ticket.priority.getAll
ticket.priority.get
ticket.priority.delete
ticket.priority.create
ticket.priority.update
ticket.severity.getAll
ticket.severity.get
ticket.severity.delete
ticket.severity.create
ticket.severity.update
wiki.getRecentChanges
wiki.getRPCVersionSupported
wiki.getPage
wiki.getPageVersion
wiki.getPageHTML
wiki.getPageHTMLVersion
wiki.getAllPages
wiki.getPageInfo
wiki.getPageInfoVersion
wiki.putPage
wiki.listAttachments
wiki.getAttachment
wiki.putAttachment
wiki.putAttachmentEx
wiki.deletePage
wiki.deleteAttachment
wiki.listLinks
wiki.wikiToHtml
search.getSearchFilters
search.performSearch

D:\work\blog\src\trac\TracTools\TracPost\bin\Debug>

ひとまず、Trac に xml-rpc 経由で問合せができるところまで確認OKと。

カテゴリー: C#, Trac パーマリンク