private void AddPermissionEntriesForRemove(MapiAclTableAdapter mapiAclTableAdapter) { foreach (Permission permission in this.removedPermissions.Values) { mapiAclTableAdapter.RemovePermissionEntry(permission.MemberId); } }
private void AddNonADEntry(MapiAclTableAdapter mapiAclTableAdapter, ref ExternalUserCollection externalUsers, string memberName, long memberId, byte[] memberEntryId, MemberRights rights) { ExternalUser externalUser = mapiAclTableAdapter.TryGetExternalUser(memberEntryId, ref externalUsers); if (externalUser != null) { PermissionSecurityPrincipal securityPrincipal = new PermissionSecurityPrincipal(externalUser); Permission permission = this.permissionSet.CreatePermission(securityPrincipal, rights, memberId); this.AddPermissionEntry(securityPrincipal, permission); return; } ExTraceGlobals.StorageTracer.TraceDebug <string>(0L, "PermissionTable::PermissionTable. Member has invalid entry id, member name = {0}.", memberName); this.AddUnknownEntry(memberName, memberId, memberEntryId, rights); }
internal void Save(CoreFolder coreFolder) { this.CheckValid(); Util.ThrowOnNullArgument(coreFolder, "coreFolder"); if (this.IsDirty) { this.EnforceRestriction(coreFolder); this.SaveSharingPartnership(coreFolder.Session as MailboxSession); using (IModifyTable permissionTable = coreFolder.GetPermissionTable(this.PermissionSet.ModifyTableOptions)) { MapiAclTableAdapter mapiAclTableAdapter = new MapiAclTableAdapter(permissionTable); this.AddPermissionEntriesForRemove(mapiAclTableAdapter); this.AddPermissionEntriesForAddOrModify(mapiAclTableAdapter); mapiAclTableAdapter.ApplyPendingChanges(true); } } this.isInvalid = true; }
internal AclTableEntry[] GetAll() { List <AclTableEntry> list = new List <AclTableEntry>(); using (IQueryResult queryResult = this.modifyTable.GetQueryResult(null, MapiAclTableAdapter.PropertiesToRead)) { bool flag; do { object[][] rows = queryResult.GetRows(int.MaxValue, out flag); foreach (object[] row in rows) { list.Add(MapiAclTableAdapter.LoadFromRawData(row)); } }while (flag); } this.allEntriesCached = list.ToArray(); return(list.ToArray()); }
private void AddPermissionEntriesForAddOrModify(MapiAclTableAdapter mapiAclTableAdapter) { foreach (Permission permission in this.permissions.Values) { byte[] array = null; if (permission.Origin == PermissionOrigin.New) { if (permission.Principal.Type == PermissionSecurityPrincipal.SecurityPrincipalType.ADRecipientPrincipal) { ParticipantEntryId participantEntryId = ParticipantEntryId.FromParticipant(new Participant(permission.Principal.ADRecipient), ParticipantEntryIdConsumer.SupportsADParticipantEntryId); array = participantEntryId.ToByteArray(); } else if (permission.Principal.Type == PermissionSecurityPrincipal.SecurityPrincipalType.ExternalUserPrincipal) { ExternalUser externalUser = permission.Principal.ExternalUser; byte[] array2 = new byte[externalUser.Sid.BinaryLength]; externalUser.Sid.GetBinaryForm(array2, 0); array = MapiStore.GetAddressBookEntryIdFromLocalDirectorySID(array2); } if (array != null) { mapiAclTableAdapter.AddPermissionEntry(array, permission.MemberRights); } } else if (permission.IsDirty) { mapiAclTableAdapter.ModifyPermissionEntry(permission.MemberId, permission.MemberRights); } } if (this.anonymousMemberPermission != null && this.anonymousMemberPermission.IsDirty) { mapiAclTableAdapter.ModifyPermissionEntry(this.anonymousMemberPermission.MemberId, this.anonymousMemberPermission.MemberRights); } if (this.defaultMemberPermission != null && this.defaultMemberPermission.IsDirty) { mapiAclTableAdapter.ModifyPermissionEntry(this.defaultMemberPermission.MemberId, this.defaultMemberPermission.MemberRights); } }
private void LoadFrom(MapiAclTableAdapter mapiAclTableAdapter) { IRecipientSession recipientSession = null; ExternalUserCollection disposable = null; AclTableEntry[] all = mapiAclTableAdapter.GetAll(); try { foreach (AclTableEntry aclTableEntry in all) { long memberId = aclTableEntry.MemberId; byte[] memberEntryId = aclTableEntry.MemberEntryId; string memberName = aclTableEntry.MemberName; MemberRights memberRights = aclTableEntry.MemberRights; if (memberId == 0L) { this.defaultMemberPermission = this.permissionSet.CreatePermission(new PermissionSecurityPrincipal(PermissionSecurityPrincipal.SpecialPrincipalType.Default), memberRights, memberId); } else if (memberId == -1L) { this.anonymousMemberPermission = this.permissionSet.CreatePermission(new PermissionSecurityPrincipal(PermissionSecurityPrincipal.SpecialPrincipalType.Anonymous), memberRights, memberId); } else if (memberEntryId != null) { ADParticipantEntryId adparticipantEntryId = mapiAclTableAdapter.TryGetParticipantEntryId(memberEntryId); if (adparticipantEntryId != null) { if (recipientSession == null) { recipientSession = mapiAclTableAdapter.Session.GetADRecipientSession(true, ConsistencyMode.IgnoreInvalid); } ADRecipient adrecipient = null; try { adrecipient = recipientSession.FindByLegacyExchangeDN(adparticipantEntryId.LegacyDN); } catch (DataValidationException) { ExTraceGlobals.StorageTracer.TraceDebug <string, string>(0L, "PermissionTable::PermissionTable. Caught exception from ADSesssion.FindByLegacyExchangeDN when trying to find a recipient from the ACL Table. Recipient name = {0}, LegDN = {1}.", memberName, adparticipantEntryId.LegacyDN); this.AddUnknownEntry(memberName, memberId, memberEntryId, memberRights); goto IL_17E; } if (adrecipient != null) { Permission permission = this.permissionSet.CreatePermission(new PermissionSecurityPrincipal(adrecipient), memberRights, memberId); this.AddPermissionEntry(permission.Principal, permission); } else { ExTraceGlobals.StorageTracer.TraceDebug <string, string>(0L, "PermissionTable::PermissionTable. Did not find the recipient from the ACL table in the AD. Recipient name = {0}, LegDN = {1}.", memberName, adparticipantEntryId.LegacyDN); this.AddUnknownEntry(memberName, memberId, memberEntryId, memberRights); } } else { this.AddNonADEntry(mapiAclTableAdapter, ref disposable, memberName, memberId, memberEntryId, memberRights); } } else { ExTraceGlobals.StorageTracer.TraceDebug <string>(0L, "PermissionTable::PermissionTable. Found a member in the ACL table (other than anonymous and default) without a member entry id. Recipient Name = {0}.", memberName); this.AddUnknownEntry(memberName, memberId, memberEntryId, memberRights); } IL_17E :; } } finally { Util.DisposeIfPresent(disposable); } }
private MapiAclTableRestriction.ExternalUserPermission TryGetExternalUserPermission(AclTableEntry aclTableEntry, MapiAclTableAdapter mapiAclTableAdapter, ref ExternalUserCollection externalUsers) { Util.ThrowOnNullArgument(aclTableEntry, "aclTableEntry"); Util.ThrowOnNullArgument(mapiAclTableAdapter, "mapiAclTableAdapter"); MailboxSession mailboxSession = this.session as MailboxSession; if (mailboxSession == null) { return(null); } byte[] memberEntryId = aclTableEntry.MemberEntryId; MemberRights memberRights = aclTableEntry.MemberRights; long memberId = aclTableEntry.MemberId; if (memberEntryId == null || memberEntryId.Length == 0) { if (memberId <= 0L) { return(null); } ExTraceGlobals.StorageTracer.TraceDebug <IExchangePrincipal, long>((long)this.GetHashCode(), "{0}: Getting memberEntryId from current ACL table for MemberId {1}.", mailboxSession.MailboxOwner, memberId); AclTableEntry byMemberId = mapiAclTableAdapter.GetByMemberId(memberId); if (byMemberId == null || byMemberId.MemberEntryId == null) { ExTraceGlobals.StorageTracer.TraceDebug <IExchangePrincipal, long>((long)this.GetHashCode(), "{0}: Not found memberEntryId from current ACL table for MemberId {1}. Skipped.", mailboxSession.MailboxOwner, memberId); return(null); } memberEntryId = byMemberId.MemberEntryId; } if (mapiAclTableAdapter.TryGetParticipantEntryId(memberEntryId) != null) { ExTraceGlobals.StorageTracer.TraceDebug <IExchangePrincipal>((long)this.GetHashCode(), "{0}: MemberEntryId indicates internal user. Skipped.", mailboxSession.MailboxOwner); return(null); } ExternalUser externalUser = mapiAclTableAdapter.TryGetExternalUser(memberEntryId, ref externalUsers); if (externalUser == null) { ExTraceGlobals.StorageTracer.TraceDebug <IExchangePrincipal>((long)this.GetHashCode(), "{0}: MemberEntryId is not external user. Skipped.", mailboxSession.MailboxOwner); return(null); } return(new MapiAclTableRestriction.ExternalUserPermission(externalUser, memberRights)); }
private ICollection <MapiAclTableRestriction.ExternalUserPermission> GetExternalUserPermissions(MapiAclTableAdapter mapiAclTableAdapter, IEnumerable <AclTableEntry.ModifyOperation> changingEntries) { List <MapiAclTableRestriction.ExternalUserPermission> list = null; ExternalUserCollection disposable = null; try { foreach (AclTableEntry.ModifyOperation modifyOperation in changingEntries) { if (modifyOperation.Operation == ModifyTableOperationType.Add || modifyOperation.Operation == ModifyTableOperationType.Modify) { MapiAclTableRestriction.ExternalUserPermission externalUserPermission = this.TryGetExternalUserPermission(modifyOperation.Entry, mapiAclTableAdapter, ref disposable); if (externalUserPermission != null) { if (list == null) { list = new List <MapiAclTableRestriction.ExternalUserPermission>(); } list.Add(externalUserPermission); } } } } finally { Util.DisposeIfPresent(disposable); } return(list); }