external_signer.cpp raw

   1  // Copyright (c) 2018-present The Bitcoin Core developers
   2  // Distributed under the MIT software license, see the accompanying
   3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   4  
   5  #include <bitcoin-build-config.h> // IWYU pragma: keep
   6  
   7  #include <common/args.h>
   8  #include <common/system.h>
   9  #include <external_signer.h>
  10  #include <rpc/protocol.h>
  11  #include <rpc/server.h>
  12  #include <rpc/util.h>
  13  #include <util/strencodings.h>
  14  
  15  #include <string>
  16  #include <vector>
  17  
  18  #ifdef ENABLE_EXTERNAL_SIGNER
  19  
  20  static RPCMethod enumeratesigners()
  21  {
  22      return RPCMethod{"enumeratesigners",
  23          "Returns a list of external signers from -signer. Signers with duplicate master key fingerprints are skipped.",
  24          {},
  25          RPCResult{
  26              RPCResult::Type::OBJ, "", "",
  27              {
  28                  {RPCResult::Type::ARR, "signers", /*optional=*/false, "",
  29                  {
  30                      {RPCResult::Type::OBJ, "", "",
  31                      {
  32                          {RPCResult::Type::STR_HEX, "fingerprint", "Master key fingerprint"},
  33                          {RPCResult::Type::STR, "name", "Device name, the model returned by the signer"},
  34                      }},
  35                  },
  36                  }
  37              }
  38          },
  39          RPCExamples{
  40              HelpExampleCli("enumeratesigners", "")
  41              + HelpExampleRpc("enumeratesigners", "")
  42          },
  43          [](const RPCMethod& self, const JSONRPCRequest& request) -> UniValue
  44          {
  45              const std::string command = gArgs.GetArg("-signer", "");
  46              if (command == "") throw JSONRPCError(RPC_MISC_ERROR, "Error: restart bitcoind with -signer=<cmd>");
  47              const std::string chain = gArgs.GetChainTypeString();
  48              UniValue signers_res = UniValue::VARR;
  49              try {
  50                  std::vector<ExternalSigner> signers;
  51                  ExternalSigner::Enumerate(command, signers, chain);
  52                  for (const ExternalSigner& signer : signers) {
  53                      UniValue signer_res = UniValue::VOBJ;
  54                      signer_res.pushKV("fingerprint", signer.m_fingerprint);
  55                      signer_res.pushKV("name", signer.m_name);
  56                      signers_res.push_back(std::move(signer_res));
  57                  }
  58              } catch (const std::exception& e) {
  59                  throw JSONRPCError(RPC_MISC_ERROR, e.what());
  60              }
  61              UniValue result(UniValue::VOBJ);
  62              result.pushKV("signers", std::move(signers_res));
  63              return result;
  64          }
  65      };
  66  }
  67  
  68  void RegisterSignerRPCCommands(CRPCTable& t)
  69  {
  70      static const CRPCCommand commands[]{
  71          {"signer", &enumeratesigners},
  72      };
  73      for (const auto& c : commands) {
  74          t.appendCommand(c.name, &c);
  75      }
  76  }
  77  
  78  #endif // ENABLE_EXTERNAL_SIGNER
  79