code updated

This commit is contained in:
Boris Tasevski 2022-07-11 17:35:15 +02:00
parent 5b92aae0d3
commit 10f2c416bd
3 changed files with 39 additions and 6 deletions

View File

@ -103,6 +103,8 @@ std::string PermissionLevelToString(PermissionLevel level) {
}
}
const std::string ASTERISK = "*";
Permissions::Permissions(uint64_t grants, uint64_t denies) : grants_(grants & (~denies)), denies_(denies) {}
PermissionLevel Permissions::Has(Permission permission) const {
@ -200,18 +202,36 @@ PermissionLevel LabelPermissions::Has(const std::string &permission) const {
}
void LabelPermissions::Grant(const std::string &permission) {
if (permission == ASTERISK) {
grants_.clear();
grants_.insert(permission);
return;
}
auto deniedPermissionIter = denies_.find(permission);
if (deniedPermissionIter != denies_.end()) {
denies_.erase(deniedPermissionIter);
}
if (grants_.size() == 1 && grants_.find(ASTERISK) != grants_.end()) {
grants_.erase(ASTERISK);
}
if (grants_.find(permission) == grants_.end()) {
grants_.insert(permission);
}
}
void LabelPermissions::Revoke(const std::string &permission) {
if (permission == ASTERISK) {
grants_.clear();
denies_.clear();
return;
}
auto deniedPermissionIter = denies_.find(permission);
auto grantedPermissionIter = grants_.find(permission);
@ -225,12 +245,23 @@ void LabelPermissions::Revoke(const std::string &permission) {
}
void LabelPermissions::Deny(const std::string &permission) {
if (permission == ASTERISK) {
denies_.clear();
denies_.insert(permission);
return;
}
auto grantedPermissionIter = grants_.find(permission);
if (grantedPermissionIter != grants_.end()) {
grants_.erase(grantedPermissionIter);
}
if (denies_.size() == 1 && denies_.find(ASTERISK) != denies_.end()) {
denies_.erase(ASTERISK);
}
if (denies_.find(permission) == denies_.end()) {
denies_.insert(permission);
}

View File

@ -1336,12 +1336,12 @@ antlrcpp::Any CypherMainVisitor::visitRevokePrivilege(MemgraphCypher::RevokePriv
*/
antlrcpp::Any CypherMainVisitor::visitLabelList(MemgraphCypher::LabelListContext *ctx) {
std::vector<std::string> labels;
for (auto *label : ctx->label()) {
if (label->ASTERISK()) {
labels.push_back("*");
} else {
if (ctx->listOfLabels()) {
for (auto *label : ctx->listOfLabels()->label()) {
labels.push_back(label->symbolicName()->accept(this).as<std::string>());
}
} else {
labels.emplace_back("*");
}
return labels;

View File

@ -260,9 +260,11 @@ privilege : CREATE
privilegeList : privilege ( ',' privilege )* ;
labelList : COLON label ( ',' COLON label )* ;
labelList : '*' | listOfLabels ;
label : ( '*' | symbolicName ) ;
listOfLabels : label ( ',' label )* ;
label : COLON symbolicName ;
showPrivileges : SHOW PRIVILEGES FOR userOrRole=userOrRoleName ;