sql_acl.h
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #define SELECT_ACL (1L << 0)
  14. #define INSERT_ACL (1L << 1)
  15. #define UPDATE_ACL (1L << 2)
  16. #define DELETE_ACL (1L << 3)
  17. #define CREATE_ACL (1L << 4)
  18. #define DROP_ACL (1L << 5)
  19. #define RELOAD_ACL (1L << 6)
  20. #define SHUTDOWN_ACL (1L << 7)
  21. #define PROCESS_ACL (1L << 8)
  22. #define FILE_ACL (1L << 9)
  23. #define GRANT_ACL (1L << 10)
  24. #define REFERENCES_ACL (1L << 11)
  25. #define INDEX_ACL (1L << 12)
  26. #define ALTER_ACL (1L << 13)
  27. #define SHOW_DB_ACL (1L << 14)
  28. #define SUPER_ACL (1L << 15)
  29. #define CREATE_TMP_ACL (1L << 16)
  30. #define LOCK_TABLES_ACL (1L << 17)
  31. #define EXECUTE_ACL (1L << 18)
  32. #define REPL_SLAVE_ACL (1L << 19)
  33. #define REPL_CLIENT_ACL (1L << 20)
  34. /*
  35.   don't forget to update
  36.     static struct show_privileges_st sys_privileges[]
  37.   in sql_show.cc when adding new privileges!
  38. */
  39. #define DB_ACLS 
  40. (UPDATE_ACL | SELECT_ACL | INSERT_ACL | DELETE_ACL | CREATE_ACL | DROP_ACL | 
  41.  GRANT_ACL | REFERENCES_ACL | INDEX_ACL | ALTER_ACL | CREATE_TMP_ACL | LOCK_TABLES_ACL)
  42. #define TABLE_ACLS 
  43. (SELECT_ACL | INSERT_ACL | UPDATE_ACL | DELETE_ACL | CREATE_ACL | DROP_ACL | 
  44.  GRANT_ACL | REFERENCES_ACL | INDEX_ACL | ALTER_ACL)
  45. #define COL_ACLS 
  46. (SELECT_ACL | INSERT_ACL | UPDATE_ACL | REFERENCES_ACL)
  47. #define GLOBAL_ACLS 
  48. (SELECT_ACL | INSERT_ACL | UPDATE_ACL | DELETE_ACL | CREATE_ACL | DROP_ACL | 
  49.  RELOAD_ACL | SHUTDOWN_ACL | PROCESS_ACL | FILE_ACL | GRANT_ACL | 
  50.  REFERENCES_ACL | INDEX_ACL | ALTER_ACL | SHOW_DB_ACL | SUPER_ACL | 
  51.  CREATE_TMP_ACL | LOCK_TABLES_ACL | REPL_SLAVE_ACL | REPL_CLIENT_ACL | 
  52.  EXECUTE_ACL)
  53. #define EXTRA_ACL (1L << 29)
  54. #define NO_ACCESS (1L << 30)
  55. /*
  56.   Defines to change the above bits to how things are stored in tables
  57.   This is needed as the 'host' and 'db' table is missing a few privileges
  58. */
  59. /* Continius bit-segments that needs to be shifted */
  60. #define DB_REL1 (RELOAD_ACL | SHUTDOWN_ACL | PROCESS_ACL | FILE_ACL)
  61. #define DB_REL2 (GRANT_ACL | REFERENCES_ACL)
  62. /* Privileges that needs to be reallocated (in continous chunks) */
  63. #define DB_CHUNK1 (GRANT_ACL | REFERENCES_ACL | INDEX_ACL | ALTER_ACL)
  64. #define DB_CHUNK2 (CREATE_TMP_ACL | LOCK_TABLES_ACL)
  65. #define fix_rights_for_db(A) (((A) & 63) | (((A) & DB_REL1) << 4) | (((A) & DB_REL2) << 6))
  66. #define get_rights_for_db(A) (((A) & 63) | (((A) & DB_CHUNK1) >> 4) | (((A) & DB_CHUNK2) >> 6))
  67. #define fix_rights_for_table(A) (((A) & 63) | (((A) & ~63) << 4))
  68. #define get_rights_for_table(A) (((A) & 63) | (((A) & ~63) >> 4))
  69. #define fix_rights_for_column(A) (((A) & 7) | (((A) & ~7) << 8))
  70. #define get_rights_for_column(A) (((A) & 7) | ((A) >> 8))
  71. /* Classes */
  72. struct acl_host_and_ip
  73. {
  74.   char *hostname;
  75.   long ip,ip_mask;                      // Used with masked ip:s
  76. };
  77. class ACL_ACCESS {
  78. public:
  79.   ulong sort;
  80.   ulong access;
  81. };
  82. /* ACL_HOST is used if no host is specified */
  83. class ACL_HOST :public ACL_ACCESS
  84. {
  85. public:
  86.   acl_host_and_ip host;
  87.   char *db;
  88. };
  89. class ACL_USER :public ACL_ACCESS
  90. {
  91. public:
  92.   acl_host_and_ip host;
  93.   uint hostname_length;
  94.   USER_RESOURCES user_resource;
  95.   char *user;
  96.   uint8 salt[SCRAMBLE_LENGTH+1];       // scrambled password in binary form
  97.   uint8 salt_len;        // 0 - no password, 4 - 3.20, 8 - 3.23, 20 - 4.1.1 
  98.   enum SSL_type ssl_type;
  99.   const char *ssl_cipher, *x509_issuer, *x509_subject;
  100. };
  101. class ACL_DB :public ACL_ACCESS
  102. {
  103. public:
  104.   acl_host_and_ip host;
  105.   char *user,*db;
  106. };
  107. /* prototypes */
  108. bool hostname_requires_resolving(const char *hostname);
  109. my_bool  acl_init(bool dont_read_acl_tables);
  110. my_bool acl_reload(THD *thd);
  111. void acl_free(bool end=0);
  112. ulong acl_get(const char *host, const char *ip,
  113.       const char *user, const char *db, my_bool db_is_pattern);
  114. int acl_getroot(THD *thd, USER_RESOURCES *mqh, const char *passwd,
  115.                 uint passwd_len);
  116. bool acl_check_host(const char *host, const char *ip);
  117. bool check_change_password(THD *thd, const char *host, const char *user,
  118.                            char *password, uint password_len);
  119. bool change_password(THD *thd, const char *host, const char *user,
  120.      char *password);
  121. int mysql_grant(THD *thd, const char *db, List <LEX_USER> &user_list,
  122. ulong rights, bool revoke);
  123. int mysql_table_grant(THD *thd, TABLE_LIST *table, List <LEX_USER> &user_list,
  124.       List <LEX_COLUMN> &column_list, ulong rights,
  125.       bool revoke);
  126. my_bool grant_init();
  127. void grant_free(void);
  128. my_bool grant_reload(THD *thd);
  129. bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
  130.  uint show_command, uint number, bool dont_print_error);
  131. bool check_grant_column (THD *thd,TABLE *table, const char *name, uint length,
  132.  uint show_command=0);
  133. bool check_grant_all_columns(THD *thd, ulong want_access, TABLE *table);
  134. bool check_grant_db(THD *thd,const char *db);
  135. ulong get_table_grant(THD *thd, TABLE_LIST *table);
  136. ulong get_column_grant(THD *thd, TABLE_LIST *table, Field *field);
  137. int mysql_show_grants(THD *thd, LEX_USER *user);
  138. void get_privilege_desc(char *to, uint max_length, ulong access);
  139. void get_mqh(const char *user, const char *host, USER_CONN *uc);
  140. int mysql_drop_user(THD *thd, List <LEX_USER> &list);
  141. int mysql_revoke_all(THD *thd, List <LEX_USER> &list);
  142. #ifdef NO_EMBEDDED_ACCESS_CHECKS
  143. #define check_grant(A,B,C,D,E,F) 0
  144. #define check_grant_db(A,B) 0
  145. #endif