static int eb_oper(const char *data, struct Client *client_p, struct Channel *chptr, long mode_type) { (void)chptr; (void)mode_type; if (data != NULL) { struct PrivilegeSet *set = privilegeset_get(data); if (set != NULL && client_p->localClient->privset == set) return EXTBAN_MATCH; /* $o:admin or whatever */ return HasPrivilege(client_p, data) ? EXTBAN_MATCH : EXTBAN_NOMATCH; } return IsOper(client_p) ? EXTBAN_MATCH : EXTBAN_NOMATCH; }
static int do_grant(struct Client *source_p, struct Client *target_p, const char *new_privset) { int dooper = 0, dodeoper = 0; struct PrivilegeSet *privset = 0; if(!strcmp(new_privset, "deoper")) { if(!IsAnyOper(target_p)) { sendto_one_notice(source_p, ":You can't deoper someone who isn't an oper."); return 0; } new_privset = "default"; dodeoper = 1; sendto_one_notice(target_p, ":%s is deopering you.", source_p->name); sendto_realops_snomask(SNO_GENERAL, L_NETWIDE, "%s is deopering %s.", get_oper_name(source_p), target_p->name); } else { if(!(privset = privilegeset_get(new_privset))) { sendto_one_notice(source_p, ":There is no privilege set named '%s'.", new_privset); return 0; } if(privset == target_p->localClient->privset) { sendto_one_notice(source_p, ":%s already has privilege set %s.", target_p->name, target_p->localClient->privset->name); return 0; } } if(!dodeoper) { if(!IsAnyOper(target_p)) { sendto_one_notice(target_p, ":%s is opering you with privilege set %s", source_p->name, privset->name); 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); dooper = 1; } else { sendto_one_notice(target_p, ":%s is changing your privilege set to %s", source_p->name, privset->name); 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); } if(privilegeset_in_set(privset, "oper:staffer") && !IsOper(target_p)) { dooper = 1; if(IsHelper(target_p)) dodeoper = 1; } else if(!privilegeset_in_set(privset, "oper:staffer") && IsOper(target_p)) dooper = dodeoper = 1; } if(dodeoper) { const char *modeparv[4]; modeparv[0] = modeparv[1] = target_p->name; modeparv[2] = "-oO"; modeparv[3] = NULL; user_mode(target_p, target_p, 3, modeparv); } if(dooper) { struct oper_conf oper; oper.name = "<grant>"; oper.umodes = 0; oper.snomask = 0; oper.privset = privset; oper_up(target_p, &oper); } target_p->localClient->privset = privset; const char *modeparv[4]; modeparv[0] = modeparv[1] = target_p->name; modeparv[2] = "+"; modeparv[3] = NULL; user_mode(target_p, target_p, 3, modeparv); return 0; }