Main Page | Modules | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members | Related Pages

interp.cc

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2000-2001 James Hess
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions
00007  * are met:
00008  * 1. Redistributions of source code must retain the above copyright
00009  *    notice, this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright
00011  *    notice, this list of conditions and the following disclaimer in the
00012  *    documentation and/or other materials provided with the distribution.
00013  * 3. Neither the name of the authors nor the names of its contributors
00014  *    may be used to endorse or promote products derived from this software
00015  *    without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
00027  * SUCH DAMAGE.
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         // ChanServ name mappings
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) /* actually uses cs_addop */ ,
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         // NickServ name mappings
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         // OperServ Commands
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         // InfoServ Commands
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         // MemoServ Commands
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         // GameServ Commands
00201         TF(GS_HELP, gs_help),
00202         TF(GS_ROLL, gs_roll),
00203 
00204         // Services Events
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 }

Generated at Sat Oct 25 20:56:08 2003 for Services using Doxygen.
Services Copyr. 1996-2001 Chip Norkus, Max Byrd, Greg Poma, Michael Graff, James Hess, Dafydd James. All rights reserved See LICENSE for licensing information.