Código de Visual-SVN Server C # que no agrega correctamente permissions de usuario (versión 2.7.2)

¡Tiempo de cuentos! Uno de nuestros empleados más descontentos decidió actualizar svn visual y modificar nuestra interfaz web un día antes de su último día. Tuvimos la configuration de authentication anterior, y todo estaba funcionando bien. Dale a esta huella de aplicaciones en particular en el gran esquema que seguimos el mantra 'si no está roto, no lo arregles'.

No estaba roto, y lo arregló …

Aqui estamos. Encontré esta pregunta sobre la interfaz con Visual SVN con C #, y parece que acaba de copyr y pegar el código textualmente desde allí.

La interfaz que tenemos es muy simple. Hay un cuadro de input que el usuario escribe en el nombre del repository deseado. Debajo hay un área de text donde puede agregar usuarios para tener acceso al repository. La búsqueda del usuario se realiza en function de la dirección de correo electrónico y llega a nuestro directory activo. El resultado final de esto es que tengo el nombre del repository que necesito crear y los usuarios / SID de las personas a las que necesito dar acceso de lectura / escritura.

Al probar este código que él pegó, parece que los repositorys se están creando bien (se muestran cuando inicio session en el server como administrador). Aquí está el código de creación de 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' en los parameters del método, el repository es una class con las siguientes properties:

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

con todos los getters y setters públicos que esperarías de un file generado linq a sql. UserRepositoryRight es una tabla que contiene el uno (repo) a muchas (usuarios) relaciones.

Como dije, creo que este código está bien, ya que estoy viendo los repositorys que se están creando.

El siguiente código copypasta es el método 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(); } 

Aquí todo se ve bien, pero parece que no se transfiere al repository y se agrega al usuario para tener permissions ReadWrite (valor key 2) en el repository creado. El final del método solo guarda los datos en las bases de datos de nuestros sitios web para permitirnos interactuar con ellos.

Entonces, el problema de raíz es si creo un repository a través de la interfaz web aquí, obtengo un error 403 Prohibido al intentar acceder a él, pero NO errores al crearlo y eliminarlo. Puede alguien señalarme la dirección correcta?

Si no obtiene ningún error al ejecutar el código, supongo que la regla de acceso se establece en la ruta <repo>/trunk que simplemente no existe en la versión más reciente. Puede probar el script en algún repository de testings nuevo que contenga "/ trunk" en su raíz. De lo contrario, simplemente puede cambiar la cadena del código en inParams["Path"] = "/trunk"; a inParams["Path"] = "/"; .

VisualSVN Server le permite configurar reglas de autorización basadas en routes en elementos (files y carpetas) que no existen en la revisión más reciente porque estos elementos pueden existir en versiones anteriores y posteriores.