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