Skip to content
Snippets Groups Projects
Select Git revision
  • Sprint/2021-19
  • master default protected
  • dev protected
  • Issue/3003-stsInstitute
  • gitkeep
  • Issue/2449-GuidPidSlugToProjectSettings
  • Issue/2309-docs
  • Fix/xxxx-updateDependencies
  • Issue/2364-testingKpiParser
  • Issue/2287-guestRole
  • Test/xxxx-pipelineTriggers
  • Issue/2102-gitLabResTypeRCV
  • Issue/2278-gitlabToS
  • Issue/2101-gitLabResTypeUi
  • Issue/1788-extractionCronjob
  • Issue/2183-kpiGeneratorResource
  • Issue/2222-resourceDateCreated
  • Issue/2221-projectDateCreated
  • Issue/1321-pidEnquiryOverhaul
  • Issue/1999-gitlabResourcesLib
  • Issue/1951-quotaImplementation
  • v2.22.0
  • v2.20.0
  • v2.19.1
  • v2.19.0
  • v2.18.0
  • v2.17.0
  • v2.16.2
  • v2.16.1
  • v2.16.0
  • v2.15.0
  • v2.14.0
  • v2.13.0
  • v2.12.1
  • v2.12.0
  • v2.11.1
  • v2.11.0
  • v2.10.1
  • v2.10.0
  • v2.9.1
  • v2.9.0
41 results

Database.Tests.csproj

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    MergeController.cs 6.57 KiB
    using Coscine.Api.STS.Data;
    using Coscine.Api.STS.Utils;
    using Coscine.Database.Models;
    using Coscine.JwtHandler;
    using Microsoft.AspNetCore.Identity;
    using Microsoft.AspNetCore.Mvc;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Security.Claims;
    using System.Threading.Tasks;
    
    namespace Coscine.Api.STS.Controllers
    {
        public class MergeController : Controller
        {
            public const string MERGETOKENKEY = "coscine.mergetoken";
            private readonly SignInManager<CoscineUser> _signInManager;
    
            public MergeController(SignInManager<CoscineUser> signInManager)
            {
                _signInManager = signInManager;
            }
    
            [Route("[controller]/login")]
            public ActionResult Login(string returnUrl = null)
            {
                var contents = GetContents();
                if (contents != null && contents.Any((claim) => claim.Type == "LoginMethod"))
                {
                    var loginMethodClaim = contents.Where((claim) => claim.Type == "LoginMethod").First();
                    switch (loginMethodClaim.Value)
                    {
                        case "orcid":
                            string orcidUrl = ORCiDHandler.GetORCiDOAuthUrl() + UrlGenerator.ORCiDRedirectUrl();
                            return Redirect(orcidUrl);
                        case "shibboleth":
                            string shibbolethUrl = UrlGenerator.ShibbolethRedirectUrl();
                            return Redirect(shibbolethUrl);
                        default:
                            break;
                    }
                }
    
                // If something is wrong with the token or method, just redirect back to login page and invalidate the token
                DeleteCookie();
                string loginUrl = UrlGenerator.GetLoginUrl(Request);
                return Redirect(loginUrl);
            }
    
            [Route("[controller]/callback")]
            public async Task<ActionResult> Callback(string returnUrl = null)
            {
                var contents = GetContents();
    
                DeleteCookie();
    
                var validMerge = false;
    
                var userModel = new UserModel();
                var userIdString = User.Identity.Name;
                var userId = new Guid(userIdString);
                var mergeFromUser = userModel.GetById(userId);
    
                var externalAuthenticatorModel = new ExternalAuthenticatorModel();
                var externalIdModel = new ExternalIdModel();
    
                // Check if logged in user has a possible login from the defined LoginMethod
                if (contents != null && contents.Any((claim) => claim.Type == "LoginMethod"))
                {
                    var loginMethodClaim = contents.Where((claim) => claim.Type == "LoginMethod").First();
                    switch (loginMethodClaim.Value)
                    {
                        case "orcid":
                            var orcidAuthItem = externalAuthenticatorModel.GetWhere((externalAuthenticator) => externalAuthenticator.DisplayName == "ORCiD");
                            var orcidMapping = externalIdModel.GetAllWhere((map) => map.UserId == userId && map.ExternalAuthenticatorId == orcidAuthItem.Id);
                            validMerge = orcidMapping.Count() > 0;
                            break;
                        case "shibboleth":
                            var shibbolethAuthItem = externalAuthenticatorModel.GetWhere((externalAuthenticator) => externalAuthenticator.DisplayName == "Shibboleth");
                            var shibbolethMapping = externalIdModel.GetAllWhere((map) => map.UserId == userId && map.ExternalAuthenticatorId == shibbolethAuthItem.Id);
                            validMerge = shibbolethMapping.Count() > 0;
                            break;
                        default:
                            break;
                    }
                }
    
                if (validMerge && contents?.Any((claim) => claim.Type == "UserGuid") == true)
                {
                    var userGuidString = contents.First((claim) => claim.Type == "UserGuid");
                    var correctGuid = Guid.TryParse(userGuidString.Value, out Guid userGuid);
                    if (correctGuid)
                    {
                        var userList = userModel.GetAllWhere((user) => user.Id == userGuid);
                        if (userList.Any())
                        {
                            var mergeIntoUser = userList.First();
    
                            if (mergeFromUser.Id != mergeIntoUser.Id)
                            {
                                var mergeUtil = new MergeUtil();
                                mergeUtil.MergeFromUserIntoUser(mergeFromUser, mergeIntoUser);
    
                                // Logout the old account and login the user into his merged account after merging has finished
                                await _signInManager.SignOutAsync();
                                var coscineUser = new CoscineUser()
                                {
                                    UserName = mergeIntoUser.Id.ToString(),
                                    Email = mergeIntoUser.EmailAddress ?? ""
                                };
                                var result = await _signInManager.UserManager.CreateAsync(coscineUser);
                                await _signInManager.SignInAsync(coscineUser, isPersistent: false);
    
                                return Redirect(UrlGenerator.ExtendReturnUrl(returnUrl, Request));
                            }
                        }
                    }
                }
                else if (contents?.Any((claim) => claim.Type == "UserGuid") == true)
                {
                    var userGuidString = contents.First((claim) => claim.Type == "UserGuid");
                    var coscineUser = new CoscineUser()
                    {
                        UserName = userGuidString.Value,
                        Email = ""
                    };
                    await _signInManager.SignInAsync(coscineUser, isPersistent: false);
    
                    return Redirect(UrlGenerator.ExtendReturnUrl(returnUrl, Request));
                }
    
                string loginUrl = UrlGenerator.GetLoginUrl(Request);
                return Redirect(loginUrl);
            }
    
            private IEnumerable<Claim> GetContents()
            {
                if (Request.Cookies.ContainsKey(MERGETOKENKEY))
                {
                    var mergeToken = Request.Cookies[MERGETOKENKEY];
                    var handler = new JWTHandler(Program.Configuration);
                    if (handler.TryValidateToken(mergeToken))
                    {
                        return handler.GetContents(mergeToken);
                    }
                }
                return null;
            }
    
            private void DeleteCookie()
            {
                if (Request.Cookies.ContainsKey(MERGETOKENKEY))
                {
                    Response.Cookies.Delete(MERGETOKENKEY);
                }
            }
    
        }
    }