Esempio n. 1
0
/*
 * atheme.command
 *
 * XML inputs:
 *       authcookie, account name, source ip, service name, command name,
 *       parameters.
 *
 * XML outputs:
 *       depends on command
 *
 * Side Effects:
 *       command is executed
 */
static int xmlrpcmethod_command(void *conn, int parc, char *parv[])
{
	myuser_t *mu;
	service_t *svs;
	command_t *cmd;
	sourceinfo_t *si;
	int newparc;
	char *newparv[20];
	struct httpddata *hd = ((connection_t *)conn)->userdata;
	int i;

	for (i = 0; i < parc; i++)
	{
		if (*parv[i] == '\0' || strchr(parv[i], '\r') || strchr(parv[i], '\n'))
		{
			xmlrpc_generic_error(fault_badparams, "Invalid parameters.");
			return 0;
		}
	}

	if (parc < 5)
	{
		xmlrpc_generic_error(fault_needmoreparams, "Insufficient parameters.");
		return 0;
	}

	if (*parv[1] != '\0' && strlen(parv[0]) > 1)
	{
		if ((mu = myuser_find(parv[1])) == NULL)
		{
			xmlrpc_generic_error(fault_nosuch_source, "Unknown user.");
			return 0;
		}

		if (authcookie_validate(parv[0], mu) == false)
		{
			xmlrpc_generic_error(fault_badauthcookie, "Invalid authcookie for this account.");
			return 0;
		}
	}
	else
		mu = NULL;

	/* try literal service name first, then user-configured nickname. */
	svs = service_find(parv[3]);
	if ((svs == NULL && (svs = service_find_nick(parv[3])) == NULL) || svs->commands == NULL)
	{
		slog(LG_DEBUG, "xmlrpcmethod_command(): invalid service %s", parv[3]);
		xmlrpc_generic_error(fault_nosuch_source, "Invalid service name.");
		return 0;
	}
	cmd = command_find(svs->commands, parv[4]);
	if (cmd == NULL)
	{
		xmlrpc_generic_error(fault_nosuch_source, "Invalid command name.");
		return 0;
	}

	memset(newparv, '\0', sizeof newparv);
	newparc = parc - 5;
	if (newparc > 20)
		newparc = 20;
	if (newparc > 0)
		memcpy(newparv, parv + 5, newparc * sizeof(parv[0]));

	si = sourceinfo_create();
	si->smu = mu;
	si->service = svs;
	si->sourcedesc = parv[2][0] != '\0' ? parv[2] : NULL;
	si->connection = conn;
	si->v = &xmlrpc_vtable;
	si->force_language = language_find("en");
	command_exec(svs, si, cmd, newparc, newparv);

	/* XXX: needs to be fixed up for restartable commands... */
	if (!hd->sent_reply)
	{
		if (hd->replybuf != NULL)
			xmlrpc_send_string(hd->replybuf);
		else
			xmlrpc_generic_error(fault_unimplemented, "Command did not return a result.");
	}

	object_unref(si);

	return 0;
}
Esempio n. 2
0
/*
 * atheme.command
 *
 * XML inputs:
 *       authcookie, account name, source ip, service name, command name,
 *       parameters.
 *
 * XML outputs:
 *       depends on command
 *
 * Side Effects:
 *       command is executed
 */
static int xmlrpcmethod_command(void *conn, int parc, char *parv[])
{
    myuser_t *mu;
    service_t *svs;
    command_t *cmd;
    sourceinfo_t si;
    int newparc;
    char *newparv[20];
    struct httpddata *hd = ((connection_t *)conn)->userdata;
    int i;

    for (i = 0; i < parc; i++)
    {
        if (strchr(parv[i], '\r') || strchr(parv[i], '\n'))
        {
            xmlrpc_generic_error(fault_badparams, "Invalid parameters.");
            return 0;
        }
    }

    if (parc < 5)
    {
        xmlrpc_generic_error(fault_needmoreparams, "Insufficient parameters.");
        return 0;
    }

    if (*parv[1] != '\0' && strlen(parv[0]) > 1)
    {
        if ((mu = myuser_find(parv[1])) == NULL)
        {
            xmlrpc_generic_error(fault_nosuch_source, "Unknown user.");
            return 0;
        }

        if (authcookie_validate(parv[0], mu) == false)
        {
            xmlrpc_generic_error(fault_badauthcookie, "Invalid authcookie for this account.");
            return 0;
        }
    }
    else
        mu = NULL;

    svs = service_find_nick(parv[3]);
    if (svs == NULL || svs->cmdtree == NULL)
    {
        slog(LG_DEBUG, "xmlrpcmethod_command(): invalid service %s", parv[3]);
        xmlrpc_generic_error(fault_nosuch_source, "Invalid service name.");
        return 0;
    }
    cmd = command_find(svs->cmdtree, parv[4]);
    if (cmd == NULL)
    {
        xmlrpc_generic_error(fault_nosuch_source, "Invalid command name.");
        return 0;
    }

    memset(newparv, '\0', sizeof newparv);
    newparc = parc - 5;
    if (newparc > 20)
        newparc = 20;
    if (newparc > 0)
        memcpy(newparv, parv + 5, newparc * sizeof(parv[0]));
    memset(&si, '\0', sizeof si);
    si.smu = mu;
    si.service = svs;
    si.sourcedesc = parv[2][0] != '\0' ? parv[2] : NULL;
    si.connection = conn;
    si.v = &xmlrpc_vtable;
    command_exec(svs, &si, cmd, newparc, newparv);
    if (!hd->sent_reply)
    {
        if (hd->replybuf != NULL)
            xmlrpc_send_string(hd->replybuf);
        else
            xmlrpc_generic_error(fault_unimplemented, "Command did not return a result.");
    }

    return 0;
}