Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
fb3b7555
C
ClickHouse
项目概览
2dot5
/
ClickHouse
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ClickHouse
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
fb3b7555
编写于
2月 05, 2020
作者:
V
Vitaly Baranov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix granting and revoking access rights.
上级
328d3a8b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
70 addition
and
11 deletion
+70
-11
dbms/src/Access/AccessRights.cpp
dbms/src/Access/AccessRights.cpp
+68
-11
dbms/src/Access/AccessRights.h
dbms/src/Access/AccessRights.h
+2
-0
未找到文件。
dbms/src/Access/AccessRights.cpp
浏览文件 @
fb3b7555
#include <Access/AccessRights.h>
#include <Common/Exception.h>
#include <common/logger_useful.h>
#include <boost/range/adaptor/map.hpp>
#include <unordered_map>
namespace
DB
{
namespace
ErrorCodes
...
...
@@ -73,6 +73,7 @@ public:
inherited_access
=
src
.
inherited_access
;
explicit_grants
=
src
.
explicit_grants
;
partial_revokes
=
src
.
partial_revokes
;
raw_access
=
src
.
raw_access
;
access
=
src
.
access
;
min_access
=
src
.
min_access
;
max_access
=
src
.
max_access
;
...
...
@@ -114,8 +115,12 @@ public:
access_to_grant
=
grantable
;
}
explicit_grants
|=
access_to_grant
-
partial_revokes
;
partial_revokes
-=
access_to_grant
;
AccessFlags
new_explicit_grants
=
access_to_grant
-
partial_revokes
;
if
(
level
==
TABLE_LEVEL
)
removeExplicitGrantsRec
(
new_explicit_grants
);
removePartialRevokesRec
(
access_to_grant
);
explicit_grants
|=
new_explicit_grants
;
calculateAllAccessRec
(
helper
);
}
...
...
@@ -147,16 +152,27 @@ public:
{
if
constexpr
(
mode
==
NORMAL_REVOKE_MODE
)
{
explicit_grants
-=
access_to_revoke
;
if
(
level
==
TABLE_LEVEL
)
removeExplicitGrantsRec
(
access_to_revoke
);
else
removeExplicitGrants
(
access_to_revoke
);
}
else
if
constexpr
(
mode
==
PARTIAL_REVOKE_MODE
)
{
partial_revokes
|=
access_to_revoke
-
explicit_grants
;
explicit_grants
-=
access_to_revoke
;
AccessFlags
new_partial_revokes
=
access_to_revoke
-
explicit_grants
;
if
(
level
==
TABLE_LEVEL
)
removeExplicitGrantsRec
(
access_to_revoke
);
else
removeExplicitGrants
(
access_to_revoke
);
removePartialRevokesRec
(
new_partial_revokes
);
partial_revokes
|=
new_partial_revokes
;
}
else
/// mode == FULL_REVOKE_MODE
{
fullRevokeRec
(
access_to_revoke
);
AccessFlags
new_partial_revokes
=
access_to_revoke
-
explicit_grants
;
removeExplicitGrantsRec
(
access_to_revoke
);
removePartialRevokesRec
(
new_partial_revokes
);
partial_revokes
|=
new_partial_revokes
;
}
calculateAllAccessRec
(
helper
);
}
...
...
@@ -272,6 +288,24 @@ public:
calculateAllAccessRec
(
helper
);
}
void
traceTree
(
Poco
::
Logger
*
log
)
const
{
LOG_TRACE
(
log
,
"Tree("
<<
level
<<
"): name="
<<
(
node_name
?
*
node_name
:
"NULL"
)
<<
", explicit_grants="
<<
explicit_grants
.
toString
()
<<
", partial_revokes="
<<
partial_revokes
.
toString
()
<<
", inherited_access="
<<
inherited_access
.
toString
()
<<
", raw_access="
<<
raw_access
.
toString
()
<<
", access="
<<
access
.
toString
()
<<
", min_access="
<<
min_access
.
toString
()
<<
", max_access="
<<
max_access
.
toString
()
<<
", num_children="
<<
(
children
?
children
->
size
()
:
0
));
if
(
children
)
{
for
(
auto
&
child
:
*
children
|
boost
::
adaptors
::
map_values
)
child
.
traceTree
(
log
);
}
}
private:
Node
*
tryGetChild
(
const
std
::
string_view
&
name
)
{
...
...
@@ -371,14 +405,28 @@ private:
calculateMinAndMaxAccess
();
}
void
fullRevokeRec
(
const
AccessFlags
&
access_to_revok
e
)
void
removeExplicitGrants
(
const
AccessFlags
&
chang
e
)
{
explicit_grants
-=
access_to_revoke
;
partial_revokes
|=
access_to_revoke
;
explicit_grants
-=
change
;
}
void
removeExplicitGrantsRec
(
const
AccessFlags
&
change
)
{
removeExplicitGrants
(
change
);
if
(
children
)
{
for
(
auto
&
child
:
*
children
|
boost
::
adaptors
::
map_values
)
child
.
removeExplicitGrantsRec
(
change
);
}
}
void
removePartialRevokesRec
(
const
AccessFlags
&
change
)
{
partial_revokes
-=
change
;
if
(
children
)
{
for
(
auto
&
child
:
*
children
|
boost
::
adaptors
::
map_values
)
child
.
fullRevokeRec
(
access_to_revok
e
);
child
.
removePartialRevokesRec
(
chang
e
);
}
}
...
...
@@ -726,4 +774,13 @@ void AccessRights::merge(const AccessRights & other)
}
}
void
AccessRights
::
traceTree
()
const
{
auto
*
log
=
&
Poco
::
Logger
::
get
(
"AccessRights"
);
if
(
root
)
root
->
traceTree
(
log
);
else
LOG_TRACE
(
log
,
"Tree: NULL"
);
}
}
dbms/src/Access/AccessRights.h
浏览文件 @
fb3b7555
...
...
@@ -130,6 +130,8 @@ private:
template
<
typename
...
Args
>
AccessFlags
getAccessImpl
(
const
Args
&
...
args
)
const
;
void
traceTree
()
const
;
struct
Node
;
std
::
unique_ptr
<
Node
>
root
;
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录