#pragma warning disable CA1810 // Initialize reference type static fields inline static SAMStoreCtx() #pragma warning restore CA1810 { // // Load the *PropertyMappingTableByProperty and *PropertyMappingTableByWinNT tables // s_userPropertyMappingTableByProperty = new Hashtable(); s_userPropertyMappingTableByWinNT = new Hashtable(); s_groupPropertyMappingTableByProperty = new Hashtable(); s_groupPropertyMappingTableByWinNT = new Hashtable(); s_computerPropertyMappingTableByProperty = new Hashtable(); s_computerPropertyMappingTableByWinNT = new Hashtable(); s_validPropertyMap = new Dictionary <string, ObjectMask>(); s_maskMap = new Dictionary <Type, ObjectMask>(); s_maskMap.Add(typeof(UserPrincipal), ObjectMask.User); s_maskMap.Add(typeof(ComputerPrincipal), ObjectMask.Computer); s_maskMap.Add(typeof(GroupPrincipal), ObjectMask.Group); s_maskMap.Add(typeof(Principal), ObjectMask.Principal); for (int i = 0; i < s_propertyMappingTableRaw.GetLength(0); i++) { string propertyName = s_propertyMappingTableRaw[i, 0] as string; Type principalType = s_propertyMappingTableRaw[i, 1] as Type; string winNTAttribute = s_propertyMappingTableRaw[i, 2] as string; FromWinNTConverterDelegate fromWinNT = s_propertyMappingTableRaw[i, 3] as FromWinNTConverterDelegate; ToWinNTConverterDelegate toWinNT = s_propertyMappingTableRaw[i, 4] as ToWinNTConverterDelegate; Debug.Assert(propertyName != null); Debug.Assert((winNTAttribute != null && fromWinNT != null) || (fromWinNT == null)); Debug.Assert(principalType == typeof(Principal) || principalType.IsSubclassOf(typeof(Principal))); // Build the table entry. The same entry will be used in both tables. // Once constructed, the table entries are treated as read-only, so there's // no danger in sharing the entries between tables. PropertyMappingTableEntry propertyEntry = new PropertyMappingTableEntry(); propertyEntry.propertyName = propertyName; propertyEntry.suggestedWinNTPropertyName = winNTAttribute; propertyEntry.winNTToPapiConverter = fromWinNT; propertyEntry.papiToWinNTConverter = toWinNT; // Add it to the appropriate tables List <Hashtable> byPropertyTables = new List <Hashtable>(); List <Hashtable> byWinNTTables = new List <Hashtable>(); ObjectMask BitMask = 0; if (principalType == typeof(UserPrincipal)) { byPropertyTables.Add(s_userPropertyMappingTableByProperty); byWinNTTables.Add(s_userPropertyMappingTableByWinNT); BitMask = ObjectMask.User; } else if (principalType == typeof(ComputerPrincipal)) { byPropertyTables.Add(s_computerPropertyMappingTableByProperty); byWinNTTables.Add(s_computerPropertyMappingTableByWinNT); BitMask = ObjectMask.Computer; } else if (principalType == typeof(GroupPrincipal)) { byPropertyTables.Add(s_groupPropertyMappingTableByProperty); byWinNTTables.Add(s_groupPropertyMappingTableByWinNT); BitMask = ObjectMask.Group; } else { Debug.Assert(principalType == typeof(Principal)); byPropertyTables.Add(s_userPropertyMappingTableByProperty); byPropertyTables.Add(s_computerPropertyMappingTableByProperty); byPropertyTables.Add(s_groupPropertyMappingTableByProperty); byWinNTTables.Add(s_userPropertyMappingTableByWinNT); byWinNTTables.Add(s_computerPropertyMappingTableByWinNT); byWinNTTables.Add(s_groupPropertyMappingTableByWinNT); BitMask = ObjectMask.Principal; } if ((winNTAttribute == null) || (winNTAttribute == "*******")) { BitMask = ObjectMask.None; } ObjectMask currentMask; if (s_validPropertyMap.TryGetValue(propertyName, out currentMask)) { s_validPropertyMap[propertyName] = currentMask | BitMask; } else { s_validPropertyMap.Add(propertyName, BitMask); } // *PropertyMappingTableByProperty // If toWinNT is null, there's no PAPI->WinNT mapping for this property // (it's probably read-only, e.g., "LastLogon"). // if (toWinNT != null) // { foreach (Hashtable propertyMappingTableByProperty in byPropertyTables) { if (propertyMappingTableByProperty[propertyName] == null) { propertyMappingTableByProperty[propertyName] = new ArrayList(); } ((ArrayList)propertyMappingTableByProperty[propertyName]).Add(propertyEntry); } // } // *PropertyMappingTableByWinNT // If fromLdap is null, there's no direct WinNT->PAPI mapping for this property. // It's probably a property that requires custom handling, such as an IdentityClaim. if (fromWinNT != null) { string winNTAttributeLower = winNTAttribute.ToLowerInvariant(); foreach (Hashtable propertyMappingTableByWinNT in byWinNTTables) { if (propertyMappingTableByWinNT[winNTAttributeLower] == null) { propertyMappingTableByWinNT[winNTAttributeLower] = new ArrayList(); } ((ArrayList)propertyMappingTableByWinNT[winNTAttributeLower]).Add(propertyEntry); } } } }
static SAMStoreCtx() { // // Load the *PropertyMappingTableByProperty and *PropertyMappingTableByWinNT tables // s_userPropertyMappingTableByProperty = new Hashtable(); s_userPropertyMappingTableByWinNT = new Hashtable(); s_groupPropertyMappingTableByProperty = new Hashtable(); s_groupPropertyMappingTableByWinNT = new Hashtable(); s_computerPropertyMappingTableByProperty = new Hashtable(); s_computerPropertyMappingTableByWinNT = new Hashtable(); s_validPropertyMap = new Dictionary<string, ObjectMask>(); s_maskMap = new Dictionary<Type, ObjectMask>(); s_maskMap.Add(typeof(UserPrincipal), ObjectMask.User); s_maskMap.Add(typeof(ComputerPrincipal), ObjectMask.Computer); s_maskMap.Add(typeof(GroupPrincipal), ObjectMask.Group); s_maskMap.Add(typeof(Principal), ObjectMask.Principal); for (int i = 0; i < s_propertyMappingTableRaw.GetLength(0); i++) { string propertyName = s_propertyMappingTableRaw[i, 0] as string; Type principalType = s_propertyMappingTableRaw[i, 1] as Type; string winNTAttribute = s_propertyMappingTableRaw[i, 2] as string; FromWinNTConverterDelegate fromWinNT = s_propertyMappingTableRaw[i, 3] as FromWinNTConverterDelegate; ToWinNTConverterDelegate toWinNT = s_propertyMappingTableRaw[i, 4] as ToWinNTConverterDelegate; Debug.Assert(propertyName != null); Debug.Assert((winNTAttribute != null && fromWinNT != null) || (fromWinNT == null)); Debug.Assert(principalType == typeof(Principal) || principalType.IsSubclassOf(typeof(Principal))); // Build the table entry. The same entry will be used in both tables. // Once constructed, the table entries are treated as read-only, so there's // no danger in sharing the entries between tables. PropertyMappingTableEntry propertyEntry = new PropertyMappingTableEntry(); propertyEntry.propertyName = propertyName; propertyEntry.suggestedWinNTPropertyName = winNTAttribute; propertyEntry.winNTToPapiConverter = fromWinNT; propertyEntry.papiToWinNTConverter = toWinNT; // Add it to the appropriate tables List<Hashtable> byPropertyTables = new List<Hashtable>(); List<Hashtable> byWinNTTables = new List<Hashtable>(); ObjectMask BitMask = 0; if (principalType == typeof(UserPrincipal)) { byPropertyTables.Add(s_userPropertyMappingTableByProperty); byWinNTTables.Add(s_userPropertyMappingTableByWinNT); BitMask = ObjectMask.User; } else if (principalType == typeof(ComputerPrincipal)) { byPropertyTables.Add(s_computerPropertyMappingTableByProperty); byWinNTTables.Add(s_computerPropertyMappingTableByWinNT); BitMask = ObjectMask.Computer; } else if (principalType == typeof(GroupPrincipal)) { byPropertyTables.Add(s_groupPropertyMappingTableByProperty); byWinNTTables.Add(s_groupPropertyMappingTableByWinNT); BitMask = ObjectMask.Group; } else { Debug.Assert(principalType == typeof(Principal)); byPropertyTables.Add(s_userPropertyMappingTableByProperty); byPropertyTables.Add(s_computerPropertyMappingTableByProperty); byPropertyTables.Add(s_groupPropertyMappingTableByProperty); byWinNTTables.Add(s_userPropertyMappingTableByWinNT); byWinNTTables.Add(s_computerPropertyMappingTableByWinNT); byWinNTTables.Add(s_groupPropertyMappingTableByWinNT); BitMask = ObjectMask.Principal; } if ((winNTAttribute == null) || (winNTAttribute == "*******")) { BitMask = ObjectMask.None; } ObjectMask currentMask; if (s_validPropertyMap.TryGetValue(propertyName, out currentMask)) { s_validPropertyMap[propertyName] = currentMask | BitMask; } else { s_validPropertyMap.Add(propertyName, BitMask); } // *PropertyMappingTableByProperty // If toWinNT is null, there's no PAPI->WinNT mapping for this property // (it's probably read-only, e.g., "LastLogon"). // if (toWinNT != null) // { foreach (Hashtable propertyMappingTableByProperty in byPropertyTables) { if (propertyMappingTableByProperty[propertyName] == null) propertyMappingTableByProperty[propertyName] = new ArrayList(); ((ArrayList)propertyMappingTableByProperty[propertyName]).Add(propertyEntry); } // } // *PropertyMappingTableByWinNT // If fromLdap is null, there's no direct WinNT->PAPI mapping for this property. // It's probably a property that requires custom handling, such as an IdentityClaim. if (fromWinNT != null) { string winNTAttributeLower = winNTAttribute.ToLower(CultureInfo.InvariantCulture); foreach (Hashtable propertyMappingTableByWinNT in byWinNTTables) { if (propertyMappingTableByWinNT[winNTAttributeLower] == null) propertyMappingTableByWinNT[winNTAttributeLower] = new ArrayList(); ((ArrayList)propertyMappingTableByWinNT[winNTAttributeLower]).Add(propertyEntry); } } } }