2 * Copyright (C) 2006 Jilles Tjoelker
3 * Copyright (C) 2006 Stephen Bennett <spb@gentoo.org>
17 #include "s_newconf.h"
19 static int mo_grant(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[]);
20 static int me_grant(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[]);
22 static int do_grant(struct Client
*source_p
, struct Client
*target_p
, const char *new_privset
);
24 struct Message grant_msgtab
= {
25 "GRANT", 0, 0, 0, MFLG_SLOW
,
26 { mg_ignore
, mg_not_oper
, mg_ignore
, mg_ignore
, {me_grant
, 3}, {mo_grant
, 3}}
29 mapi_clist_av1 grant_clist
[] = { &grant_msgtab
, NULL
};
31 DECLARE_MODULE_AV1(grant
, NULL
, NULL
, grant_clist
, NULL
, NULL
, "$Revision$");
34 mo_grant(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[])
36 struct Client
*target_p
;
38 if(!HasPrivilege(source_p
, "oper:grant"))
40 sendto_one(source_p
, form_str(ERR_NOPRIVS
), me
.name
, source_p
->name
, "grant");
44 target_p
= find_named_person(parv
[1]);
47 sendto_one_numeric(source_p
, ERR_NOSUCHNICK
,
48 form_str(ERR_NOSUCHNICK
), parv
[1]);
52 if (MyClient(target_p
))
54 do_grant(source_p
, target_p
, parv
[2]);
58 sendto_one(target_p
, ":%s ENCAP %s GRANT %s %s",
59 get_id(source_p
, target_p
), target_p
->servptr
->name
,
60 get_id(target_p
, target_p
), parv
[2]);
66 static int me_grant(struct Client
*client_p
, struct Client
*source_p
, int parc
, const char *parv
[])
68 struct Client
*target_p
;
70 target_p
= find_person(parv
[1]);
73 sendto_one_numeric(source_p
, ERR_NOSUCHNICK
,
74 form_str(ERR_NOSUCHNICK
), parv
[1]);
78 if(!find_shared_conf(source_p
->username
, source_p
->host
,
79 source_p
->servptr
->name
, SHARED_GRANT
))
81 sendto_one(source_p
, ":%s NOTICE %s :You don't have an appropriate shared"
82 "block to grant privilege on this server.", me
.name
, source_p
->name
);
86 do_grant(source_p
, target_p
, parv
[2]);
92 static int do_grant(struct Client
*source_p
, struct Client
*target_p
, const char *new_privset
)
94 int dooper
= 0, dodeoper
= 0;
95 struct PrivilegeSet
*privset
= 0;
97 if (!strcmp(new_privset
, "deoper"))
99 if (!IsOper(target_p
))
101 sendto_one_notice(source_p
, ":You can't deoper someone who isn't an oper.");
104 new_privset
= "default";
107 sendto_one_notice(target_p
, ":%s is deopering you.", source_p
->name
);
108 sendto_realops_snomask(SNO_GENERAL
, L_NETWIDE
, "%s is deopering %s.", get_oper_name(source_p
), target_p
->name
);
112 if (!(privset
= privilegeset_get(new_privset
)))
114 sendto_one_notice(source_p
, ":There is no privilege set named '%s'.", new_privset
);
118 if (privset
== target_p
->localClient
->privset
)
120 sendto_one_notice(source_p
, ":%s already has privilege set %s.", target_p
->name
, target_p
->localClient
->privset
->name
);
127 if (!IsOper(target_p
))
129 sendto_one_notice(target_p
, ":%s is opering you with privilege set %s", source_p
->name
, privset
->name
);
130 sendto_realops_snomask(SNO_GENERAL
, L_NETWIDE
, "%s is opering %s with privilege set %s", get_oper_name(source_p
), target_p
->name
, privset
->name
);
135 sendto_one_notice(target_p
, ":%s is changing your privilege set to %s", source_p
->name
, privset
->name
);
136 sendto_realops_snomask(SNO_GENERAL
, L_NETWIDE
, "%s is changing the privilege set of %s to %s", get_oper_name(source_p
), target_p
->name
, privset
->name
);
142 const char *modeparv
[4];
143 modeparv
[0] = modeparv
[1] = target_p
->name
;
146 user_mode(target_p
, target_p
, 3, modeparv
);
151 struct oper_conf oper
;
152 oper
.name
= "<grant>";
155 oper
.privset
= privset
;
157 oper_up(target_p
, &oper
);
160 target_p
->localClient
->privset
= privset
;
161 const char *modeparv
[4];
162 modeparv
[0] = modeparv
[1] = target_p
->name
;
165 user_mode(target_p
, target_p
, 3, modeparv
);