1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#include <string>
#include <vector>
#include "inspircd_config.h"
#include "configreader.h"
#include "hash_map.h"
#include "inspircd.h"
#include "mode.h"
#include "channels.h"
#include "users.h"
#include "helperfuncs.h"
#include "message.h"
#include "commands.h"
#include "modules.h"
#include "inspstring.h"
#include "hashcomp.h"
#include "modes/cmode_o.h"
extern InspIRCd* ServerInstance;
extern std::vector<Module*> modules;
extern std::vector<ircd_module*> factory;
extern int MODCOUNT;
extern time_t TIME;
ModeChannelOp::ModeChannelOp() : ModeHandler('o', 1, 1, true, MODETYPE_CHANNEL, false)
{
}
ModePair ModeChannelOp::ModeSet(userrec* source, userrec* dest, chanrec* channel, const std::string ¶meter)
{
userrec* x = ServerInstance->FindNick(parameter);
if (x)
{
if (channel->GetStatus(x) == STATUS_OP)
{
return std::make_pair(true, x->nick);
}
else
{
return std::make_pair(false, parameter);
}
}
return std::make_pair(false, parameter);
}
ModeAction ModeChannelOp::OnModeChange(userrec* source, userrec* dest, chanrec* channel, std::string ¶meter, bool adding)
{
int status = channel->GetStatus(source);
/* Call the correct method depending on wether we're adding or removing the mode */
if (adding)
{
parameter = this->AddOp(source, parameter.c_str(), channel, status);
}
else
{
parameter = this->DelOp(source, parameter.c_str(), channel, status);
}
/* If the method above 'ate' the parameter by reducing it to an empty string, then
* it won't matter wether we return ALLOW or DENY here, as an empty string overrides
* the return value and is always MODEACTION_DENY if the mode is supposed to have
* a parameter.
*/
return MODEACTION_ALLOW;
}
std::string ModeChannelOp::AddOp(userrec *user,const char* dest,chanrec *chan,int status)
{
userrec *d = ModeParser::SanityChecks(user,dest,chan,status);
if (d)
{
if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_OP));
if (MOD_RESULT == ACR_DENY)
return "";
if (MOD_RESULT == ACR_DEFAULT)
{
if ((status < STATUS_OP) && (!is_uline(user->server)))
{
user->WriteServ("482 %s %s :You're not a channel operator",user->nick, chan->name);
return "";
}
}
}
return ModeParser::Grant(d,chan,UCMODE_OP);
}
return "";
}
std::string ModeChannelOp::DelOp(userrec *user,const char *dest,chanrec *chan,int status)
{
userrec *d = ModeParser::SanityChecks(user,dest,chan,status);
if (d)
{
if (IS_LOCAL(user))
{
int MOD_RESULT = 0;
log(DEBUG,"Call OnAccessCheck for AC_DEOP");
FOREACH_RESULT(I_OnAccessCheck,OnAccessCheck(user,d,chan,AC_DEOP));
log(DEBUG,"Returns %d",MOD_RESULT);
if (MOD_RESULT == ACR_DENY)
return "";
if (MOD_RESULT == ACR_DEFAULT)
{
if ((status < STATUS_OP) && (!is_uline(user->server)) && (IS_LOCAL(user)))
{
user->WriteServ("482 %s %s :You are not a channel operator",user->nick, chan->name);
return "";
}
}
}
return ModeParser::Revoke(d,chan,UCMODE_OP);
}
return "";
}
|