/* * Copyright 2011-2014 Con Kolivas * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at your option) * any later version. See COPYING for more details. */ #include "config.h" #include #include "ckpool.h" #include "libckpool.h" static const char *b58chars = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; bool validate_address(connsock_t *cs, const char *address) { json_t *val, *res_val, *valid_val; char rpc_req[256]; bool ret = false; int len, i, j; if (unlikely(!address)) { LOGWARNING("Null address passed to validate_address"); return ret; } len = strlen(address); if (len < 27 || len > 34) { LOGWARNING("Invalid address length %d passed to validate_address", len); return ret; } for (i = 0; i < len; i++) { char c = address[i]; bool found = false; for (j = 0; j < 58; j++) { if (c == b58chars[j]) { found = true; break; } } if (!found) { LOGWARNING("Invalid char %.1s passed to validate_address", &c); return ret; } } snprintf(rpc_req, 256, "{\"method\": \"validateaddress\", \"params\": [\"%s\"]}\n", address); val = json_rpc_call(cs, rpc_req); if (!val) { LOGERR("Failed to get valid json response to validate_address"); return ret; } res_val = json_object_get(val, "result"); if (!res_val) { LOGERR("Failed to get result json response to validate_address"); goto out; } valid_val = json_object_get(res_val, "isvalid"); if (!valid_val) { LOGERR("Failed to get isvalid json response to validate_address"); goto out; } if (!json_is_true(valid_val)) LOGWARNING("Bitcoin address %s is NOT valid", address); else { LOGDEBUG("Bitcoin address %s IS valid", address); ret = true; } out: if (val) json_decref(val); return ret; }