public static SecurityContextSecurityToken ResolveCookie(byte [] bytes, byte [] cookie) { string id = null; UniqueId context = null; DateTime validFrom = DateTime.MinValue, validTo = DateTime.MaxValue, keyEffective = DateTime.MinValue, keyExpired = DateTime.MaxValue; byte [] key = null; X509Certificate2 cert = null; X500DistinguishedName issuer = null; XmlDictionary dic = new XmlDictionary(); for (int i = 0; i < 30; i++) { dic.Add("n" + i); } // FIXME: create proper quotas XmlDictionaryReaderQuotas quotas = new XmlDictionaryReaderQuotas(); XmlDictionaryReader cr = XmlDictionaryReader.CreateBinaryReader(bytes, 0, bytes.Length, dic, quotas); cr.MoveToContent(); // -> n1 cr.ReadStartElement("n0", String.Empty); do { cr.MoveToContent(); if (cr.NodeType == XmlNodeType.EndElement) { break; } if (cr.NodeType != XmlNodeType.Element) { throw new Exception("Unxpected non-element content:" + cr.NodeType); } switch (cr.Name) { case "n1": // FIXME: some integer here int n1 = cr.ReadElementContentAsInt(); if (n1 != 1) { throw new Exception("INTERNAL ERROR: there was unexpected n2 content: " + n1); } break; case "n2": context = cr.ReadElementContentAsUniqueId(); break; case "n3": id = cr.ReadElementContentAsString(); break; case "n4": key = cr.ReadElementContentAsBase64(); break; case "n7": validFrom = new DateTime(cr.ReadElementContentAsLong()); break; case "n8": validTo = new DateTime(cr.ReadElementContentAsLong()); break; case "n10": keyEffective = new DateTime(cr.ReadElementContentAsLong()); break; case "n11": keyExpired = new DateTime(cr.ReadElementContentAsLong()); break; case "n13": // <n18>X509Certificate</n18> cr.Read(); cr.MoveToContent(); cert = new X509Certificate2(cr.ReadElementContentAsBase64()); cr.ReadEndElement(); break; case "n15": // <n16><n24 n25="IssuerName" /></n16> cr.Read(); cr.ReadStartElement("n16", String.Empty); issuer = new X500DistinguishedName(cr.GetAttribute("n25")); bool empty = cr.IsEmptyElement; cr.ReadStartElement("n24", String.Empty); if (!empty) { cr.ReadEndElement(); // n24 } cr.ReadEndElement(); // n16 cr.ReadEndElement(); // n15 break; default: throw new Exception("INTERNAL ERROR: there was an unhandled element: " + cr.Name); } } while (true); SecurityContextSecurityToken sct = new SecurityContextSecurityToken( context, id, key, validFrom, validTo, null, keyEffective, keyExpired, null); sct.Cookie = cookie; return(sct); }
public object ReadValue(XmlDictionaryReader reader) { object value; if (isArray) { switch (typeCode) { case TypeCode.Byte: value = reader.ReadElementContentAsBase64(); break; case TypeCode.Boolean: if (!reader.IsEmptyElement) { reader.ReadStartElement(); value = reader.ReadBooleanArray(itemName, itemNamespace); reader.ReadEndElement(); } else { reader.Read(); value = new bool[0]; } break; case TypeCode.DateTime: if (!reader.IsEmptyElement) { reader.ReadStartElement(); value = reader.ReadDateTimeArray(itemName, itemNamespace); reader.ReadEndElement(); } else { reader.Read(); value = new DateTime[0]; } break; case TypeCode.Decimal: if (!reader.IsEmptyElement) { reader.ReadStartElement(); value = reader.ReadDecimalArray(itemName, itemNamespace); reader.ReadEndElement(); } else { reader.Read(); value = new Decimal[0]; } break; case TypeCode.Int32: if (!reader.IsEmptyElement) { reader.ReadStartElement(); value = reader.ReadInt32Array(itemName, itemNamespace); reader.ReadEndElement(); } else { reader.Read(); value = new Int32[0]; } break; case TypeCode.Int64: if (!reader.IsEmptyElement) { reader.ReadStartElement(); value = reader.ReadInt64Array(itemName, itemNamespace); reader.ReadEndElement(); } else { reader.Read(); value = new Int64[0]; } break; case TypeCode.Single: if (!reader.IsEmptyElement) { reader.ReadStartElement(); value = reader.ReadSingleArray(itemName, itemNamespace); reader.ReadEndElement(); } else { reader.Read(); value = new Single[0]; } break; case TypeCode.Double: if (!reader.IsEmptyElement) { reader.ReadStartElement(); value = reader.ReadDoubleArray(itemName, itemNamespace); reader.ReadEndElement(); } else { reader.Read(); value = new Double[0]; } break; default: throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxInvalidUseOfPrimitiveOperationFormatter))); } } else { switch (typeCode) { case TypeCode.Boolean: value = reader.ReadElementContentAsBoolean(); break; case TypeCode.DateTime: value = reader.ReadElementContentAsDateTime(); break; case TypeCode.Decimal: value = reader.ReadElementContentAsDecimal(); break; case TypeCode.Double: value = reader.ReadElementContentAsDouble(); break; case TypeCode.Int32: value = reader.ReadElementContentAsInt(); break; case TypeCode.Int64: value = reader.ReadElementContentAsLong(); break; case TypeCode.Single: value = reader.ReadElementContentAsFloat(); break; case TypeCode.String: return(reader.ReadElementContentAsString()); default: throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString(SR.SFxInvalidUseOfPrimitiveOperationFormatter))); } } return(value); }
public object ReadValue(XmlDictionaryReader reader) { object obj2; if (!this.isArray) { switch (this.typeCode) { case TypeCode.Int32: return(reader.ReadElementContentAsInt()); case TypeCode.Int64: return(reader.ReadElementContentAsLong()); case TypeCode.Single: return(reader.ReadElementContentAsFloat()); case TypeCode.Double: return(reader.ReadElementContentAsDouble()); case TypeCode.Decimal: return(reader.ReadElementContentAsDecimal()); case TypeCode.DateTime: return(reader.ReadElementContentAsDateTime()); case TypeCode.String: return(reader.ReadElementContentAsString()); case TypeCode.Boolean: return(reader.ReadElementContentAsBoolean()); } throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("SFxInvalidUseOfPrimitiveOperationFormatter"))); } switch (this.typeCode) { case TypeCode.Boolean: if (reader.IsEmptyElement) { reader.Read(); return(new bool[0]); } reader.ReadStartElement(); obj2 = reader.ReadBooleanArray(this.itemName, this.itemNamespace); reader.ReadEndElement(); return(obj2); case TypeCode.Byte: return(reader.ReadElementContentAsBase64()); case TypeCode.Int32: if (reader.IsEmptyElement) { reader.Read(); return(new int[0]); } reader.ReadStartElement(); obj2 = reader.ReadInt32Array(this.itemName, this.itemNamespace); reader.ReadEndElement(); return(obj2); case TypeCode.Int64: if (reader.IsEmptyElement) { reader.Read(); return(new long[0]); } reader.ReadStartElement(); obj2 = reader.ReadInt64Array(this.itemName, this.itemNamespace); reader.ReadEndElement(); return(obj2); case TypeCode.Single: if (reader.IsEmptyElement) { reader.Read(); return(new float[0]); } reader.ReadStartElement(); obj2 = reader.ReadSingleArray(this.itemName, this.itemNamespace); reader.ReadEndElement(); return(obj2); case TypeCode.Double: if (reader.IsEmptyElement) { reader.Read(); return(new double[0]); } reader.ReadStartElement(); obj2 = reader.ReadDoubleArray(this.itemName, this.itemNamespace); reader.ReadEndElement(); return(obj2); case TypeCode.Decimal: if (reader.IsEmptyElement) { reader.Read(); return(new decimal[0]); } reader.ReadStartElement(); obj2 = reader.ReadDecimalArray(this.itemName, this.itemNamespace); reader.ReadEndElement(); return(obj2); case TypeCode.DateTime: if (reader.IsEmptyElement) { reader.Read(); return(new DateTime[0]); } reader.ReadStartElement(); obj2 = reader.ReadDateTimeArray(this.itemName, this.itemNamespace); reader.ReadEndElement(); return(obj2); } throw System.ServiceModel.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(System.ServiceModel.SR.GetString("SFxInvalidUseOfPrimitiveOperationFormatter"))); }