00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
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
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
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
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
00214
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
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
00277 tb += n_sent;
00278 this->sendq = tb;
00279
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
00290 if (this->WriteError == "")
00291 this->WriteError = error;
00292 }
00293
00294 std::string userrec::GetWriteError()
00295 {
00296 return this->WriteError;
00297 }