mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Merge with new VARCHAR code
This commit is contained in:
128
sql/sql_acl.cc
128
sql/sql_acl.cc
@ -1053,9 +1053,8 @@ static void acl_insert_db(const char *user, const char *host, const char *db,
|
||||
ulong acl_get(const char *host, const char *ip,
|
||||
const char *user, const char *db, my_bool db_is_pattern)
|
||||
{
|
||||
ulong host_access,db_access;
|
||||
ulong host_access= ~0, db_access= 0;
|
||||
uint i,key_length;
|
||||
db_access=0; host_access= ~0;
|
||||
char key[ACL_KEY_LENGTH],*tmp_db,*end;
|
||||
acl_entry *entry;
|
||||
DBUG_ENTER("acl_get");
|
||||
@ -1438,6 +1437,7 @@ static bool update_user_table(THD *thd, const char *host, const char *user,
|
||||
TABLE_LIST tables;
|
||||
TABLE *table;
|
||||
bool error=1;
|
||||
char user_key[MAX_KEY_LENGTH];
|
||||
DBUG_ENTER("update_user_table");
|
||||
DBUG_PRINT("enter",("user: %s host: %s",user,host));
|
||||
|
||||
@ -1467,11 +1467,12 @@ static bool update_user_table(THD *thd, const char *host, const char *user,
|
||||
DBUG_RETURN(1); /* purecov: deadcode */
|
||||
table->field[0]->store(host,(uint) strlen(host), system_charset_info);
|
||||
table->field[1]->store(user,(uint) strlen(user), system_charset_info);
|
||||
key_copy(user_key, table->record[0], table->key_info,
|
||||
table->key_info->key_length);
|
||||
|
||||
table->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS);
|
||||
if (table->file->index_read_idx(table->record[0],0,
|
||||
(byte*) table->field[0]->ptr,
|
||||
table->key_info[0].key_length,
|
||||
if (table->file->index_read_idx(table->record[0], 0,
|
||||
user_key, table->key_info->key_length,
|
||||
HA_READ_KEY_EXACT))
|
||||
{
|
||||
my_message(ER_PASSWORD_NO_MATCH, ER(ER_PASSWORD_NO_MATCH),
|
||||
@ -1531,8 +1532,10 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo,
|
||||
const char *password= "";
|
||||
uint password_len= 0;
|
||||
char what= (revoke_grant) ? 'N' : 'Y';
|
||||
DBUG_ENTER("replace_user_table");
|
||||
byte user_key[MAX_KEY_LENGTH];
|
||||
LEX *lex= thd->lex;
|
||||
DBUG_ENTER("replace_user_table");
|
||||
|
||||
safe_mutex_assert_owner(&acl_cache->lock);
|
||||
|
||||
if (combo.password.str && combo.password.str[0])
|
||||
@ -1549,11 +1552,13 @@ static int replace_user_table(THD *thd, TABLE *table, const LEX_USER &combo,
|
||||
|
||||
table->field[0]->store(combo.host.str,combo.host.length, system_charset_info);
|
||||
table->field[1]->store(combo.user.str,combo.user.length, system_charset_info);
|
||||
key_copy(user_key, table->record[0], table->key_info,
|
||||
table->key_info->key_length);
|
||||
|
||||
table->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS);
|
||||
if (table->file->index_read_idx(table->record[0], 0,
|
||||
(byte*) table->field[0]->ptr,
|
||||
table->key_info[0].key_length,
|
||||
HA_READ_KEY_EXACT))
|
||||
user_key, table->key_info->key_length,
|
||||
HA_READ_KEY_EXACT))
|
||||
{
|
||||
/* what == 'N' means revoke */
|
||||
if (what == 'N')
|
||||
@ -1742,6 +1747,7 @@ static int replace_db_table(TABLE *table, const char *db,
|
||||
bool old_row_exists=0;
|
||||
int error;
|
||||
char what= (revoke_grant) ? 'N' : 'Y';
|
||||
byte user_key[MAX_KEY_LENGTH];
|
||||
DBUG_ENTER("replace_db_table");
|
||||
|
||||
if (!initialized)
|
||||
@ -1760,11 +1766,13 @@ static int replace_db_table(TABLE *table, const char *db,
|
||||
table->field[0]->store(combo.host.str,combo.host.length, system_charset_info);
|
||||
table->field[1]->store(db,(uint) strlen(db), system_charset_info);
|
||||
table->field[2]->store(combo.user.str,combo.user.length, system_charset_info);
|
||||
key_copy(user_key, table->record[0], table->key_info,
|
||||
table->key_info->key_length);
|
||||
|
||||
table->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS);
|
||||
if (table->file->index_read_idx(table->record[0],0,
|
||||
(byte*) table->field[0]->ptr,
|
||||
table->key_info[0].key_length,
|
||||
HA_READ_KEY_EXACT))
|
||||
user_key, table->key_info->key_length,
|
||||
HA_READ_KEY_EXACT))
|
||||
{
|
||||
if (what == 'N')
|
||||
{ // no row, no revoke
|
||||
@ -1935,22 +1943,25 @@ GRANT_TABLE::GRANT_TABLE(TABLE *form, TABLE *col_privs)
|
||||
0,0,0, (hash_get_key) get_key_column,0,0);
|
||||
if (cols)
|
||||
{
|
||||
int key_len;
|
||||
uint key_prefix_len;
|
||||
KEY_PART_INFO *key_part= col_privs->key_info->key_part;
|
||||
col_privs->field[0]->store(orig_host,(uint) strlen(orig_host),
|
||||
system_charset_info);
|
||||
col_privs->field[1]->store(db,(uint) strlen(db), system_charset_info);
|
||||
col_privs->field[2]->store(user,(uint) strlen(user), system_charset_info);
|
||||
col_privs->field[3]->store(tname,(uint) strlen(tname), system_charset_info);
|
||||
key_len=(col_privs->field[0]->pack_length()+
|
||||
col_privs->field[1]->pack_length()+
|
||||
col_privs->field[2]->pack_length()+
|
||||
col_privs->field[3]->pack_length());
|
||||
key_copy(key,col_privs->record[0],col_privs->key_info,key_len);
|
||||
|
||||
key_prefix_len= (key_part[0].store_length +
|
||||
key_part[1].store_length +
|
||||
key_part[2].store_length +
|
||||
key_part[3].store_length);
|
||||
key_copy(key, col_privs->record[0], col_privs->key_info, key_prefix_len);
|
||||
col_privs->field[4]->store("",0, &my_charset_latin1);
|
||||
|
||||
col_privs->file->ha_index_init(0);
|
||||
if (col_privs->file->index_read(col_privs->record[0],
|
||||
(byte*) col_privs->field[0]->ptr,
|
||||
key_len, HA_READ_KEY_EXACT))
|
||||
(byte*) key,
|
||||
key_prefix_len, HA_READ_KEY_EXACT))
|
||||
{
|
||||
cols = 0; /* purecov: deadcode */
|
||||
col_privs->file->ha_index_end();
|
||||
@ -1972,7 +1983,7 @@ GRANT_TABLE::GRANT_TABLE(TABLE *form, TABLE *col_privs)
|
||||
}
|
||||
my_hash_insert(&hash_columns, (byte *) mem_check);
|
||||
} while (!col_privs->file->index_next(col_privs->record[0]) &&
|
||||
!key_cmp_if_same(col_privs,key,0,key_len));
|
||||
!key_cmp_if_same(col_privs,key,0,key_prefix_len));
|
||||
col_privs->file->ha_index_end();
|
||||
}
|
||||
}
|
||||
@ -2053,19 +2064,22 @@ static int replace_column_table(GRANT_TABLE *g_t,
|
||||
ulong rights, bool revoke_grant)
|
||||
{
|
||||
int error=0,result=0;
|
||||
uint key_length;
|
||||
byte key[MAX_KEY_LENGTH];
|
||||
uint key_prefix_length;
|
||||
KEY_PART_INFO *key_part= table->key_info->key_part;
|
||||
DBUG_ENTER("replace_column_table");
|
||||
|
||||
table->field[0]->store(combo.host.str,combo.host.length, system_charset_info);
|
||||
table->field[1]->store(db,(uint) strlen(db), system_charset_info);
|
||||
table->field[2]->store(combo.user.str,combo.user.length, system_charset_info);
|
||||
table->field[3]->store(table_name,(uint) strlen(table_name), system_charset_info);
|
||||
key_length=(table->field[0]->pack_length()+ table->field[1]->pack_length()+
|
||||
table->field[2]->pack_length()+ table->field[3]->pack_length());
|
||||
key_copy(key,table->record[0],table->key_info,key_length);
|
||||
|
||||
rights &= COL_ACLS; // Only ACL for columns
|
||||
/* Get length of 3 first key parts */
|
||||
key_prefix_length= (key_part[0].store_length + key_part[1].store_length +
|
||||
key_part[2].store_length + key_part[3].store_length);
|
||||
key_copy(key, table->record[0], table->key_info, key_prefix_length);
|
||||
|
||||
rights&= COL_ACLS; // Only ACL for columns
|
||||
|
||||
/* first fix privileges for all columns in column list */
|
||||
|
||||
@ -2076,14 +2090,20 @@ static int replace_column_table(GRANT_TABLE *g_t,
|
||||
{
|
||||
ulong privileges = xx->rights;
|
||||
bool old_row_exists=0;
|
||||
key_restore(table->record[0],key,table->key_info,key_length);
|
||||
byte user_key[MAX_KEY_LENGTH];
|
||||
|
||||
key_restore(table->record[0],key,table->key_info,
|
||||
key_prefix_length);
|
||||
table->field[4]->store(xx->column.ptr(),xx->column.length(),
|
||||
system_charset_info);
|
||||
/* Get key for the first 4 columns */
|
||||
key_copy(user_key, table->record[0], table->key_info,
|
||||
table->key_info->key_length);
|
||||
|
||||
table->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS);
|
||||
if (table->file->index_read(table->record[0],(byte*) table->field[0]->ptr,
|
||||
table->key_info[0].key_length,
|
||||
HA_READ_KEY_EXACT))
|
||||
if (table->file->index_read(table->record[0], user_key,
|
||||
table->key_info->key_length,
|
||||
HA_READ_KEY_EXACT))
|
||||
{
|
||||
if (revoke_grant)
|
||||
{
|
||||
@ -2095,7 +2115,8 @@ static int replace_column_table(GRANT_TABLE *g_t,
|
||||
}
|
||||
old_row_exists = 0;
|
||||
restore_record(table,default_values); // Get empty record
|
||||
key_restore(table->record[0],key,table->key_info,key_length);
|
||||
key_restore(table->record[0],key,table->key_info,
|
||||
key_prefix_length);
|
||||
table->field[4]->store(xx->column.ptr(),xx->column.length(),
|
||||
system_charset_info);
|
||||
}
|
||||
@ -2152,10 +2173,14 @@ static int replace_column_table(GRANT_TABLE *g_t,
|
||||
|
||||
if (revoke_grant)
|
||||
{
|
||||
byte user_key[MAX_KEY_LENGTH];
|
||||
key_copy(user_key, table->record[0], table->key_info,
|
||||
key_prefix_length);
|
||||
|
||||
table->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS);
|
||||
if (table->file->index_read(table->record[0], (byte*) table->field[0]->ptr,
|
||||
key_length,
|
||||
HA_READ_KEY_EXACT))
|
||||
if (table->file->index_read(table->record[0], user_key,
|
||||
key_prefix_length,
|
||||
HA_READ_KEY_EXACT))
|
||||
goto end;
|
||||
|
||||
/* Scan through all rows with the same host,db,user and table */
|
||||
@ -2169,7 +2194,8 @@ static int replace_column_table(GRANT_TABLE *g_t,
|
||||
{
|
||||
GRANT_COLUMN *grant_column = NULL;
|
||||
char colum_name_buf[HOSTNAME_LENGTH+1];
|
||||
String column_name(colum_name_buf,sizeof(colum_name_buf),system_charset_info);
|
||||
String column_name(colum_name_buf,sizeof(colum_name_buf),
|
||||
system_charset_info);
|
||||
|
||||
privileges&= ~rights;
|
||||
table->field[6]->store((longlong)
|
||||
@ -2205,7 +2231,7 @@ static int replace_column_table(GRANT_TABLE *g_t,
|
||||
}
|
||||
}
|
||||
} while (!table->file->index_next(table->record[0]) &&
|
||||
!key_cmp_if_same(table,key,0,key_length));
|
||||
!key_cmp_if_same(table, key, 0, key_prefix_length));
|
||||
}
|
||||
|
||||
end:
|
||||
@ -2224,6 +2250,7 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table,
|
||||
int old_row_exists = 1;
|
||||
int error=0;
|
||||
ulong store_table_rights, store_col_rights;
|
||||
byte user_key[MAX_KEY_LENGTH];
|
||||
DBUG_ENTER("replace_table_table");
|
||||
|
||||
strxmov(grantor, thd->user, "@", thd->host_or_ip, NullS);
|
||||
@ -2245,10 +2272,12 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table,
|
||||
table->field[2]->store(combo.user.str,combo.user.length, system_charset_info);
|
||||
table->field[3]->store(table_name,(uint) strlen(table_name), system_charset_info);
|
||||
store_record(table,record[1]); // store at pos 1
|
||||
key_copy(user_key, table->record[0], table->key_info,
|
||||
table->key_info->key_length);
|
||||
|
||||
table->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS);
|
||||
if (table->file->index_read_idx(table->record[0],0,
|
||||
(byte*) table->field[0]->ptr,
|
||||
table->key_info[0].key_length,
|
||||
if (table->file->index_read_idx(table->record[0], 0,
|
||||
user_key, table->key_info->key_length,
|
||||
HA_READ_KEY_EXACT))
|
||||
{
|
||||
/*
|
||||
@ -3702,6 +3731,8 @@ static int modify_grant_table(TABLE *table, Field *host_field,
|
||||
Field *user_field, LEX_USER *user_to)
|
||||
{
|
||||
int error;
|
||||
TABLE *table;
|
||||
byte user_key[MAX_KEY_LENGTH];
|
||||
DBUG_ENTER("modify_grant_table");
|
||||
|
||||
if (user_to)
|
||||
@ -3769,6 +3800,7 @@ static int handle_grant_table(TABLE_LIST *tables, uint table_no, bool drop,
|
||||
char *user_str= user_from->user.str;
|
||||
const char *host;
|
||||
const char *user;
|
||||
uint key_prefix_length;
|
||||
DBUG_ENTER("handle_grant_table");
|
||||
|
||||
if (! table_no) // mysql.user table
|
||||
@ -3786,8 +3818,13 @@ static int handle_grant_table(TABLE_LIST *tables, uint table_no, bool drop,
|
||||
table->real_name, user_str, host_str));
|
||||
host_field->store(host_str, user_from->host.length, system_charset_info);
|
||||
user_field->store(user_str, user_from->user.length, system_charset_info);
|
||||
|
||||
key_prefix_length= (table->key_info->key_part[0].store_length +
|
||||
table->key_info->key_part[1].store_length);
|
||||
key_copy(user_key, table->record[0], table->key_info, key_prefix_length);
|
||||
|
||||
if ((error= table->file->index_read_idx(table->record[0], 0,
|
||||
(byte*) host_field->ptr, 0,
|
||||
user_key, key_prefix_length,
|
||||
HA_READ_KEY_EXACT)))
|
||||
{
|
||||
if (error != HA_ERR_KEY_NOT_FOUND)
|
||||
@ -4058,7 +4095,8 @@ static int handle_grant_data(TABLE_LIST *tables, bool drop,
|
||||
else
|
||||
{
|
||||
/* Handle user array. */
|
||||
if ((handle_grant_struct(0, drop, user_from, user_to) && ! result) || found)
|
||||
if ((handle_grant_struct(0, drop, user_from, user_to) && ! result) ||
|
||||
found)
|
||||
{
|
||||
result= 1; /* At least one record/element found. */
|
||||
/* If search is requested, we do not need to search further. */
|
||||
@ -4120,6 +4158,7 @@ static int handle_grant_data(TABLE_LIST *tables, bool drop,
|
||||
DBUG_RETURN(result);
|
||||
}
|
||||
|
||||
|
||||
static void append_user(String *str, LEX_USER *user)
|
||||
{
|
||||
if (str->length())
|
||||
@ -4131,6 +4170,7 @@ static void append_user(String *str, LEX_USER *user)
|
||||
str->append('\'');
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Create a list of users.
|
||||
|
||||
@ -4298,6 +4338,7 @@ bool mysql_rename_user(THD *thd, List <LEX_USER> &list)
|
||||
DBUG_RETURN(result);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Revoke all privileges from a list of users.
|
||||
|
||||
@ -4332,9 +4373,8 @@ bool mysql_revoke_all(THD *thd, List <LEX_USER> &list)
|
||||
{
|
||||
if (!check_acl_user(lex_user, &counter))
|
||||
{
|
||||
sql_print_error("REVOKE ALL PRIVILEGES, GRANT: User '%s'@'%s' not exists",
|
||||
lex_user->user.str,
|
||||
lex_user->host.str);
|
||||
sql_print_error("REVOKE ALL PRIVILEGES, GRANT: User '%s'@'%s' does not "
|
||||
"exists", lex_user->user.str, lex_user->host.str);
|
||||
result= -1;
|
||||
continue;
|
||||
}
|
||||
|
Reference in New Issue
Block a user