diff --git a/src/server/distrend.c b/src/server/distrend.c --- a/src/server/distrend.c +++ b/src/server/distrend.c @@ -24,8 +24,9 @@ #include "distrenjob.h" #include "listen.h" +#include "mysql.h" #include "slavefuncs.h" -#include "mysql.h" +#include "user_mgr.h" #include "common/asprintf.h" #include "common/execio.h" @@ -62,6 +63,12 @@ struct general_info { /** general_info.xml */ char *geninfo; + + /** + * \brief Where to store the user listing. + */ + char *userlist; + /** * where to store in-progress uploads or things that should * otherwise be on the same filesystem as the rest of the datadir @@ -81,6 +88,8 @@ struct general_info time_t timestamp; unsigned long total_render_power; unsigned long total_priority_pieces; + + user_mgr_t user_mgr; }; @@ -98,6 +107,7 @@ int distrend_handle_request(struct distr * client request handlers */ int distrend_handle_version(struct general_info *geninfo, struct distrend_client *client, struct distren_request *req, void *req_data); +int distrend_handle_pass(struct general_info *geninfo, struct distrend_client *client, struct distren_request *req, void *req_data); int distrend_handle_file_post_start(struct general_info *geninfo, struct distrend_client *client, struct distren_request *req, void *req_data); int distrend_handle_file_post(struct general_info *geninfo, struct distrend_client *client, struct distren_request *req, void *req_data); int distrend_handle_file_post_finish(struct general_info *geninfo, struct distrend_client *client, struct distren_request *req, void *req_data); @@ -171,6 +181,18 @@ Ethan Zonca \n\ general_info.config->datadir); distren_mkdir_recurse(general_info.files.tmpdir); + _distren_asprintf(&general_info.files.userlist, "%s/users.xml", + general_info.config->datadir); + + /** configuraton stuff that depends on the paths being calculated, such as loading data */ + general_info.user_mgr = user_mgr_init(general_info.files.userlist); + if(!general_info.user_mgr) + { + fprintf(stderr, "Error initializing user_mgr\n"); + return 1; + } + + /** MySQL Connection */ fprintf(stderr,"Connecting to mysql...\n"); if(mysqlConnect(&general_info.conn, @@ -206,10 +228,12 @@ Ethan Zonca \n\ } } - distrend_listen_handler_add(general_info.config->listens, DISTREN_REQUEST_VERSION, &distrend_handle_version); - distrend_listen_handler_add(general_info.config->listens, DISTREN_REQUEST_FILE_POST_START, &distrend_handle_file_post_start); - distrend_listen_handler_add(general_info.config->listens, DISTREN_REQUEST_FILE_POST, &distrend_handle_file_post); - distrend_listen_handler_add(general_info.config->listens, DISTREN_REQUEST_FILE_POST_FINISH, &distrend_handle_file_post_finish); + distrend_listen_handler_add(general_info.config->listens, DISTREN_REQUEST_VERSION, &distrend_handle_version, (uint8_t)DISTREND_CLIENT_PREVERSION); + distrend_listen_handler_add(general_info.config->listens, DISTREN_REQUEST_PASS, + &distrend_handle_pass, (uint8_t)DISTREND_CLIENT_PREAUTH); + distrend_listen_handler_add(general_info.config->listens, DISTREN_REQUEST_FILE_POST_START, &distrend_handle_file_post_start, (uint8_t)DISTREND_CLIENT_GOOD); + distrend_listen_handler_add(general_info.config->listens, DISTREN_REQUEST_FILE_POST, &distrend_handle_file_post, (uint8_t)DISTREND_CLIENT_GOOD); + distrend_listen_handler_add(general_info.config->listens, DISTREN_REQUEST_FILE_POST_FINISH, &distrend_handle_file_post_finish, (uint8_t)DISTREND_CLIENT_GOOD); /* Main Loop */ general_info.config->die = 0; @@ -230,6 +254,8 @@ Ethan Zonca \n\ /** free() paths */ free(general_info.files.geninfo); + free(general_info.files.tmpdir); + free(general_info.files.userlist); mysqlDisconnect(general_info.conn); return 0; @@ -285,6 +311,45 @@ int distrend_handle_version(struct gener } /** + * Handle a DISTREN_REQUEST_PASS request. + */ +int distrend_handle_pass(struct general_info *geninfo, struct distrend_client *client, struct distren_request *req, void *req_data) +{ + struct distren_request_pass *pass_req; + + char username[DISTREN_REQUEST_PASS_USERNAME_LEN + 1]; + char pass[DISTREN_REQUEST_PASS_PASS_LEN + 1]; + + struct user *user; + + if(req->len < sizeof(struct distren_request_pass)) + { + distrend_send_disconnect(client, "You tried to send too short of a DISTREN_REQUEST_PASS."); + return 1; + } + + pass_req = req_data; + memcpy(username, pass_req->username, DISTREN_REQUEST_PASS_USERNAME_LEN); + username[DISTREN_REQUEST_PASS_USERNAME_LEN] = '\0'; + + memcpy(pass, pass_req->pass, DISTREN_REQUEST_PASS_PASS_LEN); + pass[DISTREN_REQUEST_PASS_PASS_LEN] = '\0'; + + user = user_find(geninfo->user_mgr, username); + if(!user + || strcmp(user->username, username) + || strcmp(user->pass, pass)) + { + distrend_send_disconnect(client, "Invalid username or password."); + return 1; + } + + client->state = DISTREND_CLIENT_GOOD; + + return 0; +} + +/** * Traversal helper for distrend_client_find_post(). */ int distrend_client_find_post_traverse(uint32_t *post_id, struct distrend_client_file_post *client_file_post)