Skip to content
client.cc 2.64 KiB
Newer Older
/*
  This file is part of SLS.
  Copyright (C) 2008 Sebastien LUTTRINGER <contact@seblu.net>

  SLS is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; version 2 of the License.

  SLS is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with SLS; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

#include "sls.hh"
#include "client.hh"
#include "client_console.hh"
#include "client_daemon.hh"

static inline Client *login_fail(Connection &c);

/*******************************************************************************
** Method of Classes
*******************************************************************************/
Client *Client::login(Connection &c) {
  string slogin = c.recvln();
  string spass = c.recvln();

  // FIXME: find better method than fucking magic number
  char loginbuf[512];
  char passbuf[512];

  // cut read data
  if (sscanf(slogin.c_str(), "%512s %512s\n", clientbuf, loginbuf) != 2)
    return login_fail(c);
  if (sscanf(spass.c_str(), "PASS %512s\n", passbuf) != 1)
    return login_fail(c);

  // create client
  Client *real_client;
  if (strcmp(clientbuf, "HOST") == 0)
    real_client = new Daemon(c);
  else if (strcmp(clientbuf, "USER") == 0)
    real_client = new Console(c);
  else
    return login_fail(c);
  // check login and password and register it in DB if success
  if (real_client->trust(loginbuf, passbuf) == false) {
    delete real_client;
    return login_fail(c);
Seblu's avatar
Seblu committed
  std::cout << "CId " << c.getid() << ": " << real_client->type() << " " << loginbuf
	    << " logged from " << c.getremoteip()
	    << " on port " << c.getremoteport() << ".\n";
}

/*******************************************************************************
*******************************************************************************/

Client::Client(Connection &c) : c_ (c) {}

Client::~Client() {}

/*******************************************************************************
** Local functions
*******************************************************************************/
static Client *login_fail(Connection &c) {
  std::cout << "CId " << c.getid() << ": Bad authentification.\n";
Seblu's avatar
Seblu committed
  c.sendln("KO");