xrpld
Toggle main menu visibility
Loading...
Searching...
No Matches
xrpld
rpc
handlers
admin
signing
ChannelAuthorize.cpp
1
#include <xrpld/app/main/Application.h>
2
#include <xrpld/rpc/Context.h>
3
#include <xrpld/rpc/Role.h>
4
#include <xrpld/rpc/detail/RPCHelpers.h>
5
6
#include <xrpl/basics/StringUtilities.h>
7
#include <xrpl/basics/base_uint.h>
8
#include <xrpl/basics/strHex.h>
9
#include <xrpl/beast/utility/instrumentation.h>
10
#include <xrpl/json/json_value.h>
11
#include <xrpl/protocol/ErrorCodes.h>
12
#include <xrpl/protocol/PayChan.h>
13
#include <xrpl/protocol/RPCErr.h>
14
#include <xrpl/protocol/SecretKey.h>
15
#include <xrpl/protocol/Serializer.h>
16
#include <xrpl/protocol/XRPAmount.h>
17
#include <xrpl/protocol/jss.h>
18
#include <xrpl/resource/Fees.h>
19
20
#include <
cstdint
>
21
#include <
exception
>
22
#include <
optional
>
23
#include <
utility
>
24
25
namespace
xrpl
{
26
27
// {
28
// secret_key: <signing_secret_key>
29
// key_type: optional; either ed25519 or secp256k1 (default to secp256k1)
30
// channel_id: 256-bit channel id
31
// drops: 64-bit uint (as string)
32
// }
33
json::Value
34
doChannelAuthorize
(
rpc::JsonContext
& context)
35
{
36
if
(context.
role
!=
Role::ADMIN
&& !context.
app
.
config
().
canSign
())
37
{
38
return
rpc::makeError
(
RpcNotSupported
,
"Signing is not supported by this server."
);
39
}
40
41
context.
loadType
=
resource::kFeeHeavyBurdenRpc
;
42
43
auto
const
& params(context.
params
);
44
for
(
auto
const
& p : {jss::channel_id, jss::amount})
45
{
46
if
(!params.isMember(p))
47
return
rpc::missingFieldError
(p);
48
}
49
50
// Compatibility if a key type isn't specified. If it is, the
51
// keypairForSignature code will validate parameters and return
52
// the appropriate error.
53
if
(!params.isMember(jss::key_type) && !params.isMember(jss::secret))
54
return
rpc::missingFieldError
(jss::secret);
55
56
json::Value
result;
57
std::optional<std::pair<PublicKey, SecretKey>
>
const
keyPair =
58
rpc::keypairForSignature
(params, result, context.
apiVersion
);
59
60
XRPL_ASSERT(
61
keyPair ||
rpc::containsError
(result),
62
"xrpl::doChannelAuthorize : valid keyPair or an error"
);
63
if
(!keyPair ||
rpc::containsError
(result))
64
return
result;
65
66
PublicKey
const
& pk = keyPair->first;
67
SecretKey
const
& sk = keyPair->second;
68
69
if
(!params[jss::channel_id].isString())
70
return
rpcError
(
RpcInvalidParams
);
71
72
UInt256
channelId;
73
if
(!channelId.
parseHex
(params[jss::channel_id].asString()))
74
return
rpcError
(
RpcChannelMalformed
);
75
76
std::optional<std::uint64_t>
const
optDrops =
77
params[jss::amount].isString() ?
toUInt64
(params[jss::amount].asString()) : std::nullopt;
78
79
if
(!optDrops)
80
return
rpcError
(
RpcChannelAmtMalformed
);
81
82
std::uint64_t
const
drops = *optDrops;
83
84
Serializer
msg;
85
serializePayChanAuthorization
(msg, channelId,
XRPAmount
(drops));
86
87
try
88
{
89
auto
const
buf =
sign
(pk, sk, msg.
slice
());
90
result[jss::signature] =
strHex
(buf);
91
}
92
catch
(
std::exception
const
& ex)
93
{
94
// LCOV_EXCL_START
95
result =
rpc::makeError
(
96
RpcInternal
,
"Exception occurred during signing: "
+
std::string
(ex.
what
()));
97
// LCOV_EXCL_STOP
98
}
99
return
result;
100
}
101
102
}
// namespace xrpl
std::string
json::Value
Represents a JSON value.
Definition
json_value.h:117
xrpl::Application::config
virtual Config & config()=0
xrpl::BaseUInt::parseHex
constexpr bool parseHex(std::string_view sv)
Parse a hex string into a base_uint.
Definition
base_uint.h:525
xrpl::Config::canSign
bool canSign() const
Definition
src/xrpld/core/Config.h:372
xrpl::PublicKey
A public key.
Definition
PublicKey.h:53
xrpl::SecretKey
A secret key.
Definition
SecretKey.h:24
xrpl::Serializer
Definition
Serializer.h:23
xrpl::Serializer::slice
Slice slice() const noexcept
Definition
Serializer.h:141
xrpl::XRPAmount
Definition
XRPAmount.h:28
cstdint
exception
std::uint64_t
xrpl::resource::kFeeHeavyBurdenRpc
Charge const kFeeHeavyBurdenRpc
xrpl::rpc::containsError
bool containsError(json::Value const &json)
Returns true if the json contains an rpc error specification.
Definition
ErrorCodes.cpp:206
xrpl::rpc::missingFieldError
json::Value missingFieldError(std::string const &name)
Definition
ErrorCodes.h:243
xrpl::rpc::makeError
json::Value makeError(ErrorCodeI code)
Returns a new json object that reflects the error code.
Definition
ErrorCodes.cpp:190
xrpl::rpc::keypairForSignature
std::optional< std::pair< PublicKey, SecretKey > > keypairForSignature(json::Value const ¶ms, json::Value &error, unsigned int apiVersion)
Generates a keypair for signature from RPC parameters.
Definition
RPCHelpers.cpp:242
xrpl
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition
algorithm.h:5
xrpl::serializePayChanAuthorization
void serializePayChanAuthorization(Serializer &msg, UInt256 const &key, XRPAmount const &amt)
Definition
PayChan.h:11
xrpl::RpcChannelAmtMalformed
@ RpcChannelAmtMalformed
Definition
ErrorCodes.h:84
xrpl::RpcInternal
@ RpcInternal
Definition
ErrorCodes.h:113
xrpl::RpcNotSupported
@ RpcNotSupported
Definition
ErrorCodes.h:115
xrpl::RpcInvalidParams
@ RpcInvalidParams
Definition
ErrorCodes.h:67
xrpl::RpcChannelMalformed
@ RpcChannelMalformed
Definition
ErrorCodes.h:83
xrpl::strHex
std::string strHex(FwdIt begin, FwdIt end)
Definition
strHex.h:13
xrpl::rpcError
json::Value rpcError(ErrorCodeI iError)
Definition
RPCErr.cpp:13
xrpl::Role::ADMIN
@ ADMIN
Definition
Role.h:27
xrpl::UInt256
BaseUInt< 256 > UInt256
Definition
base_uint.h:580
xrpl::toUInt64
std::optional< std::uint64_t > toUInt64(std::string const &s)
Definition
libxrpl/basics/StringUtilities.cpp:136
xrpl::sign
Buffer sign(PublicKey const &pk, SecretKey const &sk, Slice const &message)
Generate a signature for a message.
Definition
SecretKey.cpp:233
xrpl::doChannelAuthorize
json::Value doChannelAuthorize(rpc::JsonContext &context)
Definition
ChannelAuthorize.cpp:34
optional
xrpl::rpc::Context::loadType
resource::Charge & loadType
Definition
Context.h:30
xrpl::rpc::Context::role
Role role
Definition
Context.h:34
xrpl::rpc::Context::apiVersion
unsigned int apiVersion
Definition
Context.h:37
xrpl::rpc::Context::app
Application & app
Definition
Context.h:29
xrpl::rpc::JsonContext
Definition
Context.h:41
xrpl::rpc::JsonContext::params
json::Value params
Definition
Context.h:51
utility
std::exception::what
T what(T... args)
Generated by
1.17.0