#include "inspircd_config.h"
#include "channels.h"
+#include "connection.h"
#include "users.h"
#include "inspircd.h"
#include <stdio.h>
+#ifdef THREADED_DNS
+#include <pthread.h>
+#include <signal.h>
+#endif
#include "inspstring.h"
+#include "commands.h"
#include "helperfuncs.h"
extern std::stringstream config_f;
+extern char ServerName[MAXBUF];
extern time_t TIME;
strcpy(dhost,"");
strcpy(fullname,"");
strcpy(modes,"");
- strcpy(server,"");
+ server = (char*)FindServerNamePtr(ServerName);
strcpy(awaymsg,"");
strcpy(oper,"");
reset_due = TIME;
dns_done = false;
recvq = "";
sendq = "";
- strcpy(result,"");
for (int i = 0; i < MAXCHANS; i++)
{
this->chans[i].channel = NULL;
invites.clear();
}
+userrec::~userrec()
+{
+}
+
void userrec::CloseSocket()
{
shutdown(this->fd,2);
{
if (this->fd > -1)
{
+ log(DEBUG,"userrec::ReadData on fd %d",this->fd);
return read(this->fd, buffer, size);
}
else return 0;
char* savept;
char* savept2;
+ // users on u-lined servers can completely bypass
+ // all permissions based checks.
+ //
+ // of course, if this is sent to a remote server and this
+ // server is not ulined there, then that other server
+ // silently drops the command.
+ if (is_uline(this->server))
+ return true;
+
// are they even an oper at all?
if (strchr(this->modes,'o'))
{
- log(DEBUG,"*** HasPermission: %s is an oper",this->nick);
for (int j =0; j < ConfValueEnum("type",&config_f); j++)
{
ConfValue("type","name",j,TypeName,&config_f);
if (!strcmp(TypeName,this->oper))
{
- log(DEBUG,"*** HasPermission: %s is an oper of type '%s'",this->nick,this->oper);
ConfValue("type","classes",j,Classes,&config_f);
char* myclass = strtok_r(Classes," ",&savept);
while (myclass)
{
- log(DEBUG,"*** HasPermission: checking classtype '%s'",myclass);
for (int k =0; k < ConfValueEnum("class",&config_f); k++)
{
ConfValue("class","name",k,ClassName,&config_f);
if (!strcmp(ClassName,myclass))
{
ConfValue("class","commands",k,CommandList,&config_f);
- log(DEBUG,"*** HasPermission: found class named %s with commands: '%s'",ClassName,CommandList);
-
-
mycmd = strtok_r(CommandList," ",&savept2);
while (mycmd)
{
- if (!strcasecmp(mycmd,command))
+ if ((!strcasecmp(mycmd,command)) || (*mycmd == '*'))
{
- log(DEBUG,"*** Command %s found, returning true",command);
return true;
}
mycmd = strtok_r(NULL," ",&savept2);
bool userrec::AddBuffer(std::string a)
{
std::string b = "";
- for (int i = 0; i < a.length(); i++)
+ for (unsigned int i = 0; i < a.length(); i++)
if ((a[i] != '\r') && (a[i] != '\0') && (a[i] != 7))
b = b + a[i];
std::stringstream stream(recvq);
stream << b;
recvq = stream.str();
- int i = 0;
+ unsigned int i = 0;
// count the size of the first line in the buffer.
while (i < recvq.length())
{
if (recvq[i++] == '\n')
break;
}
- if (recvq.length() > this->recvqmax)
+ if (recvq.length() > (unsigned)this->recvqmax)
{
this->SetWriteError("RecvQ exceeded");
WriteOpers("*** User %s RecvQ of %d exceeds connect class maximum of %d",this->nick,recvq.length(),this->recvqmax);
bool userrec::BufferIsReady()
{
- for (int i = 0; i < recvq.length(); i++)
+ for (unsigned int i = 0; i < recvq.length(); i++)
if (recvq[i] == '\n')
return true;
return false;
{
if (this->GetWriteError() != "")
return;
- if (sendq.length() + data.length() > this->sendqmax)
+ if (sendq.length() + data.length() > (unsigned)this->sendqmax)
{
WriteOpers("*** User %s SendQ of %d exceeds connect class maximum of %d",this->nick,sendq.length() + data.length(),this->sendqmax);
this->SetWriteError("SendQ exceeded");