Fix up error codes

svn:r2706
This commit is contained in:
Nick Mathewson 2004-11-07 22:58:35 +00:00
parent 0059ee5fea
commit c514a06663
2 changed files with 55 additions and 20 deletions

View file

@ -50,16 +50,43 @@ the message.
The body of the message begins with a 2-byte error code. The following
values are defined:
0x0000 Unspecified error
0x0001 Unrecognized message type
0x0002 Unrecognized configuration key
0x0003 Invalid configuration value
0x0004 Unrecognized event code
0x0005 Unauthorized user
0x0006 Failed authentication attempt
[]
0x0001 Internal error
[Something went wrong inside Tor, so that the client's
request couldn't be fulfilled.]
0x0002 Unrecognized message type
[The client sent a message type we don't understand.]
0x0003 Syntax error
[The client sent a message body in a format we can't parse.]
0x0004 Unrecognized configuration key
[The client tried to get or set a configuration option we don't
recognize.]
0x0005 Invalid configuration value
[The client tried to set a configuration option to an
incorrect, ill-formed, or impossible value.]
0x0006 Unrecognized event code
[The client tried to set an event code that we don't recognize.]
0x0007 Unauthorized.
[The client tried to send a command that requires
authorization, but it hasn't sent a valid AUTHENTICATE message.]
0x0008 Failed authentication attempt
[The client sent a well-formed authorization message.]
The rest of the body should be a human-readable description of the error.
In general, new error codes should only be added when they don't fall under
one of the existing error codes.
3.2. DONE (Type 0x0001)
Sent from server to client in response to a request that was successfully

View file

@ -42,13 +42,14 @@
/* Recognized error codes. */
#define ERR_UNSPECIFIED 0x0000
#define ERR_UNRECOGNIZED_TYPE 0x0001
#define ERR_UNRECOGNIZED_CONFIG_KEY 0x0002
#define ERR_INVALID_CONFIG_VALUE 0x0003
#define ERR_UNRECOGNIZED_EVENT_CODE 0x0004
#define ERR_UNAUTHORIZED_USER 0x0005
#define ERR_FAILED_AUTHENTICATION 0x0006
#define ERR_FAILED_SAVECONF 0x0007
#define ERR_INTERNAL 0x0001
#define ERR_UNRECOGNIZED_TYPE 0x0002
#define ERR_SYNTAX 0x0003
#define ERR_UNRECOGNIZED_CONFIG_KEY 0x0004
#define ERR_INVALID_CONFIG_VALUE 0x0005
#define ERR_UNRECOGNIZED_EVENT_CODE 0x0006
#define ERR_UNAUTHORIZED 0x0007
#define ERR_REJECTED_AUTHENTICATION 0x0008
/* Recongized asynchonous event types. */
#define _EVENT_MIN 0x0001
@ -199,18 +200,24 @@ send_control_event(uint16_t event, uint16_t len, const char *body)
static int
handle_control_setconf(connection_t *conn, uint16_t len, char *body)
{
int r;
struct config_line_t *lines=NULL;
or_options_t *options = get_options();
if (config_get_lines(body, &lines) < 0) {
log_fn(LOG_WARN,"Controller gave us config lines we can't parse.");
send_control_error(conn, ERR_UNSPECIFIED, "Couldn't parse configuration");
send_control_error(conn, ERR_SYNTAX, "Couldn't parse configuration");
return 0;
}
if (config_trial_assign(&options, lines, 1) < 0) {
if ((r=config_trial_assign(&options, lines, 1)) < 0) {
log_fn(LOG_WARN,"Controller gave us config lines that didn't validate.");
send_control_error(conn, ERR_UNSPECIFIED, "Configuration was invalid");
if (e==-1) {
send_control_error(conn, ERR_UNRECOGNNIZED_CONFIG_KEY,
"Unrecognized option");
} else {
send_control_error(conn, ERR_INVALID_CONFIG_VALUE,"Invalid option value");
}
config_free_lines(lines);
return 0;
}
@ -281,7 +288,7 @@ handle_control_setevents(connection_t *conn, uint16_t len, const char *body)
uint16_t event_code;
uint32_t event_mask = 0;
if (len % 2) {
send_control_error(conn, ERR_UNSPECIFIED,
send_control_error(conn, ERR_SYNTAX,
"Odd number of bytes in setevents message");
return 0;
}
@ -338,7 +345,7 @@ handle_control_authenticate(connection_t *conn, uint16_t len, const char *body)
}
err:
send_control_error(conn, ERR_FAILED_AUTHENTICATION,"Authentication failed");
send_control_error(conn, ERR_REJECTED_AUTHENTICATION,"Authentication failed");
return 0;
ok:
log_fn(LOG_INFO, "Authenticated control connection (%d)", conn->s);
@ -351,7 +358,7 @@ static int
handle_control_saveconf(connection_t *conn, uint16_t len,
const char *body)
{
send_control_error(conn, ERR_FAILED_SAVECONF, "Not implemented");
send_control_error(conn, ERR_INTERNAL, "Not implemented");
return 0;
}
@ -386,6 +393,7 @@ connection_control_process_inbuf(connection_t *conn) {
switch(fetch_from_buf_control(conn->inbuf, &body_len, &command_type, &body))
{
case -1:
tor_free(body);
log_fn(LOG_WARN, "Error in control command. Failing.");
return -1;
case 0:
@ -404,7 +412,7 @@ connection_control_process_inbuf(connection_t *conn) {
command_type != CONTROL_CMD_AUTHENTICATE) {
log_fn(LOG_WARN, "Rejecting '%s' command; authentication needed.",
control_cmd_to_string(command_type));
send_control_error(conn, ERR_UNAUTHORIZED_USER, "Authentication required");
send_control_error(conn, ERR_UNAUTHORIZED, "Authentication required");
tor_free(body);
goto again;
}