00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00046 #include "services.h"
00047 #include "operserv.h"
00048 #include "log.h"
00049 #include "interp.h"
00050
00065 namespace interp
00066 {
00067 #define TBL(ccname) { ccname, #ccname }
00068 #define TF(ccname, fname) { ccname, #ccname, fname }
00069 cmd_name_table global_cmd_table[] = {
00070
00071 TF(CS_HELP, cs_help),
00072 TF(CS_INFO, cs_info),
00073 TF(CS_ACCESS, cs_access),
00074 TF(CS_CHANOP, cs_chanop),
00075 TF(CS_LISTOP, cs_listop),
00076 TF(CS_ADDOP, cs_addop),
00077 TBL(CS_DELOP) ,
00078 TF(CS_AKICK, cs_akick),
00079 TF(CS_LISTAK, cs_listak),
00080 TF(CS_ADDAK, cs_addak),
00081 TF(CS_DELAK, cs_delak),
00082 TF(CS_WIPEAK, cs_wipeak),
00083 TF(CS_REGISTER, cs_register),
00084 TF(CS_IDENTIFY, cs_identify),
00085 TF(CS_MDEOP, cs_mdeop),
00086 TF(CS_MKICK, cs_mkick),
00087 TF(CS_DELETE, cs_delete),
00088 TF(CS_DROP, cs_drop),
00089 TF(CS_OP, cs_op),
00090 TF(CS_DEOP, cs_deop),
00091 TF(CS_CLIST, cs_clist),
00092 TF(CS_BANISH, cs_banish),
00093 TF(CS_CLOSE, cs_close),
00094 TF(CS_HOLD, cs_hold),
00095 TF(CS_MARK, cs_mark),
00096 TF(CS_MLOCK, cs_modelock),
00097 TF(CS_RESTRICT, cs_restrict),
00098 TF(CS_TOPICLOCK, cs_topiclock),
00099 TF(CS_SET, cs_set),
00100 TF(CS_GETPASS, cs_getpass),
00101 TBL(CSS_GETPASS_XFER),
00102 TF(CS_GETREALPASS, cs_getrealpass),
00103 TF(CS_SAVE, cs_save),
00104 TF(CS_UNBAN, cs_unban),
00105 TF(CS_INVITE, cs_invite),
00106 TF(CS_LIST, cs_list),
00107 TF(CS_WHOIS, cs_whois),
00108 TF(CS_LOG, cs_log),
00109 TF(CS_CLEAN, cs_clean),
00110 TF(CS_WIPEOP, cs_wipeop),
00111 TF(CS_SETPASS, cs_setpass),
00112 TF(CS_SETREALPASS, cs_setrealpass),
00113 TF(CS_DMOD, cs_dmod),
00114 TF(CS_TRIGGER, cs_trigger),
00115
00116
00117 TF(NS_HELP, ns_help),
00118 TF(NS_CIDENTIFY, ns_cidentify),
00119 TF(NS_IDENTIFY, ns_identify),
00120 TBL(NS_XIDENTIFY),
00121 TBL(NS_LOGOUT),
00122 TF(NS_REGISTER, ns_register),
00123 TF(NS_INFO, ns_info),
00124 TF(NS_GHOST, ns_ghost),
00125 TF(NS_RECOVER, ns_recover),
00126 TF(NS_RELEASE, ns_release),
00127 TF(NS_SET, ns_set),
00128 TF(NS_DROP, ns_drop),
00129 TF(NS_ADDMASK, ns_addmask),
00130 TF(NS_ACCESS, ns_access),
00131 TF(NS_ACC, ns_acc),
00132 TF(NS_SETFLAG, ns_setflags),
00133 TF(NS_SETOP, ns_setopflags),
00134 TF(NS_MARK, ns_mark),
00135 TF(NS_BYPASS, ns_bypass),
00136 TF(NS_BANISH, ns_banish),
00137 TF(NS_GETPASS, ns_getpass),
00138 TBL(NSS_GETPASS_XFER),
00139 TF(NS_GETREALPASS, ns_getrealpass),
00140 TF(NS_DELETE, ns_delete),
00141 TF(NS_LIST, ns_list),
00142 TF(NS_SAVE, ns_save),
00143 TF(NS_SAVEMEMO, ms_save),
00144 TF(NS_LOGOFF, ns_logoff),
00145 TF(NS_SETPASS, ns_setpass),
00146 TF(NS_SETEMAIL, ns_setemail),
00147
00148
00149 TF(OS_HELP, os_help),
00150 TF(OS_AKILL, os_akill),
00151 TF(OS_TEMPAKILL, os_tempakill),
00152 #ifdef ENABLE_AHURT
00153 TBL(OS_AHURT),
00154 #endif
00155 TF(OS_CLONERULE, os_clonerule),
00156 TBL(OS_IGNORE),
00157 TF(OS_MODE, os_mode),
00158 TF(OS_RAW, os_raw),
00159 TF(OS_SHUTDOWN, os_shutdown),
00160 TF(OS_RESET, os_reset),
00161 TF(OS_REHASH, os_reset),
00162 TF(OS_JUPE, os_jupe),
00163 TF(OS_UPTIME, os_uptime),
00164 TF(OS_TIMERS, os_timers),
00165 TF(OS_SYNC, os_sync),
00166 TF(OS_TRIGGER, os_trigger),
00167 TF(OS_MATCH, os_match),
00168 TF(OS_CLONESET, os_cloneset),
00169 TF(OS_REMSRA, os_remsra),
00170 TF(OS_SETOP, os_setop),
00171 TF(OS_GRPOP, os_grpop),
00172 TF(OS_OVERRIDE, os_override),
00173 TF(OS_STRIKE, os_strike),
00174 TF(OS_HEAL, os_heal),
00175 TF(OS_NIXGHOST, os_nixghost),
00176
00177
00178 TF(IS_HELP, is_help),
00179 TF(IS_READ, is_sendinfo),
00180 TF(IS_LIST, is_listnews),
00181 TF(IS_POST, is_postnews),
00182 TF(IS_DEL, is_delete),
00183 TF(IS_SAVE, is_save),
00184
00185
00186 TF(MS_HELP, ms_help),
00187 TF(MS_READ, ms_read),
00188 TF(MS_LIST, ms_list),
00189 TF(MS_SEND, ms_send),
00190 TF(MS_SENDSOP, ms_sendsop),
00191 TF(MS_DEL, ms_delete),
00192 TF(MS_DELETE, ms_delete),
00193 TF(MS_PURGE, ms_clean),
00194 TF(MS_FORWARD, ms_forward),
00195 TF(MS_NOMEMO, ms_nomemo),
00196 TF(MS_UNSEND, ms_unsend),
00197 TF(MS_MBLOCK, ms_mblock),
00198 TF(MS_SAVEMEMO, ms_savememo),
00199
00200
00201 TF(GS_HELP, gs_help),
00202 TF(GS_ROLL, gs_roll),
00203
00204
00205 TBL(NSE_EXPIRE),
00206 TBL(CSE_EXPIRE),
00207
00208 {SVC_CMD_NONE, NULL}
00209 };
00210
00211 const char *cmd_name(int cmd)
00212 {
00213 int i = 0;
00214 for (i = 0; global_cmd_table[i].name; i++)
00215 if (global_cmd_table[i].cnum == cmd)
00216 return global_cmd_table[i].name;
00217 return "??_??";
00218 }
00219
00220 parser::parser(const char *service, u_int32_t opflags,
00221 service_cmd_t * cmdlist,
00222 const char *incmd):theOpflags(opflags),
00223 theService(service)
00224 {
00225 struct service_cmd_t *p;
00226
00227 for (p = cmdlist; p->cmd != NULL; p++)
00228 {
00229 if ((opflags & p->root) != p->root)
00230 continue;
00231 if (!(p->flags & CMD_MATCH) && strcasecmp(p->cmd, incmd) == 0)
00232 break;
00233 else if ((p->flags & CMD_MATCH) && match(p->cmd, incmd) == 0)
00234 break;
00235 }
00236 if (!p->cmd)
00237 {
00238 for (p = cmdlist; p->cmd != NULL; p++)
00239 if (!(p->flags & CMD_MATCH)
00240 && strcasecmp(p->cmd, incmd) == 0) break;
00241 else if ((p->flags & CMD_MATCH)
00242 && match(p->cmd, incmd) == 0) break;
00243 }
00244 theCmd = p->cmd ? p : NULL;
00245 return;
00246 }
00247
00248 cmd_return parser::run(UserList * nick, char **args, int numargs)
00249 {
00250 cmd_return retval;
00251 bool fLog = false;
00252
00253 if (!theCmd)
00254 return RET_FAIL;
00255 if ((theCmd->flags & CMD_REG) &&
00256 #ifdef REQ_EMAIL
00257 (!nick->reg || !(nick->reg->flags & NACTIVE) ))
00258 #else
00259 !nick->reg)
00260 #endif
00261 {
00262 if (nick->reg)
00263 sSend
00264 (":%s NOTICE %s :Your nickname must be activated to use this command.",
00265 theService, nick->nick);
00266 else
00267 sSend
00268 (":%s NOTICE %s :Your nickname must be registered to use this command.",
00269 theService, nick->nick);
00270 return RET_EFAULT;
00271 }
00272 if ((theCmd->flags & CMD_IDENT)
00273 && (!nick->reg || !isIdentified(nick, nick->reg)))
00274 {
00275 sSend(":%s NOTICE %s :You must identify to use this command.",
00276 theService, nick->nick);
00277 sSend
00278 (":%s NOTICE %s :Type \2/msg %s HELP IDENTIFY\2 for more information.",
00279 theService, nick->nick, NickServ);
00280 return RET_EFAULT;
00281 }
00282 #ifdef ENABLE_AHURT
00283 if (!(theCmd->flags & CMD_AHURT) && (nick->oflags & NISAHURT)
00284 && !(nick->oflags & NISOPER)) {
00285 sSend
00286 (":%s NOTICE %s :You are AutoHurt and can use services only to "
00287 "identify to a registered nickname.", theService,
00288 nick->nick);
00289 sSend(":%s NOTICE %s :Type '/msg %s help' and/or "
00290 "'/msg %s help identify' for more information.",
00291 NickServ, nick->nick, NickServ, NickServ);
00292 return RET_EFAULT;
00293 }
00294 #endif
00295
00296 if ((theOpflags & theCmd->root) == theCmd->root)
00297 retval = (*theCmd->func) (nick, args, numargs);
00298 else {
00299 if (!(theOpflags & OROOT) && (theCmd->root & OROOT))
00300 sSend(":%s NOTICE %s "
00301 ":You must be a services root to use this command.",
00302 theService, nick->nick);
00303 else
00304 sSend(":%s NOTICE %s "
00305 ":You do not have the proper flags to use this command.",
00306 theService, nick->nick);
00307 retval = RET_NOPERM;
00308 }
00309
00310 if (retval == RET_KILLED)
00311 return RET_KILLED;
00312
00313 if ((theCmd->log & LOG_ALWAYS))
00314 fLog = true;
00315 if (((theCmd->log & LOG_OK) || (theCmd->log & LOG_OK_WARN))
00316 && (retval == RET_OK || retval == RET_OK_DB)) {
00317 fLog = true;
00318 }
00319 if ((theCmd->log & LOG_DB) && (retval == RET_OK_DB))
00320 fLog = true;
00321
00322 if (fLog) {
00323 unsigned int i;
00324 char stuff[IRCBUF + 2];
00325
00326 if (!theCmd->cmd_id) {
00327 for (i = 0; global_cmd_table[i].name; i++)
00328 if (global_cmd_table[i].func == theCmd->func)
00329 break;
00330 if (global_cmd_table[i].name)
00331 theCmd->cmd_id = global_cmd_table[i].cnum;
00332 }
00333
00334 stuff[0] = '\0';
00335 if (numargs>1) {
00336 parse_str(args, numargs, 2, stuff, IRCBUF);
00337 } else strcpy(stuff, "-");
00338
00339 operlog->log(nick, theCmd->cmd_id, args[1],
00340 (retval == RET_OK_DB
00341 || retval == RET_OK) ? LOGF_OK : 0, "%s", stuff);
00342 sSend(":%s NOTICE %s :This command has been logged.", theService,
00343 nick->nick);
00344
00345 if (theCmd->flood && addFlood(nick, theCmd->flood))
00346 return RET_KILLED;
00347 }
00348 if (retval == RET_OK_DB)
00349 return RET_OK_DB;
00350 return RET_OK;
00351 }
00352 }