static void check_registration(hook_user_register_check_t *hdata)
{
char buf[1024];
const char *user;
const char *domain;
int count;
if (hdata->approved)
return;
strlcpy(buf, hdata->email, sizeof buf);
user = strtok(buf, "@");
domain = strtok(NULL, "@");
count = count_mx(domain);
if (count > 0)
{
/* there are MX records for this domain */
snoop("REGISTER: mxcheck: %d MX records for %s", count, domain);
}
else
{
/* no MX records or error */
struct hostent *host;
/* attempt to resolve host (fallback to A) */
if((host = gethostbyname(domain)) == NULL)
{
snoop("REGISTER: mxcheck: no A/MX records for %s - "
"REGISTER failed", domain);
command_fail(hdata->si, fault_noprivs, "Sorry, \2%s\2 does not exist, "
"I can't send mail there. Please check and try again.", domain);
hdata->approved = 1;
return;
}
}
}
static void cs_cmd_set_fantasy(sourceinfo_t *si, int parc, char *parv[])
{
mychan_t *mc;
if (!(mc = mychan_find(parv[0])))
{
command_fail(si, fault_nosuch_target, _("Channel \2%s\2 is not registered."), parv[0]);
return;
}
if (!parv[1])
{
command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "SET FANTASY");
return;
}
if (!chanacs_source_has_flag(mc, si, CA_SET))
{
command_fail(si, fault_noprivs, _("You are not authorized to perform this command."));
return;
}
if (!strcasecmp("ON", parv[1]))
{
metadata_t *md = metadata_find(mc, "disable_fantasy");
if (!md)
{
command_fail(si, fault_nochange, _("The \2%s\2 flag is already set for channel \2%s\2."), "FANTASY", mc->name);
return;
}
metadata_delete(mc, "disable_fantasy");
logcommand(si, CMDLOG_SET, "SET:FANTASY:ON: \2%s\2", mc->name);
verbose(mc, _("\2%s\2 enabled the FANTASY flag"), get_source_name(si));
command_success_nodata(si, _("The \2%s\2 flag has been set for channel \2%s\2."), "FANTASY", mc->name);
return;
}
else if (!strcasecmp("OFF", parv[1]))
{
metadata_t *md = metadata_find(mc, "disable_fantasy");
if (md)
{
command_fail(si, fault_nochange, _("The \2%s\2 flag is not set for channel \2%s\2."), "FANTASY", mc->name);
return;
}
metadata_add(mc, "disable_fantasy", "on");
logcommand(si, CMDLOG_SET, "SET:FANTASY:OFF: \2%s\2", mc->name);
verbose(mc, _("\2%s\2 disabled the FANTASY flag"), get_source_name(si));
command_success_nodata(si, _("The \2%s\2 flag has been removed for channel \2%s\2."), "FANTASY", mc->name);
return;
}
else
{
command_fail(si, fault_badparams, STR_INVALID_PARAMS, "FANTASY");
return;
}
}
static void cs_cmd_set_guard(sourceinfo_t *si, int parc, char *parv[])
{
mychan_t *mc;
if (!(mc = mychan_find(parv[0])))
{
command_fail(si, fault_nosuch_target, _("Channel \2%s\2 is not registered."), parv[0]);
return;
}
if (!parv[1])
{
command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "SET GUARD");
return;
}
if (!chanacs_source_has_flag(mc, si, CA_SET))
{
command_fail(si, fault_noprivs, _("You are not authorized to perform this command."));
return;
}
if (!strcasecmp("ON", parv[1]))
{
if (MC_GUARD & mc->flags)
{
command_fail(si, fault_nochange, _("The \2%s\2 flag is already set for channel \2%s\2."), "GUARD", mc->name);
return;
}
if (metadata_find(mc, "private:botserv:bot-assigned") &&
module_find_published("botserv/main"))
{
command_fail(si, fault_noprivs, _("Channel \2%s\2 already has a BotServ bot assigned to it. You need to unassign it first."), mc->name);
return;
}
logcommand(si, CMDLOG_SET, "SET:GUARD:ON: \2%s\2", mc->name);
mc->flags |= MC_GUARD;
if (!(mc->flags & MC_INHABIT))
join(mc->name, chansvs.nick);
command_success_nodata(si, _("The \2%s\2 flag has been set for channel \2%s\2."), "GUARD", mc->name);
return;
}
else if (!strcasecmp("OFF", parv[1]))
{
if (!(MC_GUARD & mc->flags))
{
command_fail(si, fault_nochange, _("The \2%s\2 flag is not set for channel \2%s\2."), "GUARD", mc->name);
return;
}
logcommand(si, CMDLOG_SET, "SET:GUARD:OFF: \2%s\2", mc->name);
mc->flags &= ~MC_GUARD;
if (mc->chan != NULL && !(mc->flags & MC_INHABIT) && !(mc->chan->flags & CHAN_LOG))
part(mc->name, chansvs.nick);
command_success_nodata(si, _("The \2%s\2 flag has been removed for channel \2%s\2."), "GUARD", mc->name);
return;
}
else
{
command_fail(si, fault_badparams, STR_INVALID_PARAMS, "GUARD");
return;
}
}
static void cs_cmd_owner(sourceinfo_t *si, int parc, char *parv[])
{
char *chan = parv[0];
char *nick = parv[1];
mychan_t *mc;
user_t *tu;
chanuser_t *cu;
char *nicklist;
char *strtokctx;
if (ircd->uses_owner == false)
{
command_fail(si, fault_noprivs, _("The IRCd software you are running does not support this feature."));
return;
}
if (!chan)
{
command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "OWNER");
command_fail(si, fault_needmoreparams, _("Syntax: OWNER <#channel> [nickname] [...]"));
return;
}
mc = mychan_find(chan);
if (!mc)
{
command_fail(si, fault_nosuch_target, _("Channel \2%s\2 is not registered."), chan);
return;
}
if (!chanacs_source_has_flag(mc, si, CA_USEOWNER))
{
command_fail(si, fault_noprivs, _("You are not authorized to perform this operation."));
return;
}
if (metadata_find(mc, "private:close:closer"))
{
command_fail(si, fault_noprivs, _("\2%s\2 is closed."), chan);
return;
}
nicklist = (!nick ? strdup(si->su->nick) : strdup(nick));
nick = strtok_r(nicklist, " ", &strtokctx);
do
{
if (invert_purpose(si, parc, chan, &nick, '-', &cs_cmd_deowner))
continue;
/* figure out who we're going to op */
if (!(tu = user_find_named(nick)))
{
command_fail(si, fault_nosuch_target, _("\2%s\2 is not online."), nick);
continue;
}
if (is_internal_client(tu))
continue;
/* SECURE check; we can skip this if sender == target, because we already verified */
if ((si->su != tu) && (mc->flags & MC_SECURE) && !chanacs_user_has_flag(mc, tu, CA_OP) && !chanacs_user_has_flag(mc, tu, CA_AUTOOP))
{
command_fail(si, fault_noprivs, _("You are not authorized to perform this operation."));
command_fail(si, fault_noprivs, _("\2%s\2 has the SECURE option enabled, and \2%s\2 does not have appropriate access."), mc->name, tu->nick);
continue;
}
cu = chanuser_find(mc->chan, tu);
if (!cu)
{
command_fail(si, fault_nosuch_target, _("\2%s\2 is not on \2%s\2."), tu->nick, mc->name);
continue;
}
modestack_mode_param(chansvs.nick, mc->chan, MTYPE_ADD, ircd->owner_mchar[1], CLIENT_NAME(tu));
cu->modes |= CSTATUS_OWNER;
if (si->c == NULL && tu != si->su)
change_notify(chansvs.nick, tu, "You have been set as owner on %s by %s", mc->name, get_source_name(si));
logcommand(si, CMDLOG_DO, "OWNER: \2%s!%[email protected]%s\2 on \2%s\2", tu->nick, tu->user, tu->vhost, mc->name);
if (si->su == NULL || !chanuser_find(mc->chan, si->su))
command_success_nodata(si, _("\2%s\2 has been set as owner on \2%s\2."), tu->nick, mc->name);
} while ((nick = strtok_r(NULL, " ", &strtokctx)) != NULL);
free(nicklist);
}
开发者ID:Desuneko,项目名称:atheme,代码行数:85,代码来源:owner.c
示例13: ns_cmd_setpass
static void ns_cmd_setpass(sourceinfo_t *si, int parc, char *parv[])
{
myuser_t *mu;
metadata_t *md;
char *nick = parv[0];
char *key = parv[1];
char *password = parv[2];
if (!nick || !key || !password)
{
command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "SETPASS");
command_fail(si, fault_needmoreparams, _("Syntax: SETPASS <account> <key> <newpass>"));
return;
}
if (strchr(password, ' '))
{
command_fail(si, fault_badparams, STR_INVALID_PARAMS, "SETPASS");
command_fail(si, fault_badparams, _("Syntax: SETPASS <account> <key> <newpass>"));
return;
}
if (!(mu = myuser_find(nick)))
{
command_fail(si, fault_nosuch_target, _("\2%s\2 is not registered."), nick);
return;
}
if (strlen(password) >= PASSLEN)
{
command_fail(si, fault_badparams, STR_INVALID_PARAMS, "SETPASS");
command_fail(si, fault_badparams, _("Registration passwords may not be longer than \2%d\2 characters."), PASSLEN - 1);
return;
}
if (!strcasecmp(password, entity(mu)->name))
{
command_fail(si, fault_badparams, _("You cannot use your nickname as a password."));
command_fail(si, fault_badparams, _("Syntax: SETPASS <account> <key> <newpass>"));
return;
}
md = metadata_find(mu, "private:setpass:key");
if (md != NULL && crypt_verify_password(key, md->value) != NULL)
{
logcommand(si, CMDLOG_SET, "SETPASS: \2%s\2", entity(mu)->name);
set_password(mu, password);
metadata_delete(mu, "private:setpass:key");
command_success_nodata(si, _("The password for \2%s\2 has been changed to \2%s\2."), entity(mu)->name, password);
return;
}
if (md != NULL)
{
logcommand(si, CMDLOG_SET, "failed SETPASS (invalid key)");
}
command_fail(si, fault_badparams, _("Verification failed. Invalid key for \2%s\2."),
entity(mu)->name);
return;
}
开发者ID:DrRenX,项目名称:atheme,代码行数:63,代码来源:setpass.c
示例14: gs_cmd_join
static void gs_cmd_join(sourceinfo_t *si, int parc, char *parv[])
{
mygroup_t *mg;
groupacs_t *ga;
metadata_t *md, *md2;
unsigned int flags = 0;
bool invited = false;
groupinvite_t *gi;
if (!parv[0])
{
command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "JOIN");
command_fail(si, fault_needmoreparams, _("Syntax: JOIN <!groupname>"));
return;
}
if (!(mg = mygroup_find(parv[0])))
{
command_fail(si, fault_alreadyexists, _("Group \2%s\2 does not exist."), parv[0]);
return;
}
if ((gi = groupinvite_find(mg, entity(si->smu))) != NULL)
{
invited = true;
}
else
{
/* Legacy code - Search old invite and delete it */
if ((md2 = metadata_find(si->smu, "private:groupinvite")))
{
if (!strcasecmp(md2->value, parv[0])) {
invited = true;
metadata_delete(si->smu, "private:groupinvite");
}
}
}
if (groupacs_sourceinfo_has_flag(mg, si, 0))
{
command_fail(si, fault_nochange, _("You are already a member of group \2%s\2."), parv[0]);
return;
}
if (!(mg->flags & MG_OPEN) && !invited)
{
command_fail(si, fault_noprivs, _("Group \2%s\2 is not open to anyone joining."), parv[0]);
return;
}
if (groupacs_sourceinfo_has_flag(mg, si, GA_BAN))
{
command_fail(si, fault_noprivs, STR_NOT_AUTHORIZED);
return;
}
if (MOWGLI_LIST_LENGTH(&mg->acs) > gs_config->maxgroupacs && (!(mg->flags & MG_ACSNOLIMIT)) && !invited)
{
command_fail(si, fault_toomany, _("Group \2%s\2 access list is full."), entity(mg)->name);
return;
}
if ((md = metadata_find(mg, "joinflags")))
flags = atoi(md->value);
else
flags = gs_flags_parser(gs_config->join_flags, 0, flags);
ga = groupacs_add(mg, entity(si->smu), flags);
if (invited)
groupinvite_delete(mg, entity(si->smu));
command_success_nodata(si, _("You are now a member of \2%s\2."), entity(mg)->name);
}
开发者ID:E-werd,项目名称:shalture,代码行数:74,代码来源:join.c
示例15: gs_cmd_invite
static void gs_cmd_invite(sourceinfo_t *si, int parc, char *parv[])
{
mygroup_t *mg;
myuser_t *mu;
groupacs_t *ga;
char *group = parv[0];
char *user = parv[1];
char buf[BUFSIZE], description[256];
service_t *svs;
if (!group || !user)
{
command_fail(si, fault_needmoreparams, STR_INSUFFICIENT_PARAMS, "INVITE");
command_fail(si, fault_needmoreparams, _("Syntax: INVITE <!group> <user>"));
return;
}
if ((mg = mygroup_find(group)) == NULL)
{
command_fail(si, fault_nosuch_target, _("The group \2%s\2 does not exist."), group);
return;
}
if (!groupacs_sourceinfo_has_flag(mg, si, GA_INVITE))
{
command_fail(si, fault_noprivs, _("You are not authorized to perform this operation."));
return;
}
if ((mu = myuser_find_ext(user)) == NULL)
{
command_fail(si, fault_nosuch_target, _("\2%s\2 is not a registered account."), user);
return;
}
if ((ga = groupacs_find(mg, entity(mu), 0, false)) != NULL)
{
command_fail(si, fault_badparams, _("\2%s\2 is already a member of: \2%s\2"), entity(mu)->name, entity(mg)->name);
return;
}
if (metadata_find(mu, "private:groupinvite"))
{
command_fail(si, fault_badparams, _("\2%s\2 may not be invited to a group and already has another invitation pending."), entity(mu)->name);
return;
}
if (MU_NEVERGROUP & mu->flags)
{
command_fail(si, fault_noprivs, _("\2%s\2 does not wish to belong to any groups."), entity(mu)->name);
return;
}
metadata_add(mu, "private:groupinvite", entity(mg)->name);
if ((svs = service_find("memoserv")) != NULL)
{
snprintf(buf, BUFSIZE, "%s [auto memo] You have been invited to the group: %s", entity(mu)->name, entity(mg)->name);
command_exec_split(svs, si, "SEND", buf, svs->commands);
}
else
{
myuser_notice(si->service->nick, mu, "You have been invited to the group: %s", entity(mg)->name);
}
logcommand(si, CMDLOG_SET, "INVITE: \2%s\2 \2%s\2", entity(mg)->name, entity(mu)->name);
command_success_nodata(si, _("\2%s\2 has been invited to \2%s\2"), entity(mu)->name, entity(mg)->name);
snprintf(description, sizeof description, "Invited \2%s\2 to join.", entity(mu)->name);
notify_group_misc_change(si, mg, description);
}
请发表评论