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
00023 extern std::stringstream config_f;
00024
00025 userrec::userrec()
00026 {
00027
00028 strcpy(nick,"");
00029 strcpy(ip,"127.0.0.1");
00030 timeout = 0;
00031 strcpy(ident,"");
00032 strcpy(host,"");
00033 strcpy(dhost,"");
00034 strcpy(fullname,"");
00035 strcpy(modes,"");
00036 strcpy(inbuf,"");
00037 strcpy(server,"");
00038 strcpy(awaymsg,"");
00039 fd = lastping = signon = idle_lastmsg = nping = registered = 0;
00040 flood = port = bytes_in = bytes_out = cmds_in = cmds_out = 0;
00041 haspassed = false;
00042 strcpy(result,"");
00043 for (int i = 0; i < MAXCHANS; i++)
00044 {
00045 this->chans[i].channel = NULL;
00046 this->chans[i].uc_modes = 0;
00047 }
00048 invites.clear();
00049 }
00050
00051
00052
00053 char* userrec::GetFullHost()
00054 {
00055 snprintf(result,MAXBUF,"%s!%s@%s",nick,ident,dhost);
00056 return result;
00057 }
00058
00059
00060 char* userrec::GetFullRealHost()
00061 {
00062 snprintf(result,MAXBUF,"%s!%s@%s",nick,ident,host);
00063 return result;
00064 }
00065
00066 bool userrec::IsInvited(char* channel)
00067 {
00068 for (InvitedList::iterator i = invites.begin(); i != invites.end(); i++)
00069 {
00070 if (i->channel) {
00071 if (!strcasecmp(i->channel,channel))
00072 {
00073 return true;
00074 }
00075 }
00076 }
00077 return false;
00078 }
00079
00080 void userrec::InviteTo(char* channel)
00081 {
00082 Invited i;
00083 strlcpy(i.channel,channel,CHANMAX);
00084 invites.push_back(i);
00085 }
00086
00087 void userrec::RemoveInvite(char* channel)
00088 {
00089 log(DEBUG,"Removing invites");
00090 if (channel)
00091 {
00092 if (invites.size())
00093 {
00094 for (InvitedList::iterator i = invites.begin(); i != invites.end(); i++)
00095 {
00096 if (i->channel)
00097 {
00098 if (!strcasecmp(i->channel,channel))
00099 {
00100 invites.erase(i);
00101 return;
00102 }
00103 }
00104 }
00105 }
00106 }
00107 }
00108
00109 bool userrec::HasPermission(char* command)
00110 {
00111 char TypeName[MAXBUF],Classes[MAXBUF],ClassName[MAXBUF],CommandList[MAXBUF];
00112 char* myclass;
00113 char* mycmd;
00114 char* savept;
00115 char* savept2;
00116
00117
00118 if (strchr(this->modes,'o'))
00119 {
00120 log(DEBUG,"*** HasPermission: %s is an oper",this->nick);
00121 for (int j =0; j < ConfValueEnum("type",&config_f); j++)
00122 {
00123 ConfValue("type","name",j,TypeName,&config_f);
00124 if (!strcmp(TypeName,this->oper))
00125 {
00126 log(DEBUG,"*** HasPermission: %s is an oper of type '%s'",this->nick,this->oper);
00127 ConfValue("type","classes",j,Classes,&config_f);
00128 char* myclass = strtok_r(Classes," ",&savept);
00129 while (myclass)
00130 {
00131 log(DEBUG,"*** HasPermission: checking classtype '%s'",myclass);
00132 for (int k =0; k < ConfValueEnum("class",&config_f); k++)
00133 {
00134 ConfValue("class","name",k,ClassName,&config_f);
00135 if (!strcmp(ClassName,myclass))
00136 {
00137 ConfValue("class","commands",k,CommandList,&config_f);
00138 log(DEBUG,"*** HasPermission: found class named %s with commands: '%s'",ClassName,CommandList);
00139
00140
00141 mycmd = strtok_r(CommandList," ",&savept2);
00142 while (mycmd)
00143 {
00144 if (!strcasecmp(mycmd,command))
00145 {
00146 log(DEBUG,"*** Command %s found, returning true",command);
00147 return true;
00148 }
00149 mycmd = strtok_r(NULL," ",&savept2);
00150 }
00151 }
00152 }
00153 myclass = strtok_r(NULL," ",&savept);
00154 }
00155 }
00156 }
00157 }
00158 return false;
00159 }
00160
00161