Ejemplo n.º 1
0
        /// <summary>
        /// Retrieves the list of permitted security principals (user or team) that have access to the given record
        /// </summary>
        /// <param name="er"></param>
        /// <returns></returns>
        public RetrieveSharedPrincipalsAndAccessResponse RetrieveSharedPrincipalsAndAccess(EntityReference er)
        {
            List <PrincipalAccess> accessList = GetAccessListForRecord(er);
            RetrieveSharedPrincipalsAndAccessResponse resp = new RetrieveSharedPrincipalsAndAccessResponse();

            resp.Results["PrincipalAccesses"] = accessList.ToArray();
            return(resp);
        }
Ejemplo n.º 2
0
        public void Principal_Granted_Access_Multiple_Times_Only_Appears_Once()
        {
            var context  = new XrmFakedContext();
            var contact1 = new Contact {
                Id = Guid.NewGuid()
            };
            var user1 = new SystemUser {
                Id = Guid.NewGuid()
            };

            context.Initialize(new List <Entity>
            {
                contact1, user1
            });

            var service = context.GetFakedOrganizationService();

            GrantAccessRequest gar1 = new GrantAccessRequest
            {
                PrincipalAccess = new PrincipalAccess
                {
                    AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess,
                    Principal  = user1.ToEntityReference()
                },
                Target = contact1.ToEntityReference()
            };

            service.Execute(gar1);

            GrantAccessRequest gar2 = new GrantAccessRequest
            {
                PrincipalAccess = new PrincipalAccess
                {
                    AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess,
                    Principal  = user1.ToEntityReference()
                },
                Target = contact1.ToEntityReference()
            };

            service.Execute(gar2);

            RetrieveSharedPrincipalsAndAccessRequest req = new RetrieveSharedPrincipalsAndAccessRequest
            {
                Target = contact1.ToEntityReference()
            };
            RetrieveSharedPrincipalsAndAccessResponse resp = (RetrieveSharedPrincipalsAndAccessResponse)service.Execute(req);

            Assert.Equal(1, resp.PrincipalAccesses.Length);
        }
        /// <summary>
        /// Demonstrates sharing records by exercising various access messages including:
        /// Grant, Modify, Revoke, RetrievePrincipalAccess, and
        /// RetrievePrincipalsAndAccess.
        /// </summary>
        /// <param name="serverConfig">Contains server connection information.</param>
        /// <param name="promptforDelete">When True, the user will be prompted to delete all
        /// created entities.</param>
        public void Run(ServerConnection.Configuration serverConfig, bool promptforDelete)
        {
            try
            {
                // Connect to the Organization service.
                // The using statement assures that the service proxy will be properly disposed.
                using (_serviceProxy = new OrganizationServiceProxy(serverConfig.OrganizationUri, serverConfig.HomeRealmUri, serverConfig.Credentials, serverConfig.DeviceCredentials))
                {
                    // This statement is required to enable early-bound type support.
                    _serviceProxy.EnableProxyTypes();

                    _service = (IOrganizationService)_serviceProxy;

                    CreateRequiredRecords();

                    #region GrantAccess Message

                    // Create the request object and set the target and principal access
                    // object.
                    GrantAccessRequest grantRequest = new GrantAccessRequest()
                    {
                        Target          = new EntityReference(Account.EntityLogicalName, _accountId),
                        PrincipalAccess = new PrincipalAccess()
                        {
                            Principal  = new EntityReference(SystemUser.EntityLogicalName, _userId),
                            AccessMask = AccessRights.WriteAccess | AccessRights.ReadAccess | AccessRights.ShareAccess
                        }
                    };

                    // Execute the request.
                    GrantAccessResponse grantResponse =
                        (GrantAccessResponse)_service.Execute(grantRequest);

                    Console.Write("Access Granted ");

                    #endregion

                    #region ModifyAccess Message

                    // Create the request object and set the target and principal access
                    // object.
                    ModifyAccessRequest modifyRequest = new ModifyAccessRequest()
                    {
                        Target          = new EntityReference(Account.EntityLogicalName, _accountId),
                        PrincipalAccess = new PrincipalAccess()
                        {
                            Principal  = new EntityReference(SystemUser.EntityLogicalName, _userId),
                            AccessMask = AccessRights.ReadAccess | AccessRights.ShareAccess
                        }
                    };

                    // Execute the request.
                    ModifyAccessResponse modifyResponse =
                        (ModifyAccessResponse)_service.Execute(modifyRequest);

                    Console.Write("and Modified. ");

                    #endregion

                    #region RetrievePrincipalAccess Message

                    // Create the request object and set the target and principal.
                    RetrievePrincipalAccessRequest retrieveRequest = new RetrievePrincipalAccessRequest()
                    {
                        Target    = new EntityReference(Account.EntityLogicalName, _accountId),
                        Principal = new EntityReference(SystemUser.EntityLogicalName, _userId)
                    };

                    // Execute the request.
                    RetrievePrincipalAccessResponse retrieveResponse =
                        (RetrievePrincipalAccessResponse)_service.Execute(retrieveRequest);

                    Console.Write("Retrieved principal access. ");

                    #endregion

                    #region RetrieveSharedPrincipalsAndAccess Message

                    // Create the request object and set the target.
                    RetrieveSharedPrincipalsAndAccessRequest retrieveSharedRequest =
                        new RetrieveSharedPrincipalsAndAccessRequest()
                    {
                        Target = new EntityReference(Account.EntityLogicalName, _accountId)
                    };

                    // Execute the request.
                    RetrieveSharedPrincipalsAndAccessResponse retrieveSharedResponse =
                        (RetrieveSharedPrincipalsAndAccessResponse)_service.Execute(retrieveSharedRequest);

                    Console.Write("Retrieved principals and access. ");

                    #endregion

                    #region RevokeAccess Message

                    // Create the request object and set the target and revokee.
                    RevokeAccessRequest revokeRequest = new RevokeAccessRequest()
                    {
                        Target  = new EntityReference(Account.EntityLogicalName, _accountId),
                        Revokee = new EntityReference(SystemUser.EntityLogicalName, _userId)
                    };

                    // Execute the request.
                    RevokeAccessResponse revokeResponse =
                        (RevokeAccessResponse)_service.Execute(revokeRequest);

                    Console.Write("Revoked Access.");

                    #endregion

                    DeleteRequiredRecords(promptforDelete);
                }
            }

            // Catch any service fault exceptions that Microsoft Dynamics CRM throws.
            catch (FaultException <Microsoft.Xrm.Sdk.OrganizationServiceFault> )
            {
                // You can handle an exception here or pass it back to the calling method.
                throw;
            }
        }
Ejemplo n.º 4
0
        public void RetrieveSharedPrincipalsAndAccess_Test()
        {
            var context  = new XrmFakedContext();
            var contact1 = new Contact {
                Id = Guid.NewGuid()
            };
            var contact2 = new Contact {
                Id = Guid.NewGuid()
            };
            var user1 = new SystemUser {
                Id = Guid.NewGuid()
            };
            var user2 = new SystemUser {
                Id = Guid.NewGuid()
            };
            var user3 = new SystemUser {
                Id = Guid.NewGuid()
            };

            context.Initialize(new List <Entity>
            {
                contact1, user1, contact2, user2, user3
            });

            var service = context.GetFakedOrganizationService();

            GrantAccessRequest gar1 = new GrantAccessRequest
            {
                PrincipalAccess = new PrincipalAccess
                {
                    AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess,
                    Principal  = user1.ToEntityReference()
                },
                Target = contact1.ToEntityReference()
            };

            service.Execute(gar1);

            GrantAccessRequest gar2 = new GrantAccessRequest
            {
                PrincipalAccess = new PrincipalAccess
                {
                    AccessMask = AccessRights.ReadAccess | AccessRights.CreateAccess | AccessRights.DeleteAccess | AccessRights.ShareAccess,
                    Principal  = user1.ToEntityReference()
                },
                Target = contact2.ToEntityReference()
            };

            service.Execute(gar2);

            GrantAccessRequest gar3 = new GrantAccessRequest
            {
                PrincipalAccess = new PrincipalAccess
                {
                    AccessMask = AccessRights.ReadAccess | AccessRights.CreateAccess | AccessRights.DeleteAccess | AccessRights.ShareAccess,
                    Principal  = user2.ToEntityReference()
                },
                Target = contact1.ToEntityReference()
            };

            service.Execute(gar3);

            GrantAccessRequest gar4 = new GrantAccessRequest
            {
                PrincipalAccess = new PrincipalAccess
                {
                    AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess,
                    Principal  = user2.ToEntityReference()
                },
                Target = contact2.ToEntityReference()
            };

            service.Execute(gar4);

            RetrieveSharedPrincipalsAndAccessRequest req = new RetrieveSharedPrincipalsAndAccessRequest
            {
                Target = contact1.ToEntityReference()
            };
            RetrieveSharedPrincipalsAndAccessResponse resp = (RetrieveSharedPrincipalsAndAccessResponse)service.Execute(req);

            foreach (PrincipalAccess pa in resp.PrincipalAccesses)
            {
                if (pa.Principal.Id == user1.Id)
                {
                    Assert.NotEqual(AccessRights.None, pa.AccessMask);
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.ReadAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendToAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AssignAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.CreateAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.DeleteAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.ShareAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.WriteAccess));
                }
                else if (pa.Principal.Id == user2.Id)
                {
                    Assert.NotEqual(AccessRights.None, pa.AccessMask);
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.ReadAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendToAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AssignAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.CreateAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.DeleteAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.ShareAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.WriteAccess));
                }
                else if (pa.Principal.Id == user3.Id)
                {
                    Assert.Equal(AccessRights.None, pa.AccessMask);
                }
            }

            req = new RetrieveSharedPrincipalsAndAccessRequest
            {
                Target = contact2.ToEntityReference()
            };
            resp = (RetrieveSharedPrincipalsAndAccessResponse)service.Execute(req);

            foreach (PrincipalAccess pa in resp.PrincipalAccesses)
            {
                if (pa.Principal.Id == user2.Id)
                {
                    Assert.NotEqual(AccessRights.None, pa.AccessMask);
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.ReadAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendToAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AssignAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.CreateAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.DeleteAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.ShareAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.WriteAccess));
                }
                else if (pa.Principal.Id == user1.Id)
                {
                    Assert.NotEqual(AccessRights.None, pa.AccessMask);
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.ReadAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AppendToAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.AssignAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.CreateAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.DeleteAccess));
                    Assert.True(pa.AccessMask.HasFlag(AccessRights.ShareAccess));
                    Assert.False(pa.AccessMask.HasFlag(AccessRights.WriteAccess));
                }
                else if (pa.Principal.Id == user3.Id)
                {
                    Assert.Equal(AccessRights.None, pa.AccessMask);
                }
            }
        }