ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/branches/8.2.x/modules/m_knock.c
Revision: 4617
Committed: Sun Sep 7 13:00:55 2014 UTC (10 years, 11 months ago) by michael
Content type: text/x-csrc
File size: 4659 byte(s)
Log Message:
- Renamed Channel::chname to Channel::name

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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
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->name);
76 return 0;
77 }
78
79 if (!((chptr->mode.mode & MODE_INVITEONLY) || chptr->mode.key[0] ||
80 (chptr->mode.limit && dlink_list_length(&chptr->members) >=
81 chptr->mode.limit)))
82 {
83 sendto_one_numeric(source_p, &me, ERR_CHANOPEN, chptr->name);
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->name);
95 return 0;
96 }
97
98 if ((source_p->connection->knock.last_attempt + ConfigChannel.knock_client_time) < CurrentTime)
99 source_p->connection->knock.count = 0;
100
101 if (source_p->connection->knock.count > ConfigChannel.knock_client_count)
102 {
103 sendto_one_numeric(source_p, &me, ERR_TOOMANYKNOCK, chptr->name, "user");
104 return 0;
105 }
106
107 if ((chptr->last_knock + ConfigChannel.knock_delay_channel) > CurrentTime)
108 {
109 sendto_one_numeric(source_p, &me, ERR_TOOMANYKNOCK, chptr->name, "channel");
110 return 0;
111 }
112
113 source_p->connection->knock.last_attempt = CurrentTime;
114 source_p->connection->knock.count++;
115
116 sendto_one_numeric(source_p, &me, RPL_KNOCKDLVR, chptr->name);
117 }
118
119 chptr->last_knock = CurrentTime;
120
121 sendto_channel_local(CHFL_CHANOP, 0, chptr,
122 ":%s NOTICE @%s :KNOCK: %s (%s [%s@%s] has asked for an invite)",
123 me.name, chptr->name, chptr->name,
124 source_p->name,
125 source_p->username,
126 source_p->host);
127
128 sendto_server(source_p, CAP_KNOCK, NOCAPS, ":%s KNOCK %s",
129 source_p->id, chptr->name);
130 return 0;
131 }
132
133 static struct Message knock_msgtab =
134 {
135 "KNOCK", NULL, 0, 0, 2, MAXPARA, MFLG_SLOW, 0,
136 { m_unregistered, m_knock, m_knock, m_ignore, m_knock, m_ignore }
137 };
138
139 static void
140 module_init(void)
141 {
142 mod_add_cmd(&knock_msgtab);
143 add_capability("KNOCK", CAP_KNOCK, 1);
144 add_isupport("KNOCK", NULL, -1);
145 }
146
147 static void
148 module_exit(void)
149 {
150 mod_del_cmd(&knock_msgtab);
151 delete_capability("KNOCK");
152 delete_isupport("KNOCK");
153 }
154
155 struct module module_entry =
156 {
157 .node = { NULL, NULL, NULL },
158 .name = NULL,
159 .version = "$Revision$",
160 .handle = NULL,
161 .modinit = module_init,
162 .modexit = module_exit,
163 .flags = 0
164 };

Properties

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