diff options
Diffstat (limited to 'server-tools/instance-manager/user_map.cc')
-rw-r--r-- | server-tools/instance-manager/user_map.cc | 395 |
1 files changed, 0 insertions, 395 deletions
diff --git a/server-tools/instance-manager/user_map.cc b/server-tools/instance-manager/user_map.cc deleted file mode 100644 index 85e3f4a2cac..00000000000 --- a/server-tools/instance-manager/user_map.cc +++ /dev/null @@ -1,395 +0,0 @@ -/* Copyright (C) 2004-2006 MySQL AB - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -#if defined(__GNUC__) && defined(USE_PRAGMA_IMPLEMENTATION) -#pragma implementation -#endif - -#include "user_map.h" -#include "exit_codes.h" -#include "log.h" -#include "portability.h" - -User::User(const LEX_STRING *user_name_arg, const char *password) -{ - user_length= (uint8) (strmake(user, user_name_arg->str, - USERNAME_LENGTH) - user); - set_password(password); -} - -int User::init(const char *line) -{ - const char *name_begin, *name_end, *password; - int password_length; - - if (line[0] == '\'' || line[0] == '"') - { - name_begin= line + 1; - name_end= strchr(name_begin, line[0]); - if (name_end == 0 || name_end[1] != ':') - { - log_error("Invalid format (unmatched quote) of user line (%s).", - (const char *) line); - return 1; - } - password= name_end + 2; - } - else - { - name_begin= line; - name_end= strchr(name_begin, ':'); - if (name_end == 0) - { - log_error("Invalid format (no delimiter) of user line (%s).", - (const char *) line); - return 1; - } - password= name_end + 1; - } - - user_length= (uint8) (name_end - name_begin); - if (user_length > USERNAME_LENGTH) - { - log_error("User name is too long (%d). Max length: %d. " - "User line: '%s'.", - (int) user_length, - (int) USERNAME_LENGTH, - (const char *) line); - return 1; - } - - password_length= (int) strlen(password); - if (password_length > SCRAMBLED_PASSWORD_CHAR_LENGTH) - { - log_error("Password is too long (%d). Max length: %d." - "User line: '%s'.", - (int) password_length, - (int) SCRAMBLED_PASSWORD_CHAR_LENGTH, - (const char *) line); - return 1; - } - - memcpy(user, name_begin, user_length); - user[user_length]= 0; - - memcpy(scrambled_password, password, password_length); - scrambled_password[password_length]= 0; - - get_salt_from_password(salt, password); - - log_info("Loaded user '%s'.", (const char *) user); - - return 0; -} - - -C_MODE_START - -static uchar* get_user_key(const uchar* u, size_t* len, - my_bool __attribute__((unused)) t) -{ - const User *user= (const User *) u; - *len= user->user_length; - return (uchar *) user->user; -} - -static void delete_user(void *u) -{ - User *user= (User *) u; - delete user; -} - -C_MODE_END - - -void User_map::Iterator::reset() -{ - cur_idx= 0; -} - - -User *User_map::Iterator::next() -{ - if (cur_idx < user_map->hash.records) - return (User *) hash_element(&user_map->hash, cur_idx++); - - return NULL; -} - - -int User_map::init() -{ - enum { START_HASH_SIZE= 16 }; - if (hash_init(&hash, default_charset_info, START_HASH_SIZE, 0, 0, - get_user_key, delete_user, 0)) - return 1; - - initialized= TRUE; - - return 0; -} - - -User_map::User_map() - :initialized(FALSE) -{ -} - - -User_map::~User_map() -{ - if (initialized) - hash_free(&hash); -} - - -/* - Load password database. - - SYNOPSIS - load() - password_file_name [IN] password file path - err_msg [OUT] error message - - DESCRIPTION - Load all users from the password file. Must be called once right after - construction. In case of failure, puts error message to the log file and - returns specific error code. - - RETURN - 0 on success - !0 on error -*/ - -int User_map::load(const char *password_file_name, const char **err_msg) -{ - static const int ERR_MSG_BUF_SIZE = 255; - static char err_msg_buf[ERR_MSG_BUF_SIZE]; - - FILE *file; - char line[USERNAME_LENGTH + SCRAMBLED_PASSWORD_CHAR_LENGTH + - 2 + /* for possible quotes */ - 1 + /* for ':' */ - 2 + /* for newline */ - 1]; /* for trailing zero */ - User *user; - - if (my_access(password_file_name, F_OK) != 0) - { - if (err_msg) - { - snprintf(err_msg_buf, ERR_MSG_BUF_SIZE, - "password file (%s) does not exist", - (const char *) password_file_name); - *err_msg= err_msg_buf; - } - - return ERR_PASSWORD_FILE_DOES_NOT_EXIST; - } - - if ((file= my_fopen(password_file_name, O_RDONLY | O_BINARY, MYF(0))) == 0) - { - if (err_msg) - { - snprintf(err_msg_buf, ERR_MSG_BUF_SIZE, - "can not open password file (%s): %s", - (const char *) password_file_name, - (const char *) strerror(errno)); - *err_msg= err_msg_buf; - } - - return ERR_IO_ERROR; - } - - log_info("Loading the password database..."); - - while (fgets(line, sizeof(line), file)) - { - char *user_line= line; - - /* - We need to skip EOL-symbols also from the beginning of the line, because - if the previous line was ended by \n\r sequence, we get \r in our line. - */ - - while (user_line[0] == '\r' || user_line[0] == '\n') - ++user_line; - - /* Skip EOL-symbols in the end of the line. */ - - { - char *ptr; - - if ((ptr= strchr(user_line, '\n'))) - *ptr= 0; - - if ((ptr= strchr(user_line, '\r'))) - *ptr= 0; - } - - /* skip comments and empty lines */ - if (!user_line[0] || user_line[0] == '#') - continue; - - if ((user= new User) == 0) - { - my_fclose(file, MYF(0)); - - if (err_msg) - { - snprintf(err_msg_buf, ERR_MSG_BUF_SIZE, - "out of memory while parsing password file (%s)", - (const char *) password_file_name); - *err_msg= err_msg_buf; - } - - return ERR_OUT_OF_MEMORY; - } - - if (user->init(user_line)) - { - delete user; - my_fclose(file, MYF(0)); - - if (err_msg) - { - snprintf(err_msg_buf, ERR_MSG_BUF_SIZE, - "password file (%s) corrupted", - (const char *) password_file_name); - *err_msg= err_msg_buf; - } - - return ERR_PASSWORD_FILE_CORRUPTED; - } - - if (my_hash_insert(&hash, (uchar *) user)) - { - delete user; - my_fclose(file, MYF(0)); - - if (err_msg) - { - snprintf(err_msg_buf, ERR_MSG_BUF_SIZE, - "out of memory while parsing password file (%s)", - (const char *) password_file_name); - *err_msg= err_msg_buf; - } - - return ERR_OUT_OF_MEMORY; - } - } - - log_info("The password database loaded successfully."); - - my_fclose(file, MYF(0)); - - if (err_msg) - *err_msg= NULL; - - return ERR_OK; -} - - -int User_map::save(const char *password_file_name, const char **err_msg) -{ - static const int ERR_MSG_BUF_SIZE = 255; - static char err_msg_buf[ERR_MSG_BUF_SIZE]; - - FILE *file; - - if ((file= my_fopen(password_file_name, O_WRONLY | O_TRUNC | O_BINARY, - MYF(0))) == 0) - { - if (err_msg) - { - snprintf(err_msg_buf, ERR_MSG_BUF_SIZE, - "can not open password file (%s) for writing: %s", - (const char *) password_file_name, - (const char *) strerror(errno)); - *err_msg= err_msg_buf; - } - - return ERR_IO_ERROR; - } - - { - User_map::Iterator it(this); - User *user; - - while ((user= it.next())) - { - if (fprintf(file, "%s:%s\n", (const char *) user->user, - (const char *) user->scrambled_password) < 0) - { - if (err_msg) - { - snprintf(err_msg_buf, ERR_MSG_BUF_SIZE, - "can not write to password file (%s): %s", - (const char *) password_file_name, - (const char *) strerror(errno)); - *err_msg= err_msg_buf; - } - - my_fclose(file, MYF(0)); - - return ERR_IO_ERROR; - } - } - } - - my_fclose(file, MYF(0)); - - return ERR_OK; -} - - -/* - Check if user exists and password is correct - RETURN VALUE - 0 - user found and password OK - 1 - password mismatch - 2 - user not found -*/ - -int User_map::authenticate(const LEX_STRING *user_name, - const char *scrambled_password, - const char *scramble) const -{ - const User *user= find_user(user_name); - return user ? check_scramble(scrambled_password, scramble, user->salt) : 2; -} - - -User *User_map::find_user(const LEX_STRING *user_name) -{ - return (User*) hash_search(&hash, (uchar*) user_name->str, user_name->length); -} - -const User *User_map::find_user(const LEX_STRING *user_name) const -{ - return const_cast<User_map *> (this)->find_user(user_name); -} - - -bool User_map::add_user(User *user) -{ - return my_hash_insert(&hash, (uchar*) user) == 0 ? FALSE : TRUE; -} - - -bool User_map::remove_user(User *user) -{ - return hash_delete(&hash, (uchar*) user) == 0 ? FALSE : TRUE; -} |