mirror of
				https://github.com/cloudreve/cloudreve.git
				synced 2025-10-31 08:39:10 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			178 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package middleware
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"errors"
 | |
| 	"github.com/cloudreve/Cloudreve/v3/pkg/cache"
 | |
| 	"github.com/gin-gonic/gin"
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 	"net/http"
 | |
| 	"net/http/httptest"
 | |
| 	"testing"
 | |
| )
 | |
| 
 | |
| type errReader int
 | |
| 
 | |
| func (errReader) Read(p []byte) (n int, err error) {
 | |
| 	return 0, errors.New("test error")
 | |
| }
 | |
| 
 | |
| func TestCaptchaRequired_General(t *testing.T) {
 | |
| 	asserts := assert.New(t)
 | |
| 	rec := httptest.NewRecorder()
 | |
| 
 | |
| 	// 未启用验证码
 | |
| 	{
 | |
| 		cache.SetSettings(map[string]string{
 | |
| 			"login_captcha":                 "0",
 | |
| 			"captcha_type":                  "1",
 | |
| 			"captcha_ReCaptchaSecret":       "1",
 | |
| 			"captcha_TCaptcha_SecretId":     "1",
 | |
| 			"captcha_TCaptcha_SecretKey":    "1",
 | |
| 			"captcha_TCaptcha_CaptchaAppId": "1",
 | |
| 			"captcha_TCaptcha_AppSecretKey": "1",
 | |
| 		}, "setting_")
 | |
| 		TestFunc := CaptchaRequired("login_captcha")
 | |
| 		c, _ := gin.CreateTestContext(rec)
 | |
| 		c.Params = []gin.Param{}
 | |
| 		c.Request, _ = http.NewRequest("GET", "/", nil)
 | |
| 		TestFunc(c)
 | |
| 		asserts.False(c.IsAborted())
 | |
| 	}
 | |
| 
 | |
| 	// body 无法读取
 | |
| 	{
 | |
| 		cache.SetSettings(map[string]string{
 | |
| 			"login_captcha":                 "1",
 | |
| 			"captcha_type":                  "1",
 | |
| 			"captcha_ReCaptchaSecret":       "1",
 | |
| 			"captcha_TCaptcha_SecretId":     "1",
 | |
| 			"captcha_TCaptcha_SecretKey":    "1",
 | |
| 			"captcha_TCaptcha_CaptchaAppId": "1",
 | |
| 			"captcha_TCaptcha_AppSecretKey": "1",
 | |
| 		}, "setting_")
 | |
| 		TestFunc := CaptchaRequired("login_captcha")
 | |
| 		c, _ := gin.CreateTestContext(rec)
 | |
| 		c.Params = []gin.Param{}
 | |
| 		c.Request, _ = http.NewRequest("GET", "/", errReader(1))
 | |
| 		TestFunc(c)
 | |
| 		asserts.True(c.IsAborted())
 | |
| 	}
 | |
| 
 | |
| 	// body JSON 解析失败
 | |
| 	{
 | |
| 		cache.SetSettings(map[string]string{
 | |
| 			"login_captcha":                 "1",
 | |
| 			"captcha_type":                  "1",
 | |
| 			"captcha_ReCaptchaSecret":       "1",
 | |
| 			"captcha_TCaptcha_SecretId":     "1",
 | |
| 			"captcha_TCaptcha_SecretKey":    "1",
 | |
| 			"captcha_TCaptcha_CaptchaAppId": "1",
 | |
| 			"captcha_TCaptcha_AppSecretKey": "1",
 | |
| 		}, "setting_")
 | |
| 		TestFunc := CaptchaRequired("login_captcha")
 | |
| 		c, _ := gin.CreateTestContext(rec)
 | |
| 		c.Params = []gin.Param{}
 | |
| 		r := bytes.NewReader([]byte("123"))
 | |
| 		c.Request, _ = http.NewRequest("GET", "/", r)
 | |
| 		TestFunc(c)
 | |
| 		asserts.True(c.IsAborted())
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestCaptchaRequired_Normal(t *testing.T) {
 | |
| 	asserts := assert.New(t)
 | |
| 	rec := httptest.NewRecorder()
 | |
| 
 | |
| 	// 验证码错误
 | |
| 	{
 | |
| 		cache.SetSettings(map[string]string{
 | |
| 			"login_captcha":                 "1",
 | |
| 			"captcha_type":                  "normal",
 | |
| 			"captcha_ReCaptchaSecret":       "1",
 | |
| 			"captcha_TCaptcha_SecretId":     "1",
 | |
| 			"captcha_TCaptcha_SecretKey":    "1",
 | |
| 			"captcha_TCaptcha_CaptchaAppId": "1",
 | |
| 			"captcha_TCaptcha_AppSecretKey": "1",
 | |
| 		}, "setting_")
 | |
| 		TestFunc := CaptchaRequired("login_captcha")
 | |
| 		c, _ := gin.CreateTestContext(rec)
 | |
| 		c.Params = []gin.Param{}
 | |
| 		r := bytes.NewReader([]byte("{}"))
 | |
| 		c.Request, _ = http.NewRequest("GET", "/", r)
 | |
| 		Session("233")(c)
 | |
| 		TestFunc(c)
 | |
| 		asserts.True(c.IsAborted())
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestCaptchaRequired_Recaptcha(t *testing.T) {
 | |
| 	asserts := assert.New(t)
 | |
| 	rec := httptest.NewRecorder()
 | |
| 
 | |
| 	// 无法初始化reCaptcha实例
 | |
| 	{
 | |
| 		cache.SetSettings(map[string]string{
 | |
| 			"login_captcha":                 "1",
 | |
| 			"captcha_type":                  "recaptcha",
 | |
| 			"captcha_ReCaptchaSecret":       "",
 | |
| 			"captcha_TCaptcha_SecretId":     "1",
 | |
| 			"captcha_TCaptcha_SecretKey":    "1",
 | |
| 			"captcha_TCaptcha_CaptchaAppId": "1",
 | |
| 			"captcha_TCaptcha_AppSecretKey": "1",
 | |
| 		}, "setting_")
 | |
| 		TestFunc := CaptchaRequired("login_captcha")
 | |
| 		c, _ := gin.CreateTestContext(rec)
 | |
| 		c.Params = []gin.Param{}
 | |
| 		r := bytes.NewReader([]byte("{}"))
 | |
| 		c.Request, _ = http.NewRequest("GET", "/", r)
 | |
| 		TestFunc(c)
 | |
| 		asserts.True(c.IsAborted())
 | |
| 	}
 | |
| 
 | |
| 	// 验证码错误
 | |
| 	{
 | |
| 		cache.SetSettings(map[string]string{
 | |
| 			"login_captcha":                 "1",
 | |
| 			"captcha_type":                  "recaptcha",
 | |
| 			"captcha_ReCaptchaSecret":       "233",
 | |
| 			"captcha_TCaptcha_SecretId":     "1",
 | |
| 			"captcha_TCaptcha_SecretKey":    "1",
 | |
| 			"captcha_TCaptcha_CaptchaAppId": "1",
 | |
| 			"captcha_TCaptcha_AppSecretKey": "1",
 | |
| 		}, "setting_")
 | |
| 		TestFunc := CaptchaRequired("login_captcha")
 | |
| 		c, _ := gin.CreateTestContext(rec)
 | |
| 		c.Params = []gin.Param{}
 | |
| 		r := bytes.NewReader([]byte("{}"))
 | |
| 		c.Request, _ = http.NewRequest("GET", "/", r)
 | |
| 		TestFunc(c)
 | |
| 		asserts.True(c.IsAborted())
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func TestCaptchaRequired_Tcaptcha(t *testing.T) {
 | |
| 	asserts := assert.New(t)
 | |
| 	rec := httptest.NewRecorder()
 | |
| 
 | |
| 	// 验证出错
 | |
| 	{
 | |
| 		cache.SetSettings(map[string]string{
 | |
| 			"login_captcha":                 "1",
 | |
| 			"captcha_type":                  "tcaptcha",
 | |
| 			"captcha_ReCaptchaSecret":       "",
 | |
| 			"captcha_TCaptcha_SecretId":     "1",
 | |
| 			"captcha_TCaptcha_SecretKey":    "1",
 | |
| 			"captcha_TCaptcha_CaptchaAppId": "1",
 | |
| 			"captcha_TCaptcha_AppSecretKey": "1",
 | |
| 		}, "setting_")
 | |
| 		TestFunc := CaptchaRequired("login_captcha")
 | |
| 		c, _ := gin.CreateTestContext(rec)
 | |
| 		c.Params = []gin.Param{}
 | |
| 		r := bytes.NewReader([]byte("{}"))
 | |
| 		c.Request, _ = http.NewRequest("GET", "/", r)
 | |
| 		TestFunc(c)
 | |
| 		asserts.True(c.IsAborted())
 | |
| 	}
 | |
| }
 | 
