| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- //----------------------------------------------------------
- // Copyright (c) Microsoft Corporation. All rights reserved.
- //------------------------------------------------------------
- namespace System.ServiceModel.Security
- {
- using System.ServiceModel.Channels;
- using System.ServiceModel.Security.Tokens;
- using System.Xml;
- using SignedXml = System.IdentityModel.SignedXml;
- using StandardSignedInfo = System.IdentityModel.StandardSignedInfo;
- class LaxModeSecurityHeaderElementInferenceEngine : SecurityHeaderElementInferenceEngine
- {
- static LaxModeSecurityHeaderElementInferenceEngine instance = new LaxModeSecurityHeaderElementInferenceEngine();
- protected LaxModeSecurityHeaderElementInferenceEngine() { }
- internal static LaxModeSecurityHeaderElementInferenceEngine Instance
- {
- get { return instance; }
- }
- public override void ExecuteProcessingPasses(ReceiveSecurityHeader securityHeader, XmlDictionaryReader reader)
- {
- // pass 1
- securityHeader.ExecuteReadingPass(reader);
- // pass 1.5
- securityHeader.ExecuteDerivedKeyTokenStubPass(false);
- // pass 2
- securityHeader.ExecuteSubheaderDecryptionPass();
- // pass 2.5
- securityHeader.ExecuteDerivedKeyTokenStubPass(true);
- // layout-specific inferences
- MarkElements(securityHeader.ElementManager, securityHeader.RequireMessageProtection);
- // pass 3
- securityHeader.ExecuteSignatureEncryptionProcessingPass();
- }
- public override void MarkElements(ReceiveSecurityHeaderElementManager elementManager, bool messageSecurityMode)
- {
- bool primarySignatureFound = false;
- for (int position = 0; position < elementManager.Count; position++)
- {
- ReceiveSecurityHeaderEntry entry;
- elementManager.GetElementEntry(position, out entry);
- if (entry.elementCategory == ReceiveSecurityHeaderElementCategory.Signature)
- {
- if (!messageSecurityMode)
- {
- elementManager.SetBindingMode(position, ReceiveSecurityHeaderBindingModes.Endorsing);
- continue;
- }
- SignedXml signedXml = (SignedXml)entry.element;
- StandardSignedInfo signedInfo = (StandardSignedInfo)signedXml.Signature.SignedInfo;
- bool targetsSignature = false;
- if (signedInfo.ReferenceCount == 1)
- {
- string uri = signedInfo[0].Uri;
- string id;
- if (uri != null && uri.Length > 1 && uri[0] == '#')
- {
- id = uri.Substring(1);
- }
- else
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(
- new MessageSecurityException(SR.GetString(SR.UnableToResolveReferenceUriForSignature, uri)));
- }
- for (int j = 0; j < elementManager.Count; j++)
- {
- ReceiveSecurityHeaderEntry inner;
- elementManager.GetElementEntry(j, out inner);
- if (j != position && inner.elementCategory == ReceiveSecurityHeaderElementCategory.Signature && inner.id == id)
- {
- targetsSignature = true;
- break;
- }
- }
- }
- if (targetsSignature)
- {
- elementManager.SetBindingMode(position, ReceiveSecurityHeaderBindingModes.Endorsing);
- continue;
- }
- else
- {
- if (primarySignatureFound)
- {
- throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new MessageSecurityException(SR.GetString(SR.AtMostOnePrimarySignatureInReceiveSecurityHeader)));
- }
- primarySignatureFound = true;
- elementManager.SetBindingMode(position, ReceiveSecurityHeaderBindingModes.Primary);
- continue;
- }
- }
- }
- }
- }
- }
|