From bab9f4b4bc0f6aa0e1377745fd216ef9874b3f27 Mon Sep 17 00:00:00 2001 From: brain Date: Fri, 9 Dec 2005 20:21:39 +0000 Subject: Added new module docs git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@2301 e03df62e-2008-0410-955e-edbf42e46eb7 --- docs/module-doc/users_8cpp-source.html | 561 +++++++++++++++++---------------- 1 file changed, 286 insertions(+), 275 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 78de98822..4254d8509 100644 --- a/docs/module-doc/users_8cpp-source.html +++ b/docs/module-doc/users_8cpp-source.html @@ -31,282 +31,293 @@ 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; +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 userrec::userrec() -00034 { -00035 // the PROPER way to do it, AVOID bzero at *ALL* costs -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 // are they even an oper at all? -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 // count the size of the first line in the buffer. -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 // return false if we've had more than 600 characters WITHOUT -00216 // a carriage return (this is BAD, drop the socket) -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 // send AS MUCH OF THE USERS SENDQ as we are able to (might not be all of it) -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 // advance the queue -00279 tb += n_sent; -00280 this->sendq = tb; -00281 // update the user's stats counters -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 // don't try to set the error twice, its already set take the first string. -00292 if (this->WriteError == "") -00293 this->WriteError = error; -00294 } -00295 -00296 std::string userrec::GetWriteError() -00297 { -00298 return this->WriteError; -00299 } -
Generated on Sun Nov 27 01:43:24 2005 for InspIRCd by  +00033 extern std::stringstream config_f; +00034 extern char ServerName[MAXBUF]; +00035 +00036 extern time_t TIME; +00037 +00038 userrec::userrec() +00039 { +00040 // the PROPER way to do it, AVOID bzero at *ALL* costs +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 // users on u-lined servers can completely bypass +00159 // all permissions based checks. +00160 // +00161 // of course, if this is sent to a remote server and this +00162 // server is not ulined there, then that other server +00163 // silently drops the command. +00164 if (is_uline(this->server)) +00165 return true; +00166 +00167 // are they even an oper at all? +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 // count the size of the first line in the buffer. +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 // return false if we've had more than 600 characters WITHOUT +00227 // a carriage return (this is BAD, drop the socket) +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 // send AS MUCH OF THE USERS SENDQ as we are able to (might not be all of it) +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 // advance the queue +00290 tb += n_sent; +00291 this->sendq = tb; +00292 // update the user's stats counters +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 // don't try to set the error twice, its already set take the first string. +00303 if (this->WriteError == "") +00304 this->WriteError = error; +00305 } +00306 +00307 std::string userrec::GetWriteError() +00308 { +00309 return this->WriteError; +00310 } +
Generated on Fri Dec 9 20:20:03 2005 for InspIRCd by  doxygen 1.4.4-20050815
-- cgit v1.2.3