Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
m0_67397764
soar
提交
f35407a4
S
soar
项目概览
m0_67397764
/
soar
与 Fork 源项目一致
Fork自
Xiaomi / soar
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
soar
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f35407a4
编写于
11月 26, 2018
作者:
martianzhang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix #126
上级
c944ccd0
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
167 addition
and
22 deletion
+167
-22
cmd/soar/tool.go
cmd/soar/tool.go
+10
-0
database/privilege.go
database/privilege.go
+104
-0
database/privilege_test.go
database/privilege_test.go
+31
-0
vendor/vendor.json
vendor/vendor.json
+22
-22
未找到文件。
cmd/soar/tool.go
浏览文件 @
f35407a4
...
...
@@ -86,6 +86,11 @@ func checkConfig() int {
fmt
.
Println
(
"test-dsn"
,
common
.
Config
.
TestDSN
)
}
}
if
!
testConn
.
HasAllPrivilege
()
{
fmt
.
Printf
(
"test-dsn: %s, need all privileges"
,
common
.
FormatDSN
(
common
.
Config
.
TestDSN
))
return
1
}
// OnlineDSN connection check
onlineConn
:=
&
database
.
Connector
{
Addr
:
common
.
Config
.
OnlineDSN
.
Addr
,
...
...
@@ -106,6 +111,11 @@ func checkConfig() int {
fmt
.
Println
(
"online-dsn"
,
common
.
Config
.
OnlineDSN
)
}
}
if
!
onlineConn
.
HasSelectPrivilege
()
{
fmt
.
Printf
(
"online-dsn: %s, need all privileges"
,
common
.
FormatDSN
(
common
.
Config
.
OnlineDSN
))
return
1
}
return
0
}
...
...
database/privilege.go
0 → 100644
浏览文件 @
f35407a4
/*
* Copyright 2018 Xiaomi, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
database
import
(
"errors"
"strings"
"github.com/XiaoMi/soar/common"
)
// CurrentUser get current user with current_user() function
func
(
db
*
Connector
)
CurrentUser
()
(
string
,
string
,
error
)
{
res
,
err
:=
db
.
Query
(
"select current_user()"
)
if
err
!=
nil
{
return
""
,
""
,
err
}
if
len
(
res
.
Rows
)
>
0
{
cols
:=
strings
.
Split
(
res
.
Rows
[
0
]
.
Str
(
0
),
"@"
)
if
len
(
cols
)
==
2
{
user
:=
strings
.
Trim
(
cols
[
0
],
"'"
)
host
:=
strings
.
Trim
(
cols
[
1
],
"'"
)
if
strings
.
Contains
(
user
,
"'"
)
||
strings
.
Contains
(
host
,
"'"
)
{
return
""
,
""
,
errors
.
New
(
"user or host contains irregular character"
)
}
return
user
,
host
,
nil
}
return
""
,
""
,
errors
.
New
(
"user or host contains irregular character"
)
}
return
""
,
""
,
errors
.
New
(
"no privilege info"
)
}
// HasSelectPrivilege if user has select privilege
func
(
db
*
Connector
)
HasSelectPrivilege
()
bool
{
user
,
host
,
err
:=
db
.
CurrentUser
()
if
err
!=
nil
{
common
.
Log
.
Error
(
"User: %s, HasSelectPrivilege: %s"
,
db
.
User
,
err
.
Error
())
return
false
}
res
,
err
:=
db
.
Query
(
"select Select_priv from mysql.user where user='%s' and host='%s'"
,
user
,
host
)
if
err
!=
nil
{
common
.
Log
.
Error
(
"HasSelectPrivilege, DSN: %s, Error: %s"
,
db
.
Addr
,
err
.
Error
())
return
false
}
// Select_priv
if
len
(
res
.
Rows
)
>
0
{
if
res
.
Rows
[
0
]
.
Str
(
0
)
==
"Y"
{
return
true
}
}
return
false
}
// HasAllPrivilege if user has all privileges
func
(
db
*
Connector
)
HasAllPrivilege
()
bool
{
user
,
host
,
err
:=
db
.
CurrentUser
()
if
err
!=
nil
{
common
.
Log
.
Error
(
"User: %s, HasAllPrivilege: %s"
,
db
.
User
,
err
.
Error
())
return
false
}
// concat privilege columns
res
,
err
:=
db
.
Query
(
"SELECT GROUP_CONCAT(COLUMN_NAME) from information_schema.COLUMNS where TABLE_SCHEMA='mysql' and TABLE_NAME='user' and COLUMN_NAME like '%_priv'"
)
if
err
!=
nil
{
common
.
Log
.
Error
(
"HasAllPrivilege, DSN: %s, Error: %s"
,
db
.
Addr
,
err
.
Error
())
return
false
}
var
priv
string
if
len
(
res
.
Rows
)
>
0
{
priv
=
res
.
Rows
[
0
]
.
Str
(
0
)
}
else
{
common
.
Log
.
Error
(
"HasAllPrivilege, DSN: %s, get privilege string error"
,
db
.
Addr
)
return
false
}
// get all privilege status
res
,
err
=
db
.
Query
(
"select concat("
+
priv
+
") from mysql.user where user='%s' and host='%s'"
,
user
,
host
)
if
err
!=
nil
{
common
.
Log
.
Error
(
"HasAllPrivilege, DSN: %s, Error: %s"
,
db
.
Addr
,
err
.
Error
())
return
false
}
// %_priv
if
len
(
res
.
Rows
)
>
0
{
if
strings
.
Replace
(
res
.
Rows
[
0
]
.
Str
(
0
),
"Y"
,
""
,
-
1
)
==
""
{
return
true
}
}
return
false
}
database/privilege_test.go
0 → 100644
浏览文件 @
f35407a4
/*
* Copyright 2018 Xiaomi, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
database
import
"testing"
func
TestHasSelectPrivilege
(
t
*
testing
.
T
)
{
if
!
connTest
.
HasSelectPrivilege
()
{
t
.
Errorf
(
"DSN: %s, User: %s, should has select privilege"
,
connTest
.
Addr
,
connTest
.
User
)
}
}
func
TestHasAllPrivilege
(
t
*
testing
.
T
)
{
if
!
connTest
.
HasAllPrivilege
()
{
t
.
Errorf
(
"DSN: %s, User: %s, should has all privilege"
,
connTest
.
Addr
,
connTest
.
User
)
}
}
vendor/vendor.json
浏览文件 @
f35407a4
...
...
@@ -1034,68 +1034,68 @@
{
"checksumSHA1"
:
"q7Bd5YJHsxvzEpiOBaYn+wEpqyU="
,
"path"
:
"vitess.io/vitess"
,
"revision"
:
"
32dd398dd5459e5cf15904db35aba7460519b612
"
,
"revisionTime"
:
"2018-11-2
2T02:19:16
Z"
"revision"
:
"
9d0594c50251a5167ac786408cea822ae994951c
"
,
"revisionTime"
:
"2018-11-2
5T05:49:41
Z"
},
{
"checksumSHA1"
:
"aKn1oKcY74N8TRLm3Ayt7Q4bbI4="
,
"path"
:
"vitess.io/vitess/go/bytes2"
,
"revision"
:
"
32dd398dd5459e5cf15904db35aba7460519b612
"
,
"revisionTime"
:
"2018-11-2
2T02:19:16
Z"
"revision"
:
"
9d0594c50251a5167ac786408cea822ae994951c
"
,
"revisionTime"
:
"2018-11-2
5T05:49:41
Z"
},
{
"checksumSHA1"
:
"JVCEN4UGRmg3TofIBdzZMZ3G0Ww="
,
"path"
:
"vitess.io/vitess/go/hack"
,
"revision"
:
"
32dd398dd5459e5cf15904db35aba7460519b612
"
,
"revisionTime"
:
"2018-11-2
2T02:19:16
Z"
"revision"
:
"
9d0594c50251a5167ac786408cea822ae994951c
"
,
"revisionTime"
:
"2018-11-2
5T05:49:41
Z"
},
{
"checksumSHA1"
:
"e1WJ7vCnVrlQQQlc6n/FewCDMso="
,
"path"
:
"vitess.io/vitess/go/sqltypes"
,
"revision"
:
"
32dd398dd5459e5cf15904db35aba7460519b612
"
,
"revisionTime"
:
"2018-11-2
2T02:19:16
Z"
"revision"
:
"
9d0594c50251a5167ac786408cea822ae994951c
"
,
"revisionTime"
:
"2018-11-2
5T05:49:41
Z"
},
{
"checksumSHA1"
:
"ntFIQYkBS51G6y+FEkjFW40+HOU="
,
"path"
:
"vitess.io/vitess/go/vt/log"
,
"revision"
:
"
32dd398dd5459e5cf15904db35aba7460519b612
"
,
"revisionTime"
:
"2018-11-2
2T02:19:16
Z"
"revision"
:
"
9d0594c50251a5167ac786408cea822ae994951c
"
,
"revisionTime"
:
"2018-11-2
5T05:49:41
Z"
},
{
"checksumSHA1"
:
"XozR8bmeSR5KTe/nlUJkpJY2HKI="
,
"path"
:
"vitess.io/vitess/go/vt/proto/query"
,
"revision"
:
"
32dd398dd5459e5cf15904db35aba7460519b612
"
,
"revisionTime"
:
"2018-11-2
2T02:19:16
Z"
"revision"
:
"
9d0594c50251a5167ac786408cea822ae994951c
"
,
"revisionTime"
:
"2018-11-2
5T05:49:41
Z"
},
{
"checksumSHA1"
:
"OnWsUHLDKcO3spwH0jD55SvKD24="
,
"path"
:
"vitess.io/vitess/go/vt/proto/topodata"
,
"revision"
:
"
32dd398dd5459e5cf15904db35aba7460519b612
"
,
"revisionTime"
:
"2018-11-2
2T02:19:16
Z"
"revision"
:
"
9d0594c50251a5167ac786408cea822ae994951c
"
,
"revisionTime"
:
"2018-11-2
5T05:49:41
Z"
},
{
"checksumSHA1"
:
"sBAuZ/itMR8U8qbK4yLHxkP6Cpc="
,
"path"
:
"vitess.io/vitess/go/vt/proto/vtgate"
,
"revision"
:
"
32dd398dd5459e5cf15904db35aba7460519b612
"
,
"revisionTime"
:
"2018-11-2
2T02:19:16
Z"
"revision"
:
"
9d0594c50251a5167ac786408cea822ae994951c
"
,
"revisionTime"
:
"2018-11-2
5T05:49:41
Z"
},
{
"checksumSHA1"
:
"pLWM+SPGZs3k+IhjktE/cGUlpM0="
,
"path"
:
"vitess.io/vitess/go/vt/proto/vtrpc"
,
"revision"
:
"
32dd398dd5459e5cf15904db35aba7460519b612
"
,
"revisionTime"
:
"2018-11-2
2T02:19:16
Z"
"revision"
:
"
9d0594c50251a5167ac786408cea822ae994951c
"
,
"revisionTime"
:
"2018-11-2
5T05:49:41
Z"
},
{
"checksumSHA1"
:
"2ZBC/pPjs13cocUf8PoMSvAO5u4="
,
"path"
:
"vitess.io/vitess/go/vt/sqlparser"
,
"revision"
:
"
32dd398dd5459e5cf15904db35aba7460519b612
"
,
"revisionTime"
:
"2018-11-2
2T02:19:16
Z"
"revision"
:
"
9d0594c50251a5167ac786408cea822ae994951c
"
,
"revisionTime"
:
"2018-11-2
5T05:49:41
Z"
},
{
"checksumSHA1"
:
"oF4XzuOzwvj1iduX/lYqNSyY/HM="
,
"path"
:
"vitess.io/vitess/go/vt/vterrors"
,
"revision"
:
"
32dd398dd5459e5cf15904db35aba7460519b612
"
,
"revisionTime"
:
"2018-11-2
2T02:19:16
Z"
"revision"
:
"
9d0594c50251a5167ac786408cea822ae994951c
"
,
"revisionTime"
:
"2018-11-2
5T05:49:41
Z"
}
],
"rootPath"
:
"github.com/XiaoMi/soar"
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录