Select Git revision
-
Jan Habscheid authoredJan Habscheid authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
GroupController.cs 3.91 KiB
using Coscine.Api.LegacySharePoint.Models;
using Coscine.Api.LegacySharePoint.Utils;
using Microsoft.AspNetCore.Mvc;
using Microsoft.SharePoint;
using System;
using System.Linq;
namespace Coscine.Api.LegacySharePoint.Controllers
{
public class GroupController : Controller
{
public GroupController()
{
}
[HttpPost("[controller]/onUserSet")]
public IActionResult OnUserSet([FromBody] SharePointEventObject sharePointEventObject)
{
ProjectSharePointContext((projectWeb, spUser) =>
{
RemoveUserFromAllGroups(projectWeb, spUser);
AddUserToGroup(sharePointEventObject.Role, projectWeb, spUser);
}, sharePointEventObject);
return Ok();
}
[HttpPost("[controller]/onUserDelete")]
public IActionResult OnUserDelete([FromBody] SharePointEventObject sharePointEventObject)
{
ProjectSharePointContext((projectWeb, spUser) =>
{
RemoveUserFromAllGroups(projectWeb, spUser);
}, sharePointEventObject);
return Ok();
}
private void AddUserToGroup(string groupName, SPWeb projectWeb, SPUser spUser)
{
projectWeb.SiteGroups[groupName].AddUser(spUser);
}
private void RemoveUserFromAllGroups(SPWeb projectWeb, SPUser spUser)
{
//XXX: Why not directly iterate through spUser.Groups?
foreach (SPGroup possibleGroup in projectWeb.SiteGroups)
{
if (IsUserInGroup(spUser, possibleGroup))
{
possibleGroup.RemoveUser(spUser);
}
}
}
private bool IsUserInGroup(SPUser user, SPGroup group)
{
return user.Groups.Cast<SPGroup>()
.Any(g => g.ID == group.ID);
}
private SPUser TranslateUser(SPWeb web, SharePointEventObject sharePointEventObject)
{
// User iteration since Linq commands like .First() don't work with SPUserCollection
foreach (SPUser siteUser in web.SiteUsers)
{
if (siteUser.LoginName.StartsWith("i:0") && siteUser.LoginName.Contains("|") && siteUser.LoginName.Substring(0, siteUser.LoginName.IndexOf("|")).EndsWith("t"))
{
var prefix = siteUser.LoginName.Substring(0, siteUser.LoginName.IndexOf("|"));
return EnsureUser(sharePointEventObject.UserId, web, prefix);
}
}
try
{
if (!string.IsNullOrWhiteSpace(sharePointEventObject.StsPrefix))
{
return EnsureUser(sharePointEventObject.UserId, web, sharePointEventObject.StsPrefix);
}
throw new ArgumentNullException();
}
catch (Exception)
{
return EnsureUser(sharePointEventObject.UserId, web, "i:0^.t");
}
}
private SPUser EnsureUser(string userId, SPWeb web, string prefix)
{
var loginName = prefix + "|coscine sts|" + userId.ToString();
web.EnsureUser(loginName);
return web.SiteUsers[loginName];
}
private void ProjectSharePointContext(Action<SPWeb, SPUser> action, SharePointEventObject sharePointEventObject)
{
SPUserToken systemAccount = SPUserToken.SystemAccount;
using (SPSite site = new SPSite(sharePointEventObject.SharePointSite, systemAccount))
{
var projectUrl = SharePointUtil.EnsureProjectUrl(site, sharePointEventObject);
using (SPSite projectSite = new SPSite(projectUrl, systemAccount))
{
var spUser = TranslateUser(projectSite.RootWeb, sharePointEventObject);
action(projectSite.RootWeb, spUser);
}
}
}
}
}