Visual-SVN Server C#代码未正确添加用户权限(版本2.7.2)

时间:2013-11-18 14:04:55

标签: c# svn wmi visualsvn-server

故事时间!我们一位心怀不满的员工决定在最后一天前一天升级visual svn并修改我们的网络界面。我们设置了旧的身份验证,并且一切正常。在宏观计划中给出这个特定的应用程序足迹我们遵循'如果它没有破坏,不要修复它'的口头禅。

没有破坏,他修好了......

我们在这里。我发现This Question关于使用C#与Visual SVN进行交互,看起来他刚从那里逐字复制并粘贴了代码。

我们拥有的界面非常简单。用户在所需仓库的名称中键入一个输入框。下面是一个文本区域,他/她可以添加用户以访问存储库。用户查找是基于电子邮件地址完成的,它会访问我们的活动目录。最终的结果是我有我需要创建的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;
}

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

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();
}

这里所有看起来都是确定,但它似乎没有转移到repo并添加用户对创建的repo具有ReadWrite(键值为2)权限。该方法的尾端只是将数据保存到我们的网站数据库,以允许我们与它进行交互。

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

1 个答案:

答案 0 :(得分:1)

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

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

相关问题