故事时间!我们一位心怀不满的员工决定在最后一天前一天升级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错误,但在创建和删除它时没有错误。谁能指出我在这方面的正确方向?
答案 0 :(得分:1)
如果在运行代码时没有出现任何错误,我想在最新版本中根本不存在的路径<repo>/trunk
上设置了访问规则。您可以在一些新的测试存储库中尝试该脚本,该存储库的根目录中包含“/ trunk”。否则,您只需将代码字符串inParams["Path"] = "/trunk";
更改为inParams["Path"] = "/";
。
VisualSVN Server允许您在最新版本中不存在的项目(文件和文件夹)上设置基于路径的授权规则,因为这些项目可以存在于较早和较新的版本中。