Branch data Line data Source code
1 : : // Copyright (c) 2018-2022 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 <common/args.h>
6 : : #include <common/system.h>
7 : : #include <external_signer.h>
8 : : #include <rpc/protocol.h>
9 : : #include <rpc/server.h>
10 : : #include <rpc/util.h>
11 : : #include <util/strencodings.h>
12 : :
13 : : #include <string>
14 : : #include <vector>
15 : :
16 : : #ifdef ENABLE_EXTERNAL_SIGNER
17 [ + - ]: 2 :
18 [ + - ]: 4 : static RPCHelpMan enumeratesigners()
19 : : {
20 [ + - - + : 4 : return RPCHelpMan{"enumeratesigners",
# # # # #
# ]
21 [ + - ]: 2 : "Returns a list of external signers from -signer.",
22 : 2 : {},
23 [ + - + - ]: 2 : RPCResult{
24 [ + - + - ]: 2 : RPCResult::Type::OBJ, "", "",
25 [ + - ]: 4 : {
26 [ + - + - : 4 : {RPCResult::Type::ARR, "signers", /*optional=*/false, "",
+ - ]
27 [ + - ]: 6 : {
28 [ + - + - : 4 : {RPCResult::Type::OBJ, "", "",
+ - ]
29 [ + - ]: 6 : {
30 [ + - + - : 2 : {RPCResult::Type::STR_HEX, "fingerprint", "Master key fingerprint"},
+ - ]
31 [ + - + - : 2 : {RPCResult::Type::STR, "name", "Device name"},
+ - ]
32 : : }},
33 : : },
34 : : }
35 : : }
36 : : },
37 [ + - ]: 2 : RPCExamples{
38 [ + - + - : 2 : HelpExampleCli("enumeratesigners", "")
+ - ]
39 [ + - + - : 2 : + HelpExampleRpc("enumeratesigners", "")
+ - + - ]
40 : : },
41 [ + - ]: 2 : [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
42 : : {
43 [ # # # # : 0 : const std::string command = gArgs.GetArg("-signer", "");
# # ]
44 [ # # # # : 0 : if (command == "") throw JSONRPCError(RPC_MISC_ERROR, "Error: restart bitcoind with -signer=<cmd>");
# # # # #
# ]
45 [ # # ]: 0 : const std::string chain = gArgs.GetChainTypeString();
46 [ # # ]: 0 : UniValue signers_res = UniValue::VARR;
47 : : try {
48 : 0 : std::vector<ExternalSigner> signers;
49 [ # # # # ]: 0 : ExternalSigner::Enumerate(command, signers, chain);
50 [ # # ]: 0 : for (const ExternalSigner& signer : signers) {
51 [ # # ]: 0 : UniValue signer_res = UniValue::VOBJ;
52 [ # # # # : 0 : signer_res.pushKV("fingerprint", signer.m_fingerprint);
# # ]
53 [ # # # # : 0 : signer_res.pushKV("name", signer.m_name);
# # ]
54 [ # # # # ]: 0 : signers_res.push_back(signer_res);
55 : 0 : }
56 [ # # ]: 0 : } catch (const std::exception& e) {
57 [ # # # # : 0 : throw JSONRPCError(RPC_MISC_ERROR, e.what());
# # ]
58 [ # # ]: 0 : }
59 [ # # ]: 0 : UniValue result(UniValue::VOBJ);
60 [ # # # # : 0 : result.pushKV("signers", signers_res);
# # ]
61 : 0 : return result;
62 [ # # ]: 0 : }
63 : : };
64 : 0 : }
65 : :
66 : 1 : void RegisterSignerRPCCommands(CRPCTable& t)
67 : : {
68 [ + - - + : 2 : static const CRPCCommand commands[]{
# # ]
69 [ + - - + ]: 1 : {"signer", &enumeratesigners},
70 : : };
71 [ + + ]: 2 : for (const auto& c : commands) {
72 : 1 : t.appendCommand(c.name, &c);
73 : : }
74 : 3 : }
75 : :
76 : : #endif // ENABLE_EXTERNAL_SIGNER
|