router.go 6.5 KB
Newer Older
H
HFO4 已提交
1 2 3
package routers

import (
H
HFO4 已提交
4 5
	"github.com/HFO4/cloudreve/middleware"
	"github.com/HFO4/cloudreve/pkg/conf"
6
	"github.com/HFO4/cloudreve/pkg/util"
H
HFO4 已提交
7
	"github.com/HFO4/cloudreve/routers/controllers"
H
HFO4 已提交
8
	"github.com/gin-contrib/cors"
H
HFO4 已提交
9 10 11
	"github.com/gin-gonic/gin"
)

12 13 14 15 16
// InitRouter 初始化路由
func InitRouter() *gin.Engine {
	if conf.SystemConfig.Mode == "master" {
		util.Log().Info("当前运行模式:Master")
		return InitMasterRouter()
H
HFO4 已提交
17
	}
18 19 20
	util.Log().Info("当前运行模式:Slave")
	return InitSlaveRouter()

H
HFO4 已提交
21 22
}

23 24
// InitSlaveRouter 初始化从机模式路由
func InitSlaveRouter() *gin.Engine {
H
HFO4 已提交
25
	r := gin.Default()
26
	// 跨域相关
27 28
	InitCORS(r)
	v3 := r.Group("/api/v3/slave")
29 30 31
	// 鉴权中间件
	v3.Use(middleware.SignRequired())

H
HFO4 已提交
32
	/*
33
		路由
H
HFO4 已提交
34
	*/
35
	{
36
		// 上传
37
		v3.POST("upload", controllers.SlaveUpload)
38 39 40 41
		// 下载
		v3.GET("download/:speed/:path/:name", controllers.SlaveDownload)
		// 预览 / 外链
		v3.GET("source/:speed/:path/:name", controllers.SlavePreview)
42 43
		// 缩略图
		v3.GET("thumb/:path", controllers.SlaveThumb)
44 45
		// 删除文件
		v3.POST("delete", controllers.SlaveDelete)
46 47 48
	}
	return r
}
H
HFO4 已提交
49

50
// InitCORS 初始化跨域配置
51 52 53
func InitCORS(router *gin.Engine) {
	if conf.CORSConfig.AllowOrigins[0] != "UNSET" {
		router.Use(cors.New(cors.Config{
H
HFO4 已提交
54
			AllowOrigins:     conf.CORSConfig.AllowOrigins,
55
			AllowMethods:     conf.CORSConfig.AllowMethods,
H
HFO4 已提交
56 57 58 59
			AllowHeaders:     conf.CORSConfig.AllowHeaders,
			AllowCredentials: conf.CORSConfig.AllowCredentials,
			ExposeHeaders:    conf.CORSConfig.ExposeHeaders,
		}))
60
		return
H
HFO4 已提交
61
	}
H
HFO4 已提交
62

63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
	// 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))
	// 跨域相关
78
	InitCORS(r)
H
HFO4 已提交
79
	// 测试模式加入Mock助手中间件
H
HFO4 已提交
80
	if gin.Mode() == gin.TestMode {
H
HFO4 已提交
81
		v3.Use(middleware.MockHelper())
H
HFO4 已提交
82
	}
H
HFO4 已提交
83
	v3.Use(middleware.CurrentUser())
H
HFO4 已提交
84

H
HFO4 已提交
85 86 87
	/*
		路由
	*/
H
HFO4 已提交
88
	{
H
HFO4 已提交
89 90 91 92 93 94 95 96 97 98
		// 全局设置相关
		site := v3.Group("site")
		{
			// 测试用路由
			site.GET("ping", controllers.Ping)
			// 验证码
			site.GET("captcha", controllers.Captcha)
			// 站点全局配置
			site.GET("config", controllers.SiteConfig)
		}
99

H
HFO4 已提交
100 101
		// 用户相关路由
		user := v3.Group("user")
102 103
		{
			// 用户登录
H
HFO4 已提交
104
			user.POST("session", controllers.UserLogin)
105
			// WebAuthn登陆初始化
H
HFO4 已提交
106
			user.GET("authn/:username", controllers.StartLoginAuthn)
107
			// WebAuthn登陆
H
HFO4 已提交
108
			user.POST("authn/finish/:username", controllers.FinishLoginAuthn)
109 110
		}

H
HFO4 已提交
111 112 113 114 115 116
		// 需要携带签名验证的
		sign := v3.Group("")
		sign.Use(middleware.SignRequired())
		{
			file := sign.Group("file")
			{
H
HFO4 已提交
117
				// 文件外链
H
HFO4 已提交
118
				file.GET("get/:id/:name", controllers.AnonymousGetContent)
H
HFO4 已提交
119 120
				// 下載已经打包好的文件
				file.GET("archive/:id/archive.zip", controllers.DownloadArchive)
121 122
				// 下载文件
				file.GET("download/:id", controllers.Download)
H
HFO4 已提交
123 124
			}
		}
H
HFO4 已提交
125

126 127 128
		// 回调接口
		callback := v3.Group("callback")
		{
H
HFO4 已提交
129
			// 远程策略上传回调
130 131 132 133 134
			callback.POST(
				"remote/:key",
				middleware.RemoteCallbackAuth(),
				controllers.RemoteCallback,
			)
H
HFO4 已提交
135 136 137 138 139 140
			// 七牛策略上传回调
			callback.POST(
				"qiniu/:key",
				middleware.QiniuCallbackAuth(),
				controllers.QiniuCallback,
			)
H
HFO4 已提交
141 142 143 144 145 146
			// 阿里云OSS策略上传回调
			callback.POST(
				"oss/:key",
				middleware.OSSCallbackAuth(),
				controllers.OSSCallback,
			)
H
HFO4 已提交
147 148 149 150 151 152
			// 又拍云策略上传回调
			callback.POST(
				"upyun/:key",
				middleware.UpyunCallbackAuth(),
				controllers.UpyunCallback,
			)
H
HFO4 已提交
153 154 155 156 157 158 159 160 161
			onedrive := callback.Group("onedrive")
			{
				// 文件上传完成
				onedrive.POST(
					"finish/:key",
					middleware.OneDriveCallbackAuth(),
					controllers.OneDriveCallback,
				)
			}
162 163
		}

H
HFO4 已提交
164 165 166 167
		// 需要登录保护的
		auth := v3.Group("")
		auth.Use(middleware.AuthRequired())
		{
H
HFO4 已提交
168
			// 用户
H
HFO4 已提交
169
			user := auth.Group("user")
H
HFO4 已提交
170 171
			{
				// 当前登录用户信息
H
HFO4 已提交
172
				user.GET("me", controllers.UserMe)
173
				user.GET("storage", controllers.UserStorage)
H
HFO4 已提交
174 175 176 177 178 179 180

				// WebAuthn 注册相关
				authn := user.Group("authn")
				{
					authn.PUT("", controllers.StartRegAuthn)
					authn.PUT("finish", controllers.FinishRegAuthn)
				}
H
HFO4 已提交
181 182
			}

H
HFO4 已提交
183
			// 文件
H
HFO4 已提交
184
			file := auth.Group("file")
H
HFO4 已提交
185
			{
H
HFO4 已提交
186
				// 文件上传
H
HFO4 已提交
187
				file.POST("upload", controllers.FileUploadStream)
H
HFO4 已提交
188 189
				// 获取上传凭证
				file.GET("upload/credential", controllers.GetUploadCredential)
H
HFO4 已提交
190 191
				// 更新文件
				file.PUT("update/*path", controllers.PutContent)
192 193
				// 创建文件下载会话
				file.PUT("download/*path", controllers.CreateDownloadSession)
194 195
				// 预览文件
				file.GET("preview/*path", controllers.Preview)
196 197
				// 获取文本文件内容
				file.GET("content/*path", controllers.PreviewText)
198 199
				// 取得Office文档预览地址
				file.GET("doc/*path", controllers.GetDocPreview)
200
				// 获取缩略图
H
HFO4 已提交
201
				file.GET("thumb/:id", controllers.Thumb)
202 203
				// 取得文件外链
				file.GET("source/:id", controllers.GetSource)
H
HFO4 已提交
204 205
				// 打包要下载的文件
				file.POST("archive", controllers.Archive)
H
HFO4 已提交
206 207
			}

H
HFO4 已提交
208
			// 目录
H
HFO4 已提交
209
			directory := auth.Group("directory")
H
HFO4 已提交
210
			{
211 212
				// 创建目录
				directory.PUT("", controllers.CreateDirectory)
H
HFO4 已提交
213
				// 列出目录下内容
H
HFO4 已提交
214 215 216 217 218 219
				directory.GET("*path", controllers.ListDirectory)
			}

			// 对象,文件和目录的抽象
			object := auth.Group("object")
			{
H
HFO4 已提交
220
				// 删除对象
H
HFO4 已提交
221
				object.DELETE("", controllers.Delete)
H
HFO4 已提交
222
				// 移动对象
H
HFO4 已提交
223
				object.PATCH("", controllers.Move)
H
HFO4 已提交
224 225
				// 复制对象
				object.POST("copy", controllers.Copy)
H
HFO4 已提交
226 227
				// 重命名对象
				object.POST("rename", controllers.Rename)
H
HFO4 已提交
228 229
			}

H
HFO4 已提交
230 231
		}

H
HFO4 已提交
232
	}
H
HFO4 已提交
233 234

	// 初始化WebDAV相关路由
235
	initWebDAV(r.Group("dav"))
H
HFO4 已提交
236 237
	return r
}
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256

// 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)

	}
}