Exemplo n.º 1
0
        public async Task <Guid?> RemoveUserFromRecordAccessTeamAsync(Guid idTeamTemplate, EntityReference record, Guid idUser)
        {
            var teamId = await this.FindRecordAccessTeamIdAsync(record.Id, idTeamTemplate);

            if (!teamId.HasValue)
            {
                return(null);
            }

            if (!await IsUserTeamMemberAsync(idUser, teamId.Value))
            {
                return(null);
            }

            var request = new RemoveUserFromRecordTeamRequest()
            {
                TeamTemplateId = idTeamTemplate,
                Record         = record,
                SystemUserId   = idUser,
            };

            var response = await _service.ExecuteAsync <RemoveUserFromRecordTeamResponse>(request);

            StoreRecordAccessGroupCacheValue(idTeamTemplate, record.Id, response.AccessTeamId);

            return(response.AccessTeamId);
        }
        public static RemoveUserFromRecordTeamResponse RemoveUserFromAccessTeam(this IOrganizationService service, EntityReference record, Guid userId, Guid teamTemplateId, ITracingService trace = null)
        {
            RemoveUserFromRecordTeamRequest teamAddRequest = new RemoveUserFromRecordTeamRequest();

            teamAddRequest.Record         = record;
            teamAddRequest.SystemUserId   = userId;
            teamAddRequest.TeamTemplateId = teamTemplateId;
            return((RemoveUserFromRecordTeamResponse)service.Execute(teamAddRequest));
        }
Exemplo n.º 3
0
        public static RemoveUserFromRecordTeamResponse RemoveUserFromRecordTeam(this IOrganizationService service, EntityReference record, Guid userid, Guid templateid)
        {
            var removeUserFromRecordTeamRequest = new RemoveUserFromRecordTeamRequest
            {
                Record         = record,
                SystemUserId   = userid,
                TeamTemplateId = templateid
            };


            return((RemoveUserFromRecordTeamResponse)service.Execute(removeUserFromRecordTeamRequest));
        }
Exemplo n.º 4
0
        private void RemoveUserFromAccessTeam(string accessTeamName, EntityReference record, Guid userId, IOrganizationService service)
        {
            var req = new RemoveUserFromRecordTeamRequest();

            req.Record       = record;
            req.SystemUserId = userId;
            var q = new QueryExpression("teamtemplate");

            q.Criteria.AddCondition("teamtemplatename", ConditionOperator.Equal, accessTeamName);
            var tt = orgAdminService.RetrieveMultiple(q);

            req.TeamTemplateId = tt.Entities.First().Id;
            service.Execute(req);
        }
        public void RemoveUserFromAccessTeam(Guid userId, EntityReference recordEntityReference, string teamTemplateName)
        {
            Guid templateTeamid = Guid.Empty;

            using (OrganizationServiceContext context = new OrganizationServiceContext(ServiceProxy))
            {
                templateTeamid = (Guid)(context.CreateQuery("teamtemplate").Single(tt => (string)tt["teamtemplatename"] == teamTemplateName)["teamtemplateid"]);
            }
            RemoveUserFromRecordTeamRequest removeUserFromRecordTeamRequest = new RemoveUserFromRecordTeamRequest()
            {
                SystemUserId   = userId,
                Record         = recordEntityReference,
                TeamTemplateId = templateTeamid
            };

            ServiceProxy.Execute(removeUserFromRecordTeamRequest);
        }
Exemplo n.º 6
0
        /// <summary>
        /// Executes the workflow activity.
        /// </summary>
        /// <param name="executionContext">The execution context.</param>
        protected override void Execute(CodeActivityContext executionContext)
        {
            // Create the tracing service
            ITracingService tracingService = executionContext.GetExtension <ITracingService>();

            if (tracingService == null)
            {
                throw new InvalidPluginExecutionException("Failed to retrieve tracing service.");
            }

            tracingService.Trace("Entered " + _processName + ".Execute(), Activity Instance Id: {0}, Workflow Instance Id: {1}",
                                 executionContext.ActivityInstanceId,
                                 executionContext.WorkflowInstanceId);

            // Create the context
            IWorkflowContext context = executionContext.GetExtension <IWorkflowContext>();

            if (context == null)
            {
                throw new InvalidPluginExecutionException("Failed to retrieve workflow context.");
            }

            tracingService.Trace(_processName + ".Execute(), Correlation Id: {0}, Initiating User: {1}",
                                 context.CorrelationId,
                                 context.InitiatingUserId);

            IOrganizationServiceFactory serviceFactory = executionContext.GetExtension <IOrganizationServiceFactory>();
            IOrganizationService        service        = serviceFactory.CreateOrganizationService(context.UserId);

            try
            {
                Guid   connectionId = Connection.Get(executionContext).Id;
                Entity connection   = service.Retrieve("connection", connectionId, new ColumnSet("record1id", "record2id"));

                EntityReference connectedFromId = (EntityReference)connection["record1id"];
                EntityReference connectedToId   = (EntityReference)connection["record2id"];

                //only run this if the connection is to a user record
                if (connectedToId.LogicalName.ToUpper() == "SYSTEMUSER")
                {
                    Guid   teamTemplateId;
                    string teamTemplateName = TeamTemplateName.Get(executionContext);

                    //look up team template by name
                    QueryByAttribute querybyexpression = new QueryByAttribute("teamtemplate");
                    querybyexpression.ColumnSet = new ColumnSet("teamtemplatename", "teamtemplateid");
                    querybyexpression.Attributes.AddRange("teamtemplatename");
                    querybyexpression.Values.AddRange(teamTemplateName);
                    EntityCollection retrieved = service.RetrieveMultiple(querybyexpression);

                    //if we find something, we're set
                    if (retrieved.Entities.Count > 0)
                    {
                        teamTemplateId = retrieved.Entities[0].Id;
                    }
                    else
                    {
                        //throw exception if unable to find a matching template
                        throw new Exception("could not find team template named: " + teamTemplateName);
                    }

                    RemoveUserFromRecordTeamRequest teamRemoveRequest = new RemoveUserFromRecordTeamRequest();
                    teamRemoveRequest.Record         = connectedFromId;
                    teamRemoveRequest.SystemUserId   = connectedToId.Id;
                    teamRemoveRequest.TeamTemplateId = teamTemplateId;

                    RemoveUserFromRecordTeamResponse response = (RemoveUserFromRecordTeamResponse)service.Execute(teamRemoveRequest);
                }
            }
            catch (FaultException <OrganizationServiceFault> e)
            {
                tracingService.Trace("Exception: {0}", e.ToString());

                // Handle the exception.
                throw;
            }
            catch (Exception e)
            {
                tracingService.Trace("Exception: {0}", e.ToString());
                throw;
            }

            tracingService.Trace("Exiting " + _processName + ".Execute(), Correlation Id: {0}", context.CorrelationId);
        }
Exemplo n.º 7
0
        public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx)
        {
            RemoveUserFromRecordTeamRequest remReq = (RemoveUserFromRecordTeamRequest)request;

            EntityReference target         = remReq.Record;
            Guid            systemuserId   = remReq.SystemUserId;
            Guid            teamTemplateId = remReq.TeamTemplateId;

            if (target == null)
            {
                throw new FaultException <OrganizationServiceFault>(new OrganizationServiceFault(), "Can not remove from team without target");
            }

            if (systemuserId == Guid.Empty)
            {
                throw new FaultException <OrganizationServiceFault>(new OrganizationServiceFault(), "Can not remove from team without user");
            }

            if (teamTemplateId == Guid.Empty)
            {
                throw new FaultException <OrganizationServiceFault>(new OrganizationServiceFault(), "Can not remove from team without team");
            }

            Entity teamTemplate = ctx.CreateQuery("teamtemplate").FirstOrDefault(p => p.Id == teamTemplateId);

            if (teamTemplate == null)
            {
                throw new FaultException <OrganizationServiceFault>(new OrganizationServiceFault(), "Team template with id=" + teamTemplateId + " does not exist");
            }

            Entity user = ctx.CreateQuery("systemuser").FirstOrDefault(p => p.Id == systemuserId);

            if (user == null)
            {
                throw new FaultException <OrganizationServiceFault>(new OrganizationServiceFault(), "User with id=" + teamTemplateId + " does not exist");
            }

            IOrganizationService service = ctx.GetOrganizationService();

            ctx.AccessRightsRepository.RevokeAccessTo(target, user.ToEntityReference());
            Entity team = ctx.CreateQuery("team").FirstOrDefault(p => ((EntityReference)p["teamtemplateid"]).Id == teamTemplateId);

            if (team == null)
            {
                return(new RemoveUserFromRecordTeamResponse
                {
                    ResponseName = "RemoveUserFromRecordTeam"
                });
            }

            Entity tm = ctx.CreateQuery("teammembership").FirstOrDefault(p => (Guid)p["teamid"] == team.Id);

            if (tm != null)
            {
                service.Delete(tm.LogicalName, tm.Id);
            }

            return(new RemoveUserFromRecordTeamResponse
            {
                ResponseName = "RemoveUserFromRecordTeam"
            });
        }
Exemplo n.º 8
0
        public void SimpleUpdateTest()
        {
            var contact = new Contact()
            {
                FirstName = "test 1"
            };

            contact.Id = testUser1Service.Create(contact);

            var contact2 = new Contact()
            {
                FirstName = "test 2"
            };

            contact2.Id = testUser2Service.Create(contact2);

            //check that user 1 cannot update contact 2
            var updateContact = new Entity("contact");

            updateContact.Id           = contact2.Id;
            updateContact["firstname"] = "fred";
            try
            {
                testUser1Service.Update(updateContact);
                throw new XunitException();
            }
            catch (Exception ex)
            {
                if (!ex.Message.Contains("does not have write access"))
                {
                    throw;
                }
            }

            var req = new AddUserToRecordTeamRequest();

            req.Record       = contact2.ToEntityReference();
            req.SystemUserId = testUser1.Id;

            var q = new QueryExpression("teamtemplate");

            q.Criteria.AddCondition("teamtemplatename", ConditionOperator.Equal, "TestWriteContact");
            var tt = orgAdminService.RetrieveMultiple(q);

            req.TeamTemplateId = tt.Entities.First().Id;

            orgAdminService.Execute(req);

            //that user 1 can now see contact 2
            updateContact              = new Entity("contact");
            updateContact.Id           = contact2.Id;
            updateContact["firstname"] = "fred";
            testUser1Service.Update(updateContact);

            var removereq = new RemoveUserFromRecordTeamRequest();

            removereq.Record         = contact2.ToEntityReference();
            removereq.SystemUserId   = testUser1.Id;
            removereq.TeamTemplateId = tt.Entities.First().Id;

            orgAdminService.Execute(removereq);

            //check that user 1 cannot see contact 2
            updateContact              = new Entity("contact");
            updateContact.Id           = contact2.Id;
            updateContact["firstname"] = "bob";
            try
            {
                testUser1Service.Update(updateContact);
                throw new XunitException();
            }
            catch (Exception ex)
            {
                if (!ex.Message.Contains("does not have write access"))
                {
                    throw;
                }
            }
        }
Exemplo n.º 9
0
        public void SimpleReadTest()
        {
            var contact = new Contact()
            {
                FirstName = "test 1"
            };

            contact.Id = testUser1Service.Create(contact);

            var contact2 = new Contact()
            {
                FirstName = "test 2"
            };

            contact2.Id = testUser2Service.Create(contact2);

            //check that user 1 cannot see contact 2
            try
            {
                var checkContact = testUser1Service.Retrieve("contact", contact2.Id, new ColumnSet(true));
                throw new XunitException();
            }
            catch (Exception ex)
            {
                if (!ex.Message.Contains("does not have permission"))
                {
                    throw;
                }
            }

            var req = new AddUserToRecordTeamRequest();

            req.Record       = contact2.ToEntityReference();
            req.SystemUserId = testUser1.Id;

            var q = new QueryExpression("teamtemplate");

            q.Criteria.AddCondition("teamtemplatename", ConditionOperator.Equal, "TestReadContact");
            var tt = orgAdminService.RetrieveMultiple(q);

            req.TeamTemplateId = tt.Entities.First().Id;

            orgAdminService.Execute(req);

            //that user 1 can now see contact 2
            var checkContact2 = testUser1Service.Retrieve("contact", contact2.Id, new ColumnSet(true));

            var removereq = new RemoveUserFromRecordTeamRequest();

            removereq.Record         = contact2.ToEntityReference();
            removereq.SystemUserId   = testUser1.Id;
            removereq.TeamTemplateId = tt.Entities.First().Id;

            orgAdminService.Execute(removereq);

            //check that user 1 cannot see contact 2
            try
            {
                var checkContact = testUser1Service.Retrieve("contact", contact2.Id, new ColumnSet(true));
                throw new XunitException();
            }
            catch (Exception ex)
            {
                if (!ex.Message.Contains("does not have permission"))
                {
                    throw;
                }
            }
        }
        /// <summary>
        /// Executes the workflow activity.
        /// </summary>
        /// <param name="executionContext">The execution context.</param>
        protected override void Execute(CodeActivityContext executionContext)
        {
            // Create the tracing service
            ITracingService tracingService = executionContext.GetExtension<ITracingService>();

            if (tracingService == null)
            {
                throw new InvalidPluginExecutionException("Failed to retrieve tracing service.");
            }

            tracingService.Trace("Entered " + _processName + ".Execute(), Activity Instance Id: {0}, Workflow Instance Id: {1}",
                executionContext.ActivityInstanceId,
                executionContext.WorkflowInstanceId);

            // Create the context
            IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();

            if (context == null)
            {
                throw new InvalidPluginExecutionException("Failed to retrieve workflow context.");
            }

            tracingService.Trace(_processName + ".Execute(), Correlation Id: {0}, Initiating User: {1}",
                context.CorrelationId,
                context.InitiatingUserId);

            IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

            try
            {
                Guid connectionId = Connection.Get(executionContext).Id;
                Entity connection = service.Retrieve("connection", connectionId, new ColumnSet("record1id", "record2id"));

                EntityReference connectedFromId = (EntityReference)connection["record1id"];
                EntityReference connectedToId = (EntityReference)connection["record2id"];

                //only run this if the connection is to a user record
                if (connectedToId.LogicalName.ToUpper() == "SYSTEMUSER")
                {
                    Guid teamTemplateId;
                    string teamTemplateName = TeamTemplateName.Get(executionContext);

                    //look up team template by name
                    QueryByAttribute querybyexpression = new QueryByAttribute("teamtemplate");
                    querybyexpression.ColumnSet = new ColumnSet("teamtemplatename", "teamtemplateid");
                    querybyexpression.Attributes.AddRange("teamtemplatename");
                    querybyexpression.Values.AddRange(teamTemplateName);
                    EntityCollection retrieved = service.RetrieveMultiple(querybyexpression);

                    //if we find something, we're set
                    if (retrieved.Entities.Count > 0)
                    {
                        teamTemplateId = retrieved.Entities[0].Id;
                    }
                    else
                    {
                        //throw exception if unable to find a matching template
                        throw new Exception("could not find team template named: " + teamTemplateName);
                    }

                    RemoveUserFromRecordTeamRequest teamRemoveRequest = new RemoveUserFromRecordTeamRequest();
                    teamRemoveRequest.Record = connectedFromId;
                    teamRemoveRequest.SystemUserId = connectedToId.Id;
                    teamRemoveRequest.TeamTemplateId = teamTemplateId;

                    RemoveUserFromRecordTeamResponse response = (RemoveUserFromRecordTeamResponse)service.Execute(teamRemoveRequest);
                }
            }
            catch (FaultException<OrganizationServiceFault> e)
            {
                tracingService.Trace("Exception: {0}", e.ToString());

                // Handle the exception.
                throw;
            }
            catch (Exception e)
            {
                tracingService.Trace("Exception: {0}", e.ToString());
                throw;
            }

            tracingService.Trace("Exiting " + _processName + ".Execute(), Correlation Id: {0}", context.CorrelationId);
        }
        public void When_a_request_is_called_User_Is_Removed_From_Record_Team()
        {
            var context = new XrmFakedContext();

            var teamTemplate = new TeamTemplate
            {
                Id = Guid.NewGuid(),
                DefaultAccessRightsMask = (int)AccessRights.ReadAccess
            };

            var team = new Team
            {
                Id             = Guid.NewGuid(),
                TeamTemplateId = teamTemplate.ToEntityReference()
            };

            var user = new SystemUser
            {
                Id = Guid.NewGuid()
            };

            var teamMembership = new TeamMembership
            {
                Id = Guid.NewGuid(),
                ["systemuserid"] = user.Id,
                ["teamid"]       = team.Id
            };

            var account = new Account
            {
                Id = Guid.NewGuid()
            };

            context.Initialize(new Entity[]
            {
                teamTemplate, team, teamMembership, user, account
            });

            var executor = new RemoveUserFromRecordTeamRequestExecutor();

            var req = new RemoveUserFromRecordTeamRequest
            {
                Record         = account.ToEntityReference(),
                SystemUserId   = user.Id,
                TeamTemplateId = teamTemplate.Id
            };

            context.AccessRightsRepository.GrantAccessTo(account.ToEntityReference(), new PrincipalAccess
            {
                Principal  = user.ToEntityReference(),
                AccessMask = AccessRights.ReadAccess
            });

            executor.Execute(req, context);

            var retrievedTeamMembership = context.CreateQuery <TeamMembership>().FirstOrDefault(p => p.SystemUserId == user.Id && p.TeamId == team.Id);

            Assert.Null(retrievedTeamMembership);

            var response = context.AccessRightsRepository.RetrievePrincipalAccess(account.ToEntityReference(),
                                                                                  user.ToEntityReference());

            Assert.Equal(AccessRights.None, response.AccessRights);
        }