Ejemplo n.º 1
0
/*
** m_oper
**      parv[0] = sender prefix
**      parv[1] = oper name
**      parv[2] = oper password
*/
static void
m_oper(struct Client *client_p, struct Client *source_p,
       int parc, char *parv[])
{
  struct ConfItem *conf;
  struct AccessItem *aconf=NULL;
  const char *name = parv[1];
  const char *password = parv[2];

  if (EmptyString(password))
  {
    sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS),
	       me.name, source_p->name, "OPER");
    return;
  }

  /* end the grace period */
  if (!IsFloodDone(source_p))
    flood_endgrace(source_p);

  if ((conf = find_password_conf(name,source_p)) == NULL)
  {
    sendto_one(source_p, form_str(ERR_NOOPERHOST), me.name, source_p->name);
    conf = find_exact_name_conf(OPER_TYPE, name, NULL, NULL);
    failed_oper_notice(source_p, name, (conf != NULL) ?
                       "host mismatch" : "no oper {} block");
    log_failed_oper(source_p, name);
    return;
  }

  aconf = (struct AccessItem *)map_to_conf(conf);

  if (match_oper_password(password, aconf))
  {
    if (attach_conf(source_p, conf) != 0)
    {
      sendto_one(source_p, ":%s NOTICE %s :Can't attach conf!",
                 me.name, source_p->name);
      failed_oper_notice(source_p, name, "can't attach conf!");
      log_failed_oper(source_p, name);
      return;
    }

    oper_up(source_p);

    ilog(L_TRACE, "OPER %s by %s!%s@%s",
         name, source_p->name, source_p->username, source_p->host);
    log_oper(source_p, name);
  }
  else
  {
    sendto_one(source_p, form_str(ERR_PASSWDMISMATCH), me.name, parv[0]);
    failed_oper_notice(source_p, name, "password mismatch");
    log_failed_oper(source_p, name);
  }
}
Ejemplo n.º 2
0
/*
** m_oper
**      parv[0] = sender prefix
**      parv[1] = oper name
**      parv[2] = oper password
*/
static void
m_oper(struct Client *client_p, struct Client *source_p, int parc, char *parv[])
{
	struct ConfItem *aconf;
	struct ConfItem *oconf = NULL;
	char *name;
	char *password;
	dlink_node *ptr;

	name = parv[1];
	password = parv[2];

	if(EmptyString(password))
	{
		sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS), me.name, source_p->name, "OPER");
		return;
	}

	/* end the grace period */
	if(!IsFloodDone(source_p))
		flood_endgrace(source_p);

	if((aconf = find_password_aconf(name, source_p)) == NULL)
	{
		sendto_one(source_p, form_str(ERR_NOOPERHOST), me.name, source_p->name);
		log_foper(source_p, name);

		if(ConfigFileEntry.failed_oper_notice)
		{
			sendto_realops_flags(UMODE_ALL, L_ALL,
					     "Failed OPER attempt - host mismatch by %s (%s@%s)",
					     source_p->name, source_p->username, source_p->host);
		}
		return;
	}

	if(match_oper_password(password, aconf))
	{
		/*
		   20001216:
		   detach old iline
		   -einride
		 */
		ptr = source_p->localClient->confs.head;
		if(ptr)
		{

			oconf = ptr->data;
			detach_conf(source_p, oconf);
		}

		if(attach_conf(source_p, aconf) != 0)
		{
			sendto_one(source_p, ":%s NOTICE %s :Can't attach conf!",
				   me.name, source_p->name);
			sendto_realops_flags(UMODE_ALL, L_ALL,
					     "Failed OPER attempt by %s (%s@%s) can't attach conf!",
					     source_p->name, source_p->username, source_p->host);
			log_foper(source_p, name);
			/* 
			   20001216:
			   Reattach old iline
			   -einride
			 */
			attach_conf(source_p, oconf);
			return;
		}

		oper_up(source_p, aconf);

		ilog(L_TRACE, "OPER %s by %s!%s@%s",
		     name, source_p->name, source_p->username, source_p->host);
		log_oper(source_p, name);
		return;
	}
	else
	{
		sendto_one(source_p, form_str(ERR_PASSWDMISMATCH), me.name, parv[0]);
		log_foper(source_p, name);

		if(ConfigFileEntry.failed_oper_notice)
		{
			sendto_realops_flags(UMODE_ALL, L_ALL,
					     "Failed OPER attempt by %s (%s@%s)",
					     source_p->name, source_p->username, source_p->host);
		}
	}
}
Ejemplo n.º 3
0
/*
 * m_oper
 *      parv[1] = oper name
 *      parv[2] = oper password
 */
static int
m_oper(struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
{
    struct oper_conf *oper_p;
    const char *name;
    const char *password;

    name = parv[1];
    password = parv[2];

    if(IsOper(source_p)) {
        sendto_one(source_p, form_str(RPL_YOUREOPER), me.name, source_p->name);
        send_oper_motd(source_p);
        return 0;
    }

    /* end the grace period */
    if(!IsFloodDone(source_p))
        flood_endgrace(source_p);

    oper_p = find_oper_conf(source_p->username, source_p->orighost,
                            source_p->sockhost, name);

    if(oper_p == NULL) {
        sendto_one_numeric(source_p, ERR_NOOPERHOST, form_str(ERR_NOOPERHOST));
        ilog(L_FOPER, "FAILED OPER (%s) by (%s!%s@%s) (%s)",
             name, source_p->name,
             source_p->username, source_p->host, source_p->sockhost);

        if(ConfigFileEntry.failed_oper_notice) {
            sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
                                   "Failed OPER attempt - host mismatch by %s (%s@%s)",
                                   source_p->name, source_p->username, source_p->host);
        }

        return 0;
    }

    if(IsOperConfNeedSSL(oper_p) && !IsSSLClient(source_p)) {
        sendto_one_numeric(source_p, ERR_NOOPERHOST, form_str(ERR_NOOPERHOST));
        ilog(L_FOPER, "FAILED OPER (%s) by (%s!%s@%s) (%s) -- requires SSL/TLS",
             name, source_p->name,
             source_p->username, source_p->host, source_p->sockhost);

        if(ConfigFileEntry.failed_oper_notice) {
            sendto_realops_snomask(SNO_GENERAL, L_ALL,
                                   "Failed OPER attempt - missing SSL/TLS by %s (%s@%s)",
                                   source_p->name, source_p->username, source_p->host);
        }
        return 0;
    }

    if (oper_p->certfp != NULL) {
        if (source_p->certfp == NULL || strcasecmp(source_p->certfp, oper_p->certfp)) {
            sendto_one_numeric(source_p, ERR_NOOPERHOST, form_str(ERR_NOOPERHOST));
            ilog(L_FOPER, "FAILED OPER (%s) by (%s!%s@%s) (%s) -- client certificate fingerprint mismatch",
                 name, source_p->name,
                 source_p->username, source_p->host, source_p->sockhost);

            if(ConfigFileEntry.failed_oper_notice) {
                sendto_realops_snomask(SNO_GENERAL, L_ALL,
                                       "Failed OPER attempt - client certificate fingerprint mismatch by %s (%s@%s)",
                                       source_p->name, source_p->username, source_p->host);
            }
            return 0;
        }
    }

    if(match_oper_password(password, oper_p)) {
        oper_up(source_p, oper_p);

        ilog(L_OPERED, "OPER %s by %s!%s@%s (%s)",
             name, source_p->name, source_p->username, source_p->host,
             source_p->sockhost);
        return 0;
    } else {
        sendto_one_numeric(source_p, ERR_NOOPERHOST, form_str(ERR_NOOPERHOST));

        ilog(L_FOPER, "FAILED OPER (%s) by (%s!%s@%s) (%s)",
             name, source_p->name, source_p->username, source_p->host,
             source_p->sockhost);

        if(ConfigFileEntry.failed_oper_notice) {
            sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
                                   "Failed OPER attempt by %s (%s@%s)",
                                   source_p->name, source_p->username, source_p->host);
        }
    }

    return 0;
}