/// <summary> /// Specifies the security context used for all invocations made in the current thread. /// </summary> /// <param name="securitySessionParameters">Security Session parameters.</param> /// <returns>The name of the previous security context or null.</returns> public static SecuritySessionParameters SetCurrentSecurityContext(SecuritySessionParameters securitySessionParameters) { LocalDataStoreSlot localDataStoreSlot = Thread.GetNamedDataSlot(OccupiedThreadSlots.CurrentSecuritySessionParameters); object previousDataSlotValue = Thread.GetData(localDataStoreSlot); Thread.SetData(localDataStoreSlot, securitySessionParameters); return(previousDataSlotValue as SecuritySessionParameters); }
/// <summary> /// Initiates establishing Security Session with specific remote host via specified IConnectionManager. /// </summary> /// <param name="securitySessionParameters">Security Session parameters.</param> public void InitiateEstablishingSecuritySession(SecuritySessionParameters securitySessionParameters) { BinaryLogWriter binaryLogWriter = GenuineLoggingServices.BinaryLogWriter; if (binaryLogWriter != null && binaryLogWriter[LogCategory.Security] > 0) { binaryLogWriter.WriteEvent(LogCategory.Security, "SecuritySession.InitiateEstablishingSecuritySession", LogMessageType.SecuritySessionInitiated, null, null, this.Remote, null, GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name, this, this.Name, -1, 0, 0, 0, this.GetType().Name, this.Name, null, null, "Security Session establishing is initiated."); } this.Failed.Reset(); this._establishingSecuritySessionParameters = securitySessionParameters; GenuineThreadPool.QueueUserWorkItem(new WaitCallback(this.Internal_InitiateEstablishingSecuritySession), securitySessionParameters, false); }
private void CheckState() { try { SecuritySessionParameters parameters = new SecuritySessionParameters( SecuritySessionServices.DefaultContext.Name, SecuritySessionAttributes.None, TimeSpan.FromSeconds(5)); using (new SecurityContextKeeper(parameters)) { while (true) { try { if (ClientEnvironment.ServerStateService.CanInteract) { if (ClientEnvironment.ServerStateService.ServerReady) SetState(ServerState.Ready); else SetState(ServerState.Starting); } else SetState(ServerState.Starting); } catch (ThreadAbortException) { return; } catch(Exception ex) { SetState(ServerState.Unavailable); } if (_FinishChecking.WaitOne(1000, false)) return; } } } catch (ThreadAbortException) { } }
/// <summary> /// Forces the specified security context to be used in all calls in /// the current thread until Dispose method is called. /// </summary> /// <param name="securitySessionParameters">Security Session parameters.</param> public SecurityContextKeeper(SecuritySessionParameters securitySessionParameters) { this._previousSecuritySessionParameters = SecuritySessionServices.SetCurrentSecurityContext(securitySessionParameters); }
/// <summary> /// Constructs the response to the specified message. /// </summary> /// <param name="sourceMessage">The source message.</param> /// <param name="iTransportHeaders">The transport headers.</param> /// <param name="stream">The message content.</param> public Message(Message sourceMessage, ITransportHeaders iTransportHeaders, Stream stream) { this.ITransportContext = sourceMessage.ITransportContext; this.ITransportHeaders = iTransportHeaders; // this.Sender = sourceMessage.Recipient; this.Recipient = sourceMessage.Sender; this.ReplyToId = sourceMessage.MessageId; this.GenuineMessageType = sourceMessage.GenuineMessageType; this.Stream = stream; this.ConnectionName = sourceMessage.ConnectionName; this.SecuritySessionParameters = this.ITransportContext.FixSecuritySessionParameters(sourceMessage.SecuritySessionParameters); this.IsSynchronous = (this.SecuritySessionParameters.Attributes & SecuritySessionAttributes.ForceSync) != 0 || ((bool) this.ITransportContext.IParameterProvider[GenuineParameter.SyncResponses] && (this.SecuritySessionParameters.Attributes & SecuritySessionAttributes.ForceAsync) == 0); if (this.ITransportHeaders != null) this.ITransportHeaders[TransportHeadersSenderEntryName] = this.Sender; this.MessageId = Interlocked.Increment(ref _currentMessageId); #if TRIAL if (this.MessageId > 3010) throw GenuineExceptions.Get_Channel_TrialConditionExceeded("The maximum number of messages restriction has been exceeded. You can not send more than 3000 messages using TRIAL version."); #endif }
/// <summary> /// Returns an instance of the SecuritySessionParameters class brought to conformity with channels' settings. /// </summary> /// <param name="securitySessionParameters">Source parameters.</param> /// <returns>Fixed parameters.</returns> public SecuritySessionParameters FixSecuritySessionParameters(SecuritySessionParameters securitySessionParameters) { SecuritySessionAttributes fixedAttributes = (SecuritySessionAttributes) ( ((int) securitySessionParameters.Attributes | (int) this.ForcedSecuritySessionAttributes) & ~( (int) this.ProhibitedSecuritySessionAttributes) ); return new SecuritySessionParameters(securitySessionParameters.Name, fixedAttributes, TimeSpan.MinValue, securitySessionParameters.GenuineConnectionType, securitySessionParameters.ConnectionName, TimeSpan.MinValue, securitySessionParameters.RemoteTransportUser); }
/// <summary> /// Puts down Security Session Parameters. /// </summary> /// <param name="parameters">The Security Session Parameters.</param> private void WriteSecuritySessionParameters(SecuritySessionParameters parameters) { this.BinaryWriter.Write( (bool) (parameters != null)); if (parameters != null) { this.WriteString( parameters.Name); this.BinaryWriter.Write( (int) parameters.GenuineConnectionType); this.WriteString( parameters.ConnectionName); this.BinaryWriter.Write( (long) parameters.Timeout.Ticks); this.BinaryWriter.Write( (int) parameters.Attributes ); this.BinaryWriter.Write( (long) parameters.CloseAfterInactivity.Ticks ); } }
/// <summary> /// Puts down a record representing an event connected with the specified Security Session Parameters. /// </summary> /// <param name="author">The author.</param> /// <param name="type">The type of the event(Subcategory).</param> /// <param name="exception">The exception associated with the event.</param> /// <param name="message">The message associated with the event.</param> /// <param name="remote">The remote host participating in the event.</param> /// <param name="sourceThreadId">The id of the thread where the invocation was made.</param> /// <param name="sourceThreadName">The name of the thread.</param> /// <param name="securitySessionParameters">The Security Session Parameters.</param> /// <param name="description">The description of the event.</param> /// <param name="parameters">Parameters to the description.</param> public void WriteSecuritySessionParametersEvent(string author, LogMessageType type, Exception exception, Message message, HostInformation remote, int sourceThreadId, string sourceThreadName, SecuritySessionParameters securitySessionParameters, string description, params object[] parameters) { if (message == null || securitySessionParameters == null) { this.WriteImplementationWarningEvent("BinaryLogWriter.WriteMessageCreatedEvent", LogMessageType.Error, null, sourceThreadId, sourceThreadName, "The message or SSP is not provided. Stack trace: " + Environment.StackTrace); return ; } lock (this._streamLock) { this.WriteRecordHeader(BinaryRecordVersion.SecuritySessionParameters, LogCategory.Security, type, author); this.WriteException( exception ); this.WriteMessageSeqNo(message); this.WriteHostInformationId(remote); this.BinaryWriter.Write( (int) sourceThreadId); this.WriteString( sourceThreadName ); this.WriteSecuritySessionParameters( securitySessionParameters ); this.WriteStringWithParameters( description, parameters); this.BinaryWriter.Flush(); } }
/// <summary> /// Initiates establishing Security Session with specific remote host via specified IConnectionManager. /// </summary> /// <param name="securitySessionParameters">Security Session parameters.</param> public void InitiateEstablishingSecuritySession(SecuritySessionParameters securitySessionParameters) { BinaryLogWriter binaryLogWriter = GenuineLoggingServices.BinaryLogWriter; if (binaryLogWriter != null && binaryLogWriter[LogCategory.Security] > 0 ) binaryLogWriter.WriteEvent(LogCategory.Security, "SecuritySession.InitiateEstablishingSecuritySession", LogMessageType.SecuritySessionInitiated, null, null, this.Remote, null, GenuineUtility.CurrentThreadId, Thread.CurrentThread.Name, this, this.Name, -1, 0, 0, 0, this.GetType().Name, this.Name, null, null, "Security Session establishing is initiated."); this.Failed.Reset(); this._establishingSecuritySessionParameters = securitySessionParameters; GenuineThreadPool.QueueUserWorkItem(new WaitCallback(this.Internal_InitiateEstablishingSecuritySession), securitySessionParameters, false); }
/// <summary> /// Specifies the security context used for all invocations made in the current thread. /// </summary> /// <param name="securitySessionParameters">Security Session parameters.</param> /// <returns>The name of the previous security context or null.</returns> public static SecuritySessionParameters SetCurrentSecurityContext(SecuritySessionParameters securitySessionParameters) { LocalDataStoreSlot localDataStoreSlot = Thread.GetNamedDataSlot(OccupiedThreadSlots.CurrentSecuritySessionParameters); object previousDataSlotValue = Thread.GetData(localDataStoreSlot); Thread.SetData(localDataStoreSlot, securitySessionParameters); return previousDataSlotValue as SecuritySessionParameters; }