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