Skip to content

Commit fba31d0

Browse files
committed
add grant/revore permissions to query service
1 parent e5de0d2 commit fba31d0

File tree

7 files changed

+349
-15
lines changed

7 files changed

+349
-15
lines changed

ydb/core/kqp/executer_actor/kqp_scheme_executer.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -139,17 +139,25 @@ class TKqpSchemeExecuter : public TActorBootstrapped<TKqpSchemeExecuter> {
139139
ev->Record.MutableTransaction()->MutableModifyScheme()->CopyFrom(modifyScheme);
140140
break;
141141
}
142+
142143
case NKqpProto::TKqpSchemeOperation::kAlterUser: {
143144
auto modifyScheme = schemeOp.GetAlterUser();
144145
ev->Record.MutableTransaction()->MutableModifyScheme()->CopyFrom(modifyScheme);
145146
break;
146147
}
148+
147149
case NKqpProto::TKqpSchemeOperation::kDropUser: {
148150
auto modifyScheme = schemeOp.GetDropUser();
149151
ev->Record.MutableTransaction()->MutableModifyScheme()->CopyFrom(modifyScheme);
150152
break;
151153
}
152154

155+
case NKqpProto::TKqpSchemeOperation::kModifyPermissions: {
156+
auto modifyScheme = schemeOp.GetModifyPermissions();
157+
ev->Record.MutableTransaction()->MutableModifyScheme()->CopyFrom(modifyScheme);
158+
break;
159+
}
160+
153161
default:
154162
InternalError(TStringBuilder() << "Unexpected scheme operation: "
155163
<< (ui32) schemeOp.GetOperationCase());

ydb/core/kqp/gateway/kqp_gateway.h

+2
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ bool SplitTablePath(const TString& tableName, const TString& database, std::pair
213213
bool SetDatabaseForLoginOperation(TString& result, bool getDomainLoginOnly, TMaybe<TString> domainName,
214214
const TString& database);
215215

216+
std::pair<TString, TString> SplitPathByDirAndBaseNames(const TString& path);
217+
216218
} // namespace NKikimr::NKqp
217219

218220
template<>

ydb/core/kqp/gateway/kqp_ic_gateway.cpp

+7-8
Original file line numberDiff line numberDiff line change
@@ -2275,14 +2275,6 @@ class TKikimrIcGateway : public IKqpGateway {
22752275
}
22762276

22772277
private:
2278-
static std::pair<TString, TString> SplitPathByDirAndBaseNames(const TString& path) {
2279-
auto splitPos = path.find_last_of('/');
2280-
if (splitPos == path.npos || splitPos + 1 == path.size()) {
2281-
ythrow yexception() << "wrong path format '" << path << "'" ;
2282-
}
2283-
return {path.substr(0, splitPos), path.substr(splitPos + 1)};
2284-
}
2285-
22862278
static TListPathResult GetListPathResult(const TPathDescription& pathDesc, const TString& path) {
22872279
if (pathDesc.GetSelf().GetPathType() != EPathTypeDir) {
22882280
return ResultFromError<TListPathResult>(TString("Directory not found: ") + path);
@@ -2454,6 +2446,13 @@ bool SetDatabaseForLoginOperation(TString& result, bool getDomainLoginOnly, TMay
24542446
return true;
24552447
}
24562448

2449+
std::pair<TString, TString> SplitPathByDirAndBaseNames(const TString& path) {
2450+
auto splitPos = path.find_last_of('/');
2451+
if (splitPos == path.npos || splitPos + 1 == path.size()) {
2452+
ythrow yexception() << "wrong path format '" << path << "'" ;
2453+
}
2454+
return {path.substr(0, splitPos), path.substr(splitPos + 1)};
2455+
}
24572456

24582457
} // namespace NKqp
24592458
} // namespace NKikimr

ydb/core/kqp/host/kqp_gateway_proxy.cpp

+81-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <ydb/core/grpc_services/table_settings.h>
44
#include <ydb/core/ydb_convert/table_description.h>
55
#include <ydb/core/ydb_convert/column_families.h>
6+
#include <ydb/core/ydb_convert/ydb_convert.h>
67

78
namespace NKikimr::NKqp {
89

@@ -784,7 +785,86 @@ class TKqpGatewayProxy : public IKikimrGateway {
784785
TFuture<TGenericResult> ModifyPermissions(const TString& cluster,
785786
const TModifyPermissionsSettings& settings) override
786787
{
787-
FORWARD_ENSURE_NO_PREPARE(ModifyPermissions, cluster, settings);
788+
CHECK_PREPARED_DDL(ModifyPermissions);
789+
790+
auto modifyPermissionsPromise = NewPromise<TGenericResult>();
791+
792+
if (settings.Permissions.empty() && !settings.IsPermissionsClear) {
793+
return MakeFuture(ResultFromError<TGenericResult>("No permissions names for modify permissions"));
794+
}
795+
796+
if (settings.Pathes.empty()) {
797+
return MakeFuture(ResultFromError<TGenericResult>("No pathes for modify permissions"));
798+
}
799+
800+
if (settings.Roles.empty()) {
801+
return MakeFuture(ResultFromError<TGenericResult>("No roles for modify permissions"));
802+
}
803+
804+
NACLib::TDiffACL acl;
805+
switch (settings.Action) {
806+
case NYql::TModifyPermissionsSettings::EAction::Grant: {
807+
for (const auto& sid : settings.Roles) {
808+
for (const auto& permission : settings.Permissions) {
809+
TACLAttrs aclAttrs = ConvertYdbPermissionNameToACLAttrs(permission);
810+
acl.AddAccess(NACLib::EAccessType::Allow, aclAttrs.AccessMask, sid, aclAttrs.InheritanceType);
811+
}
812+
}
813+
}
814+
break;
815+
case NYql::TModifyPermissionsSettings::EAction::Revoke: {
816+
if (settings.IsPermissionsClear) {
817+
for (const auto& sid : settings.Roles) {
818+
acl.ClearAccessForSid(sid);
819+
}
820+
} else {
821+
for (const auto& sid : settings.Roles) {
822+
for (const auto& permission : settings.Permissions) {
823+
TACLAttrs aclAttrs = ConvertYdbPermissionNameToACLAttrs(permission);
824+
acl.RemoveAccess(NACLib::EAccessType::Allow, aclAttrs.AccessMask, sid, aclAttrs.InheritanceType);
825+
}
826+
}
827+
}
828+
}
829+
break;
830+
default: {
831+
return MakeFuture(ResultFromError<TGenericResult>("Unknown permission action"));
832+
}
833+
}
834+
835+
const auto serializedDiffAcl = acl.SerializeAsString();
836+
837+
TVector<std::pair<const TString*, std::pair<TString, TString>>> pathPairs;
838+
pathPairs.reserve(settings.Pathes.size());
839+
for (const auto& path : settings.Pathes) {
840+
pathPairs.push_back(std::make_pair(&path, SplitPathByDirAndBaseNames(path)));
841+
}
842+
843+
if (IsPrepare()) {
844+
for (const auto& path : pathPairs) {
845+
const auto& [dirname, basename] = path.second;
846+
847+
NKikimrSchemeOp::TModifyScheme schemeTx;
848+
schemeTx.SetOperationType(NKikimrSchemeOp::ESchemeOpModifyACL);
849+
schemeTx.SetWorkingDir(dirname);
850+
schemeTx.MutableModifyACL()->SetName(basename);
851+
schemeTx.MutableModifyACL()->SetDiffACL(serializedDiffAcl);
852+
853+
auto& phyQuery = *SessionCtx->Query().PreparingQuery->MutablePhysicalQuery();
854+
auto& phyTx = *phyQuery.AddTransactions();
855+
phyTx.SetType(NKqpProto::TKqpPhyTx::TYPE_SCHEME);
856+
phyTx.MutableSchemeOperation()->MutableModifyPermissions()->Swap(&schemeTx);
857+
}
858+
859+
TGenericResult result;
860+
result.SetSuccess();
861+
modifyPermissionsPromise.SetValue(result);
862+
863+
} else {
864+
return Gateway->ModifyPermissions(cluster, settings);
865+
}
866+
867+
return modifyPermissionsPromise;
788868
}
789869

790870
TFuture<TGenericResult> CreateUser(const TString& cluster, const TCreateUserSettings& settings) override {

ydb/core/kqp/provider/yql_kikimr_exec.cpp

+1-6
Original file line numberDiff line numberDiff line change
@@ -1671,10 +1671,6 @@ class TKiSinkCallableExecutionTransformer : public TAsyncCallbackTransformer<TKi
16711671
}
16721672

16731673
if (auto maybeGrantPermissions = TMaybeNode<TKiModifyPermissions>(input)) {
1674-
if (!EnsureNotPrepare("MODIFY PERMISSIONS", input->Pos(), SessionCtx->Query(), ctx)) {
1675-
return SyncError();
1676-
}
1677-
16781674
auto requireStatus = RequireChild(*input, 0);
16791675
if (requireStatus.Level != TStatus::Ok) {
16801676
return SyncStatus(requireStatus);
@@ -1683,8 +1679,7 @@ class TKiSinkCallableExecutionTransformer : public TAsyncCallbackTransformer<TKi
16831679
auto cluster = TString(maybeGrantPermissions.Cast().DataSink().Cluster());
16841680
TModifyPermissionsSettings settings = ParsePermissionsSettings(maybeGrantPermissions.Cast());
16851681

1686-
bool prepareOnly = SessionCtx->Query().PrepareOnly;
1687-
auto future = prepareOnly ? CreateDummySuccess() : Gateway->ModifyPermissions(cluster, settings);
1682+
auto future = Gateway->ModifyPermissions(cluster, settings);
16881683

16891684
return WrapFuture(future,
16901685
[](const IKikimrGateway::TGenericResult& res, const TExprNode::TPtr& input, TExprContext& ctx) {

0 commit comments

Comments
 (0)