mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 13:13:44 +01:00
Add tests for directory_handle_command_get
This commit is contained in:
parent
a444b11323
commit
4ff08bb581
@ -623,8 +623,8 @@ static char *global_dirfrontpagecontents = NULL;
|
||||
static smartlist_t *configured_ports = NULL;
|
||||
|
||||
/** Return the contents of our frontpage string, or NULL if not configured. */
|
||||
const char *
|
||||
get_dirportfrontpage(void)
|
||||
MOCK_IMPL(const char*,
|
||||
get_dirportfrontpage, (void))
|
||||
{
|
||||
return global_dirfrontpagecontents;
|
||||
}
|
||||
|
@ -14,8 +14,8 @@
|
||||
|
||||
#include "testsupport.h"
|
||||
|
||||
const char *get_dirportfrontpage(void);
|
||||
MOCK_DECL(const or_options_t *,get_options,(void));
|
||||
MOCK_DECL(const char*, get_dirportfrontpage, (void));
|
||||
MOCK_DECL(const or_options_t *, get_options, (void));
|
||||
or_options_t *get_options_mutable(void);
|
||||
int set_options(or_options_t *new_val, char **msg);
|
||||
void config_free_all(void);
|
||||
|
@ -2614,7 +2614,7 @@ choose_compression_level(ssize_t n_bytes)
|
||||
* service descriptor. On finding one, write a response into
|
||||
* conn-\>outbuf. If the request is unrecognized, send a 400.
|
||||
* Always return 0. */
|
||||
static int
|
||||
STATIC int
|
||||
directory_handle_command_get(dir_connection_t *conn, const char *headers,
|
||||
const char *req_body, size_t req_body_len)
|
||||
{
|
||||
@ -2874,7 +2874,7 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
|
||||
});
|
||||
|
||||
if (global_write_bucket_low(TO_CONN(conn), estimated_len, 2)) {
|
||||
write_http_status_line(conn, 503, "Directory busy, try again later.");
|
||||
write_http_status_line(conn, 503, "Directory busy, try again later");
|
||||
goto vote_done;
|
||||
}
|
||||
write_http_response_header(conn, body_len ? body_len : -1, compressed,
|
||||
@ -3071,7 +3071,7 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
|
||||
len += c->cache_info.signed_descriptor_len);
|
||||
|
||||
if (global_write_bucket_low(TO_CONN(conn), compressed?len/2:len, 2)) {
|
||||
write_http_status_line(conn, 503, "Directory busy, try again later.");
|
||||
write_http_status_line(conn, 503, "Directory busy, try again later");
|
||||
goto keys_done;
|
||||
}
|
||||
|
||||
|
@ -127,6 +127,10 @@ STATIC int purpose_needs_anonymity(uint8_t dir_purpose,
|
||||
uint8_t router_purpose);
|
||||
STATIC dirinfo_type_t dir_fetch_type(int dir_purpose, int router_purpose,
|
||||
const char *resource);
|
||||
STATIC int directory_handle_command_get(dir_connection_t *conn,
|
||||
const char *headers,
|
||||
const char *req_body,
|
||||
size_t req_body_len);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -3373,8 +3373,8 @@ dirvote_free_all(void)
|
||||
* ==== */
|
||||
|
||||
/** Return the body of the consensus that we're currently trying to build. */
|
||||
const char *
|
||||
dirvote_get_pending_consensus(consensus_flavor_t flav)
|
||||
MOCK_IMPL(const char *,
|
||||
dirvote_get_pending_consensus, (consensus_flavor_t flav))
|
||||
{
|
||||
tor_assert(((int)flav) >= 0 && (int)flav < N_CONSENSUS_FLAVORS);
|
||||
return pending_consensuses[flav].body;
|
||||
@ -3382,8 +3382,8 @@ dirvote_get_pending_consensus(consensus_flavor_t flav)
|
||||
|
||||
/** Return the signatures that we know for the consensus that we're currently
|
||||
* trying to build. */
|
||||
const char *
|
||||
dirvote_get_pending_detached_signatures(void)
|
||||
MOCK_IMPL(const char *,
|
||||
dirvote_get_pending_detached_signatures, (void))
|
||||
{
|
||||
return pending_consensus_signatures;
|
||||
}
|
||||
|
@ -136,8 +136,10 @@ int dirvote_add_signatures(const char *detached_signatures_body,
|
||||
const char **msg_out);
|
||||
|
||||
/* Item access */
|
||||
const char *dirvote_get_pending_consensus(consensus_flavor_t flav);
|
||||
const char *dirvote_get_pending_detached_signatures(void);
|
||||
MOCK_DECL(const char*, dirvote_get_pending_consensus,
|
||||
(consensus_flavor_t flav));
|
||||
MOCK_DECL(const char*, dirvote_get_pending_detached_signatures, (void));
|
||||
|
||||
#define DGV_BY_ID 1
|
||||
#define DGV_INCLUDE_PENDING 2
|
||||
#define DGV_INCLUDE_PREVIOUS 4
|
||||
|
@ -18,7 +18,6 @@
|
||||
#include "geoip.h"
|
||||
#include "routerlist.h"
|
||||
|
||||
static void clear_geoip_db(void);
|
||||
static void init_geoip_countries(void);
|
||||
|
||||
/** An entry from the GeoIP IPv4 file: maps an IPv4 range to a country. */
|
||||
@ -1207,9 +1206,9 @@ geoip_format_dirreq_stats(time_t now)
|
||||
{
|
||||
char t[ISO_TIME_LEN+1];
|
||||
int i;
|
||||
char *v3_ips_string, *v3_reqs_string, *v3_direct_dl_string,
|
||||
*v3_tunneled_dl_string;
|
||||
char *result;
|
||||
char *v3_ips_string = NULL, *v3_reqs_string = NULL,
|
||||
*v3_direct_dl_string = NULL, *v3_tunneled_dl_string = NULL;
|
||||
char *result = NULL;
|
||||
|
||||
if (!start_of_dirreq_stats_interval)
|
||||
return NULL; /* Not initialized. */
|
||||
@ -1666,7 +1665,7 @@ getinfo_helper_geoip(control_connection_t *control_conn,
|
||||
}
|
||||
|
||||
/** Release all storage held by the GeoIP databases and country list. */
|
||||
static void
|
||||
STATIC void
|
||||
clear_geoip_db(void)
|
||||
{
|
||||
if (geoip_countries) {
|
||||
|
@ -18,6 +18,7 @@
|
||||
STATIC int geoip_parse_entry(const char *line, sa_family_t family);
|
||||
STATIC int geoip_get_country_by_ipv4(uint32_t ipaddr);
|
||||
STATIC int geoip_get_country_by_ipv6(const struct in6_addr *addr);
|
||||
STATIC void clear_geoip_db(void);
|
||||
#endif
|
||||
int should_record_bridge_info(const or_options_t *options);
|
||||
int geoip_load_file(sa_family_t family, const char *filename);
|
||||
|
@ -269,8 +269,8 @@ client_identity_key_is_set(void)
|
||||
|
||||
/** Return the key certificate for this v3 (voting) authority, or NULL
|
||||
* if we have no such certificate. */
|
||||
authority_cert_t *
|
||||
get_my_v3_authority_cert(void)
|
||||
MOCK_IMPL(authority_cert_t *,
|
||||
get_my_v3_authority_cert, (void))
|
||||
{
|
||||
return authority_key_certificate;
|
||||
}
|
||||
|
@ -22,7 +22,7 @@ int server_identity_key_is_set(void);
|
||||
void set_client_identity_key(crypto_pk_t *k);
|
||||
crypto_pk_t *get_tlsclient_identity_key(void);
|
||||
int client_identity_key_is_set(void);
|
||||
authority_cert_t *get_my_v3_authority_cert(void);
|
||||
MOCK_DECL(authority_cert_t *, get_my_v3_authority_cert, (void));
|
||||
crypto_pk_t *get_my_v3_authority_signing_key(void);
|
||||
authority_cert_t *get_my_v3_legacy_cert(void);
|
||||
crypto_pk_t *get_my_v3_legacy_signing_key(void);
|
||||
|
@ -5184,8 +5184,8 @@ hid_serv_acting_as_directory(void)
|
||||
|
||||
/** Return true if this node is responsible for storing the descriptor ID
|
||||
* in <b>query</b> and false otherwise. */
|
||||
int
|
||||
hid_serv_responsible_for_desc_id(const char *query)
|
||||
MOCK_IMPL(int, hid_serv_responsible_for_desc_id,
|
||||
(const char *query))
|
||||
{
|
||||
const routerinfo_t *me;
|
||||
routerstatus_t *last_rs;
|
||||
|
@ -201,7 +201,7 @@ void refresh_all_country_info(void);
|
||||
int hid_serv_get_responsible_directories(smartlist_t *responsible_dirs,
|
||||
const char *id);
|
||||
int hid_serv_acting_as_directory(void);
|
||||
int hid_serv_responsible_for_desc_id(const char *id);
|
||||
MOCK_DECL(int, hid_serv_responsible_for_desc_id, (const char *id));
|
||||
|
||||
void list_pending_microdesc_downloads(digest256map_t *result);
|
||||
void launch_descriptor_downloads(int purpose,
|
||||
|
@ -70,6 +70,7 @@ src_test_test_SOURCES = \
|
||||
src/test/test_crypto.c \
|
||||
src/test/test_data.c \
|
||||
src/test/test_dir.c \
|
||||
src/test/test_dir_handle_get.c \
|
||||
src/test/test_entryconn.c \
|
||||
src/test/test_entrynodes.c \
|
||||
src/test/test_guardfraction.c \
|
||||
@ -97,7 +98,8 @@ src_test_test_SOURCES = \
|
||||
src/test/test_threads.c \
|
||||
src/test/test_util.c \
|
||||
src/test/test_helpers.c \
|
||||
src/test/test_dns.c \
|
||||
src/test/rend_test_helpers.c \
|
||||
src/test/test_dns.c \
|
||||
src/test/testing_common.c \
|
||||
src/ext/tinytest.c
|
||||
|
||||
|
66
src/test/rend_test_helpers.c
Normal file
66
src/test/rend_test_helpers.c
Normal file
@ -0,0 +1,66 @@
|
||||
#include "rend_test_helpers.h"
|
||||
|
||||
#include "test.h"
|
||||
#include "rendcommon.h"
|
||||
|
||||
void
|
||||
generate_desc(int time_diff, rend_encoded_v2_service_descriptor_t **desc,
|
||||
char **service_id, int intro_points)
|
||||
{
|
||||
rend_service_descriptor_t *generated = NULL;
|
||||
smartlist_t *descs = smartlist_new();
|
||||
time_t now;
|
||||
|
||||
now = time(NULL) + time_diff;
|
||||
create_descriptor(&generated, service_id, intro_points);
|
||||
generated->timestamp = now;
|
||||
|
||||
rend_encode_v2_descriptors(descs, generated, now, 0, REND_NO_AUTH, NULL,
|
||||
NULL);
|
||||
*desc = ((rend_encoded_v2_service_descriptor_t *)smartlist_get(descs, 0));
|
||||
|
||||
smartlist_free(descs);
|
||||
rend_service_descriptor_free(generated);
|
||||
}
|
||||
|
||||
void
|
||||
create_descriptor(rend_service_descriptor_t **generated, char **service_id,
|
||||
int intro_points)
|
||||
{
|
||||
crypto_pk_t *pk1 = NULL;
|
||||
crypto_pk_t *pk2 = NULL;
|
||||
int i;
|
||||
|
||||
*service_id = tor_malloc(REND_SERVICE_ID_LEN_BASE32+1);
|
||||
pk1 = pk_generate(0);
|
||||
pk2 = pk_generate(1);
|
||||
|
||||
*generated = tor_malloc_zero(sizeof(rend_service_descriptor_t));
|
||||
(*generated)->pk = crypto_pk_dup_key(pk1);
|
||||
rend_get_service_id((*generated)->pk, *service_id);
|
||||
|
||||
(*generated)->version = 2;
|
||||
(*generated)->protocols = 42;
|
||||
(*generated)->intro_nodes = smartlist_new();
|
||||
|
||||
for (i = 0; i < intro_points; i++) {
|
||||
rend_intro_point_t *intro = tor_malloc_zero(sizeof(rend_intro_point_t));
|
||||
crypto_pk_t *okey = pk_generate(2 + i);
|
||||
intro->extend_info = tor_malloc_zero(sizeof(extend_info_t));
|
||||
intro->extend_info->onion_key = okey;
|
||||
crypto_pk_get_digest(intro->extend_info->onion_key,
|
||||
intro->extend_info->identity_digest);
|
||||
intro->extend_info->nickname[0] = '$';
|
||||
base16_encode(intro->extend_info->nickname + 1,
|
||||
sizeof(intro->extend_info->nickname) - 1,
|
||||
intro->extend_info->identity_digest, DIGEST_LEN);
|
||||
tor_addr_from_ipv4h(&intro->extend_info->addr, crypto_rand_int(65536));
|
||||
intro->extend_info->port = 1 + crypto_rand_int(65535);
|
||||
intro->intro_key = crypto_pk_dup_key(pk2);
|
||||
smartlist_add((*generated)->intro_nodes, intro);
|
||||
}
|
||||
|
||||
crypto_pk_free(pk1);
|
||||
crypto_pk_free(pk2);
|
||||
}
|
||||
|
15
src/test/rend_test_helpers.h
Normal file
15
src/test/rend_test_helpers.h
Normal file
@ -0,0 +1,15 @@
|
||||
/* Copyright (c) 2014-2015, The Tor Project, Inc. */
|
||||
/* See LICENSE for licensing information */
|
||||
|
||||
#include "or.h"
|
||||
|
||||
#ifndef TOR_REND_TEST_HELPERS_H
|
||||
#define TOR_REND_TEST_HELPERS_H
|
||||
|
||||
void generate_desc(int time_diff, rend_encoded_v2_service_descriptor_t **desc,
|
||||
char **service_id, int intro_points);
|
||||
void create_descriptor(rend_service_descriptor_t **generated,
|
||||
char **service_id, int intro_points);
|
||||
|
||||
#endif
|
||||
|
@ -1131,6 +1131,7 @@ extern struct testcase_t controller_tests[];
|
||||
extern struct testcase_t controller_event_tests[];
|
||||
extern struct testcase_t crypto_tests[];
|
||||
extern struct testcase_t dir_tests[];
|
||||
extern struct testcase_t dir_handle_get_tests[];
|
||||
extern struct testcase_t entryconn_tests[];
|
||||
extern struct testcase_t entrynodes_tests[];
|
||||
extern struct testcase_t guardfraction_tests[];
|
||||
@ -1179,6 +1180,7 @@ struct testgroup_t testgroups[] = {
|
||||
{ "control/event/", controller_event_tests },
|
||||
{ "crypto/", crypto_tests },
|
||||
{ "dir/", dir_tests },
|
||||
{ "dir_handle_get/", dir_handle_get_tests },
|
||||
{ "dir/md/", microdesc_tests },
|
||||
{ "entryconn/", entryconn_tests },
|
||||
{ "entrynodes/", entrynodes_tests },
|
||||
|
2528
src/test/test_dir_handle_get.c
Normal file
2528
src/test/test_dir_handle_get.c
Normal file
File diff suppressed because it is too large
Load Diff
94
src/test/vote_descriptors.inc
Normal file
94
src/test/vote_descriptors.inc
Normal file
@ -0,0 +1,94 @@
|
||||
const char* VOTE_BODY_V3 =
|
||||
"network-status-version 3\n"
|
||||
"vote-status vote\n"
|
||||
"consensus-methods 13 14 15 16 17 18 19 20 21\n"
|
||||
"published 2015-09-02 19:34:15\n"
|
||||
"valid-after 2015-09-02 19:50:55\n"
|
||||
"fresh-until 2015-09-02 20:07:38\n"
|
||||
"valid-until 2015-09-02 20:24:15\n"
|
||||
"voting-delay 100 250\n"
|
||||
"client-versions 0.1.2.14,0.1.2.17\n"
|
||||
"server-versions 0.1.2.10,0.1.2.15,0.1.2.16\n"
|
||||
"known-flags Authority Exit Fast Guard MadeOfCheese MadeOfTin Running Stable V2Dir Valid\n"
|
||||
"flag-thresholds stable-uptime=0 stable-mtbf=0 fast-speed=0 guard-wfu=0.000% guard-tk=0 guard-bw-inc-exits=0 guard-bw-exc-exits=0 enough-mtbf=0 ignoring-advertised-bws=0\n"
|
||||
"params circuitwindow=80 foo=660\n"
|
||||
"dir-source Voter3 D867ACF56A9D229B35C25F0090BC9867E906BE69 3.4.5.6 3.4.5.6 80 9000\n"
|
||||
"contact voter@example.com\n"
|
||||
"legacy-dir-key 4141414141414141414141414141414141414141\n"
|
||||
"dir-key-certificate-version 3\n"
|
||||
"fingerprint D867ACF56A9D229B35C25F0090BC9867E906BE69\n"
|
||||
"dir-key-published 2008-12-12 18:07:24\n"
|
||||
"dir-key-expires 2009-12-12 18:07:24\n"
|
||||
"dir-identity-key\n"
|
||||
"-----BEGIN RSA PUBLIC KEY-----\n"
|
||||
"MIIBigKCAYEAveMpKlw8oD1YqFqpJchuwSR82BDhutbqgHiez3QO9FmzOctJpV+Y\n"
|
||||
"mpTYIJLS/qC+4GBKFF1VK0C4SoBrS3zri0qdXdE+vBGcyrxrjMklpxoqSKRY2011\n"
|
||||
"4eqYPghKlo5RzuqteBclGCHyNxWjUJeRKDWgvh+U/gr2uYM6fRm5q0fCzg4aECE7\n"
|
||||
"VP6fDGZrMbQI8jHpiMSoC9gkUASNEa6chLInlnP8/H5qUEW4TB9CN/q095pefuwL\n"
|
||||
"P+F+1Nz5hnM7fa5XmeMB8iM4RriUmOQlLBZgpQBMpEfWMIPcR9F1Gh3MxERqqUcH\n"
|
||||
"tmij+IZdeXg9OkCXykcabaYIhZD3meErn9Tax4oA/THduLfgli9zM0ExwzH1OooN\n"
|
||||
"L8rIcJ+2eBo3bQiQUbdYW71sl9w7nSPtircbJUa1mUvWYLPWQxFliPiQSetgJLMj\n"
|
||||
"VQqtPmV2hvN2Xk3lLfJO50qMTK7w7Gsaw8UtV4YDM1Hcjp/hQaIB1xfwhXgl+eUU\n"
|
||||
"btUa4c+cUTjHAgMBAAE=\n"
|
||||
"-----END RSA PUBLIC KEY-----\n"
|
||||
"dir-signing-key\n"
|
||||
"-----BEGIN RSA PUBLIC KEY-----\n"
|
||||
"MIGJAoGBALPSUInyuEu6NV3NjozplaniIEBzQXEjv1x9/+mqnwZABpYVmuy9A8nx\n"
|
||||
"eoyY3sZFsnYwNW/IZjAgG23pEmevu3F+L4myMjjaa6ORl3MgRYQ4gmuFqpefrGdm\n"
|
||||
"ywRCleh2JerkQ4VxOuq10dn/abITzLyaZzMw30KXWp5pxKXOLtxFAgMBAAE=\n"
|
||||
"-----END RSA PUBLIC KEY-----\n"
|
||||
"dir-key-crosscert\n"
|
||||
"-----BEGIN ID SIGNATURE-----\n"
|
||||
"FTBJNR/Hlt4T53yUMp1r/QCSMCpkHJCbYBT0R0pvYqhqFfYN5qHRSICRXaFFImIF\n"
|
||||
"0DGWmwRza6DxPKNzkm5/b7I0de9zJW1jNNdQAQK5xppAtQcAafRdu8cBonnmh9KX\n"
|
||||
"k1NrAK/X00FYywju3yl/SxCn1GddVNkHYexEudmJMPM=\n"
|
||||
"-----END ID SIGNATURE-----\n"
|
||||
"dir-key-certification\n"
|
||||
"-----BEGIN SIGNATURE-----\n"
|
||||
"pjWguLFBfELZDc6DywL6Do21SCl7LcutfpM92MEn4WYeSNcTXNR6lRX7reOEJk4e\n"
|
||||
"NwEaMt+Hl7slgeR5wjnW3OmMmRPZK9bquNWbfD+sAOV9bRFZTpXIdleAQFPlwvMF\n"
|
||||
"z/Gzwspzn4i2Yh6hySShrctMmW8YL3OM8LsBXzBhp/rG2uHlsxmIsc13DA6HWt61\n"
|
||||
"ffY72uNE6KckDGsQ4wPGP9q69y6g+X+TNio1KPbsILbePv6EjbO+rS8FiS4njPlg\n"
|
||||
"SPYry1RaUvxzxTkswIzdE1tjJrUiqpbWlTGxrH9N4OszoLm45Pc784KLULrjKIoi\n"
|
||||
"Q+vRsGrcMBAa+kDowWU6H1ryKR7KOhzRTcf2uqLE/W3ezaRwmOG+ETmoVFwbhk2X\n"
|
||||
"OlbXEM9fWP+INvFkr6Z93VYL2jGkCjV7e3xXmre/Lb92fUcYi6t5dwzfV8gJnIoG\n"
|
||||
"eCHd0K8NrQK0ipVk/7zcPDKOPeo9Y5aj/f6X/pDHtb+Dd5sT+l82G/Tqy4DIYUYR\n"
|
||||
"-----END SIGNATURE-----\n"
|
||||
"r router2 AwMDAwMDAwMDAwMDAwMDAwMDAwM Tk5OTk5OTk5OTk5OTk5OTk5OTk4 2015-09-02 19:09:15 153.0.136.1 443 8000\n"
|
||||
"s Running V2Dir\n"
|
||||
"v 0.1.2.14\n"
|
||||
"w Bandwidth=30 Measured=30\n"
|
||||
"p reject 1-65535\n"
|
||||
"id ed25519 none\n"
|
||||
"m 9,10,11,12,13,14,15,16,17 sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa0\n"
|
||||
"r router1 BQUFBQUFBQUFBQUFBQUFBQUFBQU TU1NTU1NTU1NTU1NTU1NTU1NTU0 2015-09-02 19:17:35 153.0.153.1 443 0\n"
|
||||
"a [1:2:3::4]:4711\n"
|
||||
"s Exit Fast Guard Running Stable Valid\n"
|
||||
"v 0.2.0.5\n"
|
||||
"w Bandwidth=120 Measured=120\n"
|
||||
"p reject 1-65535\n"
|
||||
"id ed25519 none\n"
|
||||
"m 9,10,11,12,13,14,15,16,17 sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa1\n"
|
||||
"r router3 MzMzMzMzMzMzMzMzMzMzMzMzMzM T09PT09PT09PT09PT09PT09PT08 2015-09-02 19:17:35 170.0.153.1 400 9999\n"
|
||||
"s Authority Exit Fast Guard Running Stable V2Dir Valid\n"
|
||||
"v 0.1.0.3\n"
|
||||
"w Bandwidth=120\n"
|
||||
"p reject 1-65535\n"
|
||||
"id ed25519 none\n"
|
||||
"m 9,10,11,12,13,14,15,16,17 "
|
||||
"sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa2\n"
|
||||
"r router4 NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ Ly8vLy8vLy8vLy8vLy8vLy8vLy8 2015-09-02 19:17:35 192.0.2.3 500 1999\n"
|
||||
"s Running V2Dir\n"
|
||||
"v 0.1.6.3\n"
|
||||
"w Bandwidth=30\n"
|
||||
"p reject 1-65535\n"
|
||||
"id ed25519 none\n"
|
||||
"m 9,10,11,12,13,14,15,16,17 sha256=xyzajkldsdsajdadlsdjaslsdksdjlsdjsdaskdaaa3\n"
|
||||
"directory-footer\n"
|
||||
"directory-signature D867ACF56A9D229B35C25F0090BC9867E906BE69 CBF56A83368A5150F1A9AAADAFB4D77F8C4170E2\n"
|
||||
"-----BEGIN SIGNATURE-----\n"
|
||||
"AHiWcHe+T3XbnlQqvqSAk6RY3XmEy1+hM2u9Xk6BNi7BpQkEQM1f0vzRpgn5Dnf2\n"
|
||||
"TXQWGUq9Z7jdSVnzWT3xqPA4zjw6eZkj+DKUtwq+oEDZGlf8eHTFmr0NAWfwZbk9\n"
|
||||
"NAjbMTUXUP37N2XAZwkoCWwFCrrfMwXrL7OhZbj7ifo=\n"
|
||||
"-----END SIGNATURE-----\n";
|
||||
|
Loading…
Reference in New Issue
Block a user