ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/ircd-hybrid/trunk/modules/m_tburst.c
Revision: 1751
Committed: Wed Jan 16 18:30:52 2013 UTC (12 years, 7 months ago) by michael
Content type: text/x-csrc
File size: 4558 byte(s)
Log Message:
- Forward-port -r1750 [IMPORTANT: nick and topic lengths are now configurable
  via ircd.conf. A max_nick_length, as well as a max_topic_length configuration
  option can now be found in the serverinfo{} block]
- OpenSSL 0.9.8s and higher is now required in order to enable ssl support

File Contents

# Content
1 /* modules/m_tburst.c
2 * Copyright (C) 2002, 2003, 2004, 2005 Hybrid Development Team
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 * 1.Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2.Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3.The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
25 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $Id$
29 */
30
31 #include "stdinc.h"
32 #include "client.h"
33 #include "ircd.h"
34 #include "send.h"
35 #include "modules.h"
36 #include "hash.h"
37 #include "s_serv.h"
38 #include "conf.h"
39 #include "parse.h"
40
41
42 /* ms_tburst()
43 *
44 * parv[0] = sender prefix
45 * parv[1] = channel timestamp
46 * parv[2] = channel
47 * parv[3] = topic timestamp
48 * parv[4] = topic setter
49 * parv[5] = topic
50 */
51 static void
52 ms_tburst(struct Client *client_p, struct Client *source_p,
53 int parc, char *parv[])
54 {
55 struct Channel *chptr = NULL;
56 int accept_remote = 0;
57 time_t remote_channel_ts = atol(parv[1]);
58 time_t remote_topic_ts = atol(parv[3]);
59 const char *topic = parv[5];
60 const char *setby = parv[4];
61
62 /*
63 * Do NOT test parv[5] for an empty string and return if true!
64 * parv[5] CAN be an empty string, i.e. if the other side wants
65 * to unset our topic. Don't forget: an empty topic is also a
66 * valid topic.
67 */
68
69
70 if ((chptr = hash_find_channel(parv[2])) == NULL)
71 return;
72
73 /*
74 * The logic for accepting and rejecting channel topics was
75 * always a bit hairy, so now we got exactly 2 cases where
76 * we would accept a bursted topic
77 *
78 * Case 1:
79 * The TS of the remote channel is older than ours
80 * Case 2:
81 * The TS of the remote channel is equal to ours AND
82 * the TS of the remote topic is newer than ours
83 */
84 if (HasFlag(source_p, FLAGS_SERVICE))
85 accept_remote = 1;
86 else if (remote_channel_ts < chptr->channelts)
87 accept_remote = 1;
88 else if (remote_channel_ts == chptr->channelts)
89 if (remote_topic_ts > chptr->topic_time)
90 accept_remote = 1;
91
92 if (accept_remote)
93 {
94 int topic_differs = strncmp(chptr->topic, topic, sizeof(chptr->topic) - 1);
95 int hidden_server = (ConfigServerHide.hide_servers || IsHidden(source_p));
96
97 set_channel_topic(chptr, topic, setby, remote_topic_ts, !!MyClient(source_p));
98
99 sendto_server(source_p, CAP_TBURST|CAP_TS6, NOCAPS,
100 ":%s TBURST %s %s %s %s :%s",
101 ID(source_p), parv[1], parv[2], parv[3], setby, topic);
102 sendto_server(source_p, CAP_TBURST, CAP_TS6,
103 ":%s TBURST %s %s %s %s :%s",
104 source_p->name, parv[1], parv[2], parv[3], setby, topic);
105
106 if (topic_differs)
107 sendto_channel_local(ALL_MEMBERS, 0, chptr, ":%s TOPIC %s :%s",
108 hidden_server ? me.name : source_p->name,
109 chptr->chname, chptr->topic);
110 }
111 }
112
113 static struct Message tburst_msgtab = {
114 "TBURST", 0, 0, 6, MAXPARA, MFLG_SLOW, 0,
115 { m_ignore, m_ignore, ms_tburst, m_ignore, m_ignore, m_ignore }
116 };
117
118 static void
119 module_init(void)
120 {
121 mod_add_cmd(&tburst_msgtab);
122 add_capability("TBURST", CAP_TBURST, 1);
123 }
124
125 static void
126 module_exit(void)
127 {
128 mod_del_cmd(&tburst_msgtab);
129 delete_capability("TBURST");
130 }
131
132 struct module module_entry = {
133 .node = { NULL, NULL, NULL },
134 .name = NULL,
135 .version = "$Revision$",
136 .handle = NULL,
137 .modinit = module_init,
138 .modexit = module_exit,
139 .flags = 0
140 };

Properties

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