mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 05:33:47 +01:00
dirvote: Move the handling of GET /tor/status-vote to dirauth module
In order to further isolate the dirauth code into its module, this moves the handling of the directory request GET /tor/status-vote/* into the module. Signed-off-by: David Goulet <dgoulet@torproject.org>
This commit is contained in:
parent
6ee6533fd8
commit
fdc01cb40e
@ -3912,3 +3912,57 @@ dirvote_clear_commits(networkstatus_t *ns)
|
||||
}
|
||||
}
|
||||
|
||||
/* The given url is the /tor/status-gove GET directory request. Populates the
|
||||
* items list with strings that we can compress on the fly and dir_items with
|
||||
* cached_dir_t objects that have a precompressed deflated version. */
|
||||
void
|
||||
dirvote_dirreq_get_status_vote(const char *url, smartlist_t *items,
|
||||
smartlist_t *dir_items)
|
||||
{
|
||||
int current;
|
||||
|
||||
url += strlen("/tor/status-vote/");
|
||||
current = !strcmpstart(url, "current/");
|
||||
url = strchr(url, '/');
|
||||
tor_assert(url);
|
||||
++url;
|
||||
if (!strcmp(url, "consensus")) {
|
||||
const char *item;
|
||||
tor_assert(!current); /* we handle current consensus specially above,
|
||||
* since it wants to be spooled. */
|
||||
if ((item = dirvote_get_pending_consensus(FLAV_NS)))
|
||||
smartlist_add(items, (char*)item);
|
||||
} else if (!current && !strcmp(url, "consensus-signatures")) {
|
||||
/* XXXX the spec says that we should implement
|
||||
* current/consensus-signatures too. It doesn't seem to be needed,
|
||||
* though. */
|
||||
const char *item;
|
||||
if ((item=dirvote_get_pending_detached_signatures()))
|
||||
smartlist_add(items, (char*)item);
|
||||
} else if (!strcmp(url, "authority")) {
|
||||
const cached_dir_t *d;
|
||||
int flags = DGV_BY_ID |
|
||||
(current ? DGV_INCLUDE_PREVIOUS : DGV_INCLUDE_PENDING);
|
||||
if ((d=dirvote_get_vote(NULL, flags)))
|
||||
smartlist_add(dir_items, (cached_dir_t*)d);
|
||||
} else {
|
||||
const cached_dir_t *d;
|
||||
smartlist_t *fps = smartlist_new();
|
||||
int flags;
|
||||
if (!strcmpstart(url, "d/")) {
|
||||
url += 2;
|
||||
flags = DGV_INCLUDE_PENDING | DGV_INCLUDE_PREVIOUS;
|
||||
} else {
|
||||
flags = DGV_BY_ID |
|
||||
(current ? DGV_INCLUDE_PREVIOUS : DGV_INCLUDE_PENDING);
|
||||
}
|
||||
dir_split_resource_into_fingerprints(url, fps, NULL,
|
||||
DSR_HEX|DSR_SORT_UNIQ);
|
||||
SMARTLIST_FOREACH(fps, char *, fp, {
|
||||
if ((d = dirvote_get_vote(fp, flags)))
|
||||
smartlist_add(dir_items, (cached_dir_t*)d);
|
||||
tor_free(fp);
|
||||
});
|
||||
smartlist_free(fps);
|
||||
}
|
||||
}
|
||||
|
@ -101,6 +101,8 @@ void dirvote_free_all(void);
|
||||
|
||||
void dirvote_parse_sr_commits(networkstatus_t *ns, smartlist_t *tokens);
|
||||
void dirvote_clear_commits(networkstatus_t *ns);
|
||||
void dirvote_dirreq_get_status_vote(const char *url, smartlist_t *items,
|
||||
smartlist_t *dir_items);
|
||||
|
||||
#else /* HAVE_MODULE_DIRAUTH */
|
||||
|
||||
@ -129,6 +131,15 @@ dirvote_clear_commits(networkstatus_t *ns)
|
||||
(void) ns;
|
||||
}
|
||||
|
||||
static inline void
|
||||
dirvote_dirreq_get_status_vote(const char *url, smartlist_t *items,
|
||||
smartlist_t *dir_items)
|
||||
{
|
||||
(void) url;
|
||||
(void) items;
|
||||
(void) dir_items;
|
||||
}
|
||||
|
||||
#endif /* HAVE_MODULE_DIRAUTH */
|
||||
|
||||
void dirvote_recalculate_timing(const or_options_t *options, time_t now);
|
||||
|
@ -4438,59 +4438,15 @@ handle_get_status_vote(dir_connection_t *conn, const get_handler_args_t *args)
|
||||
{
|
||||
const char *url = args->url;
|
||||
{
|
||||
int current;
|
||||
ssize_t body_len = 0;
|
||||
ssize_t estimated_len = 0;
|
||||
int lifetime = 60; /* XXXX?? should actually use vote intervals. */
|
||||
/* This smartlist holds strings that we can compress on the fly. */
|
||||
smartlist_t *items = smartlist_new();
|
||||
/* This smartlist holds cached_dir_t objects that have a precompressed
|
||||
* deflated version. */
|
||||
smartlist_t *dir_items = smartlist_new();
|
||||
int lifetime = 60; /* XXXX?? should actually use vote intervals. */
|
||||
url += strlen("/tor/status-vote/");
|
||||
current = !strcmpstart(url, "current/");
|
||||
url = strchr(url, '/');
|
||||
tor_assert(url);
|
||||
++url;
|
||||
if (!strcmp(url, "consensus")) {
|
||||
const char *item;
|
||||
tor_assert(!current); /* we handle current consensus specially above,
|
||||
* since it wants to be spooled. */
|
||||
if ((item = dirvote_get_pending_consensus(FLAV_NS)))
|
||||
smartlist_add(items, (char*)item);
|
||||
} else if (!current && !strcmp(url, "consensus-signatures")) {
|
||||
/* XXXX the spec says that we should implement
|
||||
* current/consensus-signatures too. It doesn't seem to be needed,
|
||||
* though. */
|
||||
const char *item;
|
||||
if ((item=dirvote_get_pending_detached_signatures()))
|
||||
smartlist_add(items, (char*)item);
|
||||
} else if (!strcmp(url, "authority")) {
|
||||
const cached_dir_t *d;
|
||||
int flags = DGV_BY_ID |
|
||||
(current ? DGV_INCLUDE_PREVIOUS : DGV_INCLUDE_PENDING);
|
||||
if ((d=dirvote_get_vote(NULL, flags)))
|
||||
smartlist_add(dir_items, (cached_dir_t*)d);
|
||||
} else {
|
||||
const cached_dir_t *d;
|
||||
smartlist_t *fps = smartlist_new();
|
||||
int flags;
|
||||
if (!strcmpstart(url, "d/")) {
|
||||
url += 2;
|
||||
flags = DGV_INCLUDE_PENDING | DGV_INCLUDE_PREVIOUS;
|
||||
} else {
|
||||
flags = DGV_BY_ID |
|
||||
(current ? DGV_INCLUDE_PREVIOUS : DGV_INCLUDE_PENDING);
|
||||
}
|
||||
dir_split_resource_into_fingerprints(url, fps, NULL,
|
||||
DSR_HEX|DSR_SORT_UNIQ);
|
||||
SMARTLIST_FOREACH(fps, char *, fp, {
|
||||
if ((d = dirvote_get_vote(fp, flags)))
|
||||
smartlist_add(dir_items, (cached_dir_t*)d);
|
||||
tor_free(fp);
|
||||
});
|
||||
smartlist_free(fps);
|
||||
}
|
||||
dirvote_dirreq_get_status_vote(url, items, dir_items);
|
||||
if (!smartlist_len(dir_items) && !smartlist_len(items)) {
|
||||
write_short_http_response(conn, 404, "Not found");
|
||||
goto vote_done;
|
||||
|
Loading…
Reference in New Issue
Block a user