gnuworld/mod.ccontrol/ADDUSERCommand.cc

208 lines
5.1 KiB
C++

/**
* ADDUSERCommand.cc
* Adds a new oper to the bot database
* when adding a new oper one must specify access flags
* the oper initial commands is defined by these flags
* the defualt flags can be found in CControlCommands.h file
*
* This program 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; either version 2
* of the License, or (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
* USA.
*
* $Id: ADDUSERCommand.cc,v 1.21 2006/09/26 17:35:58 kewlio Exp $
*/
#include <string>
#include "ccontrol.h"
#include "CControlCommands.h"
#include "StringTokenizer.h"
#include "ccUser.h"
#include "misc.h"
#include "commLevels.h"
#include "Constants.h"
#include "gnuworld_config.h"
RCSTAG( "$Id: ADDUSERCommand.cc,v 1.21 2006/09/26 17:35:58 kewlio Exp $" ) ;
namespace gnuworld
{
using std::string ;
namespace uworld
{
bool ADDUSERCommand::Exec( iClient* theClient, const string& Message)
{
StringTokenizer st( Message ) ;
if( st.size() < 4 )
{
Usage(theClient);
return true;
}
if(st[1].size() > User::MaxName)
{
bot->Notice(theClient,"Oper name can't be more than %d "
"characters in length.",
User::MaxName);
return false;
}
// Try fetching the user data from the database, note this is
// the new user handle
ccUser* theUser = bot->GetOper(st[1]);
if (theUser)
{
bot->Notice(theClient,"Oper '%s' already exsits in my database, "
"please change the oper handle and try again.",
theUser->getUserName().c_str());
return false;
}
unsigned long int NewAccess = 0 ;
unsigned long int NewSAccess = 0 ;
unsigned int NewFlags = 0 ;
if(!strcasecmp(st[2],"coder"))
{
NewAccess = commandLevel::CODER;
NewSAccess = commandLevel::SCODER;
NewFlags = operLevel::CODERLEVEL;
}
else if(!strcasecmp(st[2],"smt"))
{
NewAccess = commandLevel::SMT;
NewSAccess = commandLevel::SSMT;
NewFlags = operLevel::SMTLEVEL;
}
else if(!strcasecmp(st[2],"admin"))
{
if(st.size() < 5)
{
bot->Notice(theClient,"When adding a new admin, you "
"must specify a server.");
return false;
}
NewAccess = commandLevel::ADMIN;
NewSAccess = commandLevel::SADMIN;
NewFlags = operLevel::ADMINLEVEL;
}
else if(!strcasecmp(st[2],"oper"))
{
NewAccess = commandLevel::OPER;
NewSAccess = commandLevel::SOPER;
NewFlags = operLevel::OPERLEVEL;
} else if (!strcasecmp(st[2], "uhs")) {
NewAccess = commandLevel::UHS;
NewSAccess = commandLevel::SUHS;
NewFlags = operLevel::UHSLEVEL;
}
else
{
bot->Notice(theClient,
"Illegal oper type; types are: oper, admin, smt and coder");
return false;
}
ccUser *tOper = bot->IsAuth( theClient );
if( NULL == tOper )
{
bot->Notice( theClient,
"You must be authenticated to use this command." ) ;
return true ;
}
bot->MsgChanLog("ADDUSER %s %s\n",st[1].c_str(),st[2].c_str());
//Make sure the new oper wont have a command the old one doesnt have enabled
NewAccess &= tOper->getAccess();
//NewAccess = bot->getTrueAccess(NewAccess);
//Check if the user doesnt try to add an oper with higher flag than he is
unsigned int OperFlags = tOper->getType();
if(OperFlags < operLevel::ADMINLEVEL)
{
bot->Notice(theClient,
"Sorry, but only admins+ can add new opers");
return false;
}
if((OperFlags < operLevel::SMTLEVEL) && (OperFlags <= NewFlags))
{
bot->Notice(theClient,
"Sorry, but you can't add an oper with a higher or "
"equal access to your own");
return false;
}
else if(OperFlags < NewFlags)
{
bot->Notice(theClient,
"Sorry, but you can't add an oper with a higher "
"access than your own");
return false;
}
//Create the new user and update the database
theUser = new ccUser(bot->SQLDb);
theUser->setUserName(st[1]);
if(st.size() < 5)
{
theUser->setPassword(bot->CryptPass(st[3]));
theUser->setServer(tOper->getServer());
}
else
{
if(OperFlags < operLevel::SMTLEVEL)
{
bot->Notice(theClient,"Sorry, only SMT+ can specify "
"a server name");
return false;
}
string Server( bot->expandDbServer(st[3]) ) ;
if( Server.empty() )
{
bot->Notice(theClient,"I can't find a server that "
"matches '%s' in the database",
st[3].c_str());
return false;
}
theUser->setPassword(bot->CryptPass(st[4]));
theUser->setServer(Server);
}
theUser->setAccess(NewAccess);
theUser->setSAccess(NewSAccess);
theUser->setType(NewFlags);
theUser->setLast_Updated_By(theClient->getRealNickUserHost());
theUser->setNeedOp(true);
theUser->setNotice(true); //default to notice
if(bot->AddOper(theUser) == true)
{
bot->Notice(theClient, "Oper successfully added.");
theUser->loadData(theUser->getUserName());
bot->AddHost(theUser,"*!*@*");
}
else
bot->Notice(theClient, "Error while adding the new oper.");
return true;
}
}
}