|
3 | 3 | #include <ydb/core/grpc_services/table_settings.h>
|
4 | 4 | #include <ydb/core/ydb_convert/table_description.h>
|
5 | 5 | #include <ydb/core/ydb_convert/column_families.h>
|
| 6 | +#include <ydb/core/ydb_convert/ydb_convert.h> |
6 | 7 |
|
7 | 8 | namespace NKikimr::NKqp {
|
8 | 9 |
|
@@ -784,7 +785,86 @@ class TKqpGatewayProxy : public IKikimrGateway {
|
784 | 785 | TFuture<TGenericResult> ModifyPermissions(const TString& cluster,
|
785 | 786 | const TModifyPermissionsSettings& settings) override
|
786 | 787 | {
|
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; |
788 | 868 | }
|
789 | 869 |
|
790 | 870 | TFuture<TGenericResult> CreateUser(const TString& cluster, const TCreateUserSettings& settings) override {
|
|
0 commit comments