diff options
author | ribosome ribosome@31f1291d-b8d6-0310-a050-a5561fc1590b <ribosome ribosome@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864> | 2005-03-26 10:05:57 +0000 |
---|---|---|
committer | ribosome ribosome@31f1291d-b8d6-0310-a050-a5561fc1590b <ribosome ribosome@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864> | 2005-03-26 10:05:57 +0000 |
commit | c4cdb1fe36643447c4f04e375e48bd6165355c36 (patch) | |
tree | 4ad554dc0e8804be68d25e061bec22957418e11c | |
parent | 2225f58c39d004e3fac4ec38e52daeb9884727be (diff) |
BUILD : 1.7.8 (641) BUGS : NOTES : Added SUSPEND and UNSUSPEND to NickServ. Also added running as root check to anoperc.
git-svn-id: svn://svn.anope.org/anope/trunk@641 31f1291d-b8d6-0310-a050-a5561fc1590b
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@489 5417fbe8-f217-4b02-8779-1006273d7864
-rw-r--r-- | Changes | 2 | ||||
-rw-r--r-- | Changes.lang | 9 | ||||
-rw-r--r-- | include/events.h | 2 | ||||
-rw-r--r-- | include/services.h | 2 | ||||
-rw-r--r-- | lang/en_us.l | 27 | ||||
-rwxr-xr-x | src/bin/anoperc | 7 | ||||
-rw-r--r-- | src/nickserv.c | 144 | ||||
-rw-r--r-- | version.log | 6 |
8 files changed, 197 insertions, 2 deletions
@@ -1,6 +1,8 @@ Anope Version S V N ------------------- Provided by Anope Dev. <dev@anope.org> - 2005 +03/25 A Added nickserv suspend/unsuspend command. [ #00] +03/25 A Added check for UID in anoperc. Stops running as root. [ #00] 03/11 A Event for database backups. [ #00] 03/09 A Documentation on the proxy detector in docs/PROXY. [ #00] 03/03 A ShadowIRCD 4.0 beta 7 support added. [ #00] diff --git a/Changes.lang b/Changes.lang index db19d5e61..40cf1207b 100644 --- a/Changes.lang +++ b/Changes.lang @@ -7,6 +7,15 @@ Anope Version S V N CHAN_GETKEY_NOKEY CHAN_GETKEY_KEY OPER_SET_SQL_ERROR_DISABLED + NICK_X_SUSPENDED + NICK_INFO_SUSPENDED + NICK_SUSPEND_SYNTAX + NICK_SUSPEND_SUCCEEDED + NICK_SUSPEND_FAILED + NICK_UNSUSPEND_SYNTAX + NICK_UNSUSPEND_SUCCEEDED + NICK_UNSUSPEND_FAILED + NICK_SERVADMIN_HELP_SUSPEND *** Mod Strings: OPER_HELP_SET diff --git a/include/events.h b/include/events.h index 8dc56fcbd..6fa858810 100644 --- a/include/events.h +++ b/include/events.h @@ -47,4 +47,6 @@ #define EVENT_SERVER_SQUIT "server_squit" #define EVENT_SERVER_CONNECT "server_connect" #define EVENT_DEFCON_LEVEL "defcon_level" +#define EVENT_NICK_SUSPENDED "nick_suspended" +#define EVENT_NICK_UNSUSPEND "nick_unsuspend" diff --git a/include/services.h b/include/services.h index 9a2643898..63f64f608 100644 --- a/include/services.h +++ b/include/services.h @@ -1074,6 +1074,7 @@ struct session_ { #define NS_MASTER 0x0200 /* Was a master nick; used to import old databases */ #define NS_TRANSGROUP 0xC000 /* Status flags that can be passed to a nick of the same group during nick change */ +#define NS_SUSPENDED 0x0400 /* Nickname has been suspended */ #define NS_TEMPORARY 0xFF00 /* All temporary status flags */ /* These two are not used anymore */ #define NS_OLD_ENCRYPTEDPW 0x0001 /* Nickname password is encrypted */ @@ -1097,7 +1098,6 @@ struct session_ { #define NI_SERVICES_ROOT 0x00008000 /* User is a Services root */ #define NI_MEMO_MAIL 0x00010000 /* User gets email on memo */ #define NI_HIDE_STATUS 0x00020000 /* Don't show services access status */ - /* Languages. Never insert anything in the middle of this list, or * everybody will start getting the wrong language! If you want to change * the order the languages are displayed in for NickServ HELP SET LANGUAGE, diff --git a/lang/en_us.l b/lang/en_us.l index 3c0fe96a6..70b7cbbd0 100644 --- a/lang/en_us.l +++ b/lang/en_us.l @@ -206,6 +206,8 @@ NICK_X_ILLEGAL Nick %s is an illegal nickname and cannot be used. NICK_X_TRUNCATED Nick %s was truncated to %d characters. +NICK_X_SUSPENDED + Nick %s is currently suspended. CHAN_X_NOT_REGISTERED Channel %s isn't registered. CHAN_X_NOT_IN_USE @@ -611,6 +613,8 @@ NICK_INFO_NO_EXPIRE This nickname will not expire. NICK_INFO_FOR_MORE For more verbose information, type /msg %s INFO %s ALL. +NICK_INFO_SUSPENDED + This nickname is currently suspended, reason: %s # LIST responses NICK_LIST_SYNTAX @@ -713,6 +717,22 @@ NICK_SENDPASS_LINE_5 NICK_SENDPASS_OK Password of %s has been sent. +# SUSPEND responses +NICK_SUSPEND_SYNTAX + SUSPEND nickname reason +NICK_SUSPEND_SUCCEEDED + Nick %s is now suspended. +NICK_SUSPEND_FAILED + Couldn't suspend nick %s! + +# UNSUSPEND responses +NICK_UNSUSPEND_SYNTAX + UNSUSPEND nickname +NICK_UNSUSPEND_SUCCEEDED + Nick %s is now released. +NICK_UNSUSPEND_FAILED + Couldn't release nick %s! + # FORBID responses NICK_FORBID_SYNTAX FORBID nickname [reason] @@ -3713,6 +3733,13 @@ NICK_SERVADMIN_HELP_FORBID Limited to Services admins. +NICK_SERVADMIN_HELP_SUSPEND + Syntax: SUSPEND nickname reason / UNSUSPEND nickname + + SUSPENDs / UNSUSPENDs a nickname from being identified to + + Limited to Services admins. + ########################################################################### # # ChanServ help messages diff --git a/src/bin/anoperc b/src/bin/anoperc index bc0704f12..0f3900f52 100755 --- a/src/bin/anoperc +++ b/src/bin/anoperc @@ -47,6 +47,13 @@ if [ ! -f $ANOPEBIN$ANOPROG ] ; then exit 1 fi +if [ "$UID" = "0" ] ; then + echo "**********************************"; + echo "Warning: Do not run anope as root!"; + echo "**********************************"; + exit 1 +fi + if [ "$1" = "start" ] ; then if [ -f $ANOPEBIN$PIDFILE ] ; then diff --git a/src/nickserv.c b/src/nickserv.c index 61a14c3b5..6d821b61c 100644 --- a/src/nickserv.c +++ b/src/nickserv.c @@ -86,6 +86,8 @@ static int do_getemail(User * u); static int do_sendpass(User * u); static int do_forbid(User * u); static int do_resend(User * u); +static int do_suspend(User * u); +static int do_unsuspend(User * u); /* Obsolete commands */ static int do_link(User * u); @@ -137,6 +139,8 @@ void moduleAddNickServCmds(void) { c = createCommand("GETPASS", do_getpass, is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_GETPASS, NICK_SERVADMIN_HELP_GETPASS); addCoreCommand(NICKSERV,c); c = createCommand("GETEMAIL", do_getemail, is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_GETEMAIL, NICK_SERVADMIN_HELP_GETEMAIL); addCoreCommand(NICKSERV,c); c = createCommand("FORBID", do_forbid, is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_FORBID, NICK_SERVADMIN_HELP_FORBID); addCoreCommand(NICKSERV,c); + c = createCommand("SUSPEND", do_suspend, is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_SUSPEND, NICK_SERVADMIN_HELP_SUSPEND); addCoreCommand(NICKSERV,c); + c = createCommand("UNSUSPEND",do_unsuspend,is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_SUSPEND, NICK_SERVADMIN_HELP_SUSPEND); addCoreCommand(NICKSERV,c); } /* *INDENT-ON* */ /*************************************************************************/ @@ -2541,6 +2545,8 @@ static int do_identify(User * u) } } else if (na->status & NS_VERBOTEN) { notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); + } else if (na->status & NS_SUSPENDED) { + notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick); } else if (nick_identified(u)) { notice_lang(s_NickServ, u, NICK_ALREADY_IDENTIFIED); } else if (!(res = check_password(pass, na->nc->pass))) { @@ -2845,6 +2851,8 @@ static int do_set(User * u) notice_lang(s_NickServ, u, NICK_NOT_REGISTERED); } else if (na->status & NS_VERBOTEN) { notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); + } else if (na->status & NS_SUSPENDED) { + notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick); } else if (!is_servadmin && !nick_identified(u)) { notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ); } else if (stricmp(cmd, "DISPLAY") == 0) { @@ -3283,6 +3291,12 @@ static int do_access(User * u) return MOD_CONT; } + if (na->status & NS_SUSPENDED) { + notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick); + return MOD_CONT; + } + + notice_lang(s_NickServ, u, NICK_ACCESS_LIST_X, mask); mask = strtok(NULL, " "); for (access = na->nc->access, i = 0; i < na->nc->accesscount; @@ -3305,6 +3319,9 @@ static int do_access(User * u) } else if (na->status & NS_VERBOTEN) { notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); + } else if (na->status & NS_SUSPENDED) { + notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick); + } else if (!nick_identified(u)) { notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ); @@ -3555,6 +3572,11 @@ static int do_info(User * u) notice_lang(s_NickServ, u, NICK_INFO_OPTIONS, *buf ? buf : getstring(u->na, NICK_INFO_OPT_NONE)); + if (na->status & NS_SUSPENDED) { + notice_lang(s_NickServ, u, NICK_INFO_SUSPENDED, + na->last_quit); + } + if (na->status & NS_NO_EXPIRE) { notice_lang(s_NickServ, u, NICK_INFO_NO_EXPIRE); } else { @@ -3916,6 +3938,8 @@ static int do_recover(User * u) notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick); } else if (na->status & NS_VERBOTEN) { notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); + } else if (na->status & NS_SUSPENDED) { + notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick); } else if (stricmp(nick, u->nick) == 0) { notice_lang(s_NickServ, u, NICK_NO_RECOVER_SELF); } else if (pass) { @@ -3960,6 +3984,8 @@ static int do_release(User * u) notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick); } else if (na->status & NS_VERBOTEN) { notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); + } else if (na->status & NS_SUSPENDED) { + notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick); } else if (!(na->status & NS_KILL_HELD)) { notice_lang(s_NickServ, u, NICK_RELEASE_NOT_HELD, nick); } else if (pass) { @@ -4004,6 +4030,8 @@ static int do_ghost(User * u) notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick); } else if (na->status & NS_VERBOTEN) { notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); + } else if (na->status & NS_SUSPENDED) { + notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick); } else if (stricmp(nick, u->nick) == 0) { notice_lang(s_NickServ, u, NICK_NO_GHOST_SELF); } else if (pass) { @@ -4278,6 +4306,122 @@ static int do_forbid(User * u) /*************************************************************************/ +static int do_suspend(User * u) +{ + + NickAlias *na; + char *nick = strtok(NULL, " "); + char *reason = strtok(NULL, ""); + + if (!nick || !reason) { + syntax_error(s_NickServ, u, "SUSPEND", NICK_SUSPEND_SYNTAX); + return MOD_CONT; + } + + if (readonly) { + notice_lang(s_NickServ, u, READ_ONLY_MODE); + return MOD_CONT; + } + + if ((na = findnick(nick)) == NULL) { + notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick); + return MOD_CONT; + } + + if (na->status & NS_VERBOTEN) { + notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); + return MOD_CONT; + } + + if (NSSecureAdmins && nick_is_services_admin(na->nc) + && !is_services_root(u)) { + notice_lang(s_NickServ, u, PERMISSION_DENIED); + return MOD_CONT; + } + + if (na) { + na->status |= NS_SUSPENDED; + na->nc->flags |= NI_SECURE; + na->status &= ~(NS_IDENTIFIED | NS_RECOGNIZED); + na->nc->flags &= ~(NI_KILLPROTECT | NI_KILL_QUICK | NI_KILL_IMMED); + na->last_quit = sstrdup(reason); + + if (WallForbid) + anope_cmd_global(s_NickServ, "\2%s\2 used SUSPEND on \2%s\2", + u->nick, nick); + + alog("%s: %s set SUSPEND for nick %s", s_NickServ, u->nick, nick); + notice_lang(s_NickServ, u, NICK_SUSPEND_SUCCEEDED, nick); + send_event(EVENT_NICK_FORBIDDEN, nick); + + } else { + + alog("%s: Valid SUSPEND for %s by %s failed", s_NickServ, nick, + u->nick); + notice_lang(s_NickServ, u, NICK_SUSPEND_FAILED, nick); + + } + return MOD_CONT; +} + +/*************************************************************************/ + +static int do_unsuspend(User * u) +{ + NickAlias *na; + char *nick = strtok(NULL, " "); + + if (!nick) { + syntax_error(s_NickServ, u, "UNSUSPEND", NICK_UNSUSPEND_SYNTAX); + return MOD_CONT; + } + + if (readonly) { + notice_lang(s_NickServ, u, READ_ONLY_MODE); + return MOD_CONT; + } + + if ((na = findnick(nick)) == NULL) { + notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick); + return MOD_CONT; + } + + if (na->status & NS_VERBOTEN) { + notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick); + return MOD_CONT; + } + if (NSSecureAdmins && nick_is_services_admin(na->nc) + && !is_services_root(u)) { + notice_lang(s_NickServ, u, PERMISSION_DENIED); + return MOD_CONT; + } + + if (na) { + na->status &= ~NS_SUSPENDED; + + if (WallForbid) + anope_cmd_global(s_NickServ, "\2%s\2 used UNSUSPEND on \2%s\2", + u->nick, nick); + + alog("%s: %s set UNSUSPEND for nick %s", s_NickServ, u->nick, + nick); + notice_lang(s_NickServ, u, NICK_UNSUSPEND_SUCCEEDED, nick); + send_event(EVENT_NICK_UNSUSPEND, nick); + + } else { + + alog("%s: Valid UNSUSPEND for %s by %s failed", s_NickServ, nick, + u->nick); + notice_lang(s_NickServ, u, NICK_UNSUSPEND_FAILED, nick); + + } + + return MOD_CONT; + +} + +/*************************************************************************/ + int ns_do_register(User * u) { return do_register(u); diff --git a/version.log b/version.log index b890ee5be..313f382cb 100644 --- a/version.log +++ b/version.log @@ -8,10 +8,14 @@ VERSION_MAJOR="1" VERSION_MINOR="7" VERSION_PATCH="8" -VERSION_BUILD="640" +VERSION_BUILD="641" # $Log$ # +# BUILD : 1.7.8 (641) +# BUGS : +# NOTES : Added SUSPEND and UNSUSPEND to NickServ. Also added running as root check to anoperc. +# # BUILD : 1.7.8 (640) # BUGS : 323 # NOTES : Fixed /ns update setting +a if you had rights to get +q but already had it |