Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
hexbee
Cloudreve
提交
fd7b6e33
C
Cloudreve
项目概览
hexbee
/
Cloudreve
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
Cloudreve
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
fd7b6e33
编写于
12月 23, 2019
作者:
H
HFO4
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Test: auth middleware for WebDAV
上级
cf90ab5a
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
114 addition
and
4 deletion
+114
-4
middleware/auth.go
middleware/auth.go
+1
-0
middleware/auth_test.go
middleware/auth_test.go
+104
-0
pkg/cache/driver.go
pkg/cache/driver.go
+7
-3
pkg/webdav/webdav.go
pkg/webdav/webdav.go
+2
-1
未找到文件。
middleware/auth.go
浏览文件 @
fd7b6e33
...
...
@@ -52,6 +52,7 @@ func AuthRequired() gin.HandlerFunc {
}
// WebDAVAuth 验证WebDAV登录及权限
// TODO 测试
func
WebDAVAuth
()
gin
.
HandlerFunc
{
return
func
(
c
*
gin
.
Context
)
{
// OPTIONS 请求不需要鉴权,否则Windows10下无法保存文档
...
...
middleware/auth_test.go
浏览文件 @
fd7b6e33
...
...
@@ -90,3 +90,107 @@ func TestSignRequired(t *testing.T) {
SignRequiredFunc
(
c
)
asserts
.
NotNil
(
c
)
}
func
TestWebDAVAuth
(
t
*
testing
.
T
)
{
asserts
:=
assert
.
New
(
t
)
rec
:=
httptest
.
NewRecorder
()
AuthFunc
:=
WebDAVAuth
()
// options请求跳过验证
{
c
,
_
:=
gin
.
CreateTestContext
(
rec
)
c
.
Request
,
_
=
http
.
NewRequest
(
"OPTIONS"
,
"/test"
,
nil
)
AuthFunc
(
c
)
}
// 请求HTTP Basic Auth
{
c
,
_
:=
gin
.
CreateTestContext
(
rec
)
c
.
Request
,
_
=
http
.
NewRequest
(
"POST"
,
"/test"
,
nil
)
AuthFunc
(
c
)
asserts
.
NotEmpty
(
c
.
Writer
.
Header
()[
"WWW-Authenticate"
])
}
// 用户名不存在
{
c
,
_
:=
gin
.
CreateTestContext
(
rec
)
c
.
Request
,
_
=
http
.
NewRequest
(
"POST"
,
"/test"
,
nil
)
c
.
Request
.
Header
=
map
[
string
][]
string
{
"Authorization"
:
{
"Basic d2hvQGNsb3VkcmV2ZS5vcmc6YWRtaW4="
},
}
mock
.
ExpectQuery
(
"SELECT(.+)users(.+)"
)
.
WillReturnRows
(
sqlmock
.
NewRows
([]
string
{
"id"
,
"password"
,
"email"
}),
)
AuthFunc
(
c
)
asserts
.
NoError
(
mock
.
ExpectationsWereMet
())
asserts
.
Equal
(
c
.
Writer
.
Status
(),
http
.
StatusUnauthorized
)
}
// 密码错误
{
c
,
_
:=
gin
.
CreateTestContext
(
rec
)
c
.
Request
,
_
=
http
.
NewRequest
(
"POST"
,
"/test"
,
nil
)
c
.
Request
.
Header
=
map
[
string
][]
string
{
"Authorization"
:
{
"Basic d2hvQGNsb3VkcmV2ZS5vcmc6YWRtaW4="
},
}
mock
.
ExpectQuery
(
"SELECT(.+)users(.+)"
)
.
WillReturnRows
(
sqlmock
.
NewRows
([]
string
{
"id"
,
"password"
,
"email"
,
"options"
})
.
AddRow
(
1
,
"123"
,
"who@cloudreve.org"
,
"{}"
),
)
AuthFunc
(
c
)
asserts
.
NoError
(
mock
.
ExpectationsWereMet
())
asserts
.
Equal
(
c
.
Writer
.
Status
(),
http
.
StatusUnauthorized
)
}
//未启用 WebDAV
{
c
,
_
:=
gin
.
CreateTestContext
(
rec
)
c
.
Request
,
_
=
http
.
NewRequest
(
"POST"
,
"/test"
,
nil
)
c
.
Request
.
Header
=
map
[
string
][]
string
{
"Authorization"
:
{
"Basic d2hvQGNsb3VkcmV2ZS5vcmc6YWRtaW4="
},
}
mock
.
ExpectQuery
(
"SELECT(.+)users(.+)"
)
.
WillReturnRows
(
sqlmock
.
NewRows
(
[]
string
{
"id"
,
"password"
,
"email"
,
"group_id"
,
"options"
})
.
AddRow
(
1
,
"rfBd67ti3SMtYvSg:ce6dc7bca4f17f2660e18e7608686673eae0fdf3"
,
"who@cloudreve.org"
,
1
,
"{}"
,
),
)
mock
.
ExpectQuery
(
"SELECT(.+)groups(.+)"
)
.
WillReturnRows
(
sqlmock
.
NewRows
([]
string
{
"id"
,
"web_dav_enabled"
})
.
AddRow
(
1
,
false
))
AuthFunc
(
c
)
asserts
.
NoError
(
mock
.
ExpectationsWereMet
())
asserts
.
Equal
(
c
.
Writer
.
Status
(),
http
.
StatusForbidden
)
}
//正常
{
c
,
_
:=
gin
.
CreateTestContext
(
rec
)
c
.
Request
,
_
=
http
.
NewRequest
(
"POST"
,
"/test"
,
nil
)
c
.
Request
.
Header
=
map
[
string
][]
string
{
"Authorization"
:
{
"Basic d2hvQGNsb3VkcmV2ZS5vcmc6YWRtaW4="
},
}
mock
.
ExpectQuery
(
"SELECT(.+)users(.+)"
)
.
WillReturnRows
(
sqlmock
.
NewRows
(
[]
string
{
"id"
,
"password"
,
"email"
,
"group_id"
,
"options"
})
.
AddRow
(
1
,
"rfBd67ti3SMtYvSg:ce6dc7bca4f17f2660e18e7608686673eae0fdf3"
,
"who@cloudreve.org"
,
1
,
"{}"
,
),
)
mock
.
ExpectQuery
(
"SELECT(.+)groups(.+)"
)
.
WillReturnRows
(
sqlmock
.
NewRows
([]
string
{
"id"
,
"web_dav_enabled"
})
.
AddRow
(
1
,
true
))
AuthFunc
(
c
)
asserts
.
NoError
(
mock
.
ExpectationsWereMet
())
asserts
.
Equal
(
c
.
Writer
.
Status
(),
200
)
_
,
ok
:=
c
.
Get
(
"user"
)
asserts
.
True
(
ok
)
}
}
pkg/cache/driver.go
浏览文件 @
fd7b6e33
...
...
@@ -25,14 +25,18 @@ func Init() {
// Driver 键值缓存存储容器
type
Driver
interface
{
// 设置值
// 设置值
,ttl为过期时间,单位为秒
Set
(
key
string
,
value
interface
{},
ttl
int
)
error
// 取值
// 取值,并返回是否成功
Get
(
key
string
)
(
interface
{},
bool
)
// 批量取值,返回成功取值的map即不存在的值
Gets
(
keys
[]
string
,
prefix
string
)
(
map
[
string
]
interface
{},
[]
string
)
// 批量设置值
// 批量设置值,所有的key都会加上prefix前缀
Sets
(
values
map
[
string
]
interface
{},
prefix
string
)
error
// 删除值
Delete
(
keys
[]
string
,
prefix
string
)
error
}
...
...
pkg/webdav/webdav.go
浏览文件 @
fd7b6e33
...
...
@@ -604,6 +604,7 @@ func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request, fs *fil
mw
:=
multistatusWriter
{
w
:
w
}
walkFn
:=
func
(
reqPath
string
,
info
FileInfo
,
err
error
)
error
{
if
err
!=
nil
{
return
err
}
...
...
@@ -626,7 +627,7 @@ func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request, fs *fil
if
err
!=
nil
{
return
err
}
href
:=
path
.
Join
(
h
.
Prefix
,
strconv
.
FormatUint
(
uint64
(
fs
.
User
.
ID
),
10
),
reqPath
)
href
:=
path
.
Join
(
h
.
Prefix
,
reqPath
)
if
href
!=
"/"
&&
info
.
IsDir
()
{
href
+=
"/"
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录