From e0583918834a3f8683e430adf3923ea89d2a449a Mon Sep 17 00:00:00 2001 From: "rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b" Date: Mon, 2 May 2005 19:02:12 +0000 Subject: BUILD : 1.7.8 (753) BUGS : N/a NOTES : Merged anope-dev with trunk git-svn-id: svn://svn.anope.org/anope/trunk@753 31f1291d-b8d6-0310-a050-a5561fc1590b git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@516 5417fbe8-f217-4b02-8779-1006273d7864 --- src/core/cs_register.c | 199 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 src/core/cs_register.c (limited to 'src/core/cs_register.c') diff --git a/src/core/cs_register.c b/src/core/cs_register.c new file mode 100644 index 000000000..892f51290 --- /dev/null +++ b/src/core/cs_register.c @@ -0,0 +1,199 @@ +/* ChanServ core functions + * + * (C) 2003-2005 Anope Team + * Contact us at info@anope.org + * + * Please read COPYING and README for further details. + * + * Based on the original code of Epona by Lara. + * Based on the original code of Services by Andy Church. + * + * $Id$ + * + */ +/*************************************************************************/ + +#include "module.h" + +int do_register(User * u); +void myChanServHelp(User * u); + +/** + * Create the off command, and tell anope about it. + * @param argc Argument count + * @param argv Argument list + * @return MOD_CONT to allow the module, MOD_STOP to stop it + **/ +int AnopeInit(int argc, char **argv) +{ + Command *c; + + moduleAddAuthor("Anope"); + moduleAddVersion("$Id$"); + moduleSetType(CORE); + + c = createCommand("REGISTER", do_register, NULL, CHAN_HELP_REGISTER, + -1, -1, -1, -1); + moduleAddCommand(CHANSERV, c, MOD_UNIQUE); + + moduleSetChanHelp(myChanServHelp); + + return MOD_CONT; +} + +/** + * Unload the module + **/ +void AnopeFini(void) +{ + +} + + + +/** + * Add the help response to anopes /cs help output. + * @param u The user who is requesting help + **/ +void myChanServHelp(User * u) +{ + notice_lang(s_ChanServ, u, CHAN_HELP_CMD_REGISTER); +} + +/** + * The /cs register command. + * @param u The user who issued the command + * @param MOD_CONT to continue processing other modules, MOD_STOP to stop processing. + **/ +int do_register(User * u) +{ + char *chan = strtok(NULL, " "); + char *pass = strtok(NULL, " "); + char *desc = strtok(NULL, ""); + NickCore *nc; + Channel *c; + ChannelInfo *ci; + struct u_chaninfolist *uc; + int is_servadmin = is_services_admin(u); +#ifdef USE_ENCRYPTION + char founderpass[PASSMAX + 1]; +#endif + + if (readonly) { + notice_lang(s_ChanServ, u, CHAN_REGISTER_DISABLED); + return MOD_CONT; + } + + if (checkDefCon(DEFCON_NO_NEW_CHANNELS)) { + notice_lang(s_ChanServ, u, OPER_DEFCON_DENIED); + return MOD_CONT; + } + + if (!desc) { + syntax_error(s_ChanServ, u, "REGISTER", CHAN_REGISTER_SYNTAX); + } else if (*chan == '&') { + notice_lang(s_ChanServ, u, CHAN_REGISTER_NOT_LOCAL); + } else if (*chan != '#') { + notice_lang(s_ChanServ, u, CHAN_SYMBOL_REQUIRED); + } else if (!u->na || !(nc = u->na->nc)) { + notice_lang(s_ChanServ, u, CHAN_MUST_REGISTER_NICK, s_NickServ); + } else if (!nick_recognized(u)) { + notice_lang(s_ChanServ, u, CHAN_MUST_IDENTIFY_NICK, s_NickServ, + s_NickServ); + } else if (!(c = findchan(chan))) { + notice_lang(s_ChanServ, u, CHAN_REGISTER_NONE_CHANNEL, chan); + } else if ((ci = cs_findchan(chan)) != NULL) { + if (ci->flags & CI_VERBOTEN) { + alog("%s: Attempt to register FORBIDden channel %s by %s!%s@%s", s_ChanServ, ci->name, u->nick, u->username, u->host); + notice_lang(s_ChanServ, u, CHAN_MAY_NOT_BE_REGISTERED, chan); + } else { + notice_lang(s_ChanServ, u, CHAN_ALREADY_REGISTERED, chan); + } + } else if (!stricmp(chan, "#")) { + notice_lang(s_ChanServ, u, CHAN_MAY_NOT_BE_REGISTERED, chan); + } else if (!chan_has_user_status(c, u, CUS_OP)) { + notice_lang(s_ChanServ, u, CHAN_MUST_BE_CHANOP); + + } else if (!is_servadmin && nc->channelmax > 0 + && nc->channelcount >= nc->channelmax) { + notice_lang(s_ChanServ, u, + nc->channelcount > + nc-> + channelmax ? CHAN_EXCEEDED_CHANNEL_LIMIT : + CHAN_REACHED_CHANNEL_LIMIT, nc->channelmax); + } else if (stricmp(u->nick, pass) == 0 + || (StrictPasswords && strlen(pass) < 5)) { + notice_lang(s_ChanServ, u, MORE_OBSCURE_PASSWORD); + } else if (!(ci = makechan(chan))) { + alog("%s: makechan() failed for REGISTER %s", s_ChanServ, chan); + notice_lang(s_ChanServ, u, CHAN_REGISTRATION_FAILED); + +#ifdef USE_ENCRYPTION + } else if (strscpy(founderpass, pass, PASSMAX + 1), + encrypt_in_place(founderpass, PASSMAX) < 0) { + alog("%s: Couldn't encrypt password for %s (REGISTER)", + s_ChanServ, chan); + notice_lang(s_ChanServ, u, CHAN_REGISTRATION_FAILED); + delchan(ci); +#endif + + } else { + c->ci = ci; + ci->c = c; + ci->bantype = CSDefBantype; + ci->flags = CSDefFlags; + ci->mlock_on = ircd->defmlock; + ci->memos.memomax = MSMaxMemos; + ci->last_used = ci->time_registered; + ci->founder = nc; +#ifdef USE_ENCRYPTION + if (strlen(pass) > PASSMAX) + notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX); + memset(pass, 0, strlen(pass)); + memcpy(ci->founderpass, founderpass, PASSMAX); + ci->flags |= CI_ENCRYPTEDPW; +#else + if (strlen(pass) > PASSMAX - 1) /* -1 for null byte */ + notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX - 1); + strscpy(ci->founderpass, pass, PASSMAX); +#endif + ci->desc = sstrdup(desc); + if (c->topic) { + ci->last_topic = sstrdup(c->topic); + strscpy(ci->last_topic_setter, c->topic_setter, NICKMAX); + ci->last_topic_time = c->topic_time; + } else { + /* Set this to something, otherwise it will maliform the topic */ + strscpy(ci->last_topic_setter, s_ChanServ, NICKMAX); + } + ci->bi = NULL; + ci->botflags = BSDefFlags; + ci->founder->channelcount++; + alog("%s: Channel '%s' registered by %s!%s@%s", s_ChanServ, chan, + u->nick, u->username, u->host); + notice_lang(s_ChanServ, u, CHAN_REGISTERED, chan, u->nick); +#ifndef USE_ENCRYPTION + notice_lang(s_ChanServ, u, CHAN_PASSWORD_IS, ci->founderpass); +#endif + uc = scalloc(sizeof(*uc), 1); + uc->next = u->founder_chans; + uc->prev = NULL; + if (u->founder_chans) + u->founder_chans->prev = uc; + u->founder_chans = uc; + uc->chan = ci; + /* Implement new mode lock */ + check_modes(c); + /* On most ircds you do not receive the admin/owner mode till its registered */ + if (ircd->admin) { + anope_cmd_mode(s_ChanServ, chan, "%s %s", ircd->adminset, + u->nick); + } + if (ircd->owner && ircd->ownerset) { + anope_cmd_mode(s_ChanServ, chan, "%s %s", ircd->ownerset, + u->nick); + } + send_event(EVENT_CHAN_REGISTERED, 1, chan); + } + return MOD_CONT; +} -- cgit