Example #1
0
 public bool Connect()
 {
     try
     {
         if (!m_connection.Connect())
         {
             SetState(State.Terminated, m_connection.lasterror());
         }
         byte[] ln = m_connection.ReadLine();
         if (ln == null) 
         {
             SetState(State.Terminated, "server closed connection");
             return false;
         }
         if (Protocol.IsCommand("ERR", ln))
         {
             string msg = Protocol.CommandArg("ERR", ln);
             SetState(State.Terminated, "Failed to connect to server: " + msg);
             return false;
         }
         if (Protocol.IsCommand("BAD", ln))
         {
             string msg = Protocol.CommandArg("BAD", ln);
             SetState(State.Terminated, "Cannot connect to server: " + msg);
             return false;
         }
         if (Protocol.IsCommand("BYE", ln))
         {
             string msg = Protocol.CommandArg("BYE", ln);
             SetState(State.Terminated, "Server terminated connection: " + msg);
             return false;
         }
         string banner = Encoding.UTF8.GetString(ln);
         if (m_config.banner != null && m_config.banner != banner)
         {
             SetState(State.Terminated, "unknown service connected (banner does not match).");
             return false;
         }
         ln = m_connection.ReadLine();
         if (ln == null) 
         {
             SetState(State.Terminated, "server closed connection");
             return false;
         }
         else if (Protocol.IsCommand("OK", ln))
         {
             m_connection.WriteLine("AUTH");
             ln = m_connection.ReadLine();
             if (ln == null) 
             {
                 SetState(State.Terminated, "server closed connection");
                 return false;
             }
             else if (Protocol.IsCommand("MECHS", ln))
             {
                 if (m_config.authmethod != null)
                 {
                     m_connection.WriteLine("MECH " + m_config.authmethod);
                 }
                 else
                 {
                     m_connection.WriteLine("MECH NONE");
                 }
                 ln = m_connection.ReadLine();
                 if (ln == null) 
                 {
                     SetState(State.Terminated, "server closed connection");
                     return false;
                 }
                 else if (Protocol.IsCommand("OK", ln))
                 {
                     if (m_config.authmethod == null || Protocol.IsEqual(m_config.authmethod, "NONE"))
                     {
                         //... no authentication
                     }
                     else if (Protocol.IsEqual(m_config.authmethod, "WOLFRAME-CRAM"))
                     {
                         if (!AuthMechWolframeCram())
                         {
                             return false;
                         }
                     }
                     m_request_thread = new Thread(new ThreadStart(this.RunRequests));
                     m_answer_thread = new Thread(new ThreadStart(this.RunAnswers));
                     SetState(State.Running, null);
                     m_request_thread.Start();
                     m_answer_thread.Start();
                     return true;
                 }
                 else if (Protocol.IsCommand("ERR", ln))
                 {
                     SetState(State.Terminated, "authorization denied: " + Protocol.CommandArg( "ERR", ln));
                     return false;
                 }
                 else
                 {
                     SetState(State.Terminated, "authorization denied");
                     return false;
                 }
             }
             else if (Protocol.IsCommand("ERR", ln))
             {
                 m_lasterror = Protocol.CommandArg( "ERR", ln);
                 return false;
             }
             else
             {
                 SetState(State.Terminated, "authorization process refused");
                 return false;
             }
         }
         SetState(State.Terminated, "protocol error");
         return false;
     }
     catch (Exception soe)
     {
         SetState(State.Terminated, soe.Message);
         return false;
     }
 }