mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
Corrections
This commit is contained in:
parent
dc88b973e9
commit
36902c66a0
@ -1,4 +1,5 @@
|
|||||||
#include <Access/Common/AccessFlags.h>
|
#include <Access/Common/AccessFlags.h>
|
||||||
|
#include <Access/ContextAccess.h>
|
||||||
#include <Storages/StorageDictionary.h>
|
#include <Storages/StorageDictionary.h>
|
||||||
#include <Storages/StorageFactory.h>
|
#include <Storages/StorageFactory.h>
|
||||||
#include <DataTypes/DataTypesNumber.h>
|
#include <DataTypes/DataTypesNumber.h>
|
||||||
@ -179,7 +180,18 @@ Pipe StorageDictionary::read(
|
|||||||
{
|
{
|
||||||
auto registered_dictionary_name = location == Location::SameDatabaseAndNameAsDictionary ? getStorageID().getInternalDictionaryName() : dictionary_name;
|
auto registered_dictionary_name = location == Location::SameDatabaseAndNameAsDictionary ? getStorageID().getInternalDictionaryName() : dictionary_name;
|
||||||
auto dictionary = getContext()->getExternalDictionariesLoader().getDictionary(registered_dictionary_name, local_context);
|
auto dictionary = getContext()->getExternalDictionariesLoader().getDictionary(registered_dictionary_name, local_context);
|
||||||
local_context->checkAccess(AccessType::dictGet | AccessType::SELECT, dictionary->getDatabaseOrNoDatabaseTag(), dictionary->getDictionaryID().getTableName());
|
|
||||||
|
/**
|
||||||
|
* For backward compatibility reasons we require either SELECT or dictGet permission to read directly from the dictionary.
|
||||||
|
* If none of these conditions are met - we ask to grant a dictGet.
|
||||||
|
*/
|
||||||
|
bool has_dict_get = local_context->getAccess()->isGranted(
|
||||||
|
AccessType::dictGet, dictionary->getDatabaseOrNoDatabaseTag(), dictionary->getDictionaryID().getTableName());
|
||||||
|
bool has_select = local_context->getAccess()->isGranted(
|
||||||
|
AccessType::SELECT, dictionary->getDatabaseOrNoDatabaseTag(), dictionary->getDictionaryID().getTableName());
|
||||||
|
if (!has_dict_get && !has_select)
|
||||||
|
local_context->checkAccess(AccessType::dictGet, dictionary->getDatabaseOrNoDatabaseTag(), dictionary->getDictionaryID().getTableName());
|
||||||
|
|
||||||
return dictionary->read(column_names, max_block_size, threads);
|
return dictionary->read(column_names, max_block_size, threads);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
ACCESS_DENIED
|
|
||||||
ACCESS_DENIED
|
|
@ -1,41 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
||||||
# shellcheck source=../shell_config.sh
|
|
||||||
. "$CUR_DIR"/../shell_config.sh
|
|
||||||
|
|
||||||
username="user_${CLICKHOUSE_TEST_UNIQUE_NAME}"
|
|
||||||
dictname="dict_${CLICKHOUSE_TEST_UNIQUE_NAME}"
|
|
||||||
dicttablename="dict_table_${CLICKHOUSE_TEST_UNIQUE_NAME}"
|
|
||||||
|
|
||||||
${CLICKHOUSE_CLIENT} -m --query "
|
|
||||||
CREATE DICTIONARY IF NOT EXISTS ${dictname}
|
|
||||||
(
|
|
||||||
id UInt64,
|
|
||||||
value UInt64
|
|
||||||
)
|
|
||||||
PRIMARY KEY id
|
|
||||||
SOURCE(NULL())
|
|
||||||
LAYOUT(FLAT())
|
|
||||||
LIFETIME(MIN 0 MAX 1000);
|
|
||||||
CREATE USER IF NOT EXISTS ${username} NOT IDENTIFIED;
|
|
||||||
GRANT SELECT, CREATE TEMPORARY TABLE ON *.* to ${username};
|
|
||||||
SELECT * FROM ${dictname};
|
|
||||||
CREATE TABLE ${dicttablename} (id UInt64, value UInt64)
|
|
||||||
ENGINE = Dictionary(${CLICKHOUSE_DATABASE}.${dictname});
|
|
||||||
SELECT * FROM ${dicttablename};
|
|
||||||
"
|
|
||||||
|
|
||||||
$CLICKHOUSE_CLIENT -m --user="${username}" --query "
|
|
||||||
SELECT * FROM ${dictname};
|
|
||||||
" 2>&1 | grep -o ACCESS_DENIED | uniq
|
|
||||||
|
|
||||||
$CLICKHOUSE_CLIENT -m --user="${username}" --query "
|
|
||||||
SELECT * FROM ${dicttablename};
|
|
||||||
" 2>&1 | grep -o ACCESS_DENIED | uniq
|
|
||||||
|
|
||||||
${CLICKHOUSE_CLIENT} -m --query "
|
|
||||||
DROP TABLE IF EXISTS ${dicttablename} SYNC;
|
|
||||||
DROP DICTIONARY IF EXISTS ${dictname};
|
|
||||||
DROP USER IF EXISTS ${username};
|
|
||||||
"
|
|
@ -2,4 +2,3 @@ Ok.
|
|||||||
Ok.
|
Ok.
|
||||||
Ok.
|
Ok.
|
||||||
ACCESS_DENIED
|
ACCESS_DENIED
|
||||||
|
|
||||||
|
@ -32,17 +32,17 @@ ${CLICKHOUSE_CLIENT} -nm --query "
|
|||||||
# Reading from dictionary via direct SELECT is Ok.
|
# Reading from dictionary via direct SELECT is Ok.
|
||||||
$CLICKHOUSE_CLIENT -nm --user="${username}" --query "
|
$CLICKHOUSE_CLIENT -nm --user="${username}" --query "
|
||||||
SELECT * FROM ${dictname};
|
SELECT * FROM ${dictname};
|
||||||
" 2>&1 > /dev/null && echo "Ok."
|
" >/dev/null 2>&1 && echo "Ok."
|
||||||
|
|
||||||
# Reading from dictionary via dictionary storage is Ok.
|
# Reading from dictionary via dictionary storage is Ok.
|
||||||
$CLICKHOUSE_CLIENT -nm --user="${username}" --query "
|
$CLICKHOUSE_CLIENT -nm --user="${username}" --query "
|
||||||
SELECT * FROM ${dicttablename};
|
SELECT * FROM ${dicttablename};
|
||||||
" 2>&1 > /dev/null && echo "Ok."
|
" >/dev/null 2>&1 && echo "Ok."
|
||||||
|
|
||||||
# Reading from dictionary via dictionary table function is Ok.
|
# Reading from dictionary via dictionary table function is Ok.
|
||||||
$CLICKHOUSE_CLIENT -nm --user="${username}" --query "
|
$CLICKHOUSE_CLIENT -nm --user="${username}" --query "
|
||||||
SELECT * FROM dictionary(${dictname});
|
SELECT * FROM dictionary(${dictname});
|
||||||
" 2>&1 > /dev/null && echo "Ok."
|
" >/dev/null 2>&1 && echo "Ok."
|
||||||
|
|
||||||
# Function dictGet requires a permission dictGet to use.
|
# Function dictGet requires a permission dictGet to use.
|
||||||
$CLICKHOUSE_CLIENT -nm --user="${username}" --query "
|
$CLICKHOUSE_CLIENT -nm --user="${username}" --query "
|
||||||
|
Loading…
Reference in New Issue
Block a user