|
|
|
package oss
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io/ioutil"
|
|
|
|
"net/http"
|
|
|
|
"net/url"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/cloudreve/Cloudreve/v3/pkg/cache"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestGetPublicKey(t *testing.T) {
|
|
|
|
asserts := assert.New(t)
|
|
|
|
testCases := []struct {
|
|
|
|
Request http.Request
|
|
|
|
ResNil bool
|
|
|
|
Error bool
|
|
|
|
}{
|
|
|
|
// Header解码失败
|
|
|
|
{
|
|
|
|
Request: http.Request{
|
|
|
|
Header: http.Header{
|
|
|
|
"X-Oss-Pub-Key-Url": {"中文"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ResNil: true,
|
|
|
|
Error: true,
|
|
|
|
},
|
|
|
|
// 公钥URL无效
|
|
|
|
{
|
|
|
|
Request: http.Request{
|
|
|
|
Header: http.Header{
|
|
|
|
"X-Oss-Pub-Key-Url": {"aHR0cHM6Ly9wb3JuaHViLmNvbQ=="},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ResNil: true,
|
|
|
|
Error: true,
|
|
|
|
},
|
|
|
|
// 请求失败
|
|
|
|
{
|
|
|
|
Request: http.Request{
|
|
|
|
Header: http.Header{
|
|
|
|
"X-Oss-Pub-Key-Url": {"aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS8yMzQyMzQ="},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ResNil: true,
|
|
|
|
Error: true,
|
|
|
|
},
|
|
|
|
// 成功
|
|
|
|
{
|
|
|
|
Request: http.Request{
|
|
|
|
Header: http.Header{
|
|
|
|
"X-Oss-Pub-Key-Url": {"aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ=="},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
ResNil: false,
|
|
|
|
Error: false,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for i, testCase := range testCases {
|
|
|
|
asserts.NoError(cache.Deletes([]string{"oss_public_key"}, ""))
|
|
|
|
res, err := GetPublicKey(&testCase.Request)
|
|
|
|
if testCase.Error {
|
|
|
|
asserts.Error(err, "Test Case #%d", i)
|
|
|
|
} else {
|
|
|
|
asserts.NoError(err, "Test Case #%d", i)
|
|
|
|
}
|
|
|
|
if testCase.ResNil {
|
|
|
|
asserts.Empty(res, "Test Case #%d", i)
|
|
|
|
} else {
|
|
|
|
asserts.NotEmpty(res, "Test Case #%d", i)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 测试缓存
|
|
|
|
asserts.NoError(cache.Set("oss_public_key", []byte("123"), 0))
|
|
|
|
res, err := GetPublicKey(nil)
|
|
|
|
asserts.NoError(err)
|
|
|
|
asserts.Equal([]byte("123"), res)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestVerifyCallbackSignature(t *testing.T) {
|
|
|
|
asserts := assert.New(t)
|
|
|
|
testPubKey := `-----BEGIN PUBLIC KEY-----
|
|
|
|
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKs/JBGzwUB2aVht4crBx3oIPBLNsjGs
|
|
|
|
C0fTXv+nvlmklvkcolvpvXLTjaxUHR3W9LXxQ2EHXAJfCB+6H2YF1k8CAwEAAQ==
|
|
|
|
-----END PUBLIC KEY-----
|
|
|
|
`
|
|
|
|
|
|
|
|
// 成功
|
|
|
|
{
|
|
|
|
asserts.NoError(cache.Set("oss_public_key", []byte(testPubKey), 0))
|
|
|
|
r := http.Request{
|
|
|
|
URL: &url.URL{Path: "/api/v3/callback/oss/TnXx5E5VyfJUyM1UdkdDu1rtnJ34EbmH"},
|
|
|
|
Header: map[string][]string{
|
|
|
|
"Authorization": {"e5LwzwTkP9AFAItT4YzvdJOHd0Y0wqTMWhsV/h5SG90JYGAmMd+8LQyj96R+9qUfJWjMt6suuUh7LaOryR87Dw=="},
|
|
|
|
"X-Oss-Pub-Key-Url": {"aHR0cHM6Ly9nb3NzcHVibGljLmFsaWNkbi5jb20vY2FsbGJhY2tfcHViX2tleV92MS5wZW0="},
|
|
|
|
},
|
|
|
|
Body: ioutil.NopCloser(strings.NewReader(`{"name":"2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","source_name":"1/1_hFRtDLgM_2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","size":114020,"pic_info":"810,539"}`)),
|
|
|
|
}
|
|
|
|
asserts.NoError(VerifyCallbackSignature(&r))
|
|
|
|
}
|
|
|
|
|
|
|
|
// 签名错误
|
|
|
|
{
|
|
|
|
asserts.NoError(cache.Set("oss_public_key", []byte(testPubKey), 0))
|
|
|
|
r := http.Request{
|
|
|
|
URL: &url.URL{Path: "/api/v3/callback/oss/TnXx5E5VyfJUyM1UdkdDu1rtnJ34EbmH"},
|
|
|
|
Header: map[string][]string{
|
|
|
|
"Authorization": {"e3LwzwTkP9AFAItT4YzvdJOHd0Y0wqTMWhsV/h5SG90JYGAmMd+8LQyj96R+9qUfJWjMt6suuUh7LaOryR87Dw=="},
|
|
|
|
"X-Oss-Pub-Key-Url": {"aHR0cHM6Ly9nb3NzcHVibGljLmFsaWNkbi5jb20vY2FsbGJhY2tfcHViX2tleV92MS5wZW0="},
|
|
|
|
},
|
|
|
|
Body: ioutil.NopCloser(strings.NewReader(`{"name":"2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","source_name":"1/1_hFRtDLgM_2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","size":114020,"pic_info":"810,539"}`)),
|
|
|
|
}
|
|
|
|
asserts.Error(VerifyCallbackSignature(&r))
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetPubKey 失败
|
|
|
|
{
|
|
|
|
asserts.NoError(cache.Deletes([]string{"oss_public_key"}, ""))
|
|
|
|
r := http.Request{
|
|
|
|
URL: &url.URL{Path: "/api/v3/callback/oss/TnXx5E5VyfJUyM1UdkdDu1rtnJ34EbmH"},
|
|
|
|
Header: map[string][]string{
|
|
|
|
"Authorization": {"e5LwzwTkP9AFAItT4YzvdJOHd0Y0wqTMWhsV/h5SG90JYGAmMd+8LQyj96R+9qUfJWjMt6suuUh7LaOryR87Dw=="},
|
|
|
|
},
|
|
|
|
Body: ioutil.NopCloser(strings.NewReader(`{"name":"2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","source_name":"1/1_hFRtDLgM_2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","size":114020,"pic_info":"810,539"}`)),
|
|
|
|
}
|
|
|
|
asserts.Error(VerifyCallbackSignature(&r))
|
|
|
|
}
|
|
|
|
|
|
|
|
// getRequestMD5 失败
|
|
|
|
{
|
|
|
|
asserts.NoError(cache.Set("oss_public_key", []byte(testPubKey), 0))
|
|
|
|
r := http.Request{
|
|
|
|
URL: &url.URL{Path: "%测试"},
|
|
|
|
Header: map[string][]string{
|
|
|
|
"Authorization": {"e5LwzwTkP9AFAItT4YzvdJOHd0Y0wqTMWhsV/h5SG90JYGAmMd+8LQyj96R+9qUfJWjMt6suuUh7LaOryR87Dw=="},
|
|
|
|
"X-Oss-Pub-Key-Url": {"aHR0cHM6Ly9nb3NzcHVibGljLmFsaWNkbi5jb20vY2FsbGJhY2tfcHViX2tleV92MS5wZW0="},
|
|
|
|
},
|
|
|
|
Body: ioutil.NopCloser(strings.NewReader(`{"name":"2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","source_name":"1/1_hFRtDLgM_2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","size":114020,"pic_info":"810,539"}`)),
|
|
|
|
}
|
|
|
|
asserts.Error(VerifyCallbackSignature(&r))
|
|
|
|
}
|
|
|
|
|
|
|
|
// 无 Authorization 头
|
|
|
|
{
|
|
|
|
asserts.NoError(cache.Set("oss_public_key", []byte(testPubKey), 0))
|
|
|
|
r := http.Request{
|
|
|
|
URL: &url.URL{Path: "/api/v3/callback/oss/TnXx5E5VyfJUyM1UdkdDu1rtnJ34EbmH"},
|
|
|
|
Header: map[string][]string{
|
|
|
|
"X-Oss-Pub-Key-Url": {"aHR0cHM6Ly9nb3NzcHVibGljLmFsaWNkbi5jb20vY2FsbGJhY2tfcHViX2tleV92MS5wZW0="},
|
|
|
|
},
|
|
|
|
Body: ioutil.NopCloser(strings.NewReader(`{"name":"2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","source_name":"1/1_hFRtDLgM_2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","size":114020,"pic_info":"810,539"}`)),
|
|
|
|
}
|
|
|
|
asserts.Error(VerifyCallbackSignature(&r))
|
|
|
|
}
|
|
|
|
|
|
|
|
// pub block 不存在
|
|
|
|
{
|
|
|
|
asserts.NoError(cache.Set("oss_public_key", []byte(""), 0))
|
|
|
|
r := http.Request{
|
|
|
|
URL: &url.URL{Path: "/api/v3/callback/oss/TnXx5E5VyfJUyM1UdkdDu1rtnJ34EbmH"},
|
|
|
|
Header: map[string][]string{
|
|
|
|
"Authorization": {"e5LwzwTkP9AFAItT4YzvdJOHd0Y0wqTMWhsV/h5SG90JYGAmMd+8LQyj96R+9qUfJWjMt6suuUh7LaOryR87Dw=="},
|
|
|
|
"X-Oss-Pub-Key-Url": {"aHR0cHM6Ly9nb3NzcHVibGljLmFsaWNkbi5jb20vY2FsbGJhY2tfcHViX2tleV92MS5wZW0="},
|
|
|
|
},
|
|
|
|
Body: ioutil.NopCloser(strings.NewReader(`{"name":"2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","source_name":"1/1_hFRtDLgM_2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","size":114020,"pic_info":"810,539"}`)),
|
|
|
|
}
|
|
|
|
asserts.Error(VerifyCallbackSignature(&r))
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParsePKIXPublicKey出错
|
|
|
|
{
|
|
|
|
asserts.NoError(cache.Set("oss_public_key", []byte("-----BEGIN PUBLIC KEY-----\n-----END PUBLIC KEY-----"), 0))
|
|
|
|
r := http.Request{
|
|
|
|
URL: &url.URL{Path: "/api/v3/callback/oss/TnXx5E5VyfJUyM1UdkdDu1rtnJ34EbmH"},
|
|
|
|
Header: map[string][]string{
|
|
|
|
"Authorization": {"e5LwzwTkP9AFAItT4YzvdJOHd0Y0wqTMWhsV/h5SG90JYGAmMd+8LQyj96R+9qUfJWjMt6suuUh7LaOryR87Dw=="},
|
|
|
|
"X-Oss-Pub-Key-Url": {"aHR0cHM6Ly9nb3NzcHVibGljLmFsaWNkbi5jb20vY2FsbGJhY2tfcHViX2tleV92MS5wZW0="},
|
|
|
|
},
|
|
|
|
Body: ioutil.NopCloser(strings.NewReader(`{"name":"2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","source_name":"1/1_hFRtDLgM_2f7b2ccf30e9270ea920f1ab8a4037a546a2f0d5.jpg","size":114020,"pic_info":"810,539"}`)),
|
|
|
|
}
|
|
|
|
asserts.Error(VerifyCallbackSignature(&r))
|
|
|
|
}
|
|
|
|
}
|