diff --git a/src/AccountState.h b/src/AccountState.h index 0711d049a1..6d40bb855e 100644 --- a/src/AccountState.h +++ b/src/AccountState.h @@ -36,9 +36,9 @@ public: return mLedgerEntry->getIFieldPresent(sfAuthorizedKey); } - uint160 getAuthorizedKey() + NewcoinAddress getAuthorizedKey() { - return mLedgerEntry->getIFieldH160(sfAuthorizedKey); + return mLedgerEntry->getIValueFieldAccount(sfAuthorizedKey); } const NewcoinAddress& getAccountID() const { return mAccountID; } diff --git a/src/RPCServer.cpp b/src/RPCServer.cpp index 1c7bdcd1c2..d0fe93be2b 100644 --- a/src/RPCServer.cpp +++ b/src/RPCServer.cpp @@ -5,6 +5,9 @@ #include #include #include +#include + +#include #include "../json/reader.h" #include "../json/writer.h" @@ -254,10 +257,10 @@ Json::Value RPCServer::authorize(const uint256& uLedger, naAccountPublic.setAccountPublic(naGenerator, iIndex); naAccountPrivate.setAccountPrivate(naGenerator, naSeed, iIndex); - if (asSrc->getAuthorizedKey() != naAccountPublic.getAccountID()) + if (asSrc->getAuthorizedKey().getAccountID() != naAccountPublic.getAccountID()) { std::cerr << "iIndex: " << iIndex << std::endl; - std::cerr << "sfAuthorizedKey: " << strHex(asSrc->getAuthorizedKey()) << std::endl; + std::cerr << "sfAuthorizedKey: " << strHex(asSrc->getAuthorizedKey().getAccountID()) << std::endl; std::cerr << "naAccountPublic: " << strHex(naAccountPublic.getAccountID()) << std::endl; return JSONRPCError(500, "wrong password (changed)"); @@ -322,6 +325,40 @@ Json::Value RPCServer::accountFromString(const uint256& uLedger, NewcoinAddress& return Json::Value(Json::objectValue); } +// account_email_set [] +Json::Value RPCServer::doAccountEmailSet(Json::Value ¶ms) +{ + if (params.size() < 2 || params.size() > 3) + { + return "invalid params"; + } + else if (!mNetOps->available()) + { + return JSONRPCError(503, "network not available"); + } + + // Hash as per: http://en.gravatar.com/site/implement/hash/ + std::string strEmail = 3 == params.size() ? params[2u].asString() : ""; + std::vector vucMD5(128/8, 0); + std::string strMD5Lower; + + boost::trim(strEmail); + boost::to_lower(strEmail); + + MD5(reinterpret_cast(strEmail.c_str()), strEmail.size(), &vucMD5.front()); + + strMD5Lower = strHex(vucMD5); + boost::to_lower(strMD5Lower); + + Json::Value ret(Json::objectValue); + + ret["email"] = strEmail; + ret["hash"] = strHex(vucMD5); + ret["url_gravatar"] = str(boost::format("http://www.gravatar.com/avatar/%s") % strMD5Lower); + + return ret; +} + // account_info || // account_info || [] Json::Value RPCServer::doAccountInfo(Json::Value ¶ms) @@ -1458,6 +1495,7 @@ Json::Value RPCServer::doCommand(const std::string& command, Json::Value& params { std::cerr << "RPC:" << command << std::endl; + if (command == "account_email_set") return doAccountEmailSet(params); if (command == "account_info") return doAccountInfo(params); if (command == "account_lines") return doAccountLines(params); if (command == "connect") return doConnect(params); diff --git a/src/RPCServer.h b/src/RPCServer.h index fd2ca9fbea..e9e0085b90 100644 --- a/src/RPCServer.h +++ b/src/RPCServer.h @@ -48,6 +48,7 @@ private: Json::Value accountFromString(const uint256& uLedger, NewcoinAddress& naAccount, bool& bIndex, const std::string& strIdent, const int iIndex); + Json::Value doAccountEmailSet(Json::Value ¶ms); Json::Value doAccountInfo(Json::Value& params); Json::Value doAccountLines(Json::Value ¶ms); Json::Value doConnect(Json::Value& params); diff --git a/src/SerializedObject.h b/src/SerializedObject.h index d1d61a6425..5eb7245f4a 100644 --- a/src/SerializedObject.h +++ b/src/SerializedObject.h @@ -49,6 +49,7 @@ enum SOE_Field sfFlags, sfGenerator, sfGeneratorID, + sfHash, sfHighID, sfHighLimit, sfIdentifier, diff --git a/src/TransactionEngine.cpp b/src/TransactionEngine.cpp index ef40653e38..62cd01c418 100644 --- a/src/TransactionEngine.cpp +++ b/src/TransactionEngine.cpp @@ -583,7 +583,7 @@ TransactionEngineResult TransactionEngine::doClaim(const SerializedTransaction& // // Set the public key needed to use the account. - sleDst->setIFieldH160(sfAuthorizedKey, hGeneratorID); + sleDst->setIFieldAccount(sfAuthorizedKey, hGeneratorID); // Construct a generator map entry. sleGen = boost::make_shared(ltGENERATOR_MAP); @@ -930,8 +930,6 @@ TransactionEngineResult TransactionEngine::doWalletAdd(const SerializedTransacti LedgerStateParms qry = lepNONE; SLE::pointer sleDst = mLedger->getAccountRoot(qry, uDstAccountID); - std::cerr << str(boost::format("WalletAdd: %s") % sleDst->getFullText()) << std::endl; - if (sleDst) { std::cerr << "WalletAdd: account already created" << std::endl; diff --git a/src/TransactionFormats.cpp b/src/TransactionFormats.cpp index 3aaaa40c1e..2fd9f46593 100644 --- a/src/TransactionFormats.cpp +++ b/src/TransactionFormats.cpp @@ -5,6 +5,14 @@ TransactionFormat InnerTxnFormats[]= { + { "AccountSet", ttACCOUNT_SET, { + { S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 }, + { S_FIELD(EmailHash), STI_HASH128, SOE_IFFLAG, 1 }, + { S_FIELD(WalletLocator), STI_HASH256, SOE_IFFLAG, 2 }, + { S_FIELD(SourceTag), STI_UINT32, SOE_IFFLAG, 4 }, + { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, + { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } + }, { "Claim", ttCLAIM, { { S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 }, { S_FIELD(Generator), STI_VL, SOE_REQUIRED, 0 }, diff --git a/src/TransactionFormats.h b/src/TransactionFormats.h index 008486e6e6..1297169047 100644 --- a/src/TransactionFormats.h +++ b/src/TransactionFormats.h @@ -9,8 +9,9 @@ enum TransactionType ttPAYMENT = 0, ttCLAIM = 1, ttWALLET_ADD = 2, - ttINVOICE = 3, - ttOFFER = 4, + ttACCOUNT_SET = 3, + ttINVOICE = 4, + ttOFFER = 5, ttCREDIT_SET = 20, ttTRANSIT_SET = 21, }; diff --git a/src/main.cpp b/src/main.cpp index 71ead3e179..f9abab2788 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,6 +37,7 @@ void printHelp(const po::options_description& desc) cout << desc << endl; cout << "Commands: " << endl; + cout << " account_email_set []" << endl; cout << " account_info |" << endl; cout << " account_info || []" << endl; cout << " account_lines |" << endl;