【发布时间】: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