예제 #1
0
        /// <summary>
        /// Retrieves a <see cref="String"/> value
        /// describing the given <see cref="SslStream"/>
        /// value.
        /// </summary>
        /// <param name="stream">
        /// For which to retrieve the <c>String</c> value.
        /// </param>
        /// <returns>
        /// The corresponding value.
        /// </returns>
        internal static string SslStreamPropertiesToString(SslStream stream)
        {
            using (StringWriter writer = new StringWriter())
            {
                writer.WriteLine("------------------------- SSL Stream -----------------------");
                writer.WriteLine("Check Cert Revocation Status : {0}", stream.CheckCertRevocationStatus);
                writer.WriteLine("Cipher Algorithm             : {0}", stream.CipherAlgorithm);
                writer.WriteLine("Cipher Strength              : {0}", stream.CipherStrength);
                writer.WriteLine("Hash Algorithm               : {0}", stream.HashAlgorithm);
                writer.WriteLine("Hash Strength                : {0}", stream.HashStrength);
                writer.WriteLine("Is Authenticated             : {0}", stream.IsAuthenticated);
                writer.WriteLine("Is Encrypted                 : {0}", stream.IsEncrypted);
                writer.WriteLine("Is MutuallyAuthenticated     : {0}", stream.IsMutuallyAuthenticated);
                writer.WriteLine("Key Exchange Algorithm       : {0}", stream.KeyExchangeAlgorithm);
                writer.WriteLine("Key Exchange Strength        : {0}", stream.KeyExchangeStrength);
                writer.WriteLine("Local Certificate            :");
                writer.WriteLine(HsqlDiagnostics.CertificateToString(stream.LocalCertificate));
                writer.WriteLine("Read Timeout                 : {0}", stream.ReadTimeout);
                writer.WriteLine("Remote Certificate           :");
                writer.WriteLine(HsqlDiagnostics.CertificateToString(stream.RemoteCertificate));
                writer.WriteLine("Ssl Protocol                 : {0}", stream.SslProtocol);
                writer.WriteLine("Write Timeout                : {0}", stream.WriteTimeout);
                writer.WriteLine();
                writer.Flush();

                return(writer.ToString());
            }
        }
예제 #2
0
        /// <summary>
        /// Implements the local certificate selection callback.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="targetHost">The target host.</param>
        /// <param name="localCertificates">The local certificates.</param>
        /// <param name="remoteCertificate">The remote certificate.</param>
        /// <param name="acceptableIssuers">The acceptable issuers.</param>
        /// <returns></returns>
        protected virtual X509Certificate SelectLocalCertificate(
            object sender,
            string targetHost,
            X509CertificateCollection localCertificates,
            X509Certificate remoteCertificate,
            string[] acceptableIssuers)
        {
            HsqlDiagnostics.Debug("Selection started....");

            if (localCertificates == null)
            {
                HsqlDiagnostics.Debug("localCertificates == null");
            }
            else
            {
                if (acceptableIssuers == null)
                {
                    HsqlDiagnostics.Debug("acceptableIssuers == null");
                }
                else
                {
                    // Use the first certificate that is from an acceptable issuer.
                    HsqlDiagnostics.Debug(
                        "Searching {0} local certificates for acceptable issuer...",
                        localCertificates.Count);

                    for (int i = 0; i < localCertificates.Count; i++)
                    {
                        X509Certificate certificate = localCertificates[i];

                        string issuer = certificate.Issuer;

                        if (Array.IndexOf(acceptableIssuers, issuer) != -1)
                        {
                            HsqlDiagnostics.Debug("Acceptable issuer found.");
                            HsqlDiagnostics.Debug("Returning localCertificates[{0}]:", i);
                            HsqlDiagnostics.DebugCert(certificate);

                            return(certificate);
                        }
                    }

                    HsqlDiagnostics.Debug(
                        "Did not find a local certificate with an acceptable issuer.");
                }

                if (localCertificates.Count > 0)
                {
                    HsqlDiagnostics.Debug("returning localCertificates[0]:");
                    HsqlDiagnostics.DebugCert(localCertificates[0]);

                    return(localCertificates[0]);
                }
            }

            HsqlDiagnostics.Debug("returning null.");

            return(null);
        }
예제 #3
0
        /// <summary>
        /// Initializes the connection.
        /// </summary>
        /// <param name="host">The host.</param>
        /// <param name="port">The port.</param>
        /// <param name="tls">
        /// if set to <c>true</c>, use transport layer security.
        /// </param>
        /// <exception cref="HsqlException"></exception>
        protected virtual void InitializeConnection(
            string host,
            int port,
            bool tls)
        {
            HsqlDiagnostics.Debug("...");

            OpenConnection(host, port, tls);
        }
예제 #4
0
        /// <summary>
        /// Performs common instance-scope initialization.
        /// </summary>
        protected void InitializeInstance()
        {
            HsqlDiagnostics.Debug("...");

            m_rowOutput  = new RowOutputBinary(m_buffer);
            m_rowInput   = new RowInputBinary(m_rowOutput);
            m_request    = m_Protocol.CreateAttributeRequest();
            m_autoCommit = true;
        }
예제 #5
0
        /// <summary>
        /// Opens the connection.
        /// </summary>
        /// <param name="host">The host.</param>
        /// <param name="port">The port.</param>
        /// <param name="tls">
        /// if set to <c>true</c>, use transport layer security.
        /// </param>
        /// <exception cref="HsqlException">
        /// </exception>
        protected virtual void OpenConnection(
            string host,
            int port,
            bool tls)
        {
            if (m_tcpClient != null)
            {
                throw new System.InvalidOperationException(
                          "The connection is already open.");
            }

            HsqlDiagnostics.Debug("...");

            try
            {
                HsqlDiagnostics.Debug("Entered with arguments ({0},{1},{2})",
                                      host, port, tls);

                m_tcpClient = new TcpClient(host, port);

                HsqlDiagnostics.Debug("Created TcpClient({0},{1})", host, port);

                Stream stream = m_tcpClient.GetStream();

                HsqlDiagnostics.Debug("Got client stream from TcpClient");

                if (m_tls)
                {
                    HsqlDiagnostics.Debug("Initializing Client TLS...");

                    SslStream sslStream = new SslStream(
                        stream,
                        false,
                        ValidateRemoteCertificate,
                        null);

                    HsqlDiagnostics.Debug("Invoking sslStream.AuthenticateAsClient({0})",
                                          host);

                    sslStream.AuthenticateAsClient(host);

                    stream = sslStream;
                }

                JavaInputStreamAdapter  input  = new JavaInputStreamAdapter(stream);
                JavaOutputStreamAdapter output = new JavaOutputStreamAdapter(stream);

                m_dataInput  = new DataInputStream(new BufferedInputStream(input));
                m_dataOutput = new BufferedOutputStream(output);
            }
            catch (System.Exception e)
            {
                throw Trace.error(Trace.SOCKET_ERROR, e);
            }
        }
예제 #6
0
        /// <summary>
        /// Implements the remote certificate validation callback.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="certificate">The certificate.</param>
        /// <param name="chain">The chain.</param>
        /// <param name="sslPolicyErrors">The SSL policy errors.</param>
        /// <returns>
        /// <c>true</c> if validation succeeds;
        /// <c>false</c> otherwise.
        /// </returns>
        protected virtual bool ValidateRemoteCertificate(
            object sender,
            X509Certificate certificate,
            X509Chain chain,
            SslPolicyErrors sslPolicyErrors)
        {
            HsqlDiagnostics.Debug("...");

            if (sslPolicyErrors == SslPolicyErrors.None)
            {
                // its all good.
                return(true);
            }
            else
            {
                HsqlDiagnostics.Debug("Certificate error: {0}",
                                      sslPolicyErrors);

                return(false);
            }
        }
예제 #7
0
        /// <summary>
        /// Closes the connection.
        /// </summary>
        protected virtual void CloseConnection()
        {
            HsqlDiagnostics.Debug("...");

            TcpClient tcpClient = m_tcpClient;

            if (tcpClient != null)
            {
                try
                {
                    tcpClient.Client.Close();
                }
                catch { }

                try
                {
                    tcpClient.Close();
                }
                catch { }

                m_tcpClient = null;
            }
        }
예제 #8
0
        /// <summary>
        /// Writes the specified request.
        /// </summary>
        /// <param name="request">The request.</param>
        /// <exception cref="java.io.IOException"></exception>
        /// <exception cref="org.hsqldb.HsqlException"></exception>
        //[CLSCompliant(false)]
        protected void WriteRequest(Request request)
        {
            HsqlDiagnostics.DebugRequest(request);

            Request.write(request, m_rowOutput, m_dataOutput);
        }