mirror of https://github.com/cloudreve/Cloudreve
Test: s3 policy
parent
95f318e069
commit
746aa3e8ef
1
go.sum
1
go.sum
|
@ -239,6 +239,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go v3.0.125+incompatible h1:dqpmYaez7VBT7PCRBcBxkzlDOiTk7Td8ATiia1b1GuE=
|
github.com/tencentcloud/tencentcloud-sdk-go v3.0.125+incompatible h1:dqpmYaez7VBT7PCRBcBxkzlDOiTk7Td8ATiia1b1GuE=
|
||||||
github.com/tencentcloud/tencentcloud-sdk-go v3.0.125+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4=
|
github.com/tencentcloud/tencentcloud-sdk-go v3.0.125+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4=
|
||||||
|
|
|
@ -175,7 +175,7 @@ func QiniuCallbackAuth() gin.HandlerFunc {
|
||||||
// 验证key并查找用户
|
// 验证key并查找用户
|
||||||
resp, user := uploadCallbackCheck(c)
|
resp, user := uploadCallbackCheck(c)
|
||||||
if resp.Code != 0 {
|
if resp.Code != 0 {
|
||||||
c.JSON(401, serializer.QiniuCallbackFailed{Error: resp.Msg})
|
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: resp.Msg})
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -185,12 +185,12 @@ func QiniuCallbackAuth() gin.HandlerFunc {
|
||||||
ok, err := mac.VerifyCallback(c.Request)
|
ok, err := mac.VerifyCallback(c.Request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
util.Log().Debug("无法验证回调请求,%s", err)
|
util.Log().Debug("无法验证回调请求,%s", err)
|
||||||
c.JSON(401, serializer.QiniuCallbackFailed{Error: "无法验证回调请求"})
|
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: "无法验证回调请求"})
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
c.JSON(401, serializer.QiniuCallbackFailed{Error: "回调签名无效"})
|
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: "回调签名无效"})
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -205,7 +205,7 @@ func OSSCallbackAuth() gin.HandlerFunc {
|
||||||
// 验证key并查找用户
|
// 验证key并查找用户
|
||||||
resp, _ := uploadCallbackCheck(c)
|
resp, _ := uploadCallbackCheck(c)
|
||||||
if resp.Code != 0 {
|
if resp.Code != 0 {
|
||||||
c.JSON(401, serializer.QiniuCallbackFailed{Error: resp.Msg})
|
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: resp.Msg})
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -213,7 +213,7 @@ func OSSCallbackAuth() gin.HandlerFunc {
|
||||||
err := oss.VerifyCallbackSignature(c.Request)
|
err := oss.VerifyCallbackSignature(c.Request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
util.Log().Debug("回调签名验证失败,%s", err)
|
util.Log().Debug("回调签名验证失败,%s", err)
|
||||||
c.JSON(401, serializer.QiniuCallbackFailed{Error: "回调签名验证失败"})
|
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: "回调签名验证失败"})
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -228,7 +228,7 @@ func UpyunCallbackAuth() gin.HandlerFunc {
|
||||||
// 验证key并查找用户
|
// 验证key并查找用户
|
||||||
resp, user := uploadCallbackCheck(c)
|
resp, user := uploadCallbackCheck(c)
|
||||||
if resp.Code != 0 {
|
if resp.Code != 0 {
|
||||||
c.JSON(401, serializer.QiniuCallbackFailed{Error: resp.Msg})
|
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: resp.Msg})
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -237,7 +237,7 @@ func UpyunCallbackAuth() gin.HandlerFunc {
|
||||||
body, err := ioutil.ReadAll(c.Request.Body)
|
body, err := ioutil.ReadAll(c.Request.Body)
|
||||||
c.Request.Body.Close()
|
c.Request.Body.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(401, serializer.QiniuCallbackFailed{Error: err.Error()})
|
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: err.Error()})
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -253,7 +253,7 @@ func UpyunCallbackAuth() gin.HandlerFunc {
|
||||||
// 计算正文MD5
|
// 计算正文MD5
|
||||||
actualContentMD5 := fmt.Sprintf("%x", md5.Sum(body))
|
actualContentMD5 := fmt.Sprintf("%x", md5.Sum(body))
|
||||||
if actualContentMD5 != contentMD5 {
|
if actualContentMD5 != contentMD5 {
|
||||||
c.JSON(401, serializer.QiniuCallbackFailed{Error: "MD5不一致"})
|
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: "MD5不一致"})
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -268,7 +268,7 @@ func UpyunCallbackAuth() gin.HandlerFunc {
|
||||||
|
|
||||||
// 对比签名
|
// 对比签名
|
||||||
if signature != actualSignature {
|
if signature != actualSignature {
|
||||||
c.JSON(401, serializer.QiniuCallbackFailed{Error: "鉴权失败"})
|
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: "鉴权失败"})
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -284,7 +284,7 @@ func OneDriveCallbackAuth() gin.HandlerFunc {
|
||||||
// 验证key并查找用户
|
// 验证key并查找用户
|
||||||
resp, _ := uploadCallbackCheck(c)
|
resp, _ := uploadCallbackCheck(c)
|
||||||
if resp.Code != 0 {
|
if resp.Code != 0 {
|
||||||
c.JSON(401, serializer.QiniuCallbackFailed{Error: resp.Msg})
|
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: resp.Msg})
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -303,7 +303,7 @@ func COSCallbackAuth() gin.HandlerFunc {
|
||||||
// 验证key并查找用户
|
// 验证key并查找用户
|
||||||
resp, _ := uploadCallbackCheck(c)
|
resp, _ := uploadCallbackCheck(c)
|
||||||
if resp.Code != 0 {
|
if resp.Code != 0 {
|
||||||
c.JSON(401, serializer.QiniuCallbackFailed{Error: resp.Msg})
|
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: resp.Msg})
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -318,7 +318,7 @@ func S3CallbackAuth() gin.HandlerFunc {
|
||||||
// 验证key并查找用户
|
// 验证key并查找用户
|
||||||
resp, _ := uploadCallbackCheck(c)
|
resp, _ := uploadCallbackCheck(c)
|
||||||
if resp.Code != 0 {
|
if resp.Code != 0 {
|
||||||
c.JSON(401, serializer.QiniuCallbackFailed{Error: resp.Msg})
|
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: resp.Msg})
|
||||||
c.Abort()
|
c.Abort()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -747,3 +747,47 @@ func TestIsAdmin(t *testing.T) {
|
||||||
asserts.False(c.IsAborted())
|
asserts.False(c.IsAborted())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestS3CallbackAuth(t *testing.T) {
|
||||||
|
asserts := assert.New(t)
|
||||||
|
rec := httptest.NewRecorder()
|
||||||
|
AuthFunc := S3CallbackAuth()
|
||||||
|
|
||||||
|
// Callback Key 相关验证失败
|
||||||
|
{
|
||||||
|
c, _ := gin.CreateTestContext(rec)
|
||||||
|
c.Params = []gin.Param{
|
||||||
|
{"key", "testUpyunBackRemote"},
|
||||||
|
}
|
||||||
|
c.Request, _ = http.NewRequest("POST", "/api/v3/callback/upyun/testUpyunBackRemote", nil)
|
||||||
|
AuthFunc(c)
|
||||||
|
asserts.True(c.IsAborted())
|
||||||
|
}
|
||||||
|
|
||||||
|
// 成功
|
||||||
|
{
|
||||||
|
cache.Set(
|
||||||
|
"callback_testCallBackUpyun",
|
||||||
|
serializer.UploadSession{
|
||||||
|
UID: 1,
|
||||||
|
PolicyID: 512,
|
||||||
|
VirtualPath: "/",
|
||||||
|
},
|
||||||
|
0,
|
||||||
|
)
|
||||||
|
cache.Deletes([]string{"1"}, "policy_")
|
||||||
|
mock.ExpectQuery("SELECT(.+)users(.+)").
|
||||||
|
WillReturnRows(sqlmock.NewRows([]string{"id", "group_id"}).AddRow(1, 1))
|
||||||
|
mock.ExpectQuery("SELECT(.+)groups(.+)").
|
||||||
|
WillReturnRows(sqlmock.NewRows([]string{"id", "policies"}).AddRow(1, "[702]"))
|
||||||
|
mock.ExpectQuery("SELECT(.+)policies(.+)").
|
||||||
|
WillReturnRows(sqlmock.NewRows([]string{"id", "access_key", "secret_key"}).AddRow(2, "123", "123"))
|
||||||
|
c, _ := gin.CreateTestContext(rec)
|
||||||
|
c.Params = []gin.Param{
|
||||||
|
{"key", "testCallBackUpyun"},
|
||||||
|
}
|
||||||
|
c.Request, _ = http.NewRequest("POST", "/api/v3/callback/upyun/testCallBackUpyun", ioutil.NopCloser(strings.NewReader("1")))
|
||||||
|
AuthFunc(c)
|
||||||
|
asserts.False(c.IsAborted())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -209,6 +209,28 @@ func TestPolicy_GetUploadURL(t *testing.T) {
|
||||||
asserts.Equal("http://127.0.0.1", policy.GetUploadURL())
|
asserts.Equal("http://127.0.0.1", policy.GetUploadURL())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// S3 未填写自动生成
|
||||||
|
{
|
||||||
|
policy := Policy{
|
||||||
|
Type: "s3",
|
||||||
|
Server: "",
|
||||||
|
BucketName: "bucket",
|
||||||
|
OptionsSerialized: PolicyOption{Region: "us-east"},
|
||||||
|
}
|
||||||
|
asserts.Equal("https://bucket.s3.us-east.amazonaws.com/", policy.GetUploadURL())
|
||||||
|
}
|
||||||
|
|
||||||
|
// s3 自己指定
|
||||||
|
{
|
||||||
|
policy := Policy{
|
||||||
|
Type: "s3",
|
||||||
|
Server: "https://s3.us-east.amazonaws.com/",
|
||||||
|
BucketName: "bucket",
|
||||||
|
OptionsSerialized: PolicyOption{Region: "us-east"},
|
||||||
|
}
|
||||||
|
asserts.Equal("https://s3.us-east.amazonaws.com/bucket", policy.GetUploadURL())
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPolicy_IsPathGenerateNeeded(t *testing.T) {
|
func TestPolicy_IsPathGenerateNeeded(t *testing.T) {
|
||||||
|
|
|
@ -102,6 +102,10 @@ func TestDispatchHandler(t *testing.T) {
|
||||||
fs.Policy = &model.Policy{Type: "onedrive"}
|
fs.Policy = &model.Policy{Type: "onedrive"}
|
||||||
err = fs.DispatchHandler()
|
err = fs.DispatchHandler()
|
||||||
asserts.NoError(err)
|
asserts.NoError(err)
|
||||||
|
|
||||||
|
fs.Policy = &model.Policy{Type: "s3"}
|
||||||
|
err = fs.DispatchHandler()
|
||||||
|
asserts.NoError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNewFileSystemFromCallback(t *testing.T) {
|
func TestNewFileSystemFromCallback(t *testing.T) {
|
||||||
|
|
|
@ -46,8 +46,8 @@ type UploadCallback struct {
|
||||||
Size uint64 `json:"size"`
|
Size uint64 `json:"size"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// QiniuCallbackFailed 七牛存储策略上传回调失败响应
|
// GeneralUploadCallbackFailed 存储策略上传回调失败响应
|
||||||
type QiniuCallbackFailed struct {
|
type GeneralUploadCallbackFailed struct {
|
||||||
Error string `json:"error"`
|
Error string `json:"error"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ func QiniuCallback(c *gin.Context) {
|
||||||
if err := c.ShouldBindJSON(&callbackBody); err == nil {
|
if err := c.ShouldBindJSON(&callbackBody); err == nil {
|
||||||
res := callback.ProcessCallback(callbackBody, c)
|
res := callback.ProcessCallback(callbackBody, c)
|
||||||
if res.Code != 0 {
|
if res.Code != 0 {
|
||||||
c.JSON(401, serializer.QiniuCallbackFailed{Error: res.Msg})
|
c.JSON(401, serializer.GeneralUploadCallbackFailed{Error: res.Msg})
|
||||||
} else {
|
} else {
|
||||||
c.JSON(200, res)
|
c.JSON(200, res)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue