Skip to content

Commit e6457a7

Browse files
authored
ydb(d) cli: add commands for setting interrupt-inheritance flag in acl (#3776)
Add `ydb scheme permissions {clear,set}-inheritance` commands. Add `ydbd db schema access {clear,set}-inheritance` commands. `InterruptInheritance` is a special flag that blocks permission inheritance for a target path. There are a variance of inheritance type modifiers which effect how inheritance works for an individual access control entry, but InterruptInheritance flag have a global effect for a path. InterruptInheritance was a part of the public api for a while now (and it was used internally), but there was no cli commands to actually manipulate it.
1 parent bb312c5 commit e6457a7

File tree

7 files changed

+179
-0
lines changed

7 files changed

+179
-0
lines changed

ydb/core/driver_lib/cli_base/cli_cmds_db.cpp

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,90 @@ class TClientCommandSchemaAccessRemove : public TClientCommand {
799799
}
800800
};
801801

802+
class TClientCommandSchemaAccessInheritanceBase : public TClientCommand {
803+
public:
804+
TClientCommandSchemaAccessInheritanceBase(
805+
const TString& name,
806+
const std::initializer_list<TString>& aliases,
807+
const TString& description,
808+
bool interruptInheritance
809+
)
810+
: TClientCommand(name, aliases, description)
811+
, InterruptInheritance(interruptInheritance)
812+
{}
813+
814+
TAutoPtr<NKikimrClient::TSchemeOperation> Request;
815+
816+
virtual void Config(TConfig& config) override {
817+
TClientCommand::Config(config);
818+
config.SetFreeArgsNum(1);
819+
SetFreeArgTitle(0, "<PATH>", "Full pathname of an object (e.g. /ru/home/user/mydb/test1/test2).\n"
820+
" Or short pathname if profile path is set (e.g. test1/test2).");
821+
}
822+
823+
TString Base;
824+
TString Name;
825+
bool InterruptInheritance = false;
826+
827+
virtual void Parse(TConfig& config) override {
828+
TClientCommand::Parse(config);
829+
TString pathname = config.ParseResult->GetFreeArgs()[0];
830+
size_t pos = pathname.rfind('/');
831+
if (config.Path) {
832+
// Profile path is set
833+
if (!pathname.StartsWith('/')) {
834+
Base = config.Path;
835+
Name = pathname;
836+
} else {
837+
WarnProfilePathSet();
838+
Base = pathname.substr(0, pos);
839+
Name = pathname.substr(pos + 1);
840+
}
841+
} else {
842+
Base = pathname.substr(0, pos);
843+
Name = pathname.substr(pos + 1);
844+
}
845+
}
846+
847+
virtual int Run(TConfig& config) override {
848+
TAutoPtr<NMsgBusProxy::TBusSchemeOperation> request(new NMsgBusProxy::TBusSchemeOperation());
849+
NKikimrClient::TSchemeOperation& record(request->Record);
850+
auto& modifyScheme = *record.MutableTransaction()->MutableModifyScheme();
851+
modifyScheme.SetOperationType(NKikimrSchemeOp::EOperationType::ESchemeOpModifyACL);
852+
modifyScheme.SetWorkingDir(Base);
853+
auto& modifyAcl = *modifyScheme.MutableModifyACL();
854+
modifyAcl.SetName(Name);
855+
NACLibProto::TDiffACL diffAcl;
856+
{
857+
diffAcl.SetInterruptInheritance(InterruptInheritance);
858+
}
859+
modifyAcl.SetDiffACL(diffAcl.SerializeAsString());
860+
int result = MessageBusCall<NMsgBusProxy::TBusSchemeOperation, NMsgBusProxy::TBusResponse>(config, request,
861+
[](const NMsgBusProxy::TBusResponse& response) -> int {
862+
if (response.Record.GetStatus() != NMsgBusProxy::MSTATUS_OK) {
863+
Cerr << ToCString(static_cast<NMsgBusProxy::EResponseStatus>(response.Record.GetStatus())) << " " << response.Record.GetErrorReason() << Endl;
864+
return 1;
865+
}
866+
return 0;
867+
});
868+
return result;
869+
}
870+
};
871+
872+
class TClientCommandSchemaAccessSetInheritance : public TClientCommandSchemaAccessInheritanceBase {
873+
public:
874+
TClientCommandSchemaAccessSetInheritance()
875+
: TClientCommandSchemaAccessInheritanceBase("set-inheritance", {}, "Enable permission inheritance from the parent", false)
876+
{}
877+
};
878+
879+
class TClientCommandSchemaAccessClearInheritance : public TClientCommandSchemaAccessInheritanceBase {
880+
public:
881+
TClientCommandSchemaAccessClearInheritance()
882+
: TClientCommandSchemaAccessInheritanceBase("clear-inheritance", {}, "Disable permission inheritance from the parent", true)
883+
{}
884+
};
885+
802886
class TClientCommandSchemaAccess : public TClientCommandTree {
803887
public:
804888
TClientCommandSchemaAccess()
@@ -808,6 +892,8 @@ class TClientCommandSchemaAccess : public TClientCommandTree {
808892
AddCommand(std::make_unique<TClientCommandSchemaAccessRemove>());
809893
//AddCommand(std::make_unique<TClientCommandSchemaAccessGrant>());
810894
//AddCommand(std::make_unique<TClientCommandSchemaAccessRevoke>());
895+
AddCommand(std::make_unique<TClientCommandSchemaAccessSetInheritance>());
896+
AddCommand(std::make_unique<TClientCommandSchemaAccessClearInheritance>());
811897
}
812898
};
813899

ydb/docs/en/core/reference/ydb-cli/_includes/commands.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ Any command can be run from the command line with the `--help` option to get hel
5050
| scheme permissions remove | Removing a permission |
5151
| scheme permissions revoke | Revoking a permission |
5252
| scheme permissions set | Setting permissions |
53+
| scheme permissions clear-inheritance | Disabling permissions inheritance |
54+
| scheme permissions set-inheritance | Enabling permissions inheritance |
5355
| [scheme rmdir](../commands/dir.md#rmdir) | Deleting a directory |
5456
| [scripting yql](../scripting-yql.md) | Executing a YQL script |
5557
| table attribute add | Adding a table attribute |

ydb/docs/ru/core/reference/ydb-cli/_includes/commands.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ scheme permissions grant | Предоставление разрешения
5050
scheme permissions remove | Удаление разрешения
5151
scheme permissions revoke | Удаление разрешения
5252
scheme permissions set | Установка разрешений
53+
scheme permissions clear-inheritance | Запрет наследования разрешений
54+
scheme permissions set-inheritance | Установка наследования разрешений
5355
[scheme rmdir](../commands/dir.md#rmdir) | Удаление директории
5456
[scripting yql](../scripting-yql.md) | Выполнение YQL-скрипта
5557
table attribute add | Добавление атрибута для строкой или колоночной таблицы

ydb/public/lib/ydb_cli/commands/ydb_service_scheme.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,6 +1094,8 @@ TCommandPermissions::TCommandPermissions()
10941094
AddCommand(std::make_unique<TCommandPermissionSet>());
10951095
AddCommand(std::make_unique<TCommandChangeOwner>());
10961096
AddCommand(std::make_unique<TCommandPermissionClear>());
1097+
AddCommand(std::make_unique<TCommandPermissionSetInheritance>());
1098+
AddCommand(std::make_unique<TCommandPermissionClearInheritance>());
10971099
AddCommand(std::make_unique<TCommandPermissionList>());
10981100
}
10991101

@@ -1285,6 +1287,66 @@ int TCommandPermissionClear::Run(TConfig& config) {
12851287
return EXIT_SUCCESS;
12861288
}
12871289

1290+
TCommandPermissionSetInheritance::TCommandPermissionSetInheritance()
1291+
: TYdbOperationCommand("set-inheritance", std::initializer_list<TString>(), "Set to inherit permissions from the parent")
1292+
{}
1293+
1294+
void TCommandPermissionSetInheritance::Config(TConfig& config) {
1295+
TYdbOperationCommand::Config(config);
1296+
1297+
config.SetFreeArgsNum(1);
1298+
SetFreeArgTitle(0, "<path>", "Path to set interrupt-inheritance flag for");
1299+
}
1300+
1301+
void TCommandPermissionSetInheritance::Parse(TConfig& config) {
1302+
TClientCommand::Parse(config);
1303+
ParsePath(config, 0);
1304+
}
1305+
1306+
int TCommandPermissionSetInheritance::Run(TConfig& config) {
1307+
NScheme::TSchemeClient client(CreateDriver(config));
1308+
ThrowOnError(
1309+
client.ModifyPermissions(
1310+
Path,
1311+
FillSettings(
1312+
NScheme::TModifyPermissionsSettings()
1313+
.AddInterruptInheritance(false)
1314+
)
1315+
).GetValueSync()
1316+
);
1317+
return EXIT_SUCCESS;
1318+
}
1319+
1320+
TCommandPermissionClearInheritance::TCommandPermissionClearInheritance()
1321+
: TYdbOperationCommand("clear-inheritance", std::initializer_list<TString>(), "Set to do not inherit permissions from the parent")
1322+
{}
1323+
1324+
void TCommandPermissionClearInheritance::Config(TConfig& config) {
1325+
TYdbOperationCommand::Config(config);
1326+
1327+
config.SetFreeArgsNum(1);
1328+
SetFreeArgTitle(0, "<path>", "Path to set interrupt-inheritance flag for");
1329+
}
1330+
1331+
void TCommandPermissionClearInheritance::Parse(TConfig& config) {
1332+
TClientCommand::Parse(config);
1333+
ParsePath(config, 0);
1334+
}
1335+
1336+
int TCommandPermissionClearInheritance::Run(TConfig& config) {
1337+
NScheme::TSchemeClient client(CreateDriver(config));
1338+
ThrowOnError(
1339+
client.ModifyPermissions(
1340+
Path,
1341+
FillSettings(
1342+
NScheme::TModifyPermissionsSettings()
1343+
.AddInterruptInheritance(true)
1344+
)
1345+
).GetValueSync()
1346+
);
1347+
return EXIT_SUCCESS;
1348+
}
1349+
12881350
TCommandPermissionList::TCommandPermissionList()
12891351
: TYdbOperationCommand("list", std::initializer_list<TString>(), "List permissions")
12901352
{}

ydb/public/lib/ydb_cli/commands/ydb_service_scheme.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,22 @@ class TCommandPermissionClear : public TYdbOperationCommand, public TCommandWith
203203
virtual int Run(TConfig& config) override;
204204
};
205205

206+
class TCommandPermissionSetInheritance : public TYdbOperationCommand, public TCommandWithPath {
207+
public:
208+
TCommandPermissionSetInheritance();
209+
virtual void Config(TConfig& config) override;
210+
virtual void Parse(TConfig& config) override;
211+
virtual int Run(TConfig& config) override;
212+
};
213+
214+
class TCommandPermissionClearInheritance : public TYdbOperationCommand, public TCommandWithPath {
215+
public:
216+
TCommandPermissionClearInheritance();
217+
virtual void Config(TConfig& config) override;
218+
virtual void Parse(TConfig& config) override;
219+
virtual int Run(TConfig& config) override;
220+
};
221+
206222
class TCommandPermissionList : public TYdbOperationCommand, public TCommandWithPath {
207223
public:
208224
TCommandPermissionList();

ydb/public/sdk/cpp/client/ydb_scheme/scheme.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,9 @@ class TSchemeClient::TImpl : public TClientImplCommon<TSchemeClient::TImpl> {
253253
if (settings.ClearAcl_) {
254254
request.set_clear_permissions(true);
255255
}
256+
if (settings.SetInterruptInheritance_) {
257+
request.set_interrupt_inheritance(settings.InterruptInheritanceValue_);
258+
}
256259

257260
for (const auto& action : settings.Actions_) {
258261
auto protoAction = request.add_actions();

ydb/public/sdk/cpp/client/ydb_scheme/scheme.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,16 @@ struct TModifyPermissionsSettings : public TOperationRequestSettings<TModifyPerm
136136
return *this;
137137
}
138138

139+
TModifyPermissionsSettings& AddInterruptInheritance(bool value) {
140+
SetInterruptInheritance_ = true;
141+
InterruptInheritanceValue_ = value;
142+
return *this;
143+
}
144+
139145
TVector<std::pair<EModifyPermissionsAction, TPermissions>> Actions_;
140146
bool ClearAcl_ = false;
147+
bool SetInterruptInheritance_ = false;
148+
bool InterruptInheritanceValue_ = false;
141149
void AddAction(EModifyPermissionsAction action, const TPermissions& permissions) {
142150
Actions_.emplace_back(std::pair<EModifyPermissionsAction, TPermissions>{action, permissions});
143151
}

0 commit comments

Comments
 (0)