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 "connection.h"
00022 #include "users.h"
00023 #include "inspircd.h"
00024 #include <stdio.h>
00025 #ifdef THREADED_DNS
00026 #include <pthread.h>
00027 #include <signal.h>
00028 #endif
00029 #include "inspstring.h"
00030 #include "commands.h"
00031 #include "helperfuncs.h"
00032
00033 extern std::stringstream config_f;
00034 extern char ServerName[MAXBUF];
00035
00036 extern time_t TIME;
00037
00038 userrec::userrec()
00039 {
00040
00041 strcpy(nick,"");
00042 strcpy(ip,"127.0.0.1");
00043 timeout = 0;
00044 strcpy(ident,"");
00045 strcpy(host,"");
00046 strcpy(dhost,"");
00047 strcpy(fullname,"");
00048 strcpy(modes,"");
00049 server = (char*)FindServerNamePtr(ServerName);
00050 strcpy(awaymsg,"");
00051 strcpy(oper,"");
00052 reset_due = TIME;
00053 lines_in = 0;
00054 fd = lastping = signon = idle_lastmsg = nping = registered = 0;
00055 flood = port = bytes_in = bytes_out = cmds_in = cmds_out = 0;
00056 haspassed = false;
00057 dns_done = false;
00058 recvq = "";
00059 sendq = "";
00060 for (int i = 0; i < MAXCHANS; i++)
00061 {
00062 this->chans[i].channel = NULL;
00063 this->chans[i].uc_modes = 0;
00064 }
00065 invites.clear();
00066 }
00067
00068 userrec::~userrec()
00069 {
00070 }
00071
00072 void userrec::CloseSocket()
00073 {
00074 shutdown(this->fd,2);
00075 close(this->fd);
00076 }
00077
00078 char* userrec::GetFullHost()
00079 {
00080 static char result[MAXBUF];
00081 snprintf(result,MAXBUF,"%s!%s@%s",nick,ident,dhost);
00082 return result;
00083 }
00084
00085 int userrec::ReadData(void* buffer, size_t size)
00086 {
00087 if (this->fd > -1)
00088 {
00089 log(DEBUG,"userrec::ReadData on fd %d",this->fd);
00090 return read(this->fd, buffer, size);
00091 }
00092 else return 0;
00093 }
00094
00095
00096 char* userrec::GetFullRealHost()
00097 {
00098 static char fresult[MAXBUF];
00099 snprintf(fresult,MAXBUF,"%s!%s@%s",nick,ident,host);
00100 return fresult;
00101 }
00102
00103 bool userrec::IsInvited(char* channel)
00104 {
00105 for (InvitedList::iterator i = invites.begin(); i != invites.end(); i++)
00106 {
00107 if (i->channel) {
00108 if (!strcasecmp(i->channel,channel))
00109 {
00110 return true;
00111 }
00112 }
00113 }
00114 return false;
00115 }
00116
00117 InvitedList* userrec::GetInviteList()
00118 {
00119 return &invites;
00120 }
00121
00122 void userrec::InviteTo(char* channel)
00123 {
00124 Invited i;
00125 strlcpy(i.channel,channel,CHANMAX);
00126 invites.push_back(i);
00127 }
00128
00129 void userrec::RemoveInvite(char* channel)
00130 {
00131 log(DEBUG,"Removing invites");
00132 if (channel)
00133 {
00134 if (invites.size())
00135 {
00136 for (InvitedList::iterator i = invites.begin(); i != invites.end(); i++)
00137 {
00138 if (i->channel)
00139 {
00140 if (!strcasecmp(i->channel,channel))
00141 {
00142 invites.erase(i);
00143 return;
00144 }
00145 }
00146 }
00147 }
00148 }
00149 }
00150
00151 bool userrec::HasPermission(char* command)
00152 {
00153 char TypeName[MAXBUF],Classes[MAXBUF],ClassName[MAXBUF],CommandList[MAXBUF];
00154 char* mycmd;
00155 char* savept;
00156 char* savept2;
00157
00158
00159
00160
00161
00162
00163
00164 if (is_uline(this->server))
00165 return true;
00166
00167
00168 if (strchr(this->modes,'o'))
00169 {
00170 for (int j =0; j < ConfValueEnum("type",&config_f); j++)
00171 {
00172 ConfValue("type","name",j,TypeName,&config_f);
00173 if (!strcmp(TypeName,this->oper))
00174 {
00175 ConfValue("type","classes",j,Classes,&config_f);
00176 char* myclass = strtok_r(Classes," ",&savept);
00177 while (myclass)
00178 {
00179 for (int k =0; k < ConfValueEnum("class",&config_f); k++)
00180 {
00181 ConfValue("class","name",k,ClassName,&config_f);
00182 if (!strcmp(ClassName,myclass))
00183 {
00184 ConfValue("class","commands",k,CommandList,&config_f);
00185 mycmd = strtok_r(CommandList," ",&savept2);
00186 while (mycmd)
00187 {
00188 if ((!strcasecmp(mycmd,command)) || (*mycmd == '*'))
00189 {
00190 return true;
00191 }
00192 mycmd = strtok_r(NULL," ",&savept2);
00193 }
00194 }
00195 }
00196 myclass = strtok_r(NULL," ",&savept);
00197 }
00198 }
00199 }
00200 }
00201 return false;
00202 }
00203
00204
00205 bool userrec::AddBuffer(std::string a)
00206 {
00207 std::string b = "";
00208 for (unsigned int i = 0; i < a.length(); i++)
00209 if ((a[i] != '\r') && (a[i] != '\0') && (a[i] != 7))
00210 b = b + a[i];
00211 std::stringstream stream(recvq);
00212 stream << b;
00213 recvq = stream.str();
00214 unsigned int i = 0;
00215
00216 while (i < recvq.length())
00217 {
00218 if (recvq[i++] == '\n')
00219 break;
00220 }
00221 if (recvq.length() > (unsigned)this->recvqmax)
00222 {
00223 this->SetWriteError("RecvQ exceeded");
00224 WriteOpers("*** User %s RecvQ of %d exceeds connect class maximum of %d",this->nick,recvq.length(),this->recvqmax);
00225 }
00226
00227
00228 return (i < 600);
00229 }
00230
00231 bool userrec::BufferIsReady()
00232 {
00233 for (unsigned int i = 0; i < recvq.length(); i++)
00234 if (recvq[i] == '\n')
00235 return true;
00236 return false;
00237 }
00238
00239 void userrec::ClearBuffer()
00240 {
00241 recvq = "";
00242 }
00243
00244 std::string userrec::GetBuffer()
00245 {
00246 if (recvq == "")
00247 return "";
00248 char* line = (char*)recvq.c_str();
00249 std::string ret = "";
00250 while ((*line != '\n') && (strlen(line)))
00251 {
00252 ret = ret + *line;
00253 line++;
00254 }
00255 if ((*line == '\n') || (*line == '\r'))
00256 line++;
00257 recvq = line;
00258 return ret;
00259 }
00260
00261 void userrec::AddWriteBuf(std::string data)
00262 {
00263 if (this->GetWriteError() != "")
00264 return;
00265 if (sendq.length() + data.length() > (unsigned)this->sendqmax)
00266 {
00267 WriteOpers("*** User %s SendQ of %d exceeds connect class maximum of %d",this->nick,sendq.length() + data.length(),this->sendqmax);
00268 this->SetWriteError("SendQ exceeded");
00269 return;
00270 }
00271 std::stringstream stream;
00272 stream << sendq << data;
00273 sendq = stream.str();
00274 }
00275
00276
00277 void userrec::FlushWriteBuf()
00278 {
00279 if (sendq.length())
00280 {
00281 char* tb = (char*)this->sendq.c_str();
00282 int n_sent = write(this->fd,tb,this->sendq.length());
00283 if (n_sent == -1)
00284 {
00285 this->SetWriteError(strerror(errno));
00286 }
00287 else
00288 {
00289
00290 tb += n_sent;
00291 this->sendq = tb;
00292
00293 this->bytes_out += n_sent;
00294 this->cmds_out++;
00295 }
00296 }
00297 }
00298
00299 void userrec::SetWriteError(std::string error)
00300 {
00301 log(DEBUG,"Setting error string for %s to '%s'",this->nick,error.c_str());
00302
00303 if (this->WriteError == "")
00304 this->WriteError = error;
00305 }
00306
00307 std::string userrec::GetWriteError()
00308 {
00309 return this->WriteError;
00310 }