private static void SerializeStoreTags(Dictionary <Guid, StoreTagData> dictionary, Dictionary <Guid, StoreTagData> defaultArchiveTagData, List <Guid> deletedTags, RetentionHoldData retentionHoldData, Stream dataStream, IExchangePrincipal mailboxOwner, bool compactDefaultTagOnly, bool fullCrawlRequired) { MrmFaiFormatter.Tracer.TraceDebug <IExchangePrincipal, int>(0L, "Mailbox:{0}. About to serialize tags to FAI. There are {1} items in the tag dictionary.", mailboxOwner, (dictionary == null) ? -1 : dictionary.Count); dataStream.SetLength(0L); using (XmlTextWriter xmlTextWriter = new XmlTextWriter(dataStream, null)) { xmlTextWriter.WriteStartElement("UserConfiguration"); xmlTextWriter.WriteStartElement("Info"); xmlTextWriter.WriteAttributeString("version", "Exchange.14"); xmlTextWriter.WriteStartElement("Data"); if (!compactDefaultTagOnly) { MrmFaiFormatter.Tracer.TraceDebug(0L, "Mailbox:{0}. About to write out hold info. HoldEnabled: {1}. Comment: {2}. Url: {3}", new object[] { mailboxOwner, retentionHoldData.HoldEnabled, retentionHoldData.Comment, retentionHoldData.Url }); xmlTextWriter.WriteStartElement("RetentionHold"); xmlTextWriter.WriteAttributeString("Enabled", retentionHoldData.HoldEnabled.ToString()); xmlTextWriter.WriteAttributeString("RetentionComment", retentionHoldData.Comment); xmlTextWriter.WriteAttributeString("RetentionUrl", retentionHoldData.Url); xmlTextWriter.WriteEndElement(); } xmlTextWriter.WriteStartElement("ArchiveSync"); xmlTextWriter.WriteAttributeString("FullCrawlRequired", fullCrawlRequired.ToString()); xmlTextWriter.WriteEndElement(); if (deletedTags != null) { foreach (Guid guid in deletedTags) { xmlTextWriter.WriteStartElement("DeletedTag"); xmlTextWriter.WriteAttributeString("Guid", guid.ToString()); xmlTextWriter.WriteEndElement(); } } foreach (StoreTagData storeTagData in dictionary.Values) { if (storeTagData == null) { MrmFaiFormatter.Tracer.TraceDebug <IExchangePrincipal>(0L, "Mailbox:{0}. Store data Tag is null, so it will not be serialized.", mailboxOwner); } else { bool flag = storeTagData.Tag.IsArchiveTag || ElcMailboxHelper.IsArchiveTag(storeTagData, false); if (storeTagData.Tag.Type == ElcFolderType.All && flag) { MrmFaiFormatter.Tracer.TraceDebug <IExchangePrincipal, string>(0L, "Mailbox:{0}. Tag {1} is a default Move To Archive tag. We don't serialize those.", mailboxOwner, storeTagData.Tag.Name); } else { MrmFaiFormatter.Tracer.TraceDebug <IExchangePrincipal, string>(0L, "Mailbox:{0}. Starting to serialize tag {1}.", mailboxOwner, storeTagData.Tag.Name); if (compactDefaultTagOnly && storeTagData.Tag.Type != ElcFolderType.All) { MrmFaiFormatter.Tracer.TraceDebug <IExchangePrincipal, string>(0L, "Mailbox:{0}. compactDefaultTagOnly is true and tag {1} is not default, so skip.", mailboxOwner, storeTagData.Tag.Name); } else if (flag) { MrmFaiFormatter.SerializeStoreTagData("ArchiveTag", storeTagData, xmlTextWriter, mailboxOwner, compactDefaultTagOnly); } else { MrmFaiFormatter.SerializeStoreTagData("PolicyTag", storeTagData, xmlTextWriter, mailboxOwner, compactDefaultTagOnly); } } } } if (defaultArchiveTagData != null) { foreach (StoreTagData storeTagData2 in defaultArchiveTagData.Values) { MrmFaiFormatter.SerializeStoreTagData("DefaultArchiveTag", storeTagData2, xmlTextWriter, mailboxOwner, compactDefaultTagOnly); } } xmlTextWriter.WriteEndElement(); xmlTextWriter.WriteEndElement(); } }
internal static Dictionary <Guid, AdTagData> GetTagsInPolicy(MailboxSession session, ADUser aduser, Dictionary <Guid, AdTagData> allAdTags) { if (allAdTags == null || allAdTags.Count == 0 || aduser == null) { return(null); } string arg = session.MailboxOwner.MailboxInfo.PrimarySmtpAddress.ToString(); ADObjectId adobjectId = aduser.RetentionPolicy; if (adobjectId == null && aduser.ShouldUseDefaultRetentionPolicy && aduser.OrganizationId != null && !OrganizationId.ForestWideOrgId.Equals(aduser.OrganizationId)) { IConfigurationSession scopedSession; if (SharedConfiguration.IsDehydratedConfiguration(aduser.OrganizationId)) { scopedSession = SharedConfiguration.CreateScopedToSharedConfigADSession(aduser.OrganizationId); } else { scopedSession = DirectorySessionFactory.Default.GetTenantOrTopologyConfigurationSession(false, ConsistencyMode.FullyConsistent, ADSessionSettings.FromOrganizationIdWithoutRbacScopesServiceOnly(aduser.OrganizationId), 149, "GetTagsInPolicy", "f:\\15.00.1497\\sources\\dev\\infoworker\\src\\common\\ELC\\AdTagReader.cs"); } IList <RetentionPolicy> defaultRetentionPolicy = SharedConfiguration.GetDefaultRetentionPolicy(scopedSession, aduser, null, 1); if (defaultRetentionPolicy != null && defaultRetentionPolicy.Count > 0) { adobjectId = defaultRetentionPolicy[0].Id; } } if (adobjectId == null) { AdReader.Tracer.TraceDebug <string>(0L, "Mailbox '{0}' does not have an ELC Mailbox policy.", arg); return(null); } IConfigurationSession tenantOrTopologyConfigurationSession = DirectorySessionFactory.Default.GetTenantOrTopologyConfigurationSession(false, ConsistencyMode.FullyConsistent, ADSessionSettings.FromAllTenantsOrRootOrgAutoDetect(adobjectId), 175, "GetTagsInPolicy", "f:\\15.00.1497\\sources\\dev\\infoworker\\src\\common\\ELC\\AdTagReader.cs"); RetentionPolicy retentionPolicy = tenantOrTopologyConfigurationSession.Read <RetentionPolicy>(adobjectId); if (retentionPolicy == null) { AdReader.Tracer.TraceDebug <string, ADObjectId>(0L, "Mailbox '{0}' no matching ELC Mailbox policy for Template '{1}'.", arg, adobjectId); return(null); } MultiValuedProperty <ADObjectId> retentionPolicyTagLinks = retentionPolicy.RetentionPolicyTagLinks; Dictionary <Guid, AdTagData> dictionary = new Dictionary <Guid, AdTagData>(); List <AdTagData> list = new List <AdTagData>(); List <AdTagData> list2 = new List <AdTagData>(); int num = 0; Dictionary <Guid, AdTagData> dictionary2 = new Dictionary <Guid, AdTagData>(); foreach (Guid key in allAdTags.Keys) { AdTagData adTagData = allAdTags[key]; dictionary2[adTagData.Tag.Guid] = adTagData; } foreach (ADObjectId adobjectId2 in retentionPolicyTagLinks) { if (!dictionary2.ContainsKey(adobjectId2.ObjectGuid)) { AdReader.Tracer.TraceDebug <string, string>(0L, "Mailbox '{0}' has link '{1}' in policy to a tag that could not be found in the AD. Skipping user.", arg, adobjectId2.DistinguishedName); throw new IWTransientException(Strings.descTagNotInAD(adobjectId2.DistinguishedName)); } AdTagData adTagData2 = dictionary2[adobjectId2.ObjectGuid]; if (adTagData2.Tag.Type == ElcFolderType.All) { if (ElcMailboxHelper.IsArchiveTag(adTagData2, false)) { AdReader.Tracer.TraceDebug <string, string>(0L, "Mailbox '{0}'. Tag {1} is a default archive tag.", arg, adTagData2.Tag.Name); list2.Add(adTagData2); } else if (adTagData2.Tag.IsPrimary) { AdReader.Tracer.TraceDebug <string, string>(0L, "Mailbox '{0}'. Tag {1} is the primary default retention tag.", arg, adTagData2.Tag.Name); list.Insert(0, adTagData2); num++; } else { AdReader.Tracer.TraceDebug <string, string>(0L, "Mailbox '{0}'. Tag {1} is a default retention tag.", arg, adTagData2.Tag.Name); list.Add(adTagData2); } } else { dictionary[adobjectId2.ObjectGuid] = dictionary2[adobjectId2.ObjectGuid]; } } if (list2.Count > 0) { AdReader.Tracer.TraceDebug <string, string, int>(0L, "Mailbox '{0}' with policy '{1}' has {2} default MTA tags.", arg, retentionPolicy.Id.DistinguishedName, list2.Count); list2.Sort(delegate(AdTagData x, AdTagData y) { if (x.ContentSettings.Count != 1) { return(1); } if (y.ContentSettings.Count != 1) { return(-1); } return(x.ContentSettings.Single <KeyValuePair <Guid, ContentSetting> >().Value.MessageClass.Length - y.ContentSettings.Single <KeyValuePair <Guid, ContentSetting> >().Value.MessageClass.Length); }); AdTagData firstArchiveTag = new AdTagData(); firstArchiveTag.Tag = list2[0].Tag; firstArchiveTag.ContentSettings = new SortedDictionary <Guid, ContentSetting>(); list2.SelectMany((AdTagData x) => x.ContentSettings.Values).ForEach(delegate(ContentSetting x) { firstArchiveTag.ContentSettings[x.Guid] = x; }); dictionary[firstArchiveTag.Tag.Guid] = firstArchiveTag; } if (list.Count > 0) { if (num > 1) { AdReader.Tracer.TraceDebug <string, string>(0L, "Mailbox '{0}' has policy '{1}' with corrupted default tags (Primary default should be 1). Skipping user.", arg, retentionPolicy.Id.DistinguishedName); throw new IWPermanentException(Strings.descPrimaryDefaultCorrupted(retentionPolicy.Id.DistinguishedName, num)); } if (num == 0 && list.Count > 1) { list.Sort(delegate(AdTagData x, AdTagData y) { if (x.ContentSettings.Count != 1) { return(1); } if (y.ContentSettings.Count != 1) { return(-1); } return(x.ContentSettings.Single <KeyValuePair <Guid, ContentSetting> >().Value.MessageClass.Length - y.ContentSettings.Single <KeyValuePair <Guid, ContentSetting> >().Value.MessageClass.Length); }); } for (int i = 0; i < list.Count; i++) { Guid guid = list[i].Tag.Guid; dictionary[guid] = list[i]; } } return(dictionary); }