Feat: sign http request / read running mode from config file

This commit is contained in:
HFO4
2019-12-23 13:27:18 +08:00
parent fd7b6e33c8
commit 90827b2441
13 changed files with 199 additions and 45 deletions

View File

@@ -0,0 +1,14 @@
package controllers
import (
"github.com/HFO4/cloudreve/pkg/serializer"
"github.com/gin-gonic/gin"
)
// SlaveUpload 从机文件上传
func SlaveUpload(c *gin.Context) {
c.JSON(200, serializer.Response{
Code: 0,
})
}

View File

@@ -17,7 +17,7 @@ import (
func TestListDirectoryRoute(t *testing.T) {
switchToMemDB()
asserts := assert.New(t)
router := InitRouter()
router := InitMasterRouter()
w := httptest.NewRecorder()
// 成功
@@ -41,7 +41,7 @@ func TestListDirectoryRoute(t *testing.T) {
func TestLocalFileUpload(t *testing.T) {
switchToMemDB()
asserts := assert.New(t)
router := InitRouter()
router := InitMasterRouter()
w := httptest.NewRecorder()
middleware.SessionMock = map[string]interface{}{"user_id": 1}
@@ -111,7 +111,7 @@ func TestLocalFileUpload(t *testing.T) {
func TestObjectDelete(t *testing.T) {
asserts := assert.New(t)
router := InitRouter()
router := InitMasterRouter()
w := httptest.NewRecorder()
middleware.SessionMock = map[string]interface{}{"user_id": 1}

View File

@@ -3,42 +3,45 @@ package routers
import (
"github.com/HFO4/cloudreve/middleware"
"github.com/HFO4/cloudreve/pkg/conf"
"github.com/HFO4/cloudreve/pkg/util"
"github.com/HFO4/cloudreve/routers/controllers"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
)
// initWebDAV 初始化WebDAV相关路由
func initWebDAV(group *gin.RouterGroup) {
{
group.Use(middleware.WebDAVAuth())
group.Any("/*path", controllers.ServeWebDAV)
group.Any("", controllers.ServeWebDAV)
group.Handle("PROPFIND", "/*path", controllers.ServeWebDAV)
group.Handle("PROPFIND", "", controllers.ServeWebDAV)
group.Handle("MKCOL", "/*path", controllers.ServeWebDAV)
group.Handle("LOCK", "/*path", controllers.ServeWebDAV)
group.Handle("UNLOCK", "/*path", controllers.ServeWebDAV)
group.Handle("PROPPATCH", "/*path", controllers.ServeWebDAV)
group.Handle("COPY", "/*path", controllers.ServeWebDAV)
group.Handle("MOVE", "/*path", controllers.ServeWebDAV)
}
}
// InitRouter 初始化路由
func InitRouter() *gin.Engine {
r := gin.Default()
v3 := r.Group("/api/v3")
/*
中间件
*/
v3.Use(middleware.Session(conf.SystemConfig.SessionSecret))
if conf.SystemConfig.Mode == "master" {
util.Log().Info("当前运行模式Master")
return InitMasterRouter()
}
util.Log().Info("当前运行模式Slave")
return InitSlaveRouter()
// CORS TODO: 根据配置文件来
}
// InitSlaveRouter 初始化从机模式路由
func InitSlaveRouter() *gin.Engine {
r := gin.Default()
v3 := r.Group("/api/v3/slave")
// 跨域相关
InitCORS(v3)
// 鉴权中间件
v3.Use(middleware.SignRequired())
/*
路由
*/
{
v3.POST("upload", controllers.SlaveUpload)
}
return r
}
// InitCORS 初始化跨域配置
func InitCORS(group *gin.RouterGroup) {
if conf.CORSConfig.AllowOrigins[0] != "UNSET" || conf.CORSConfig.AllowAllOrigins {
v3.Use(cors.New(cors.Config{
group.Use(cors.New(cors.Config{
AllowOrigins: conf.CORSConfig.AllowOrigins,
AllowAllOrigins: conf.CORSConfig.AllowAllOrigins,
AllowMethods: conf.CORSConfig.AllowHeaders,
@@ -46,13 +49,29 @@ func InitRouter() *gin.Engine {
AllowCredentials: conf.CORSConfig.AllowCredentials,
ExposeHeaders: conf.CORSConfig.ExposeHeaders,
}))
return
}
// slave模式下未启动跨域的警告
if conf.SystemConfig.Mode == "slave" {
util.Log().Warning("当前作为存储端Slave运行但未启用跨域配置可能会导致 Master 端无法正常上传文件")
}
}
// InitMasterRouter 初始化主机模式路由
func InitMasterRouter() *gin.Engine {
r := gin.Default()
v3 := r.Group("/api/v3")
/*
中间件
*/
v3.Use(middleware.Session(conf.SystemConfig.SessionSecret))
// 跨域相关
InitCORS(v3)
// 测试模式加入Mock助手中间件
if gin.Mode() == gin.TestMode {
v3.Use(middleware.MockHelper())
}
v3.Use(middleware.CurrentUser())
/*
@@ -166,3 +185,22 @@ func InitRouter() *gin.Engine {
initWebDAV(r.Group("dav"))
return r
}
// initWebDAV 初始化WebDAV相关路由
func initWebDAV(group *gin.RouterGroup) {
{
group.Use(middleware.WebDAVAuth())
group.Any("/*path", controllers.ServeWebDAV)
group.Any("", controllers.ServeWebDAV)
group.Handle("PROPFIND", "/*path", controllers.ServeWebDAV)
group.Handle("PROPFIND", "", controllers.ServeWebDAV)
group.Handle("MKCOL", "/*path", controllers.ServeWebDAV)
group.Handle("LOCK", "/*path", controllers.ServeWebDAV)
group.Handle("UNLOCK", "/*path", controllers.ServeWebDAV)
group.Handle("PROPPATCH", "/*path", controllers.ServeWebDAV)
group.Handle("COPY", "/*path", controllers.ServeWebDAV)
group.Handle("MOVE", "/*path", controllers.ServeWebDAV)
}
}

View File

@@ -11,7 +11,7 @@ import (
func TestPing(t *testing.T) {
asserts := assert.New(t)
router := InitRouter()
router := InitMasterRouter()
w := httptest.NewRecorder()
req, _ := http.NewRequest("GET", "/api/v3/site/ping", nil)
@@ -23,7 +23,7 @@ func TestPing(t *testing.T) {
func TestCaptcha(t *testing.T) {
asserts := assert.New(t)
router := InitRouter()
router := InitMasterRouter()
w := httptest.NewRecorder()
req, _ := http.NewRequest(
@@ -43,7 +43,7 @@ func TestCaptcha(t *testing.T) {
// defer mutex.Unlock()
// switchToMockDB()
// asserts := assert.New(t)
// router := InitRouter()
// router := InitMasterRouter()
// w := httptest.NewRecorder()
//
// // 创建测试用验证码
@@ -153,7 +153,7 @@ func TestCaptcha(t *testing.T) {
// defer mutex.Unlock()
// switchToMockDB()
// asserts := assert.New(t)
// router := InitRouter()
// router := InitMasterRouter()
// w := httptest.NewRecorder()
//
// mock.ExpectQuery("^SELECT (.+)").WillReturnRows(sqlmock.NewRows([]string{"email", "nick", "password", "options"}).
@@ -211,7 +211,7 @@ func TestCaptcha(t *testing.T) {
func TestSiteConfigRoute(t *testing.T) {
switchToMemDB()
asserts := assert.New(t)
router := InitRouter()
router := InitMasterRouter()
w := httptest.NewRecorder()
req, _ := http.NewRequest(