diff --git a/src/RPCServer.cpp b/src/RPCServer.cpp index a641cf7728..ab8785ff72 100644 --- a/src/RPCServer.cpp +++ b/src/RPCServer.cpp @@ -45,29 +45,40 @@ Json::Value RPCServer::RPCError(int iError) const char* pToken; const char* pMessage; } errorInfoA[] = { + { rpcACT_EXISTS, "actExists", "Account already exists." }, + { rpcACT_MALFORMED, "actMalformed", "Account malformed." }, + { rpcACT_NOT_FOUND, "actNotFound", "Account not found." }, { rpcBAD_SEED, "badSeed", "Disallowed seed." }, { rpcDST_ACT_MALFORMED, "dstActMalformed", "Destination account is malformed." }, { rpcDST_AMT_MALFORMED, "dstAmtMalformed", "Destination amount/currency is malformed." }, + { rpcFAIL_GEN_DECRPYT, "failGenDecrypt", "Failed to decrypt generator." }, { rpcHOST_IP_MALFORMED, "hostIpMalformed", "Host IP is malformed." }, { rpcINSUF_FUNDS, "insufFunds", "Insufficient funds." }, { rpcINTERNAL, "internal", "Internal error." }, { rpcINVALID_PARAMS, "invalidParams", "Invalid parameters." }, + { rpcLGR_IDXS_INVALID, "lgrIdxsInvalid", "Ledger indexes invalid." }, + { rpcLGR_IDX_MALFORMED, "lgrIdxMalformed", "Ledger index malformed." }, + { rpcLGR_NOT_FOUND, "lgrNotFound", "Ledger not found." }, + { rpcMUST_SEND_XNS, "mustSendXns", "Can only send XNS to accounts which are not created." }, { rpcNICKNAME_MALFORMED,"nicknameMalformed","Nickname is malformed." }, { rpcNICKNAME_MISSING, "nicknameMissing", "Nickname does not exist." }, { rpcNICKNAME_PERM, "nicknamePerm", "Account does not control nickname." }, + { rpcNOT_IMPL, "notImpl", "Not implemented." }, { rpcNO_CLOSED, "noClosed", "Closed ledger is unavailable." }, { rpcNO_CURRENT, "noCurrent", "Current ledger is unavailable." }, { rpcNO_GEN_DECRPYT, "noGenDectypt", "Password failed to decrypt master public generator." }, { rpcNO_NETWORK, "noNetwork", "Network not available." }, - { rpcNOT_IMPL, "notImpl", "Not implemented." }, { rpcPASSWD_CHANGED, "passwdChanged", "Wrong key, password changed." }, + { rpcPORT_MALFORMED, "portMalformed", "Port is malformed." }, { rpcPUBLIC_MALFORMED, "publicMalformed", "Public key is malformed." }, { rpcSRC_ACT_MALFORMED, "srcActMalformed", "Source account is malformed." }, { rpcSRC_AMT_MALFORMED, "srcAmtMalformed", "Source amount/currency is malformed." }, { rpcSRC_MISSING, "srcMissing", "Source account does not exist." }, { rpcSRC_UNCLAIMED, "srcUnclaimed", "Source account is not claimed." }, { rpcSUCCESS, "success", "Success." }, + { rpcTXN_NOT_FOUND, "txnNotFound", "Transaction not found." }, { rpcUNKNOWN_COMMAND, "unknownCmd", "Unknown command." }, + { rpcWRONG_PASSWORD, "wrongPassword", "Wrong password." }, { rpcWRONG_SEED, "wrongSeed", "The regular key does not point as the master key." }, }; @@ -245,14 +256,14 @@ Json::Value RPCServer::getMasterGenerator(const uint256& uLedger, const NewcoinA if (!sleGen) { // No account has been claimed or has had it password set for seed. - return JSONRPCError(500, "wrong password"); + return RPCError(rpcWRONG_PASSWORD); } std::vector vucCipher = sleGen->getIFieldVL(sfGenerator); std::vector vucMasterGenerator = na0Private.accountPrivateDecrypt(na0Public, vucCipher); if (vucMasterGenerator.empty()) { - return JSONRPCError(500, "internal error: password failed to decrypt master public generator"); + return RPCError(rpcFAIL_GEN_DECRPYT); } naMasterGenerator.setFamilyGenerator(vucMasterGenerator); @@ -725,7 +736,7 @@ Json::Value RPCServer::doConnect(Json::Value& params) // YYY Should make an extract int. if (!extractString(strPort, params, 1)) - return JSONRPCError(500, "Bad port"); + return RPCError(rpcPORT_MALFORMED); iPort = boost::lexical_cast(strPort); } @@ -1028,17 +1039,17 @@ Json::Value RPCServer::doPasswordSet(Json::Value& params) if (!naMasterSeed.setFamilySeedGeneric(params[0u].asString())) { // Should also not allow account id's as seeds. - return "master seed expected"; + return RPCError(rpcBAD_SEED); } else if (!naRegularSeed.setFamilySeedGeneric(params[1u].asString())) { // Should also not allow account id's as seeds. - return "regular seed expected"; + return RPCError(rpcBAD_SEED); } // YYY Might use account from string to be more flexible. else if (params.size() >= 3 && !naAccountID.setAccountID(params[2u].asString())) { - return "bad account"; + return RPCError(rpcACT_MALFORMED); } else { @@ -1088,7 +1099,7 @@ Json::Value RPCServer::doPasswordSet(Json::Value& params) if (!iMax) { - return "account not found"; + return RPCError(rpcACT_NOT_FOUND); } Transaction::pointer trns = Transaction::sharedPasswordSet( @@ -1205,7 +1216,7 @@ Json::Value RPCServer::doSend(Json::Value& params) } else if (!saDstAmount.isNative()) { - return JSONRPCError(500, "Can only send XNS to accounts which are not created."); + return RPCError(rpcMUST_SEND_XNS); } else { @@ -1327,7 +1338,9 @@ Json::Value RPCServer::doTx(Json::Value& params) uint256 txid(param1); Transaction::pointer txn=theApp->getMasterTransaction().fetch(txid, true); - if (!txn) return JSONRPCError(500, "Transaction not found"); + + if (!txn) return RPCError(rpcTXN_NOT_FOUND); + return txn->getJson(true); } @@ -1364,7 +1377,7 @@ Json::Value RPCServer::doLedger(Json::Value& params) ledger = theApp->getMasterLedger().getLedgerBySeq(boost::lexical_cast(param)); if (!ledger) - return JSONRPCError(503, "Unable to locate ledger"); + return RPCError(rpcLGR_NOT_FOUND); bool full = false; if (extractString(param, params, 1)) @@ -1390,10 +1403,11 @@ Json::Value RPCServer::doAccountTransactions(Json::Value& params) NewcoinAddress account; if (!account.setAccountID(param)) - return JSONRPCError(500, "invalid account"); + return RPCError(rpcACT_MALFORMED); if (!extractString(param, params, 1)) - return JSONRPCError(500, "invalid ledger index"); + return RPCError(rpcLGR_IDX_MALFORMED); + minLedger = boost::lexical_cast(param); if ((params.size() == 3) && extractString(param, params, 2)) @@ -1404,7 +1418,7 @@ Json::Value RPCServer::doAccountTransactions(Json::Value& params) if ((maxLedger < minLedger) || (minLedger == 0) || (maxLedger == 0)) { std::cerr << "minL=" << minLedger << ", maxL=" << maxLedger << std::endl; - return JSONRPCError(500, "invalid ledger indexes"); + return RPCError(rpcLGR_IDXS_INVALID); } #ifndef DEBUG @@ -1446,7 +1460,7 @@ Json::Value RPCServer::doAccountTransactions(Json::Value& params) } catch (...) { - return JSONRPCError(500, "internal error"); + return RPCError(rpcINTERNAL); } #endif } @@ -1606,11 +1620,11 @@ Json::Value RPCServer::doWalletAdd(Json::Value& params) } else if (!naSrcAccountID.setAccountID(params[1u].asString())) { - return JSONRPCError(500, "source account id needed"); + return RPCError(rpcSRC_ACT_MALFORMED); } else if (!naMasterSeed.setFamilySeedGeneric(params[2u].asString())) { - return "master seed expected"; + return RPCError(rpcBAD_SEED); } else if (params.size() >= 4 && !saAmount.setValue(params[3u].asString(), sDstCurrency)) { @@ -1707,12 +1721,12 @@ Json::Value RPCServer::doWalletClaim(Json::Value& params) if (!naMasterSeed.setFamilySeedGeneric(params[0u].asString())) { // Should also not allow account id's as seeds. - return "master seed expected"; + return RPCError(rpcBAD_SEED); } else if (!naRegularSeed.setFamilySeedGeneric(params[1u].asString())) { // Should also not allow account id's as seeds. - return "regular seed expected"; + return RPCError(rpcBAD_SEED); } else { @@ -1804,11 +1818,11 @@ Json::Value RPCServer::doWalletCreate(Json::Value& params) } else if (!naDstAccountID.setAccountID(params[2u].asString())) { - return "create account id needed"; + return RPCError(rpcDST_ACT_MALFORMED); } else if (mNetOps->getAccountState(uLedger, naDstAccountID)) { - return "account already exists"; + return RPCError(rpcACT_EXISTS); } // Trying to build: diff --git a/src/RPCServer.h b/src/RPCServer.h index 3058760e80..8eea5c60b2 100644 --- a/src/RPCServer.h +++ b/src/RPCServer.h @@ -18,37 +18,48 @@ public: rpcSUCCESS, // Networking - rpcNO_NETWORK, rpcNO_CLOSED, rpcNO_CURRENT, + rpcNO_NETWORK, // Ledger state + rpcACT_EXISTS, + rpcACT_NOT_FOUND, rpcINSUF_FUNDS, + rpcLGR_NOT_FOUND, + rpcMUST_SEND_XNS, + rpcNICKNAME_MISSING, rpcPASSWD_CHANGED, rpcSRC_MISSING, rpcSRC_UNCLAIMED, + rpcTXN_NOT_FOUND, + rpcWRONG_PASSWORD, rpcWRONG_SEED, - rpcNICKNAME_MISSING, // Malformed command rpcINVALID_PARAMS, rpcUNKNOWN_COMMAND, // Bad paramater + rpcACT_MALFORMED, rpcBAD_SEED, - rpcSRC_ACT_MALFORMED, rpcDST_ACT_MALFORMED, - rpcPUBLIC_MALFORMED, - rpcHOST_IP_MALFORMED, - rpcSRC_AMT_MALFORMED, rpcDST_AMT_MALFORMED, + rpcHOST_IP_MALFORMED, + rpcLGR_IDXS_INVALID, + rpcLGR_IDX_MALFORMED, rpcNICKNAME_MALFORMED, rpcNICKNAME_PERM, + rpcPORT_MALFORMED, + rpcPUBLIC_MALFORMED, + rpcSRC_ACT_MALFORMED, + rpcSRC_AMT_MALFORMED, // Internal error (should never happen) rpcINTERNAL, // Generic internal error. - rpcNO_GEN_DECRPYT, + rpcFAIL_GEN_DECRPYT, rpcNOT_IMPL, + rpcNO_GEN_DECRPYT, }; Json::Value RPCError(int iError);