Esempio n. 1
0
        public async Task <XResult <bool> > _validateContextChain(XSecurityContext context, Guid userId, int securityTypes)
        {
            if (context.Members.Contains(userId) && (context.Permissions & securityTypes) != 0)
            {
                return(new XResult <bool>(true, true, $"Authorised by {context.Name} ({context.Id})"));
            }

            var parent = await GetParentContext(context.Id);

            if (!parent || parent.Object == null)
            {
                return
                    (XResult <bool> .GetNotAuthorised(
                         $"Could not find parent context on context {context.Name} ({context.Id}). looking for permisssions {securityTypes} "));
            }

            var c = await _validateContextChain(parent.Object, userId, securityTypes);

            if (c)
            {
                return(c);
            }

            return
                (XResult <bool> .GetNotAuthorised(
                     $"Could not find parent context on context {context.Name} ({context.Id}). looking for permisssions {securityTypes} (last try)"));
        }
Esempio n. 2
0
 public async Task <XResult <XSecurityContext> > GetAccess(Guid userId, XSecurityContext context,
                                                           int securityTypes)
 {
     return(await GetAccess(userId, new List <XSecurityContext> {
         context
     }, securityTypes));
 }
Esempio n. 3
0
        public async Task <XResult <bool> > RemoveMember(XSecurityContext context, Guid currentUserId, Guid memberId)
        {
            //first check the current user has permissions to edit security
            var canEditSecurityResult =
                await _validateContextChain(context, currentUserId, (int)XPermission.EditPermissions);

            if (!canEditSecurityResult)
            {
                return(canEditSecurityResult);
            }

            var liveContext = await GetContextById(context.Id);

            if (!liveContext)
            {
                return(liveContext.Copy <bool>());
            }

            if (liveContext.Object.Members.Contains(memberId))
            {
                liveContext.Object.Members.Remove(memberId);

                var setResult = await SetContext(liveContext.Object);

                if (!setResult)
                {
                    return(setResult);
                }
            }

            context.Members.Add(currentUserId);

            return(new XResult <bool>(true));
        }
        public async Task <XResult <bool> > SetContext(XSecurityContext context)
        {
            var existing = _contexts.FirstOrDefault(_ => _.Id == context.Id);

            if (existing != null)
            {
                _contexts.Remove(existing);
            }

            _contexts.Add(context);

            return(new XResult <bool>(true));
        }
Esempio n. 5
0
        public async Task <XSecurityContext> GetRootContext(Guid contextId)
        {
            XSecurityContext currentContext = null;

            while (true)
            {
                var context = await _repo.GetParentContext(currentContext.Id);

                if (!context)
                {
                    return(currentContext);
                }

                currentContext = context.Object;
            }
        }
Esempio n. 6
0
        public async Task <XResult <XSecurityContext> > CreateContext(XSecurityContext parent, string name,
                                                                      int permissions, Guid?owner = null, List <Guid> targetIds = null)
        {
            var context = new XSecurityContext
            {
                Id          = Guid.NewGuid(),
                Name        = name,
                Permissions = permissions,
                Members     = new List <Guid>(),
                Children    = new List <Guid>()
            };

            if (owner != null)
            {
                context.Members.Add(owner.Value);
            }

            if (targetIds != null)
            {
                context.Targets = targetIds;
            }

            parent?.Children.Add(context.Id);

            var newContextResult = await SetContext(context);

            if (parent != null)
            {
                var parentUpdateResult = await SetContext(parent);

                if (!parentUpdateResult)
                {
                    return(parentUpdateResult.Copy <XSecurityContext>());
                }
            }

            if (!newContextResult)
            {
                return(newContextResult.Copy <XSecurityContext>());
            }

            return(new XResult <XSecurityContext>(context));
        }
Esempio n. 7
0
 public async Task <XResult <bool> > SetContext(XSecurityContext context)
 {
     return(await _repo.SetContext(context));
 }