summaryrefslogtreecommitdiff
path: root/src/actions.c
diff options
context:
space:
mode:
authorsjaz <sjaz@5417fbe8-f217-4b02-8779-1006273d7864>2009-01-01 12:00:20 +0000
committersjaz <sjaz@5417fbe8-f217-4b02-8779-1006273d7864>2009-01-01 12:00:20 +0000
commitc777c8d9aa7cd5c2e9a399727a7fa9985a77fb1c (patch)
tree9e996ae4a1bbb833cec036c5cd4d87a590149e85 /src/actions.c
Anope Stable Branch
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/stable@1902 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/actions.c')
-rw-r--r--src/actions.c270
1 files changed, 270 insertions, 0 deletions
diff --git a/src/actions.c b/src/actions.c
new file mode 100644
index 000000000..46617643b
--- /dev/null
+++ b/src/actions.c
@@ -0,0 +1,270 @@
+/* Various routines to perform simple actions.
+ *
+ * (C) 2003-2008 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 "services.h"
+
+/*************************************************************************/
+
+/**
+ * Note a bad password attempt for the given user. If they've used up
+ * their limit, toss them off.
+ * @param u the User to check
+ * @return void
+ */
+void bad_password(User * u)
+{
+ time_t now = time(NULL);
+
+ if (!u || !BadPassLimit) {
+ return;
+ }
+
+ if (BadPassTimeout > 0 && u->invalid_pw_time > 0
+ && u->invalid_pw_time < now - BadPassTimeout)
+ u->invalid_pw_count = 0;
+ u->invalid_pw_count++;
+ u->invalid_pw_time = now;
+ if (u->invalid_pw_count >= BadPassLimit) {
+ kill_user(NULL, u->nick, "Too many invalid passwords");
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Remove a user from the IRC network.
+ * @param source is the nick which should generate the kill, or NULL for a server-generated kill.
+ * @param user to remove
+ * @param reason for the kill
+ * @return void
+ */
+void kill_user(char *source, char *user, char *reason)
+{
+ char buf[BUFSIZE];
+
+ if (!user || !*user) {
+ return;
+ }
+ if (!source || !*source) {
+ source = ServerName;
+ }
+ if (!reason) {
+ reason = "";
+ }
+
+ snprintf(buf, sizeof(buf), "%s (%s)", source, reason);
+
+ anope_cmd_svskill(source, user, buf);
+
+ if (!ircd->quitonkill && finduser(user)) {
+ do_kill(user, buf);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Check and enforce SQlines
+ * @param mask of the sqline
+ * @param reason for the sqline
+ * @return void
+ */
+void sqline(char *mask, char *reason)
+{
+ int i;
+ Channel *c, *next;
+ char *av[3];
+ struct c_userlist *cu, *cunext;
+
+ if (ircd->chansqline) {
+ if (*mask == '#') {
+ anope_cmd_sqline(mask, reason);
+
+ for (i = 0; i < 1024; i++) {
+ for (c = chanlist[i]; c; c = next) {
+ next = c->next;
+
+ if (!match_wild_nocase(mask, c->name)) {
+ continue;
+ }
+ for (cu = c->users; cu; cu = cunext) {
+ cunext = cu->next;
+ if (is_oper(cu->user)) {
+ continue;
+ }
+ av[0] = c->name;
+ av[1] = cu->user->nick;
+ av[2] = reason;
+ anope_cmd_kick(s_OperServ, av[0], av[1],
+ "Q-Lined: %s", av[2]);
+ do_kick(s_ChanServ, 3, av);
+ }
+ }
+ }
+ } else {
+ anope_cmd_sqline(mask, reason);
+ }
+ } else {
+ anope_cmd_sqline(mask, reason);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Unban the nick from a channel
+ * @param ci channel info for the channel
+ * @param nick to remove the ban for
+ * @return void
+ */
+void common_unban(ChannelInfo * ci, char *nick)
+{
+ char *av[4];
+ char *host = NULL;
+ char buf[BUFSIZE];
+ int ac;
+ uint32 ip = 0;
+ User *u;
+ Entry *ban, *next;
+
+ if (!ci || !ci->c || !nick) {
+ return;
+ }
+
+ if (!(u = finduser(nick))) {
+ return;
+ }
+
+ if (!ci->c->bans || (ci->c->bans->count == 0))
+ return;
+
+ if (u->hostip == NULL) {
+ host = host_resolve(u->host);
+ /* we store the just resolved hostname so we don't
+ * need to do this again */
+ if (host) {
+ u->hostip = sstrdup(host);
+ }
+ } else {
+ host = sstrdup(u->hostip);
+ }
+ /* Convert the host to an IP.. */
+ if (host)
+ ip = str_is_ip(host);
+
+ if (ircd->svsmode_unban) {
+ anope_cmd_unban(ci->name, nick);
+ } else {
+ if (ircdcap->tsmode) {
+ snprintf(buf, BUFSIZE - 1, "%ld", (long int) time(NULL));
+ av[0] = ci->name;
+ av[1] = buf;
+ av[2] = sstrdup("-b");
+ ac = 4;
+ } else {
+ av[0] = ci->name;
+ av[1] = sstrdup("-b");
+ ac = 3;
+ }
+
+ for (ban = ci->c->bans->entries; ban; ban = next) {
+ next = ban->next;
+ if (entry_match(ban, u->nick, u->username, u->host, ip) ||
+ entry_match(ban, u->nick, u->username, u->vhost, ip)) {
+ anope_cmd_mode(whosends(ci), ci->name, "-b %s", ban->mask);
+ if (ircdcap->tsmode)
+ av[3] = ban->mask;
+ else
+ av[2] = ban->mask;
+
+ do_cmode(whosends(ci), ac, av);
+ }
+ }
+
+ if (ircdcap->tsmode)
+ free(av[2]);
+ else
+ free(av[1]);
+ }
+ /* host_resolve() sstrdup us this info so we gotta free it */
+ if (host) {
+ free(host);
+ }
+}
+
+/*************************************************************************/
+
+/**
+ * Prepare to set SVSMODE and update internal user modes
+ * @param u user to apply modes to
+ * @param modes the modes to set on the user
+ * @param arg the arguments for the user modes
+ * @return void
+ */
+void common_svsmode(User * u, char *modes, char *arg)
+{
+ int ac = 1;
+ char *av[2];
+
+ av[0] = modes;
+ if (arg) {
+ av[1] = arg;
+ ac++;
+ }
+
+ anope_cmd_svsmode(u, ac, av);
+ anope_set_umode(u, ac, av);
+}
+
+/*************************************************************************/
+
+/**
+ * Get the vhost for the user, if set else return the host, on ircds without
+ * vhost this returns the host
+ * @param u user to get the vhost for
+ * @return vhost
+ */
+char *common_get_vhost(User * u)
+{
+ if (!u)
+ return NULL;
+
+ if (ircd->vhostmode && (u->mode & ircd->vhostmode))
+ return u->vhost;
+ else if (ircd->vhost && u->vhost)
+ return u->vhost;
+ else
+ return u->host;
+}
+
+/*************************************************************************/
+
+/**
+ * Get the vident for the user, if set else return the ident, on ircds without
+ * vident this returns the ident
+ * @param u user to get info the vident for
+ * @return vident
+ */
+char *common_get_vident(User * u)
+{
+ if (!u)
+ return NULL;
+
+ if (ircd->vhostmode && (u->mode & ircd->vhostmode))
+ return u->vident;
+ else if (ircd->vident && u->vident)
+ return u->vident;
+ else
+ return u->username;
+}