From 66f0cd6469d2643858c2fcd14726d362696bd68d Mon Sep 17 00:00:00 2001 From: brain Date: Tue, 24 May 2005 02:34:33 +0000 Subject: New methods, new docs git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@1484 e03df62e-2008-0410-955e-edbf42e46eb7 --- docs/module-doc/users_8cpp-source.html | 531 +++++++++++++++++---------------- 1 file changed, 273 insertions(+), 258 deletions(-) (limited to 'docs/module-doc/users_8cpp-source.html') diff --git a/docs/module-doc/users_8cpp-source.html b/docs/module-doc/users_8cpp-source.html index e4e36db0d..2d74edf36 100644 --- a/docs/module-doc/users_8cpp-source.html +++ b/docs/module-doc/users_8cpp-source.html @@ -21,271 +21,286 @@ 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; +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 time_t TIME; +00027 extern std::stringstream config_f; 00028 -00029 userrec::userrec() -00030 { -00031 // the PROPER way to do it, AVOID bzero at *ALL* costs -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() +00029 extern time_t TIME; +00030 +00031 userrec::userrec() +00032 { +00033 // the PROPER way to do it, AVOID bzero at *ALL* costs +00034 strcpy(nick,""); +00035 strcpy(ip,"127.0.0.1"); +00036 timeout = 0; +00037 strcpy(ident,""); +00038 strcpy(host,""); +00039 strcpy(dhost,""); +00040 strcpy(fullname,""); +00041 strcpy(modes,""); +00042 strcpy(server,""); +00043 strcpy(awaymsg,""); +00044 strcpy(oper,""); +00045 reset_due = TIME; +00046 lines_in = 0; +00047 fd = lastping = signon = idle_lastmsg = nping = registered = 0; +00048 flood = port = bytes_in = bytes_out = cmds_in = cmds_out = 0; +00049 haspassed = false; +00050 dns_done = false; +00051 recvq = ""; +00052 sendq = ""; +00053 strcpy(result,""); +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 snprintf(result,MAXBUF,"%s!%s@%s",nick,ident,dhost); -00065 return result; +00064 shutdown(this->fd,2); +00065 close(this->fd); 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 // are they even an oper at all? -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 // count the size of the first line in the buffer. -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 // return false if we've had more than 600 characters WITHOUT -00197 // a carriage return (this is BAD, drop the socket) -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) +00067 +00068 char* userrec::GetFullHost() +00069 { +00070 snprintf(result,MAXBUF,"%s!%s@%s",nick,ident,dhost); +00071 return result; +00072 } +00073 +00074 int userrec::ReadData(void* buffer, size_t size) +00075 { +00076 if (this->fd > -1) +00077 { +00078 return read(this->fd, buffer, size); +00079 } +00080 else return 0; +00081 } +00082 +00083 +00084 char* userrec::GetFullRealHost() +00085 { +00086 snprintf(result,MAXBUF,"%s!%s@%s",nick,ident,host); +00087 return result; +00088 } +00089 +00090 bool userrec::IsInvited(char* channel) +00091 { +00092 for (InvitedList::iterator i = invites.begin(); i != invites.end(); i++) +00093 { +00094 if (i->channel) { +00095 if (!strcasecmp(i->channel,channel)) +00096 { +00097 return true; +00098 } +00099 } +00100 } +00101 return false; +00102 } +00103 +00104 InvitedList* userrec::GetInviteList() +00105 { +00106 return &invites; +00107 } +00108 +00109 void userrec::InviteTo(char* channel) +00110 { +00111 Invited i; +00112 strlcpy(i.channel,channel,CHANMAX); +00113 invites.push_back(i); +00114 } +00115 +00116 void userrec::RemoveInvite(char* channel) +00117 { +00118 log(DEBUG,"Removing invites"); +00119 if (channel) +00120 { +00121 if (invites.size()) +00122 { +00123 for (InvitedList::iterator i = invites.begin(); i != invites.end(); i++) +00124 { +00125 if (i->channel) +00126 { +00127 if (!strcasecmp(i->channel,channel)) +00128 { +00129 invites.erase(i); +00130 return; +00131 } +00132 } +00133 } +00134 } +00135 } +00136 } +00137 +00138 bool userrec::HasPermission(char* command) +00139 { +00140 char TypeName[MAXBUF],Classes[MAXBUF],ClassName[MAXBUF],CommandList[MAXBUF]; +00141 char* mycmd; +00142 char* savept; +00143 char* savept2; +00144 +00145 // are they even an oper at all? +00146 if (strchr(this->modes,'o')) +00147 { +00148 log(DEBUG,"*** HasPermission: %s is an oper",this->nick); +00149 for (int j =0; j < ConfValueEnum("type",&config_f); j++) +00150 { +00151 ConfValue("type","name",j,TypeName,&config_f); +00152 if (!strcmp(TypeName,this->oper)) +00153 { +00154 log(DEBUG,"*** HasPermission: %s is an oper of type '%s'",this->nick,this->oper); +00155 ConfValue("type","classes",j,Classes,&config_f); +00156 char* myclass = strtok_r(Classes," ",&savept); +00157 while (myclass) +00158 { +00159 log(DEBUG,"*** HasPermission: checking classtype '%s'",myclass); +00160 for (int k =0; k < ConfValueEnum("class",&config_f); k++) +00161 { +00162 ConfValue("class","name",k,ClassName,&config_f); +00163 if (!strcmp(ClassName,myclass)) +00164 { +00165 ConfValue("class","commands",k,CommandList,&config_f); +00166 log(DEBUG,"*** HasPermission: found class named %s with commands: '%s'",ClassName,CommandList); +00167 +00168 +00169 mycmd = strtok_r(CommandList," ",&savept2); +00170 while (mycmd) +00171 { +00172 if (!strcasecmp(mycmd,command)) +00173 { +00174 log(DEBUG,"*** Command %s found, returning true",command); +00175 return true; +00176 } +00177 mycmd = strtok_r(NULL," ",&savept2); +00178 } +00179 } +00180 } +00181 myclass = strtok_r(NULL," ",&savept); +00182 } +00183 } +00184 } +00185 } +00186 return false; +00187 } +00188 +00189 +00190 bool userrec::AddBuffer(std::string a) +00191 { +00192 std::string b = ""; +00193 for (int i = 0; i < a.length(); i++) +00194 if ((a[i] != '\r') && (a[i] != '\0') && (a[i] != 7)) +00195 b = b + a[i]; +00196 std::stringstream stream(recvq); +00197 stream << b; +00198 recvq = stream.str(); +00199 int i = 0; +00200 // count the size of the first line in the buffer. +00201 while (i < recvq.length()) +00202 { +00203 if (recvq[i++] == '\n') +00204 break; +00205 } +00206 if (recvq.length() > this->recvqmax) +00207 { +00208 this->SetWriteError("RecvQ exceeded"); +00209 WriteOpers("*** User %s RecvQ of %d exceeds connect class maximum of %d",this->nick,recvq.length(),this->recvqmax); +00210 } +00211 // return false if we've had more than 600 characters WITHOUT +00212 // a carriage return (this is BAD, drop the socket) +00213 return (i < 600); +00214 } +00215 +00216 bool userrec::BufferIsReady() +00217 { +00218 for (int i = 0; i < recvq.length(); i++) +00219 if (recvq[i] == '\n') +00220 return true; +00221 return false; +00222 } +00223 +00224 void userrec::ClearBuffer() +00225 { +00226 recvq = ""; +00227 } +00228 +00229 std::string userrec::GetBuffer() +00230 { +00231 if (recvq == "") +00232 return ""; +00233 char* line = (char*)recvq.c_str(); +00234 std::string ret = ""; +00235 while ((*line != '\n') && (strlen(line))) 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(); +00237 ret = ret + *line; +00238 line++; +00239 } +00240 if ((*line == '\n') || (*line == '\r')) +00241 line++; +00242 recvq = line; +00243 return ret; 00244 } 00245 -00246 // send AS MUCH OF THE USERS SENDQ as we are able to (might not be all of it) -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 // advance the queue -00260 tb += n_sent; -00261 this->sendq = tb; -00262 // update the user's stats counters -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 // don't try to set the error twice, its already set take the first string. -00273 if (this->WriteError == "") -00274 this->WriteError = error; -00275 } -00276 -00277 std::string userrec::GetWriteError() -00278 { -00279 return this->WriteError; -00280 } -
Generated on Sun May 15 18:36:02 2005 for InspIRCd by +00246 void userrec::AddWriteBuf(std::string data) +00247 { +00248 if (this->GetWriteError() != "") +00249 return; +00250 if (sendq.length() + data.length() > this->sendqmax) +00251 { +00252 WriteOpers("*** User %s SendQ of %d exceeds connect class maximum of %d",this->nick,sendq.length() + data.length(),this->sendqmax); +00253 this->SetWriteError("SendQ exceeded"); +00254 return; +00255 } +00256 std::stringstream stream; +00257 stream << sendq << data; +00258 sendq = stream.str(); +00259 } +00260 +00261 // send AS MUCH OF THE USERS SENDQ as we are able to (might not be all of it) +00262 void userrec::FlushWriteBuf() +00263 { +00264 if (sendq.length()) +00265 { +00266 char* tb = (char*)this->sendq.c_str(); +00267 int n_sent = write(this->fd,tb,this->sendq.length()); +00268 if (n_sent == -1) +00269 { +00270 this->SetWriteError(strerror(errno)); +00271 } +00272 else +00273 { +00274 // advance the queue +00275 tb += n_sent; +00276 this->sendq = tb; +00277 // update the user's stats counters +00278 this->bytes_out += n_sent; +00279 this->cmds_out++; +00280 } +00281 } +00282 } +00283 +00284 void userrec::SetWriteError(std::string error) +00285 { +00286 log(DEBUG,"Setting error string for %s to '%s'",this->nick,error.c_str()); +00287 // don't try to set the error twice, its already set take the first string. +00288 if (this->WriteError == "") +00289 this->WriteError = error; +00290 } +00291 +00292 std::string userrec::GetWriteError() +00293 { +00294 return this->WriteError; +00295 } +
Generated on Tue May 24 02:30:07 2005 for InspIRCd by doxygen 1.3.3
-- cgit v1.3.1-10-gc9f91