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