【问题标题】:Visual-SVN Server C# code not properly adding user permissions (version 2.7.2)Visual-SVN 服务器 C# 代码未正确添加用户权限(版本 2.7.2)
【发布时间】:2013-11-18 14:04:54
【问题描述】:

故事时间!我们其中一位心怀不满的员工决定在他最后一天的前一天升级视觉 svn 并修改我们的 Web 界面。我们设置了旧的身份验证,一切正常。在我们遵循“如果它没有坏,就不要修复它”的口号的宏伟计划中,为这个特定的应用程序提供足迹。

它没有坏,他修好了……

所以我们到了。我发现This Question 是关于使用 C# 与 Visual SVN 交互的,看起来他只是从那里逐字复制并粘贴了代码。

我们的界面非常简单。有一个输入框,用户可以在其中输入所需存储库的名称。下面是一个文本区域,他/她可以在其中添加用户以访问 repo。用户查找是根据电子邮件地址完成的,它会到达我们的活动目录。这样做的最终结果是我有了我需要创建的 repo 的名称,以及我需要授予读/写访问权限的人的用户/SID。

测试他粘贴的这段代码,似乎存储库创建得很好(当我以管理员身份登录服务器时它们会显示出来)。这是repo创建代码:

static public bool CreateRepository(repository r)
{

    ManagementClass repoClass = new ManagementClass("root\\VisualSVN", "VisualSVN_Repository", null);
    // Obtain in-parameters for the method
    ManagementBaseObject inParams = repoClass.GetMethodParameters("Create");


    // Add the input parameters.
    inParams["Name"] = r.name; 

    // Execute the method and obtain the return values.
    ManagementBaseObject outParams =
        repoClass.InvokeMethod("Create", inParams, null);

    return true;
}

方法参数中的'repository r',repository是一个具有以下属性的类:

private int _id;
private string _name;
private System.Nullable<System.DateTime> _deleteAfter;
private EntitySet<UserRepositoryRight> _UserRepositoryRights;

具有您期望从 linq 到 sql 生成的文件中的所有公共 getter 和 setter。 UserRepositoryRight 是一个表,其中包含一个(repo)到多个(用户)的关系。

就像我说的,我认为这段代码很好,因为我看到了正在创建的存储库。

接下来的copypasta代码是UpdatePermissions方法

static public void UpdatePermissions(string sid, string repository, AccessLevel level, bool isAdmin = false)
{

    //Update SVN
    ManagementClass userClass = new ManagementClass("root\\VisualSVN", "VisualSVN_WindowsAccount", null);
    ManagementClass permClass = new ManagementClass("root\\VisualSVN", "VisualSVN_PermissionEntry", null);
    ManagementClass repoClass = new ManagementClass("root\\VisualSVN", "VisualSVN_Repository", null);

    ManagementObject userObject = userClass.CreateInstance();
    userObject.SetPropertyValue("SID", sid);

    ManagementObject permObject = permClass.CreateInstance();
    permObject.SetPropertyValue("Account", userObject);
    permObject.SetPropertyValue("AccessLevel", level);

    ManagementObject repoObject = repoClass.CreateInstance();
    repoObject.SetPropertyValue("Name", repository);

    ManagementBaseObject inParams =
        repoClass.GetMethodParameters("SetSecurity");

    inParams["Path"] = "/trunk";
    inParams["Permissions"] = new object[] { permObject };

    ManagementBaseObject outParams =
        repoObject.InvokeMethod("SetSecurity", inParams, null);


    //Update in DB
    var db = new DataMapSVNServiceDataContext();
    if (level == AccessLevel.NoAccess) //If we are removing the user
    {
        var output = (db.repositories.Single(r => r.name == repository)).UserRepositoryRights.Single(u => u.User.Sid == sid);
        if (output.isAdmin != null && !((bool)output.isAdmin)) //making sure DB owner isn't ever removed
            db.UserRepositoryRights.DeleteOnSubmit(output);
    }
    if (level == AccessLevel.ReadWrite) //if we are adding the user
    {
        var add = new UserRepositoryRight
        {
            isAdmin = isAdmin,
            User = db.Users.Single(u => u.Sid == sid),
            repository = db.repositories.Single(r => r.name == repository)
        };
        db.UserRepositoryRights.InsertOnSubmit(add);
    }
    db.SubmitChanges();
}

这里看起来一切正常,但它似乎并没有被转移到存储库并添加用户以对创建的存储库具有 ReadWrite(键值为 2)权限。该方法的尾部只是将数据保存到我们的网站数据库中,以便我们与之交互。

所以,根本问题是如果我在这里通过 Web 界面创建一个 repo,我在尝试访问它时会收到 403 Forbidden 错误,但在创建和删除它时没有错误。谁能在这里指出我正确的方向?

【问题讨论】:

  • “升级视觉 svn”是指“将 VisualSVN 服务器从 2.5 升级到 2.7”?他是从哪个版本升级的?
  • @bahrep,是的。它是2.5或更低。他顺带向我提到了升级我们使用新身份验证(WMI)的原因。所以我们从没有那个的版本升级。我们在升级方面并没有真正落后,所以我愿意打赌 2.5

标签: c# svn wmi visualsvn-server


【解决方案1】:

如果您在运行代码时没有收到任何错误,我猜想访问规则是在路径&lt;repo&gt;/trunk 上设置的,该路径在最新版本中根本不存在。您可以在一些新的测试存储库中尝试该脚本,该存储库的根目录中包含“/trunk”。否则,您只需将代码字符串inParams["Path"] = "/trunk";更改为inParams["Path"] = "/";即可。

VisualSVN Server 允许您对最新版本中不存在的项目(文件和文件夹)设置基于路径的授权规则,因为这些项目可能存在于较早和较新的版本中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2013-09-03
    相关资源
    最近更新 更多