mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-02-17 01:52:02 +00:00
Update protobuf definitions
This commit is contained in:
parent
25598229a8
commit
e2064337c6
@ -97,6 +97,11 @@ SignedIdentity.address max_size:36
|
||||
SignedIdentity.public_key max_size:33
|
||||
SignedIdentity.signature max_size:65
|
||||
|
||||
GetECDHSessionKey.peer_public_key max_size:65
|
||||
GetECDHSessionKey.ecdsa_curve_name max_size:32
|
||||
|
||||
ECDHSessionKey.session_key max_size:65
|
||||
|
||||
# not used in firmware
|
||||
SimpleSignTx.inputs max_count:0
|
||||
SimpleSignTx.outputs max_count:0
|
||||
|
@ -149,11 +149,22 @@ const pb_field_t GetAddress_fields[5] = {
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
const pb_field_t EthereumGetAddress_fields[3] = {
|
||||
PB_FIELD2( 1, UINT32 , REPEATED, CALLBACK, FIRST, EthereumGetAddress, address_n, address_n, 0),
|
||||
PB_FIELD2( 2, BOOL , OPTIONAL, STATIC , OTHER, EthereumGetAddress, show_display, address_n, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
const pb_field_t Address_fields[2] = {
|
||||
PB_FIELD2( 1, STRING , REQUIRED, STATIC , FIRST, Address, address, address, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
const pb_field_t EthereumAddress_fields[2] = {
|
||||
PB_FIELD2( 1, BYTES , REQUIRED, CALLBACK, FIRST, EthereumAddress, address, address, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
const pb_field_t WipeDevice_fields[1] = {
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
@ -317,6 +328,31 @@ const pb_field_t TxAck_fields[2] = {
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
const pb_field_t EthereumSignTx_fields[9] = {
|
||||
PB_FIELD2( 1, UINT32 , REPEATED, CALLBACK, FIRST, EthereumSignTx, address_n, address_n, 0),
|
||||
PB_FIELD2( 2, BYTES , OPTIONAL, CALLBACK, OTHER, EthereumSignTx, nonce, address_n, 0),
|
||||
PB_FIELD2( 3, BYTES , OPTIONAL, CALLBACK, OTHER, EthereumSignTx, gas_price, nonce, 0),
|
||||
PB_FIELD2( 4, BYTES , OPTIONAL, CALLBACK, OTHER, EthereumSignTx, gas_limit, gas_price, 0),
|
||||
PB_FIELD2( 5, BYTES , OPTIONAL, CALLBACK, OTHER, EthereumSignTx, to, gas_limit, 0),
|
||||
PB_FIELD2( 6, BYTES , OPTIONAL, CALLBACK, OTHER, EthereumSignTx, value, to, 0),
|
||||
PB_FIELD2( 7, BYTES , OPTIONAL, CALLBACK, OTHER, EthereumSignTx, data_initial_chunk, value, 0),
|
||||
PB_FIELD2( 8, UINT32 , OPTIONAL, STATIC , OTHER, EthereumSignTx, data_length, data_initial_chunk, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
const pb_field_t EthereumTxRequest_fields[5] = {
|
||||
PB_FIELD2( 1, UINT32 , OPTIONAL, STATIC , FIRST, EthereumTxRequest, data_length, data_length, 0),
|
||||
PB_FIELD2( 2, UINT32 , OPTIONAL, STATIC , OTHER, EthereumTxRequest, signature_v, data_length, 0),
|
||||
PB_FIELD2( 3, BYTES , OPTIONAL, CALLBACK, OTHER, EthereumTxRequest, signature_r, signature_v, 0),
|
||||
PB_FIELD2( 4, BYTES , OPTIONAL, CALLBACK, OTHER, EthereumTxRequest, signature_s, signature_r, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
const pb_field_t EthereumTxAck_fields[2] = {
|
||||
PB_FIELD2( 1, BYTES , OPTIONAL, CALLBACK, FIRST, EthereumTxAck, data_chunk, data_chunk, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
const pb_field_t SignIdentity_fields[5] = {
|
||||
PB_FIELD2( 1, MESSAGE , OPTIONAL, STATIC , FIRST, SignIdentity, identity, identity, &IdentityType_fields),
|
||||
PB_FIELD2( 2, BYTES , OPTIONAL, STATIC , OTHER, SignIdentity, challenge_hidden, identity, 0),
|
||||
@ -332,6 +368,18 @@ const pb_field_t SignedIdentity_fields[4] = {
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
const pb_field_t GetECDHSessionKey_fields[4] = {
|
||||
PB_FIELD2( 1, MESSAGE , OPTIONAL, STATIC , FIRST, GetECDHSessionKey, identity, identity, &IdentityType_fields),
|
||||
PB_FIELD2( 2, BYTES , OPTIONAL, STATIC , OTHER, GetECDHSessionKey, peer_public_key, identity, 0),
|
||||
PB_FIELD2( 3, STRING , OPTIONAL, STATIC , OTHER, GetECDHSessionKey, ecdsa_curve_name, peer_public_key, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
const pb_field_t ECDHSessionKey_fields[2] = {
|
||||
PB_FIELD2( 1, BYTES , OPTIONAL, STATIC , FIRST, ECDHSessionKey, session_key, session_key, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
const pb_field_t FirmwareErase_fields[1] = {
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
@ -385,7 +433,7 @@ const pb_field_t DebugLinkLog_fields[4] = {
|
||||
* numbers or field sizes that are larger than what can fit in 8 or 16 bit
|
||||
* field descriptors.
|
||||
*/
|
||||
STATIC_ASSERT((pb_membersize(Features, coins[0]) < 65536 && pb_membersize(PublicKey, node) < 65536 && pb_membersize(GetAddress, multisig) < 65536 && pb_membersize(LoadDevice, node) < 65536 && pb_membersize(SimpleSignTx, inputs[0]) < 65536 && pb_membersize(SimpleSignTx, outputs[0]) < 65536 && pb_membersize(SimpleSignTx, transactions[0]) < 65536 && pb_membersize(TxRequest, details) < 65536 && pb_membersize(TxRequest, serialized) < 65536 && pb_membersize(TxAck, tx) < 65536 && pb_membersize(SignIdentity, identity) < 65536 && pb_membersize(DebugLinkState, node) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_Initialize_GetFeatures_Features_ClearSession_ApplySettings_ChangePin_Ping_Success_Failure_ButtonRequest_ButtonAck_PinMatrixRequest_PinMatrixAck_Cancel_PassphraseRequest_PassphraseAck_GetEntropy_Entropy_GetPublicKey_PublicKey_GetAddress_Address_WipeDevice_LoadDevice_ResetDevice_EntropyRequest_EntropyAck_RecoveryDevice_WordRequest_WordAck_SignMessage_VerifyMessage_MessageSignature_EncryptMessage_EncryptedMessage_DecryptMessage_DecryptedMessage_CipherKeyValue_CipheredKeyValue_EstimateTxSize_TxSize_SignTx_SimpleSignTx_TxRequest_TxAck_SignIdentity_SignedIdentity_FirmwareErase_FirmwareUpload_DebugLinkDecision_DebugLinkGetState_DebugLinkState_DebugLinkStop_DebugLinkLog)
|
||||
STATIC_ASSERT((pb_membersize(Features, coins[0]) < 65536 && pb_membersize(PublicKey, node) < 65536 && pb_membersize(GetAddress, multisig) < 65536 && pb_membersize(LoadDevice, node) < 65536 && pb_membersize(SimpleSignTx, inputs[0]) < 65536 && pb_membersize(SimpleSignTx, outputs[0]) < 65536 && pb_membersize(SimpleSignTx, transactions[0]) < 65536 && pb_membersize(TxRequest, details) < 65536 && pb_membersize(TxRequest, serialized) < 65536 && pb_membersize(TxAck, tx) < 65536 && pb_membersize(SignIdentity, identity) < 65536 && pb_membersize(GetECDHSessionKey, identity) < 65536 && pb_membersize(DebugLinkState, node) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_Initialize_GetFeatures_Features_ClearSession_ApplySettings_ChangePin_Ping_Success_Failure_ButtonRequest_ButtonAck_PinMatrixRequest_PinMatrixAck_Cancel_PassphraseRequest_PassphraseAck_GetEntropy_Entropy_GetPublicKey_PublicKey_GetAddress_EthereumGetAddress_Address_EthereumAddress_WipeDevice_LoadDevice_ResetDevice_EntropyRequest_EntropyAck_RecoveryDevice_WordRequest_WordAck_SignMessage_VerifyMessage_MessageSignature_EncryptMessage_EncryptedMessage_DecryptMessage_DecryptedMessage_CipherKeyValue_CipheredKeyValue_EstimateTxSize_TxSize_SignTx_SimpleSignTx_TxRequest_TxAck_EthereumSignTx_EthereumTxRequest_EthereumTxAck_SignIdentity_SignedIdentity_GetECDHSessionKey_ECDHSessionKey_FirmwareErase_FirmwareUpload_DebugLinkDecision_DebugLinkGetState_DebugLinkState_DebugLinkStop_DebugLinkLog)
|
||||
#endif
|
||||
|
||||
#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
|
||||
|
@ -61,6 +61,13 @@ typedef enum _MessageType {
|
||||
MessageType_MessageType_SignIdentity = 53,
|
||||
MessageType_MessageType_SignedIdentity = 54,
|
||||
MessageType_MessageType_GetFeatures = 55,
|
||||
MessageType_MessageType_EthereumGetAddress = 56,
|
||||
MessageType_MessageType_EthereumAddress = 57,
|
||||
MessageType_MessageType_EthereumSignTx = 58,
|
||||
MessageType_MessageType_EthereumTxRequest = 59,
|
||||
MessageType_MessageType_EthereumTxAck = 60,
|
||||
MessageType_MessageType_GetECDHSessionKey = 61,
|
||||
MessageType_MessageType_ECDHSessionKey = 62,
|
||||
MessageType_MessageType_DebugLinkDecision = 100,
|
||||
MessageType_MessageType_DebugLinkGetState = 101,
|
||||
MessageType_MessageType_DebugLinkState = 102,
|
||||
@ -270,6 +277,16 @@ typedef struct _DecryptedMessage {
|
||||
char address[36];
|
||||
} DecryptedMessage;
|
||||
|
||||
typedef struct {
|
||||
size_t size;
|
||||
uint8_t bytes[65];
|
||||
} ECDHSessionKey_session_key_t;
|
||||
|
||||
typedef struct _ECDHSessionKey {
|
||||
bool has_session_key;
|
||||
ECDHSessionKey_session_key_t session_key;
|
||||
} ECDHSessionKey;
|
||||
|
||||
typedef struct {
|
||||
size_t size;
|
||||
uint8_t bytes[33];
|
||||
@ -343,6 +360,41 @@ typedef struct _EstimateTxSize {
|
||||
char coin_name[17];
|
||||
} EstimateTxSize;
|
||||
|
||||
typedef struct _EthereumAddress {
|
||||
pb_callback_t address;
|
||||
} EthereumAddress;
|
||||
|
||||
typedef struct _EthereumGetAddress {
|
||||
pb_callback_t address_n;
|
||||
bool has_show_display;
|
||||
bool show_display;
|
||||
} EthereumGetAddress;
|
||||
|
||||
typedef struct _EthereumSignTx {
|
||||
pb_callback_t address_n;
|
||||
pb_callback_t nonce;
|
||||
pb_callback_t gas_price;
|
||||
pb_callback_t gas_limit;
|
||||
pb_callback_t to;
|
||||
pb_callback_t value;
|
||||
pb_callback_t data_initial_chunk;
|
||||
bool has_data_length;
|
||||
uint32_t data_length;
|
||||
} EthereumSignTx;
|
||||
|
||||
typedef struct _EthereumTxAck {
|
||||
pb_callback_t data_chunk;
|
||||
} EthereumTxAck;
|
||||
|
||||
typedef struct _EthereumTxRequest {
|
||||
bool has_data_length;
|
||||
uint32_t data_length;
|
||||
bool has_signature_v;
|
||||
uint32_t signature_v;
|
||||
pb_callback_t signature_r;
|
||||
pb_callback_t signature_s;
|
||||
} EthereumTxRequest;
|
||||
|
||||
typedef struct _Failure {
|
||||
bool has_code;
|
||||
FailureType code;
|
||||
@ -417,6 +469,20 @@ typedef struct _GetAddress {
|
||||
MultisigRedeemScriptType multisig;
|
||||
} GetAddress;
|
||||
|
||||
typedef struct {
|
||||
size_t size;
|
||||
uint8_t bytes[65];
|
||||
} GetECDHSessionKey_peer_public_key_t;
|
||||
|
||||
typedef struct _GetECDHSessionKey {
|
||||
bool has_identity;
|
||||
IdentityType identity;
|
||||
bool has_peer_public_key;
|
||||
GetECDHSessionKey_peer_public_key_t peer_public_key;
|
||||
bool has_ecdsa_curve_name;
|
||||
char ecdsa_curve_name[32];
|
||||
} GetECDHSessionKey;
|
||||
|
||||
typedef struct _GetEntropy {
|
||||
uint32_t size;
|
||||
} GetEntropy;
|
||||
@ -681,7 +747,9 @@ extern const uint32_t SimpleSignTx_lock_time_default;
|
||||
#define GetPublicKey_init_default {0, {0, 0, 0, 0, 0, 0, 0, 0}, false, "", false, 0}
|
||||
#define PublicKey_init_default {HDNodeType_init_default, false, ""}
|
||||
#define GetAddress_init_default {0, {0, 0, 0, 0, 0, 0, 0, 0}, false, "Bitcoin", false, 0, false, MultisigRedeemScriptType_init_default}
|
||||
#define EthereumGetAddress_init_default {{{NULL}, NULL}, false, 0}
|
||||
#define Address_init_default {""}
|
||||
#define EthereumAddress_init_default {{{NULL}, NULL}}
|
||||
#define WipeDevice_init_default {0}
|
||||
#define LoadDevice_init_default {false, "", false, HDNodeType_init_default, false, "", false, 0, false, "english", false, "", false, 0}
|
||||
#define ResetDevice_init_default {false, 0, false, 256u, false, 0, false, 0, false, "english", false, ""}
|
||||
@ -705,8 +773,13 @@ extern const uint32_t SimpleSignTx_lock_time_default;
|
||||
#define SimpleSignTx_init_default {0, {}, 0, {}, 0, {}, false, "Bitcoin", false, 1u, false, 0u}
|
||||
#define TxRequest_init_default {false, (RequestType)0, false, TxRequestDetailsType_init_default, false, TxRequestSerializedType_init_default}
|
||||
#define TxAck_init_default {false, TransactionType_init_default}
|
||||
#define EthereumSignTx_init_default {{{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, false, 0}
|
||||
#define EthereumTxRequest_init_default {false, 0, false, 0, {{NULL}, NULL}, {{NULL}, NULL}}
|
||||
#define EthereumTxAck_init_default {{{NULL}, NULL}}
|
||||
#define SignIdentity_init_default {false, IdentityType_init_default, false, {0, {0}}, false, "", false, ""}
|
||||
#define SignedIdentity_init_default {false, "", false, {0, {0}}, false, {0, {0}}}
|
||||
#define GetECDHSessionKey_init_default {false, IdentityType_init_default, false, {0, {0}}, false, ""}
|
||||
#define ECDHSessionKey_init_default {false, {0, {0}}}
|
||||
#define FirmwareErase_init_default {0}
|
||||
#define FirmwareUpload_init_default {{0, {0}}}
|
||||
#define DebugLinkDecision_init_default {0}
|
||||
@ -735,7 +808,9 @@ extern const uint32_t SimpleSignTx_lock_time_default;
|
||||
#define GetPublicKey_init_zero {0, {0, 0, 0, 0, 0, 0, 0, 0}, false, "", false, 0}
|
||||
#define PublicKey_init_zero {HDNodeType_init_zero, false, ""}
|
||||
#define GetAddress_init_zero {0, {0, 0, 0, 0, 0, 0, 0, 0}, false, "", false, 0, false, MultisigRedeemScriptType_init_zero}
|
||||
#define EthereumGetAddress_init_zero {{{NULL}, NULL}, false, 0}
|
||||
#define Address_init_zero {""}
|
||||
#define EthereumAddress_init_zero {{{NULL}, NULL}}
|
||||
#define WipeDevice_init_zero {0}
|
||||
#define LoadDevice_init_zero {false, "", false, HDNodeType_init_zero, false, "", false, 0, false, "", false, "", false, 0}
|
||||
#define ResetDevice_init_zero {false, 0, false, 0, false, 0, false, 0, false, "", false, ""}
|
||||
@ -759,8 +834,13 @@ extern const uint32_t SimpleSignTx_lock_time_default;
|
||||
#define SimpleSignTx_init_zero {0, {}, 0, {}, 0, {}, false, "", false, 0, false, 0}
|
||||
#define TxRequest_init_zero {false, (RequestType)0, false, TxRequestDetailsType_init_zero, false, TxRequestSerializedType_init_zero}
|
||||
#define TxAck_init_zero {false, TransactionType_init_zero}
|
||||
#define EthereumSignTx_init_zero {{{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, false, 0}
|
||||
#define EthereumTxRequest_init_zero {false, 0, false, 0, {{NULL}, NULL}, {{NULL}, NULL}}
|
||||
#define EthereumTxAck_init_zero {{{NULL}, NULL}}
|
||||
#define SignIdentity_init_zero {false, IdentityType_init_zero, false, {0, {0}}, false, "", false, ""}
|
||||
#define SignedIdentity_init_zero {false, "", false, {0, {0}}, false, {0, {0}}}
|
||||
#define GetECDHSessionKey_init_zero {false, IdentityType_init_zero, false, {0, {0}}, false, ""}
|
||||
#define ECDHSessionKey_init_zero {false, {0, {0}}}
|
||||
#define FirmwareErase_init_zero {0}
|
||||
#define FirmwareUpload_init_zero {{0, {0}}}
|
||||
#define DebugLinkDecision_init_zero {0}
|
||||
@ -806,6 +886,7 @@ extern const uint32_t SimpleSignTx_lock_time_default;
|
||||
#define DecryptMessage_hmac_tag 4
|
||||
#define DecryptedMessage_message_tag 1
|
||||
#define DecryptedMessage_address_tag 2
|
||||
#define ECDHSessionKey_session_key_tag 1
|
||||
#define EncryptMessage_pubkey_tag 1
|
||||
#define EncryptMessage_message_tag 2
|
||||
#define EncryptMessage_display_only_tag 3
|
||||
@ -819,6 +900,22 @@ extern const uint32_t SimpleSignTx_lock_time_default;
|
||||
#define EstimateTxSize_outputs_count_tag 1
|
||||
#define EstimateTxSize_inputs_count_tag 2
|
||||
#define EstimateTxSize_coin_name_tag 3
|
||||
#define EthereumAddress_address_tag 1
|
||||
#define EthereumGetAddress_address_n_tag 1
|
||||
#define EthereumGetAddress_show_display_tag 2
|
||||
#define EthereumSignTx_address_n_tag 1
|
||||
#define EthereumSignTx_nonce_tag 2
|
||||
#define EthereumSignTx_gas_price_tag 3
|
||||
#define EthereumSignTx_gas_limit_tag 4
|
||||
#define EthereumSignTx_to_tag 5
|
||||
#define EthereumSignTx_value_tag 6
|
||||
#define EthereumSignTx_data_initial_chunk_tag 7
|
||||
#define EthereumSignTx_data_length_tag 8
|
||||
#define EthereumTxAck_data_chunk_tag 1
|
||||
#define EthereumTxRequest_data_length_tag 1
|
||||
#define EthereumTxRequest_signature_v_tag 2
|
||||
#define EthereumTxRequest_signature_r_tag 3
|
||||
#define EthereumTxRequest_signature_s_tag 4
|
||||
#define Failure_code_tag 1
|
||||
#define Failure_message_tag 2
|
||||
#define Features_vendor_tag 1
|
||||
@ -843,6 +940,9 @@ extern const uint32_t SimpleSignTx_lock_time_default;
|
||||
#define GetAddress_coin_name_tag 2
|
||||
#define GetAddress_show_display_tag 3
|
||||
#define GetAddress_multisig_tag 4
|
||||
#define GetECDHSessionKey_identity_tag 1
|
||||
#define GetECDHSessionKey_peer_public_key_tag 2
|
||||
#define GetECDHSessionKey_ecdsa_curve_name_tag 3
|
||||
#define GetEntropy_size_tag 1
|
||||
#define GetPublicKey_address_n_tag 1
|
||||
#define GetPublicKey_ecdsa_curve_name_tag 2
|
||||
@ -932,7 +1032,9 @@ extern const pb_field_t Entropy_fields[2];
|
||||
extern const pb_field_t GetPublicKey_fields[4];
|
||||
extern const pb_field_t PublicKey_fields[3];
|
||||
extern const pb_field_t GetAddress_fields[5];
|
||||
extern const pb_field_t EthereumGetAddress_fields[3];
|
||||
extern const pb_field_t Address_fields[2];
|
||||
extern const pb_field_t EthereumAddress_fields[2];
|
||||
extern const pb_field_t WipeDevice_fields[1];
|
||||
extern const pb_field_t LoadDevice_fields[8];
|
||||
extern const pb_field_t ResetDevice_fields[7];
|
||||
@ -956,8 +1058,13 @@ extern const pb_field_t SignTx_fields[6];
|
||||
extern const pb_field_t SimpleSignTx_fields[7];
|
||||
extern const pb_field_t TxRequest_fields[4];
|
||||
extern const pb_field_t TxAck_fields[2];
|
||||
extern const pb_field_t EthereumSignTx_fields[9];
|
||||
extern const pb_field_t EthereumTxRequest_fields[5];
|
||||
extern const pb_field_t EthereumTxAck_fields[2];
|
||||
extern const pb_field_t SignIdentity_fields[5];
|
||||
extern const pb_field_t SignedIdentity_fields[4];
|
||||
extern const pb_field_t GetECDHSessionKey_fields[4];
|
||||
extern const pb_field_t ECDHSessionKey_fields[2];
|
||||
extern const pb_field_t FirmwareErase_fields[1];
|
||||
extern const pb_field_t FirmwareUpload_fields[2];
|
||||
extern const pb_field_t DebugLinkDecision_fields[2];
|
||||
@ -1014,6 +1121,8 @@ extern const pb_field_t DebugLinkLog_fields[4];
|
||||
#define TxAck_size (6 + TransactionType_size)
|
||||
#define SignIdentity_size (558 + IdentityType_size)
|
||||
#define SignedIdentity_size 140
|
||||
#define GetECDHSessionKey_size (107 + IdentityType_size)
|
||||
#define ECDHSessionKey_size 67
|
||||
#define FirmwareErase_size 0
|
||||
#define FirmwareUpload_size 2
|
||||
#define DebugLinkDecision_size 2
|
||||
|
2
vendor/trezor-common
vendored
2
vendor/trezor-common
vendored
@ -1 +1 @@
|
||||
Subproject commit 36a574056deacad8943f1412c3db149750f8b163
|
||||
Subproject commit e6295a33cda4f0541311c9098569531c2d84220b
|
Loading…
Reference in New Issue
Block a user