예제 #1
0
파일: util.c 프로젝트: auroracoin/ccminer
bool stratum_authorize(struct stratum_ctx *sctx, const char *user, const char *pass)
{
    json_t *val = NULL, *res_val, *err_val;
    char *s, *sret;
    json_error_t err;
    bool ret = false;

    s = (char*)malloc(80 + strlen(user) + strlen(pass));
    sprintf(s, "{\"id\": 2, \"method\": \"mining.authorize\", \"params\": [\"%s\", \"%s\"]}",
            user, pass);

    if (!stratum_send_line(sctx, s))
        goto out;

    while (1) {
        sret = stratum_recv_line(sctx);
        if (!sret)
            goto out;
        if (!stratum_handle_method(sctx, sret))
            break;
        free(sret);
    }

    val = JSON_LOADS(sret, &err);
    free(sret);
    if (!val) {
        applog(LOG_ERR, "JSON decode failed(%d): %s", err.line, err.text);
        goto out;
    }

    res_val = json_object_get(val, "result");
    err_val = json_object_get(val, "error");

    if (!res_val || json_is_false(res_val) ||
            (err_val && !json_is_null(err_val)))  {
        applog(LOG_ERR, "Stratum authentication failed");
        goto out;
    }

    ret = true;

out:
    free(s);
    if (val)
        json_decref(val);

    return ret;
}
예제 #2
0
bool stratum_authorize(struct stratum_ctx *sctx, const char *user, const char *pass)
{
	json_t *val = NULL, *res_val, *err_val;
	char *s, *sret;
	json_error_t err;
	bool ret = false;

	if(jsonrpc_2) {
        s = (char*)malloc(300 + strlen(user) + strlen(pass));
        sprintf(s, "{\"method\": \"login\", \"params\": {\"login\": \"%s\", \"pass\": \"%s\", \"agent\": \"cpuminer-multi/0.1\"}, \"id\": 1}",
                user, pass);
	} else {
        s = (char*)malloc(80 + strlen(user) + strlen(pass));
        sprintf(s, "{\"id\": 2, \"method\": \"mining.authorize\", \"params\": [\"%s\", \"%s\"]}",
                user, pass);
	}

	if (!stratum_send_line(sctx, s))
		goto out;

	while (1) {
		sret = stratum_recv_line(sctx);
		if (!sret)
			goto out;
		if (!stratum_handle_method(sctx, sret))
			break;
		free(sret);
	}

	val = JSON_LOADS(sret, &err);
	free(sret);
	if (!val) {
		applog(LOG_ERR, "JSON decode failed(%d): %s", err.line, err.text);
		goto out;
	}

	res_val = json_object_get(val, "result");
	err_val = json_object_get(val, "error");

	if (!res_val || json_is_false(res_val) ||
	    (err_val && !json_is_null(err_val)))  {
		applog(LOG_ERR, "Stratum authentication failed");
		goto out;
	}

    if(jsonrpc_2) {
        rpc2_login_decode(val);
        json_t *job_val = json_object_get(res_val, "job");
        pthread_mutex_lock(&sctx->work_lock);
        if(job_val) rpc2_job_decode(job_val, &sctx->work);
        pthread_mutex_unlock(&sctx->work_lock);
    }

	ret = true;

out:
	free(s);
	if (val)
		json_decref(val);

	return ret;
}