summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2014-02-09 18:45:43 -0500
committerAdam <Adam@anope.org>2014-02-09 18:51:52 -0500
commit6d61a842866f3a32551f46c46609d688697f2f2e (patch)
treedfcc6b876368667e53e8751f62bda3ca1afa4dde
parentf6b8596c7bd195bf8d933c5ee8d28e5393d832a7 (diff)
Add an opertype priv "protected" to not allow services to kick a user.
Also classify ulines as protected
-rw-r--r--data/example.conf1
-rw-r--r--include/users.h2
-rw-r--r--modules/commands/bs_kick.cpp6
-rw-r--r--src/channels.cpp9
-rw-r--r--src/users.cpp7
5 files changed, 8 insertions, 17 deletions
diff --git a/data/example.conf b/data/example.conf
index 948700e8b..4762ad084 100644
--- a/data/example.conf
+++ b/data/example.conf
@@ -768,6 +768,7 @@ log
* nickserv/confirm - Can confirm other users nicknames
* nickserv/drop - Can drop other users nicks
* operserv/config - Can modify services's configuration
+ * protected - Can not be kicked from channels by Services
*
* Available commands:
* botserv/bot/del botserv/bot/add botserv/bot/change botserv/set/private
diff --git a/include/users.h b/include/users.h
index 0a4da4f4e..4b07b2f33 100644
--- a/include/users.h
+++ b/include/users.h
@@ -323,7 +323,7 @@ class CoreExport User : public virtual Base, public Extensible, public CommandRe
/** Check if the user is protected from kicks and negative mode changes
* @return true or false
*/
- bool IsProtected() const;
+ bool IsProtected();
/** Kill a user
* @param source The user/server doing the kill
diff --git a/modules/commands/bs_kick.cpp b/modules/commands/bs_kick.cpp
index 6c31f93cf..c08376e3c 100644
--- a/modules/commands/bs_kick.cpp
+++ b/modules/commands/bs_kick.cpp
@@ -1038,8 +1038,8 @@ class BSKick : public Module
void check_ban(ChannelInfo *ci, User *u, KickerData *kd, int ttbtype)
{
- /* Don't ban ulines */
- if (u->server->IsULined())
+ /* Don't ban ulines or protected users */
+ if (u->IsProtected())
return;
BanData::Data &bd = this->GetBanData(u, ci->c);
@@ -1065,7 +1065,7 @@ class BSKick : public Module
va_list args;
char buf[1024];
- if (!ci || !ci->bi || !ci->c || !u || u->server->IsULined() || !ci->c->FindUser(u))
+ if (!ci || !ci->bi || !ci->c || !u || u->IsProtected() || !ci->c->FindUser(u))
return;
Anope::string fmt = Language::Translate(u, message);
diff --git a/src/channels.cpp b/src/channels.cpp
index fe0e0600b..072634253 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -727,11 +727,7 @@ bool Channel::Kick(BotInfo *bi, User *u, const char *reason, ...)
vsnprintf(buf, BUFSIZE - 1, reason, args);
va_end(args);
- /* May not kick ulines */
- if (u->server->IsULined())
- return false;
-
- /* Do not kick protected clients */
+ /* Do not kick protected clients or Ulines */
if (u->IsProtected())
return false;
@@ -863,9 +859,6 @@ bool Channel::CheckKick(User *user)
/* We don't enforce services restrictions on clients on ulined services
* as this will likely lead to kick/rejoin floods. ~ Viper */
- if (user->server->IsULined())
- return false;
-
if (user->IsProtected())
return false;
diff --git a/src/users.cpp b/src/users.cpp
index 088aa5a67..b9564a2d5 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -642,12 +642,9 @@ ChanUserContainer *User::FindChannel(Channel *c) const
return NULL;
}
-bool User::IsProtected() const
+bool User::IsProtected()
{
- if (this->HasMode("PROTECTED") || this->HasMode("GOD"))
- return true;
-
- return false;
+ return this->HasMode("PROTECTED") || this->HasMode("GOD") || this->HasPriv("protected") || (this->server && this->server->IsULined());
}
void User::Kill(const MessageSource &source, const Anope::string &reason)