Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

users.cpp

Go to the documentation of this file.
00001 /*       +------------------------------------+
00002  *       | Inspire Internet Relay Chat Daemon |
00003  *       +------------------------------------+
00004  *
00005  *  Inspire is copyright (C) 2002-2004 ChatSpike-Dev.
00006  *                       E-mail:
00007  *                <brain@chatspike.net>
00008  *                <Craig@chatspike.net>
00009  *     
00010  * Written by Craig Edwards, Craig McLure, and others.
00011  * This program is free but copyrighted software; see
00012  *            the file COPYING for details.
00013  *
00014  * ---------------------------------------------------
00015  */
00016 
00017 using namespace std;
00018 
00019 #include "inspircd_config.h" 
00020 #include "channels.h"
00021 #include "users.h"
00022 #include "inspircd.h"
00023 #include <stdio.h>
00024 #include "inspstring.h"
00025 #include "helperfuncs.h"
00026 
00027 extern std::stringstream config_f;
00028 extern char ServerName[MAXBUF];
00029 
00030 extern time_t TIME;
00031 
00032 userrec::userrec()
00033 {
00034         // the PROPER way to do it, AVOID bzero at *ALL* costs
00035         strcpy(nick,"");
00036         strcpy(ip,"127.0.0.1");
00037         timeout = 0;
00038         strcpy(ident,"");
00039         strcpy(host,"");
00040         strcpy(dhost,"");
00041         strcpy(fullname,"");
00042         strcpy(modes,"");
00043         server = (char*)FindServerNamePtr(ServerName);
00044         strcpy(awaymsg,"");
00045         strcpy(oper,"");
00046         reset_due = TIME;
00047         lines_in = 0;
00048         fd = lastping = signon = idle_lastmsg = nping = registered = 0;
00049         flood = port = bytes_in = bytes_out = cmds_in = cmds_out = 0;
00050         haspassed = false;
00051         dns_done = false;
00052         recvq = "";
00053         sendq = "";
00054         for (int i = 0; i < MAXCHANS; i++)
00055         {
00056                 this->chans[i].channel = NULL;
00057                 this->chans[i].uc_modes = 0;
00058         }
00059         invites.clear();
00060 }
00061 
00062 void userrec::CloseSocket()
00063 {
00064         shutdown(this->fd,2);
00065         close(this->fd);
00066 }
00067  
00068 char* userrec::GetFullHost()
00069 {
00070         static char result[MAXBUF];
00071         snprintf(result,MAXBUF,"%s!%s@%s",nick,ident,dhost);
00072         return result;
00073 }
00074 
00075 int userrec::ReadData(void* buffer, size_t size)
00076 {
00077         if (this->fd > -1)
00078         {
00079                 return read(this->fd, buffer, size);
00080         }
00081         else return 0;
00082 }
00083 
00084 
00085 char* userrec::GetFullRealHost()
00086 {
00087         static char fresult[MAXBUF];
00088         snprintf(fresult,MAXBUF,"%s!%s@%s",nick,ident,host);
00089         return fresult;
00090 }
00091 
00092 bool userrec::IsInvited(char* channel)
00093 {
00094         for (InvitedList::iterator i = invites.begin(); i != invites.end(); i++)
00095         {
00096                 if (i->channel) {
00097                         if (!strcasecmp(i->channel,channel))
00098                         {
00099                                 return true;
00100                         }
00101                 }
00102         }
00103         return false;
00104 }
00105 
00106 InvitedList* userrec::GetInviteList()
00107 {
00108         return &invites;
00109 }
00110 
00111 void userrec::InviteTo(char* channel)
00112 {
00113         Invited i;
00114         strlcpy(i.channel,channel,CHANMAX);
00115         invites.push_back(i);
00116 }
00117 
00118 void userrec::RemoveInvite(char* channel)
00119 {
00120         log(DEBUG,"Removing invites");
00121         if (channel)
00122         {
00123                 if (invites.size())
00124                 {
00125                         for (InvitedList::iterator i = invites.begin(); i != invites.end(); i++)
00126                         {
00127                                 if (i->channel)
00128                                 {
00129                                         if (!strcasecmp(i->channel,channel))
00130                                         {
00131                                                 invites.erase(i);
00132                                                 return;
00133                                         }
00134                                 }
00135                         }
00136                 }
00137         }
00138 }
00139 
00140 bool userrec::HasPermission(char* command)
00141 {
00142         char TypeName[MAXBUF],Classes[MAXBUF],ClassName[MAXBUF],CommandList[MAXBUF];
00143         char* mycmd;
00144         char* savept;
00145         char* savept2;
00146         
00147         // are they even an oper at all?
00148         if (strchr(this->modes,'o'))
00149         {
00150                 log(DEBUG,"*** HasPermission: %s is an oper",this->nick);
00151                 for (int j =0; j < ConfValueEnum("type",&config_f); j++)
00152                 {
00153                         ConfValue("type","name",j,TypeName,&config_f);
00154                         if (!strcmp(TypeName,this->oper))
00155                         {
00156                                 log(DEBUG,"*** HasPermission: %s is an oper of type '%s'",this->nick,this->oper);
00157                                 ConfValue("type","classes",j,Classes,&config_f);
00158                                 char* myclass = strtok_r(Classes," ",&savept);
00159                                 while (myclass)
00160                                 {
00161                                         log(DEBUG,"*** HasPermission: checking classtype '%s'",myclass);
00162                                         for (int k =0; k < ConfValueEnum("class",&config_f); k++)
00163                                         {
00164                                                 ConfValue("class","name",k,ClassName,&config_f);
00165                                                 if (!strcmp(ClassName,myclass))
00166                                                 {
00167                                                         ConfValue("class","commands",k,CommandList,&config_f);
00168                                                         log(DEBUG,"*** HasPermission: found class named %s with commands: '%s'",ClassName,CommandList);
00169                                                         
00170                                                         
00171                                                         mycmd = strtok_r(CommandList," ",&savept2);
00172                                                         while (mycmd)
00173                                                         {
00174                                                                 if (!strcasecmp(mycmd,command))
00175                                                                 {
00176                                                                         log(DEBUG,"*** Command %s found, returning true",command);
00177                                                                         return true;
00178                                                                 }
00179                                                                 mycmd = strtok_r(NULL," ",&savept2);
00180                                                         }
00181                                                 }
00182                                         }
00183                                         myclass = strtok_r(NULL," ",&savept);
00184                                 }
00185                         }
00186                 }
00187         }
00188         return false;
00189 }
00190 
00191 
00192 bool userrec::AddBuffer(std::string a)
00193 {
00194         std::string b = "";
00195         for (int i = 0; i < a.length(); i++)
00196                 if ((a[i] != '\r') && (a[i] != '\0') && (a[i] != 7))
00197                         b = b + a[i];
00198         std::stringstream stream(recvq);
00199         stream << b;
00200         recvq = stream.str();
00201         int i = 0;
00202         // count the size of the first line in the buffer.
00203         while (i < recvq.length())
00204         {
00205                 if (recvq[i++] == '\n')
00206                         break;
00207         }
00208         if (recvq.length() > this->recvqmax)
00209         {
00210                 this->SetWriteError("RecvQ exceeded");
00211                 WriteOpers("*** User %s RecvQ of %d exceeds connect class maximum of %d",this->nick,recvq.length(),this->recvqmax);
00212         }
00213         // return false if we've had more than 600 characters WITHOUT
00214         // a carriage return (this is BAD, drop the socket)
00215         return (i < 600);
00216 }
00217 
00218 bool userrec::BufferIsReady()
00219 {
00220         for (int i = 0; i < recvq.length(); i++)
00221                 if (recvq[i] == '\n')
00222                         return true;
00223         return false;
00224 }
00225 
00226 void userrec::ClearBuffer()
00227 {
00228         recvq = "";
00229 }
00230 
00231 std::string userrec::GetBuffer()
00232 {
00233         if (recvq == "")
00234                 return "";
00235         char* line = (char*)recvq.c_str();
00236         std::string ret = "";
00237         while ((*line != '\n') && (strlen(line)))
00238         {
00239                 ret = ret + *line;
00240                 line++;
00241         }
00242         if ((*line == '\n') || (*line == '\r'))
00243                 line++;
00244         recvq = line;
00245         return ret;
00246 }
00247 
00248 void userrec::AddWriteBuf(std::string data)
00249 {
00250         if (this->GetWriteError() != "")
00251                 return;
00252         if (sendq.length() + data.length() > this->sendqmax)
00253         {
00254                 WriteOpers("*** User %s SendQ of %d exceeds connect class maximum of %d",this->nick,sendq.length() + data.length(),this->sendqmax);
00255                 this->SetWriteError("SendQ exceeded");
00256                 return;
00257         }
00258         std::stringstream stream;
00259         stream << sendq << data;
00260         sendq = stream.str();
00261 }
00262 
00263 // send AS MUCH OF THE USERS SENDQ as we are able to (might not be all of it)
00264 void userrec::FlushWriteBuf()
00265 {
00266         if (sendq.length())
00267         {
00268                 char* tb = (char*)this->sendq.c_str();
00269                 int n_sent = write(this->fd,tb,this->sendq.length());
00270                 if (n_sent == -1)
00271                 {
00272                         this->SetWriteError(strerror(errno));
00273                 }
00274                 else
00275                 {
00276                         // advance the queue
00277                         tb += n_sent;
00278                         this->sendq = tb;
00279                         // update the user's stats counters
00280                         this->bytes_out += n_sent;
00281                         this->cmds_out++;
00282                 }
00283         }
00284 }
00285 
00286 void userrec::SetWriteError(std::string error)
00287 {
00288         log(DEBUG,"Setting error string for %s to '%s'",this->nick,error.c_str());
00289         // don't try to set the error twice, its already set take the first string.
00290         if (this->WriteError == "")
00291                 this->WriteError = error;
00292 }
00293 
00294 std::string userrec::GetWriteError()
00295 {
00296         return this->WriteError;
00297 }

Generated on Mon May 30 05:15:21 2005 for InspIRCd by doxygen 1.3.3