コード例 #1
0
        /// <summary>
        /// Add default permissions to an object.
        /// </summary>
        /// <param name="dataModel">The data model.</param>
        /// <param name="transaction">The current transaction.</param>
        /// <param name="organizationId">The TenentId of the organization where the scan should start (eg. where the entity is).</param>
        /// <param name="entityId">The entityId of the object to modify.</param>
        ///<param name="tenantId">The root TenantId for which all the records will be created for</param>
        public static void AddGroupPermissions(DataModel dataModel, DataModelTransaction transaction, Guid organizationId, Guid entityId, Guid tenantId)
        {
            TenantRow organizationRow = DataModel.Tenant.TenantKey.Find(organizationId);

            RightsHolderRow[] rightsHolders;
            TenantTreeRow[]   tenantTreeRows;

            if (organizationRow == null)
            {
                throw new FaultException <RecordNotFoundFault>(
                          new RecordNotFoundFault("Organization", new object[] { organizationId }),
                          "The organization has been deleted.");
            }

            organizationRow.AcquireReaderLock(transaction);
            tenantTreeRows = organizationRow.GetTenantTreeRowsByFK_Tenant_TenantTree_ChildId();
            rightsHolders  = organizationRow.GetRightsHolderRows();
            organizationRow.ReleaseLock(transaction.TransactionId);

            foreach (RightsHolderRow rightsHolderRow in rightsHolders)
            {
                GroupRow[] groupRows;

                rightsHolderRow.AcquireReaderLock(transaction);
                groupRows = rightsHolderRow.GetGroupRows();
                rightsHolderRow.ReleaseLock(transaction.TransactionId);

                if (groupRows.Length > 0)
                {
                    Guid         groupId;
                    GroupRow     group = groupRows[0];
                    GroupTypeRow groupType;

                    group.AcquireReaderLock(transaction);
                    groupId   = group.GroupId;
                    groupType = group.GroupTypeRow;
                    group.ReleaseReaderLock(transaction.TransactionId);

                    groupType.AcquireReaderLock(transaction);
                    if (groupType.GroupTypeCode == GroupType.ExchangeAdmin ||
                        groupType.GroupTypeCode == GroupType.FluidTradeAdmin ||
                        groupType.GroupTypeCode == GroupType.SiteAdmin)
                    {
                        dataModel.CreateAccessControl(
                            Guid.NewGuid(),
                            AccessRightMap.FromCode(AccessRight.FullControl),
                            entityId,
                            groupId,
                            tenantId);
                    }
                }
            }

            foreach (TenantTreeRow tenantTreeRow in tenantTreeRows)
            {
                Guid parentId;

                tenantTreeRow.AcquireReaderLock(transaction);
                parentId = tenantTreeRow.ParentId;
                tenantTreeRow.ReleaseLock(transaction.TransactionId);

                AddGroupPermissions(dataModel, transaction, parentId, entityId, tenantId);
            }
        }