SocketMode ISocketCallback.Connected(Stream stream, TextWriter log) { try { var socketMode = SocketManager.DefaultSocketMode; // disallow connection in some cases OnDebugAbort(); // the order is important here: // [network]<==[ssl]<==[logging]<==[buffered] var config = Multiplexer.RawConfig; if (config.Ssl) { Multiplexer.LogLocked(log, "Configuring SSL"); var host = config.SslHost; if (string.IsNullOrWhiteSpace(host)) { host = Format.ToStringHostOnly(Bridge.ServerEndPoint.EndPoint); } var ssl = new SslStream(stream, false, config.CertificateValidationCallback, config.CertificateSelectionCallback ?? GetAmbientCertificateCallback() #if !__MonoCS__ , EncryptionPolicy.RequireEncryption #endif ); try { ssl.AuthenticateAsClient(host, config.SslProtocols); Multiplexer.LogLocked(log, $"SSL connection established successfully using protocol: {ssl.SslProtocol}"); } catch (AuthenticationException authexception) { RecordConnectionFailed(ConnectionFailureType.AuthenticationFailure, authexception); Multiplexer.Trace("Encryption failure"); return(SocketMode.Abort); } stream = ssl; socketMode = SocketMode.Async; } OnWrapForLogging(ref stream, physicalName); int bufferSize = config.WriteBuffer; this.netStream = stream; this.outStream = bufferSize <= 0 ? stream : new BufferedStream(stream, bufferSize); Multiplexer.LogLocked(log, "Connected {0}", Bridge); Bridge.OnConnected(this, log); return(socketMode); } catch (Exception ex) { RecordConnectionFailed(ConnectionFailureType.InternalFailure, ex); // includes a bridge.OnDisconnected Multiplexer.Trace("Could not connect: " + ex.Message, physicalName); return(SocketMode.Abort); } }
SocketMode ISocketCallback.Connected(Stream stream) { try { var socketMode = SocketManager.DefaultSocketMode; // disallow connection in some cases OnDebugAbort(); // the order is important here: // [network]<==[ssl]<==[logging]<==[buffered] var config = multiplexer.RawConfig; if (config.Ssl) { var host = config.SslHost; if (string.IsNullOrWhiteSpace(host)) { host = Format.ToStringHostOnly(bridge.ServerEndPoint.EndPoint); } var ssl = new SslStream(stream, false, config.CertificateValidationCallback, config.CertificateSelectionCallback #if !MONO , EncryptionPolicy.RequireEncryption #endif ); ssl.AuthenticateAsClient(host); if (!ssl.IsEncrypted) { RecordConnectionFailed(ConnectionFailureType.AuthenticationFailure); multiplexer.Trace("Encryption failure"); return(SocketMode.Abort); } stream = ssl; socketMode = SocketMode.Async; } OnWrapForLogging(ref stream, physicalName); int bufferSize = config.WriteBuffer; this.netStream = stream; this.outStream = bufferSize <= 0 ? stream : new BufferedStream(stream, bufferSize); multiplexer.Trace("Connected", physicalName); bridge.OnConnected(this); return(socketMode); } catch (Exception ex) { RecordConnectionFailed(ConnectionFailureType.InternalFailure, ex); // includes a bridge.OnDisconnected multiplexer.Trace("Could not connect: " + ex.Message, physicalName); return(SocketMode.Abort); } }