mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 17:12:03 +00:00
Backport #66409 to 24.3: Fix VALID UNTIL clause resetting after restart
This commit is contained in:
parent
12047b0a1b
commit
b62f2327fb
@ -114,6 +114,34 @@ namespace
|
|||||||
else if (query.grantees)
|
else if (query.grantees)
|
||||||
user.grantees = *query.grantees;
|
user.grantees = *query.grantees;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
time_t getValidUntilFromAST(ASTPtr valid_until, ContextPtr context)
|
||||||
|
{
|
||||||
|
if (context)
|
||||||
|
valid_until = evaluateConstantExpressionAsLiteral(valid_until, context);
|
||||||
|
|
||||||
|
const String valid_until_str = checkAndGetLiteralArgument<String>(valid_until, "valid_until");
|
||||||
|
|
||||||
|
if (valid_until_str == "infinity")
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
time_t time = 0;
|
||||||
|
ReadBufferFromString in(valid_until_str);
|
||||||
|
|
||||||
|
if (context)
|
||||||
|
{
|
||||||
|
const auto & time_zone = DateLUT::instance("");
|
||||||
|
const auto & utc_time_zone = DateLUT::instance("UTC");
|
||||||
|
|
||||||
|
parseDateTimeBestEffort(time, in, time_zone, utc_time_zone);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
readDateTimeText(time, in);
|
||||||
|
}
|
||||||
|
|
||||||
|
return time;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockIO InterpreterCreateUserQuery::execute()
|
BlockIO InterpreterCreateUserQuery::execute()
|
||||||
@ -134,23 +162,7 @@ BlockIO InterpreterCreateUserQuery::execute()
|
|||||||
|
|
||||||
std::optional<time_t> valid_until;
|
std::optional<time_t> valid_until;
|
||||||
if (query.valid_until)
|
if (query.valid_until)
|
||||||
{
|
valid_until = getValidUntilFromAST(query.valid_until, getContext());
|
||||||
const ASTPtr valid_until_literal = evaluateConstantExpressionAsLiteral(query.valid_until, getContext());
|
|
||||||
const String valid_until_str = checkAndGetLiteralArgument<String>(valid_until_literal, "valid_until");
|
|
||||||
|
|
||||||
time_t time = 0;
|
|
||||||
|
|
||||||
if (valid_until_str != "infinity")
|
|
||||||
{
|
|
||||||
const auto & time_zone = DateLUT::instance("");
|
|
||||||
const auto & utc_time_zone = DateLUT::instance("UTC");
|
|
||||||
|
|
||||||
ReadBufferFromString in(valid_until_str);
|
|
||||||
parseDateTimeBestEffort(time, in, time_zone, utc_time_zone);
|
|
||||||
}
|
|
||||||
|
|
||||||
valid_until = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<RolesOrUsersSet> default_roles_from_query;
|
std::optional<RolesOrUsersSet> default_roles_from_query;
|
||||||
if (query.default_roles)
|
if (query.default_roles)
|
||||||
@ -259,7 +271,11 @@ void InterpreterCreateUserQuery::updateUserFromQuery(User & user, const ASTCreat
|
|||||||
if (query.auth_data)
|
if (query.auth_data)
|
||||||
auth_data = AuthenticationData::fromAST(*query.auth_data, {}, !query.attach);
|
auth_data = AuthenticationData::fromAST(*query.auth_data, {}, !query.attach);
|
||||||
|
|
||||||
updateUserFromQueryImpl(user, query, auth_data, {}, {}, {}, {}, {}, allow_no_password, allow_plaintext_password, true);
|
std::optional<time_t> valid_until;
|
||||||
|
if (query.valid_until)
|
||||||
|
valid_until = getValidUntilFromAST(query.valid_until, {});
|
||||||
|
|
||||||
|
updateUserFromQueryImpl(user, query, auth_data, {}, {}, {}, {}, valid_until, allow_no_password, allow_plaintext_password, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void registerInterpreterCreateUserQuery(InterpreterFactory & factory)
|
void registerInterpreterCreateUserQuery(InterpreterFactory & factory)
|
||||||
|
@ -5,7 +5,7 @@ from time import sleep
|
|||||||
from helpers.cluster import ClickHouseCluster
|
from helpers.cluster import ClickHouseCluster
|
||||||
|
|
||||||
cluster = ClickHouseCluster(__file__)
|
cluster = ClickHouseCluster(__file__)
|
||||||
node = cluster.add_instance("node")
|
node = cluster.add_instance("node", stay_alive=True)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope="module")
|
@pytest.fixture(scope="module")
|
||||||
@ -84,3 +84,22 @@ def test_details(started_cluster):
|
|||||||
node.query("SHOW CREATE USER user_details_time_only")
|
node.query("SHOW CREATE USER user_details_time_only")
|
||||||
== f"CREATE USER user_details_time_only VALID UNTIL \\'{until_year}-01-01 22:03:40\\'\n"
|
== f"CREATE USER user_details_time_only VALID UNTIL \\'{until_year}-01-01 22:03:40\\'\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_restart(started_cluster):
|
||||||
|
node.query("CREATE USER user_restart VALID UNTIL '06/11/2010 08:03:20 Z+3'")
|
||||||
|
|
||||||
|
assert (
|
||||||
|
node.query("SHOW CREATE USER user_restart")
|
||||||
|
== "CREATE USER user_restart VALID UNTIL \\'2010-11-06 05:03:20\\'\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
node.restart_clickhouse()
|
||||||
|
|
||||||
|
assert (
|
||||||
|
node.query("SHOW CREATE USER user_restart")
|
||||||
|
== "CREATE USER user_restart VALID UNTIL \\'2010-11-06 05:03:20\\'\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
error = "Authentication failed"
|
||||||
|
assert error in node.query_and_get_error("SELECT 1", user="user_restart")
|
||||||
|
Loading…
Reference in New Issue
Block a user