mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-09-20 21:16:22 +02:00
Code to parse and access network parameters.
Partial backport of381766ce4b
. Partial backport of56c6d78520
.
This commit is contained in:
parent
95008db08d
commit
83c3f118db
@ -119,6 +119,10 @@ typedef unsigned int uint32_t;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef INT32_MIN
|
||||||
|
#define INT32_MIN (-2147483647-1)
|
||||||
|
#endif
|
||||||
|
|
||||||
#if (SIZEOF_LONG == 4)
|
#if (SIZEOF_LONG == 4)
|
||||||
#ifndef HAVE_INT32_T
|
#ifndef HAVE_INT32_T
|
||||||
typedef signed long int32_t;
|
typedef signed long int32_t;
|
||||||
|
@ -286,6 +286,10 @@ networkstatus_vote_free(networkstatus_t *ns)
|
|||||||
SMARTLIST_FOREACH(ns->known_flags, char *, c, tor_free(c));
|
SMARTLIST_FOREACH(ns->known_flags, char *, c, tor_free(c));
|
||||||
smartlist_free(ns->known_flags);
|
smartlist_free(ns->known_flags);
|
||||||
}
|
}
|
||||||
|
if (ns->net_params) {
|
||||||
|
SMARTLIST_FOREACH(ns->net_params, char *, c, tor_free(c));
|
||||||
|
smartlist_free(ns->net_params);
|
||||||
|
}
|
||||||
if (ns->supported_methods) {
|
if (ns->supported_methods) {
|
||||||
SMARTLIST_FOREACH(ns->supported_methods, char *, c, tor_free(c));
|
SMARTLIST_FOREACH(ns->supported_methods, char *, c, tor_free(c));
|
||||||
smartlist_free(ns->supported_methods);
|
smartlist_free(ns->supported_methods);
|
||||||
@ -1884,6 +1888,33 @@ networkstatus_dump_bridge_status_to_file(time_t now)
|
|||||||
tor_free(status);
|
tor_free(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Return the value of a integer parameter from the networkstatus <b>ns</b>
|
||||||
|
* whose name is <b>param_name</b>. Return <b>default_val</b> if ns is NULL,
|
||||||
|
* or if it has no parameter called <b>param_name</b>. */
|
||||||
|
int32_t
|
||||||
|
networkstatus_get_param(networkstatus_t *ns, const char *param_name,
|
||||||
|
int32_t default_val)
|
||||||
|
{
|
||||||
|
size_t name_len;
|
||||||
|
|
||||||
|
if (!ns || !ns->net_params)
|
||||||
|
return default_val;
|
||||||
|
|
||||||
|
name_len = strlen(param_name);
|
||||||
|
|
||||||
|
SMARTLIST_FOREACH_BEGIN(ns->net_params, const char *, p) {
|
||||||
|
if (!strcmpstart(p, param_name) && p[name_len] == '=') {
|
||||||
|
int ok=0;
|
||||||
|
long v = tor_parse_long(p+name_len+1, 10, INT32_MIN, INT32_MAX, &ok,
|
||||||
|
NULL);
|
||||||
|
if (ok)
|
||||||
|
return (int32_t) v;
|
||||||
|
}
|
||||||
|
} SMARTLIST_FOREACH_END(p);
|
||||||
|
|
||||||
|
return default_val;
|
||||||
|
}
|
||||||
|
|
||||||
/** If <b>question</b> is a string beginning with "ns/" in a format the
|
/** If <b>question</b> is a string beginning with "ns/" in a format the
|
||||||
* control interface expects for a GETINFO question, set *<b>answer</b> to a
|
* control interface expects for a GETINFO question, set *<b>answer</b> to a
|
||||||
* newly-allocated string containing networkstatus lines for the appropriate
|
* newly-allocated string containing networkstatus lines for the appropriate
|
||||||
|
12
src/or/or.h
12
src/or/or.h
@ -1655,6 +1655,10 @@ typedef struct networkstatus_t {
|
|||||||
* not listed here, the voter has no opinion on what its value should be. */
|
* not listed here, the voter has no opinion on what its value should be. */
|
||||||
smartlist_t *known_flags;
|
smartlist_t *known_flags;
|
||||||
|
|
||||||
|
/** List of key=value strings for the parameters in this vote or
|
||||||
|
* consensus, sorted by key. */
|
||||||
|
smartlist_t *net_params;
|
||||||
|
|
||||||
/** List of networkstatus_voter_info_t. For a vote, only one element
|
/** List of networkstatus_voter_info_t. For a vote, only one element
|
||||||
* is included. For a consensus, one element is included for every voter
|
* is included. For a consensus, one element is included for every voter
|
||||||
* whose vote contributed to the consensus. */
|
* whose vote contributed to the consensus. */
|
||||||
@ -3570,9 +3574,9 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_env_t *private_key,
|
|||||||
authority_cert_t *cert);
|
authority_cert_t *cert);
|
||||||
|
|
||||||
#ifdef DIRVOTE_PRIVATE
|
#ifdef DIRVOTE_PRIVATE
|
||||||
char *
|
char *format_networkstatus_vote(crypto_pk_env_t *private_key,
|
||||||
format_networkstatus_vote(crypto_pk_env_t *private_key,
|
networkstatus_t *v3_ns);
|
||||||
networkstatus_t *v3_ns);
|
char *dirvote_compute_params(smartlist_t *votes);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/********************************* dns.c ***************************/
|
/********************************* dns.c ***************************/
|
||||||
@ -3787,6 +3791,8 @@ void signed_descs_update_status_from_consensus_networkstatus(
|
|||||||
char *networkstatus_getinfo_helper_single(routerstatus_t *rs);
|
char *networkstatus_getinfo_helper_single(routerstatus_t *rs);
|
||||||
char *networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now);
|
char *networkstatus_getinfo_by_purpose(const char *purpose_string, time_t now);
|
||||||
void networkstatus_dump_bridge_status_to_file(time_t now);
|
void networkstatus_dump_bridge_status_to_file(time_t now);
|
||||||
|
int32_t networkstatus_get_param(networkstatus_t *ns, const char *param_name,
|
||||||
|
int32_t default_val);
|
||||||
int getinfo_helper_networkstatus(control_connection_t *conn,
|
int getinfo_helper_networkstatus(control_connection_t *conn,
|
||||||
const char *question, char **answer);
|
const char *question, char **answer);
|
||||||
void networkstatus_free_all(void);
|
void networkstatus_free_all(void);
|
||||||
|
@ -77,6 +77,7 @@ typedef enum {
|
|||||||
K_VOTING_DELAY,
|
K_VOTING_DELAY,
|
||||||
|
|
||||||
K_KNOWN_FLAGS,
|
K_KNOWN_FLAGS,
|
||||||
|
K_PARAMS,
|
||||||
K_VOTE_DIGEST,
|
K_VOTE_DIGEST,
|
||||||
K_CONSENSUS_DIGEST,
|
K_CONSENSUS_DIGEST,
|
||||||
K_CONSENSUS_METHODS,
|
K_CONSENSUS_METHODS,
|
||||||
@ -383,6 +384,7 @@ static token_rule_t networkstatus_token_table[] = {
|
|||||||
T1("valid-until", K_VALID_UNTIL, CONCAT_ARGS, NO_OBJ ),
|
T1("valid-until", K_VALID_UNTIL, CONCAT_ARGS, NO_OBJ ),
|
||||||
T1("voting-delay", K_VOTING_DELAY, GE(2), NO_OBJ ),
|
T1("voting-delay", K_VOTING_DELAY, GE(2), NO_OBJ ),
|
||||||
T1("known-flags", K_KNOWN_FLAGS, ARGS, NO_OBJ ),
|
T1("known-flags", K_KNOWN_FLAGS, ARGS, NO_OBJ ),
|
||||||
|
T01("params", K_PARAMS, ARGS, NO_OBJ ),
|
||||||
T( "fingerprint", K_FINGERPRINT, CONCAT_ARGS, NO_OBJ ),
|
T( "fingerprint", K_FINGERPRINT, CONCAT_ARGS, NO_OBJ ),
|
||||||
|
|
||||||
CERTIFICATE_MEMBERS
|
CERTIFICATE_MEMBERS
|
||||||
@ -420,6 +422,7 @@ static token_rule_t networkstatus_consensus_token_table[] = {
|
|||||||
T01("client-versions", K_CLIENT_VERSIONS, CONCAT_ARGS, NO_OBJ ),
|
T01("client-versions", K_CLIENT_VERSIONS, CONCAT_ARGS, NO_OBJ ),
|
||||||
T01("server-versions", K_SERVER_VERSIONS, CONCAT_ARGS, NO_OBJ ),
|
T01("server-versions", K_SERVER_VERSIONS, CONCAT_ARGS, NO_OBJ ),
|
||||||
T01("consensus-method", K_CONSENSUS_METHOD, EQ(1), NO_OBJ),
|
T01("consensus-method", K_CONSENSUS_METHOD, EQ(1), NO_OBJ),
|
||||||
|
T01("params", K_PARAMS, ARGS, NO_OBJ ),
|
||||||
|
|
||||||
END_OF_TABLE
|
END_OF_TABLE
|
||||||
};
|
};
|
||||||
@ -2310,6 +2313,34 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tok = find_opt_by_keyword(tokens, K_PARAMS);
|
||||||
|
if (tok) {
|
||||||
|
inorder = 1;
|
||||||
|
ns->net_params = smartlist_create();
|
||||||
|
for (i = 0; i < tok->n_args; ++i) {
|
||||||
|
int ok=0;
|
||||||
|
char *eq = strchr(tok->args[i], '=');
|
||||||
|
if (!eq) {
|
||||||
|
log_warn(LD_DIR, "Bad element '%s' in params", escaped(tok->args[i]));
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
tor_parse_long(eq+1, 10, INT32_MIN, INT32_MAX, &ok, NULL);
|
||||||
|
if (!ok) {
|
||||||
|
log_warn(LD_DIR, "Bad element '%s' in params", escaped(tok->args[i]));
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
if (i > 0 && strcmp(tok->args[i-1], tok->args[i]) >= 0) {
|
||||||
|
log_warn(LD_DIR, "%s >= %s", tok->args[i-1], tok->args[i]);
|
||||||
|
inorder = 0;
|
||||||
|
}
|
||||||
|
smartlist_add(ns->net_params, tor_strdup(tok->args[i]));
|
||||||
|
}
|
||||||
|
if (!inorder) {
|
||||||
|
log_warn(LD_DIR, "params not in order");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ns->voters = smartlist_create();
|
ns->voters = smartlist_create();
|
||||||
|
|
||||||
SMARTLIST_FOREACH_BEGIN(tokens, directory_token_t *, _tok) {
|
SMARTLIST_FOREACH_BEGIN(tokens, directory_token_t *, _tok) {
|
||||||
|
Loading…
Reference in New Issue
Block a user