]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - src/modules/m_spanningtree/fmode.cpp
Purge the deprecated hash_map from existance.
[user/henk/code/inspircd.git] / src / modules / m_spanningtree / fmode.cpp
1 /*
2  * InspIRCd -- Internet Relay Chat Daemon
3  *
4  *   Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
5  *   Copyright (C) 2008 Robin Burchell <robin+git@viroteck.net>
6  *
7  * This file is part of InspIRCd.  InspIRCd is free software: you can
8  * redistribute it and/or modify it under the terms of the GNU General Public
9  * License as published by the Free Software Foundation, version 2.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
14  * details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20
21 #include "inspircd.h"
22 #include "commands.h"
23
24 #include "treesocket.h"
25 #include "treeserver.h"
26 #include "utils.h"
27
28 /** FMODE command - server mode with timestamp checks */
29 CmdResult CommandFMode::Handle(const std::vector<std::string>& params, User *who)
30 {
31         std::string sourceserv = who->server;
32
33         std::vector<std::string> modelist;
34         time_t TS = 0;
35         for (unsigned int q = 0; (q < params.size()) && (q < 64); q++)
36         {
37                 if (q == 1)
38                 {
39                         /* The timestamp is in this position.
40                          * We don't want to pass that up to the
41                          * server->client protocol!
42                          */
43                         TS = atoi(params[q].c_str());
44                 }
45                 else
46                 {
47                         /* Everything else is fine to append to the modelist */
48                         modelist.push_back(params[q]);
49                 }
50
51         }
52         /* Extract the TS value of the object, either User or Channel */
53         User* dst = ServerInstance->FindNick(params[0]);
54         Channel* chan = NULL;
55         time_t ourTS = 0;
56
57         if (dst)
58         {
59                 ourTS = dst->age;
60         }
61         else
62         {
63                 chan = ServerInstance->FindChan(params[0]);
64                 if (chan)
65                 {
66                         ourTS = chan->age;
67                 }
68                 else
69                         /* Oops, channel doesnt exist! */
70                         return CMD_FAILURE;
71         }
72
73         if (!TS)
74         {
75                 ServerInstance->Logs->Log("m_spanningtree",DEFAULT,"*** BUG? *** TS of 0 sent to FMODE. Are some services authors smoking craq, or is it 1970 again?. Dropped.");
76                 ServerInstance->SNO->WriteToSnoMask('d', "WARNING: The server %s is sending FMODE with a TS of zero. Total craq. Mode was dropped.", sourceserv.c_str());
77                 return CMD_INVALID;
78         }
79
80         /* TS is equal or less: Merge the mode changes into ours and pass on.
81          */
82         if (TS <= ourTS)
83         {
84                 bool merge = (TS == ourTS) && IS_SERVER(who);
85                 ServerInstance->Modes->Process(modelist, who, merge);
86                 return CMD_SUCCESS;
87         }
88         /* If the TS is greater than ours, we drop the mode and dont pass it anywhere.
89          */
90         return CMD_FAILURE;
91 }
92
93