disable normal user write inner table
This commit is contained in:
		@ -912,6 +912,14 @@ int get_dml_stmt_need_privs(
 | 
				
			|||||||
        } else { } //do nothing
 | 
					        } else { } //do nothing
 | 
				
			||||||
        const ObDMLStmt *dml_stmt = static_cast<const ObDMLStmt*>(basic_stmt);
 | 
					        const ObDMLStmt *dml_stmt = static_cast<const ObDMLStmt*>(basic_stmt);
 | 
				
			||||||
        int64_t table_size = dml_stmt->get_table_size();
 | 
					        int64_t table_size = dml_stmt->get_table_size();
 | 
				
			||||||
 | 
					        if (stmt::T_SELECT != stmt_type) {
 | 
				
			||||||
 | 
					          ObSEArray<const ObDmlTableInfo*, 4> table_infos;
 | 
				
			||||||
 | 
					          if (OB_FAIL(static_cast<const ObDelUpdStmt*>(basic_stmt)->get_dml_table_infos(table_infos))) {
 | 
				
			||||||
 | 
					            LOG_WARN("failed to get dml table infos", K(ret));
 | 
				
			||||||
 | 
					          } else if (OB_FAIL(ObPrivilegeCheck::can_do_operation_on_db(session_priv, table_infos, op_literal))) {
 | 
				
			||||||
 | 
					            LOG_WARN("cann't do this operation on this database", K(ret), K(stmt_type));
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        for (int64_t i = 0; OB_SUCC(ret) && i < table_size; i++) {
 | 
					        for (int64_t i = 0; OB_SUCC(ret) && i < table_size; i++) {
 | 
				
			||||||
          const TableItem *table_item = dml_stmt->get_table_item(i);
 | 
					          const TableItem *table_item = dml_stmt->get_table_item(i);
 | 
				
			||||||
          if (OB_ISNULL(table_item)) {
 | 
					          if (OB_ISNULL(table_item)) {
 | 
				
			||||||
@ -3118,6 +3126,33 @@ int ObPrivilegeCheck::can_do_operation_on_db(
 | 
				
			|||||||
  return ret;
 | 
					  return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ObPrivilegeCheck::can_do_operation_on_db(const ObSessionPrivInfo &session_priv,
 | 
				
			||||||
 | 
					                                             const ObIArray<const ObDmlTableInfo*> &table_infos,
 | 
				
			||||||
 | 
					                                             const ObString &op_literal)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
 | 
					  if (is_sys_tenant(session_priv.tenant_id_)) {
 | 
				
			||||||
 | 
					    /* system tenant, no checking */
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    for (int64_t i = 0; OB_SUCC(ret) && i < table_infos.count(); i++) {
 | 
				
			||||||
 | 
					      const ObDmlTableInfo *table_info = table_infos.at(i);
 | 
				
			||||||
 | 
					      if (OB_ISNULL(table_info)) {
 | 
				
			||||||
 | 
					        ret = OB_ERR_UNEXPECTED;
 | 
				
			||||||
 | 
					        LOG_WARN("table info is null");
 | 
				
			||||||
 | 
					      } else if (table_info->is_link_table_) {
 | 
				
			||||||
 | 
					        // skip link table
 | 
				
			||||||
 | 
					      } else if (is_inner_table(table_info->ref_table_id_)) {
 | 
				
			||||||
 | 
					        ret = OB_ERR_NO_TABLE_PRIVILEGE;
 | 
				
			||||||
 | 
					        LOG_USER_ERROR(OB_ERR_NO_TABLE_PRIVILEGE, op_literal.length(), op_literal.ptr(),
 | 
				
			||||||
 | 
					                      session_priv.user_name_.length(), session_priv.user_name_.ptr(),
 | 
				
			||||||
 | 
					                      session_priv.host_name_.length(),session_priv.host_name_.ptr(),
 | 
				
			||||||
 | 
					                      table_info->table_name_.length(), table_info->table_name_.ptr());
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ObPrivilegeCheck::can_do_grant_on_db_table(
 | 
					int ObPrivilegeCheck::can_do_grant_on_db_table(
 | 
				
			||||||
    const ObSessionPrivInfo &session_priv,
 | 
					    const ObSessionPrivInfo &session_priv,
 | 
				
			||||||
    const ObPrivSet priv_set,
 | 
					    const ObPrivSet priv_set,
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,7 @@
 | 
				
			|||||||
namespace oceanbase {
 | 
					namespace oceanbase {
 | 
				
			||||||
namespace sql {
 | 
					namespace sql {
 | 
				
			||||||
struct ObSqlCtx;
 | 
					struct ObSqlCtx;
 | 
				
			||||||
 | 
					struct ObDmlTableInfo;
 | 
				
			||||||
class ObStmt;
 | 
					class ObStmt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef int (*ObGetStmtNeedPrivsFunc) (const share::schema::ObSessionPrivInfo &session_priv,
 | 
					typedef int (*ObGetStmtNeedPrivsFunc) (const share::schema::ObSessionPrivInfo &session_priv,
 | 
				
			||||||
@ -53,6 +54,9 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  static int can_do_operation_on_db(const share::schema::ObSessionPrivInfo &session_priv,
 | 
					  static int can_do_operation_on_db(const share::schema::ObSessionPrivInfo &session_priv,
 | 
				
			||||||
                                    const common::ObString &db_name);
 | 
					                                    const common::ObString &db_name);
 | 
				
			||||||
 | 
					  static int can_do_operation_on_db(const share::schema::ObSessionPrivInfo &session_priv,
 | 
				
			||||||
 | 
					                                    const common::ObIArray<const ObDmlTableInfo*> &table_infos,
 | 
				
			||||||
 | 
					                                    const common::ObString &op_literal);
 | 
				
			||||||
  static int can_do_grant_on_db_table(const share::schema::ObSessionPrivInfo &session_priv,
 | 
					  static int can_do_grant_on_db_table(const share::schema::ObSessionPrivInfo &session_priv,
 | 
				
			||||||
                                      const ObPrivSet priv_set,
 | 
					                                      const ObPrivSet priv_set,
 | 
				
			||||||
                                      const common::ObString &db_name,
 | 
					                                      const common::ObString &db_name,
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user