ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/releases/8.2.0beta1/modules/m_knock.c
Revision: 3420
Committed: Tue Apr 29 15:13:10 2014 UTC (11 years, 3 months ago) by michael
Content type: text/x-csrc
File size: 4681 byte(s)
Log Message:
RELEASE TAG 8.2.0beta1

File Contents

# Content
1 /*
2 * ircd-hybrid: an advanced, lightweight Internet Relay Chat Daemon (ircd)
3 *
4 * Copyright (c) 1998-2014 ircd-hybrid development team
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19 * USA
20 */
21
22 /*! \file m_knock.c
23 * \brief Includes required functions for processing the KNOCK command.
24 * \version $Id$
25 */
26
27 #include "stdinc.h"
28 #include "list.h"
29 #include "channel.h"
30 #include "channel_mode.h"
31 #include "client.h"
32 #include "hash.h"
33 #include "irc_string.h"
34 #include "ircd.h"
35 #include "numeric.h"
36 #include "send.h"
37 #include "conf.h"
38 #include "parse.h"
39 #include "modules.h"
40 #include "server.h"
41 #include "user.h"
42
43
44 /*! \brief KNOCK command handler
45 *
46 * \param source_p Pointer to allocated Client struct from which the message
47 * originally comes from. This can be a local or remote client.
48 * \param parc Integer holding the number of supplied arguments.
49 * \param parv Argument vector where parv[0] .. parv[parc-1] are non-NULL
50 * pointers.
51 * \note Valid arguments for this command are:
52 * - parv[0] = command
53 * - parv[1] = channel name
54 */
55 static int
56 m_knock(struct Client *source_p, int parc, char *parv[])
57 {
58 struct Channel *chptr = NULL;
59
60 if (EmptyString(parv[1]))
61 {
62 sendto_one_numeric(source_p, &me, ERR_NEEDMOREPARAMS, "KNOCK");
63 return 0;
64 }
65
66 if ((chptr = hash_find_channel(parv[1])) == NULL)
67 {
68 sendto_one_numeric(source_p, &me, ERR_NOSUCHCHANNEL, parv[1]);
69 return 0;
70 }
71
72 /* Normal channel, just be sure they aren't on it */
73 if (IsMember(source_p, chptr))
74 {
75 sendto_one_numeric(source_p, &me, ERR_KNOCKONCHAN, chptr->chname);
76 return 0;
77 }
78
79 if (!((chptr->mode.mode & MODE_INVITEONLY) || (*chptr->mode.key) ||
80 (chptr->mode.limit && dlink_list_length(&chptr->members) >=
81 chptr->mode.limit)))
82 {
83 sendto_one_numeric(source_p, &me, ERR_CHANOPEN, chptr->chname);
84 return 0;
85 }
86
87 if (MyClient(source_p))
88 {
89 /*
90 * Don't allow a knock if the user is banned, or the channel is private
91 */
92 if (PrivateChannel(chptr) || is_banned(chptr, source_p))
93 {
94 sendto_one_numeric(source_p, &me, ERR_CANNOTSENDTOCHAN, chptr->chname);
95 return 0;
96 }
97
98 /*
99 * flood protection:
100 * allow one knock per user per knock_delay
101 * allow one knock per channel per knock_delay_channel
102 *
103 * we only limit local requests..
104 */
105 if ((source_p->localClient->last_knock + ConfigChannel.knock_delay) >
106 CurrentTime)
107 {
108 sendto_one_numeric(source_p, &me, ERR_TOOMANYKNOCK, chptr->chname, "user");
109 return 0;
110 }
111
112 if ((chptr->last_knock + ConfigChannel.knock_delay_channel) > CurrentTime)
113 {
114 sendto_one_numeric(source_p, &me, ERR_TOOMANYKNOCK, chptr->chname, "channel");
115 return 0;
116 }
117
118 source_p->localClient->last_knock = CurrentTime;
119 sendto_one_numeric(source_p, &me, RPL_KNOCKDLVR, chptr->chname);
120 }
121
122 chptr->last_knock = CurrentTime;
123
124 sendto_channel_local(CHFL_CHANOP, 0, chptr,
125 ":%s NOTICE @%s :KNOCK: %s (%s [%s@%s] has asked for an invite)",
126 me.name, chptr->chname, chptr->chname,
127 source_p->name,
128 source_p->username,
129 source_p->host);
130
131 sendto_server(source_p, CAP_KNOCK, NOCAPS, ":%s KNOCK %s",
132 source_p->id, chptr->chname);
133 return 0;
134 }
135
136 static struct Message knock_msgtab =
137 {
138 "KNOCK", 0, 0, 2, MAXPARA, MFLG_SLOW, 0,
139 { m_unregistered, m_knock, m_knock, m_ignore, m_knock, m_ignore }
140 };
141
142 static void
143 module_init(void)
144 {
145 mod_add_cmd(&knock_msgtab);
146 add_capability("KNOCK", CAP_KNOCK, 1);
147 add_isupport("KNOCK", NULL, -1);
148 }
149
150 static void
151 module_exit(void)
152 {
153 mod_del_cmd(&knock_msgtab);
154 delete_capability("KNOCK");
155 delete_isupport("KNOCK");
156 }
157
158 struct module module_entry =
159 {
160 .node = { NULL, NULL, NULL },
161 .name = NULL,
162 .version = "$Revision$",
163 .handle = NULL,
164 .modinit = module_init,
165 .modexit = module_exit,
166 .flags = 0
167 };

Properties

Name Value
svn:eol-style native
svn:keywords Id Revision