ignore_auth/ignore_auth.c
author Mikael Berthe <mikael@lilotux.net>
Sat, 13 Oct 2012 14:34:18 +0200
changeset 44 3f94f3522960
parent 40 5cd4b42ada91
permissions -rw-r--r--
[killpresence] Add a command /probe to send a presence probe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
     1
/*
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
     2
 *  Module "ignore_auth" -- ignore subscription requests
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
     3
 *
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
     4
 * Copyright 2010 Frank Zschockelt <mcabber@freakysoft.de>
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
     5
 *
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
     6
 * This module is free software; you can redistribute it and/or modify
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
     8
 * the Free Software Foundation; either version 2 of the License, or (at
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
     9
 * your option) any later version.
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    10
 *
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful, but
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    14
 * General Public License for more details.
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    15
 *
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    17
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    18
 */
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    19
#include <string.h>
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    20
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    21
#include <mcabber/commands.h>
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    22
#include <mcabber/hooks.h>
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    23
#include <mcabber/modules.h>
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    24
#include <mcabber/screen.h>
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    25
#include <mcabber/settings.h>
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    26
#include <mcabber/xmpp.h>
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    27
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    28
static void ignore_auth_init   (void);
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    29
static void ignore_auth_uninit (void);
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    30
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    31
/* Module description */
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    32
module_info_t info_ignore_auth = {
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    33
        .branch          = MCABBER_BRANCH,
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    34
        .api             = MCABBER_API_VERSION,
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    35
        .version         = MCABBER_VERSION,
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    36
        .description     = "ignore auth requests by specifying a jid regex",
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    37
        .requires        = NULL,
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    38
        .init            = ignore_auth_init,
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    39
        .uninit          = ignore_auth_uninit,
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    40
        .next            = NULL,
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    41
};
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    42
40
5cd4b42ada91 Sync with current mcabber API
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
    43
#ifdef MCABBER_API_HAVE_CMD_ID
5cd4b42ada91 Sync with current mcabber API
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
    44
static gpointer ignoreauth_cmdid;
5cd4b42ada91 Sync with current mcabber API
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
    45
#endif
5cd4b42ada91 Sync with current mcabber API
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
    46
38
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    47
GSList *regexlist = NULL;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    48
static guint ignore_auth_hid = 0;  /* Hook handler id */
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    49
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    50
static guint ignore_hh(const gchar *hookname, hk_arg_t *args, gpointer userdata)
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    51
{
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    52
  guint subscription;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    53
  const char *bjid = NULL, *type = NULL, *msg = NULL;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    54
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    55
  if (settings_opt_get_int("ignore_auth")) {
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    56
    int i;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    57
    for (i = 0; args[i].name; i++) {
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    58
      if (!strcmp(args[i].name, "type"))
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    59
        type = args[i].value;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    60
      if (!strcmp(args[i].name, "message"))
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    61
        msg = args[i].value;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    62
      if (!strcmp(args[i].name, "jid"))
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    63
        bjid = args[i].value;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    64
    }
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    65
    /* shouldn't happen */
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    66
    if (!bjid || !type || !msg)
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    67
      return HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    68
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    69
    subscription = roster_getsubscription(bjid);
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    70
    /* only ignore subscription requests when no subscription exists */
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    71
    if ((subscription == sub_none) && (!strcmp(type, "subscribe"))) {
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    72
      GSList *head;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    73
      int ignore_it = FALSE;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    74
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    75
      /* try to match against one of our regular expressions */
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    76
      for (head = regexlist; head && !ignore_it; head = g_slist_next(head)) {
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    77
        GMatchInfo *match_info;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    78
        g_regex_match(head->data, bjid, 0, &match_info);
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    79
        if (g_match_info_matches(match_info))
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    80
          ignore_it = TRUE;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    81
        g_match_info_free (match_info);
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    82
      }
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    83
      if(ignore_it) {
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    84
        xmpp_send_s10n(bjid, LM_MESSAGE_SUB_TYPE_UNSUBSCRIBED);
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    85
        scr_log_print(LPRINT_NORMAL, "Ignored auth request from %s (%s)",
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    86
                      bjid, msg);
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    87
        return HOOK_HANDLER_RESULT_NO_MORE_HANDLER_DROP_DATA;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    88
      }
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    89
    }
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    90
  }
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    91
  /* we're done, let the other handlers do their job! */
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    92
  return HOOK_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    93
}
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    94
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    95
/* ignore command handler */
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    96
static void do_ignore_auth(char *args)
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    97
{
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    98
  GRegex *new_regex;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
    99
  if (!args || !*args) {
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   100
    GSList *head;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   101
    for (head = regexlist; head; head = g_slist_next(head))
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   102
      scr_log_print(LPRINT_NORMAL, "Ignoring %s",
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   103
                    g_regex_get_pattern(head->data));
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   104
    return;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   105
  }
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   106
  new_regex = g_regex_new(args, G_REGEX_OPTIMIZE, 0, NULL);
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   107
  if (!new_regex) {
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   108
    scr_log_print(LPRINT_NORMAL, "That wasn't a glib regex");
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   109
    return;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   110
  }
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   111
  regexlist = g_slist_append(regexlist, new_regex);
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   112
}
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   113
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   114
/* Initialization */
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   115
static void ignore_auth_init(void)
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   116
{
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   117
  /* Add command */
40
5cd4b42ada91 Sync with current mcabber API
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
   118
#ifdef MCABBER_API_HAVE_CMD_ID
5cd4b42ada91 Sync with current mcabber API
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
   119
  ignoreauth_cmdid = cmd_add("ignore_auth", "", 0, 0, do_ignore_auth, NULL);
5cd4b42ada91 Sync with current mcabber API
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
   120
#else
38
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   121
  cmd_add("ignore_auth", "", 0, 0, do_ignore_auth, NULL);
40
5cd4b42ada91 Sync with current mcabber API
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
   122
#endif
38
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   123
  /* Add handler */
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   124
  ignore_auth_hid = hk_add_handler(ignore_hh, HOOK_SUBSCRIPTION,
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   125
                                   G_PRIORITY_DEFAULT_IDLE, NULL);
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   126
  settings_set(SETTINGS_TYPE_OPTION, "ignore_auth", "1");
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   127
}
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   128
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   129
/* Uninitialization */
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   130
static void ignore_auth_uninit(void)
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   131
{
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   132
  GSList *head;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   133
  /* Unregister command */
40
5cd4b42ada91 Sync with current mcabber API
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
   134
#ifdef MCABBER_API_HAVE_CMD_ID
5cd4b42ada91 Sync with current mcabber API
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
   135
  cmd_del(ignoreauth_cmdid);
5cd4b42ada91 Sync with current mcabber API
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
   136
#else
38
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   137
  cmd_del("ignore_auth");
40
5cd4b42ada91 Sync with current mcabber API
Mikael Berthe <mikael@lilotux.net>
parents: 38
diff changeset
   138
#endif
38
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   139
  /* Unregister event handler */
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   140
  hk_del_handler(HOOK_SUBSCRIPTION, ignore_auth_hid);
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   141
  /* unref every regex */
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   142
  for (head = regexlist; head; head = g_slist_next(head))
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   143
    g_regex_unref(head->data);
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   144
  g_slist_free(regexlist);
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   145
  regexlist = NULL;
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   146
}
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   147
3dad6bd6cde2 Add ignore_auth module
franky
parents:
diff changeset
   148
/* vim: set et cindent cinoptions=>2\:2(0 ts=2 sw=2:  For Vim users... */