如何通过SharpSVN找到锁具所有者?

时间:2015-11-12 16:32:13

标签: svn tortoisesvn sharpsvn

我们在Windows 2012上运行VisualSVN。我的任务是防止窃取锁。我想使用预解锁钩子。首先,我想将锁定所有者的名称与锁定用户的名称进行比较。我可以使用svnlook

在服务器上找到锁所有者
svnlook lock C:\Repositories\DIT_TEST time-for-a-sandwich.txt

这给了我一个包含所有者的信息列表。凉。

我想在SharpSVN中复制它。这就是我到目前为止所拥有的:

using (SvnClient client = new SvnClient())
{
    StringBuilder sbLockOwner = new StringBuilder();
    Collection<SvnListEventArgs> col;
    if (client.GetList(new Uri("https://dit-visualsvn/svn/DIT_TEST"), out col))
    {
        foreach (SvnListEventArgs svnListEventArg in col)
        {
            sbLockOwner.Append(svnListEventArg.Lock.Owner.ToString());
        }
    }
}

当我尝试释放锁定时,我收到错误:

Unable to connect to a repository at URL 'https://dit-visualsvn/svn/DIT_TEST' --->
Access to '/svn/DIT_TEST' forbidden.

我已验证我的用户对存储库具有读/写权限,并且我已尝试使用client.Authentication.ForceCredentials("login", "pswd");解决方案。仍然不允许。

如何使用SharpSVN获取锁拥有者的姓名?

更多信息:如果我将代码更改为this SO上的回复,我仍然会看到禁止访问。

1 个答案:

答案 0 :(得分:0)

如果你想复制&#39; svnlook&#39;使用SharpSvn,您应该首先查看SvnLookClient

我猜测您正在使用Windows /集成安全性与您的visualsvn服务器,并且(通常)不会从​​在不同凭据下运行的服务器进程工作。但是当你在存储库钩子中时,由于你有权访问物理文件,所以你不需要凭据。

但是你遇到了问题svnlook lock尚未在SvnLookClient上实施......

此时我通常会开始查看svnadmin命令,看看是否存在svnlooksvnadmin在同一层上工作的等价物。在这种情况下,您会发现svnadmin lslockssvnadmin locksvnadmin unlock ...但是继续搜索SharpSvn的svnadmin-like SvnRepositoryClient找到这些命令。

此时我切换到了不同的答案模式。该功能尚未在SharpSvn中使用。但截至目前,它已在上一个SharpSvn版本中提供。

您现在应该可以使用

void Main(string[] args)
{
   SvnHookArguments ha;
   if (!SvnHookArguments.ParseHookArguments(args, SvnHookType.PreUnlock, Console.In, out ha)
   {
       Console.Error.Writeline("Bad arguments");
       Environment.Exit(1);
   }
   using (SvnLookClient look = new SvnLookClient())
   {
       SvnLockInfo lck;
       look.GetLock(ha.LookOrigin, ha.Path, out lck);

       if (lck == null)
           return; // Wasn't locked???

       // lck.Owner now contains the old owner
       // ha.User the new user
   }
}

但是我猜你也想要实现一个.PreLock钩子,因为我自己在获取锁时通常会破坏锁...而不是解锁。