diff options
| author | Adam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864> | 2009-10-30 02:38:06 +0000 |
|---|---|---|
| committer | Adam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864> | 2009-10-30 02:38:06 +0000 |
| commit | 987f371c0bd02120e9ed8740b064e9fa02b83876 (patch) | |
| tree | 26c031410f13d638670096ca219d59c6c19d306e /src/chanserv.c | |
| parent | 6a9fa9f4d2ead592eb51a014491ce3aaee2029e8 (diff) | |
Removed channel passwords and added /chanserv QOP command to add additional channel founders, aswell as access level 10000
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@2599 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/chanserv.c')
| -rw-r--r-- | src/chanserv.c | 202 |
1 files changed, 94 insertions, 108 deletions
diff --git a/src/chanserv.c b/src/chanserv.c index a6aee4aaf..991b708ef 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -59,6 +59,9 @@ static int def_levels[][2] = { { CA_BAN, 5 }, { CA_TOPIC, ACCESS_INVALID }, { CA_INFO, ACCESS_INVALID }, + { CA_AUTOOWNER, ACCESS_INVALID }, + { CA_OWNER, ACCESS_INVALID }, + { CA_OWNERME, ACCESS_INVALID }, { -1 } }; @@ -67,7 +70,7 @@ LevelInfo levelinfo[] = { { CA_AUTODEOP, "AUTODEOP", CHAN_LEVEL_AUTODEOP }, { CA_AUTOHALFOP, "AUTOHALFOP", CHAN_LEVEL_AUTOHALFOP }, { CA_AUTOOP, "AUTOOP", CHAN_LEVEL_AUTOOP }, - { CA_AUTOPROTECT, "", CHAN_LEVEL_AUTOPROTECT }, + { CA_AUTOPROTECT, "AUTOPROTECT", CHAN_LEVEL_AUTOPROTECT }, { CA_AUTOVOICE, "AUTOVOICE", CHAN_LEVEL_AUTOVOICE }, { CA_NOJOIN, "NOJOIN", CHAN_LEVEL_NOJOIN }, { CA_SIGNKICK, "SIGNKICK", CHAN_LEVEL_SIGNKICK }, @@ -87,8 +90,8 @@ LevelInfo levelinfo[] = { { CA_INVITE, "INVITE", CHAN_LEVEL_INVITE }, { CA_OPDEOP, "OPDEOP", CHAN_LEVEL_OPDEOP }, { CA_OPDEOPME, "OPDEOPME", CHAN_LEVEL_OPDEOPME }, - { CA_PROTECT, "", CHAN_LEVEL_PROTECT }, - { CA_PROTECTME, "", CHAN_LEVEL_PROTECTME }, + { CA_PROTECT, "PROTECT", CHAN_LEVEL_PROTECT }, + { CA_PROTECTME, "PROTECTME", CHAN_LEVEL_PROTECTME }, { CA_TOPIC, "TOPIC", CHAN_LEVEL_TOPIC }, { CA_UNBAN, "UNBAN", CHAN_LEVEL_UNBAN }, { CA_VOICE, "VOICE", CHAN_LEVEL_VOICE }, @@ -100,6 +103,9 @@ LevelInfo levelinfo[] = { { CA_GREET, "GREET", CHAN_LEVEL_GREET }, { CA_NOKICK, "NOKICK", CHAN_LEVEL_NOKICK }, { CA_SAY, "SAY", CHAN_LEVEL_SAY }, + { CA_AUTOOWNER, "AUTOOWNER", CHAN_LEVEL_AUTOOWNER }, + { CA_OWNER, "OWNER", CHAN_LEVEL_OWNER }, + { CA_OWNERME, "OWNERME", CHAN_LEVEL_OWNERME }, { -1 } }; int levelinfo_maxwidth = 0; @@ -381,7 +387,10 @@ void load_cs_dbase() } else { ci->successor = NULL; } - SAFE(read = read_buffer(ci->founderpass, f)); + + char nothing[PASSMAX]; + SAFE(read = read_buffer(nothing, f)); // XXX founder pass was removed.. just here so it works + SAFE(read_string(&ci->desc, f)); if (!ci->desc) ci->desc = sstrdup(""); @@ -646,7 +655,11 @@ void save_cs_dbase() SAFE(write_string(ci->successor->display, f)); else SAFE(write_string(NULL, f)); - SAFE(written = write_buffer(ci->founderpass, f)); + + char nothing[PASSMAX]; /* founder passwords were removed! */ + strcpy(nothing, "nothing\0"); + SAFE(written = write_buffer(nothing, f)); + SAFE(write_string(ci->desc, f)); SAFE(write_string(ci->url, f)); SAFE(write_string(ci->email, f)); @@ -1107,8 +1120,8 @@ int check_should_owner(User * user, char *chan) if (!ci || (ci->flags & CI_FORBIDDEN) || *chan == '+') return 0; - if (((ci->flags & CI_SECUREFOUNDER) && is_real_founder(user, ci)) - || (!(ci->flags & CI_SECUREFOUNDER) && is_founder(user, ci))) { + if (((ci->flags & CI_SECUREFOUNDER) && IsRealFounder(user, ci)) + || (!(ci->flags & CI_SECUREFOUNDER) && IsFounder(user, ci))) { ircdproto->SendMode(whosends(ci), chan, "+o%s %s %s", cm->ModeChar, user->nick, user->nick); return 1; @@ -1613,7 +1626,7 @@ int check_access(User * user, ChannelInfo * ci, int what) ci->last_used = time(NULL); if (what == ACCESS_FOUNDER) - return is_founder(user, ci); + return IsFounder(user, ci); if (level >= ACCESS_FOUNDER) return (what == CA_AUTODEOP || what == CA_NOJOIN) ? 0 : 1; /* Hacks to make flags work */ @@ -1691,8 +1704,6 @@ int delchan(ChannelInfo * ci) { unsigned i; NickCore *nc; - User *u; - struct u_chaninfolist *cilist, *cilist_next; if (!ci) { if (debug) { @@ -1726,34 +1737,6 @@ int delchan(ChannelInfo * ci) alog("debug: delchan() Bot has been removed moving on"); } - if (debug >= 2) { - alog("debug: delchan() founder cleanup"); - } - for (i = 0; i < 1024; i++) { - for (u = userlist[i]; u; u = u->next) { - cilist = u->founder_chans; - while (cilist) { - cilist_next = cilist->next; - if (cilist->chan == ci) { - if (debug) - alog("debug: Dropping founder login of %s for %s", - u->nick, ci->name); - if (cilist->next) - cilist->next->prev = cilist->prev; - if (cilist->prev) - cilist->prev->next = cilist->next; - else - u->founder_chans = cilist->next; - delete cilist; - } - cilist = cilist_next; - } - } - } - if (debug >= 2) { - alog("debug: delchan() founder cleanup done"); - } - if (ci->next) ci->next->prev = ci->prev; if (ci->prev) @@ -1862,68 +1845,67 @@ void reset_levels(ChannelInfo * ci) /*************************************************************************/ -/* Does the given user have founder access to the channel? */ - -int is_founder(User * user, ChannelInfo * ci) +/** Is the user a channel founder? (owner) + * @param user The user + * @param ci The channel + * @return true or false + */ +bool IsFounder(User *user, ChannelInfo *ci) { - if (!user || !ci) { - return 0; - } - - if (user->isSuperAdmin) { - return 1; - } - - if (user->nc && user->nc == ci->founder) { - if ((nick_identified(user) - || (user->IsRecognized() && !(ci->flags & CI_SECURE)))) - return 1; - } - if (is_identified(user, ci)) - return 1; - return 0; -} + ChanAccess *access = NULL; -/*************************************************************************/ + if (!user || !ci) + return false; -int is_real_founder(User * user, ChannelInfo * ci) -{ - if (user->isSuperAdmin) { - return 1; + if (IsRealFounder(user, ci)) + return true; + + if (user->nc) + access = ci->GetAccess(user->nc); + else + { + NickAlias *na = findnick(user->nick); + if (na) + access = ci->GetAccess(na->nc); } + + /* If they're QOP+ and theyre identified or theyre recognized and the channel isn't secure */ + if (access && access->level >= ACCESS_QOP && (user->nc || (user->IsRecognized() && !(ci->flags & CI_SECURE)))) + return true; - if (user->nc && user->nc == ci->founder) { - if ((nick_identified(user) - || (user->IsRecognized() && !(ci->flags & CI_SECURE)))) - return 1; - } - return 0; + return false; } -/*************************************************************************/ +/** Is the user the real founder? + * @param user The user + * @param ci The channel + * @return true or false + */ +bool IsRealFounder(User *user, ChannelInfo *ci) +{ + if (!user || !ci) + return false; -/* Has the given user password-identified as founder for the channel? */ + if (user->isSuperAdmin) + return true; -int is_identified(User * user, ChannelInfo * ci) -{ - struct u_chaninfolist *c; + if (user->nc && user->nc == ci->founder) + return true; - for (c = user->founder_chans; c; c = c->next) { - if (c->chan == ci) - return 1; - } - return 0; + return false; } -/*************************************************************************/ - -/* Return the access level the given user has on the channel. If the - * channel doesn't exist, the user isn't on the access list, or the channel - * is CS_SECURE and the user hasn't IDENTIFY'd with NickServ, return 0. */ -int get_access(User * user, ChannelInfo * ci) +/** Return the access level for the user on the channel. + * If the channel doesn't exist, the user isn't on the access list, or the + * channel is CI_SECURE and the user isn't identified, return 0 + * @param user The user + * @param ci The cahnnel + * @return The level, or 0 + */ +int get_access(User *user, ChannelInfo *ci) { - ChanAccess *access; + ChanAccess *access = NULL; if (!ci || !user) return 0; @@ -1931,20 +1913,24 @@ int get_access(User * user, ChannelInfo * ci) /* SuperAdmin always has highest level */ if (user->isSuperAdmin) return ACCESS_SUPERADMIN; - - if (is_founder(user, ci)) + + if (IsFounder(user, ci)) return ACCESS_FOUNDER; - - if (!user->nc) - return 0; - - if (nick_identified(user) - || (user->IsRecognized() && !(ci->flags & CI_SECURE))) - if ((access = ci->GetAccess(user->nc))) - return access->level; - + if (nick_identified(user)) - return 0; + { + access = ci->GetAccess(user->nc); + if (access) + return access->level; + } + else + { + NickAlias *na = findnick(user->nick); + if (na) + access = ci->GetAccess(na->nc); + if (access && user->IsRecognized() && !(ci->flags & CI_SECURE)) + return access->level; + } return 0; } @@ -1958,7 +1944,7 @@ void update_cs_lastseen(User * user, ChannelInfo * ci) if (!ci || !user || !user->nc) return; - if (is_founder(user, ci) || nick_identified(user) + if (IsFounder(user, ci) || nick_identified(user) || (user->IsRecognized() && !(ci->flags & CI_SECURE))) if ((access = ci->GetAccess(user->nc))) access->last_seen = time(NULL); @@ -2031,22 +2017,22 @@ const char *get_xop_level(int level) { ChannelMode *halfop = ModeManager::FindChannelModeByName(CMODE_HALFOP); - if (level < ACCESS_VOP) { + if (level < ACCESS_VOP) return "Err"; - } else if (halfop && level < ACCESS_HOP) { + else if (halfop && level < ACCESS_HOP) return "VOP"; - } else if (!halfop && level < ACCESS_AOP) { + else if (!halfop && level < ACCESS_AOP) return "VOP"; - } else if (halfop && level < ACCESS_AOP) { + else if (halfop && level < ACCESS_AOP) return "HOP"; - } else if (level < ACCESS_SOP) { + else if (level < ACCESS_SOP) return "AOP"; - } else if (level < ACCESS_FOUNDER) { + else if (level < ACCESS_QOP) return "SOP"; - } else { + else if (level < ACCESS_FOUNDER) + return "QOP"; + else return "Founder"; - } - } /*************************************************************************/ |
