Skip to content
Snippets Groups Projects
Select Git revision
  • c7d24812a094b89ed874969ba0af7c06e22166c9
  • main default protected
  • MacOS
  • 1.1.1
  • 1.1.0
  • 1.0
6 results

Lambda.py

Blame
  • 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);
                    }
                }
            }
        }
    }