router.go 8.0 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,
				)
			}
H
HFO4 已提交
162 163 164 165 166 167
			// 腾讯云COS策略上传回调
			callback.GET(
				"cos/:key",
				middleware.COSCallbackAuth(),
				controllers.COSCallback,
			)
168 169
		}

H
HFO4 已提交
170
		// 分享相关
H
HFO4 已提交
171
		share := v3.Group("share", middleware.ShareAvailable())
H
HFO4 已提交
172 173
		{
			// 获取分享
H
HFO4 已提交
174
			share.GET("info/:id", controllers.GetShare)
175
			// 创建文件下载会话
176
			share.PUT("download/:id",
H
HFO4 已提交
177
				middleware.CheckShareUnlocked(),
H
HFO4 已提交
178 179 180
				middleware.BeforeShareDownload(),
				controllers.GetShareDownload,
			)
H
HFO4 已提交
181
			// 预览分享文件
H
HFO4 已提交
182
			share.GET("preview/:id",
H
HFO4 已提交
183
				middleware.CheckShareUnlocked(),
H
HFO4 已提交
184 185 186 187
				middleware.ShareCanPreview(),
				middleware.BeforeShareDownload(),
				controllers.PreviewShare,
			)
H
HFO4 已提交
188
			// 取得Office文档预览地址
H
HFO4 已提交
189 190 191
			share.GET("doc/:id",
				middleware.CheckShareUnlocked(),
				middleware.ShareCanPreview(),
H
HFO4 已提交
192 193 194
				middleware.BeforeShareDownload(),
				controllers.GetShareDocPreview,
			)
H
HFO4 已提交
195
			// 获取文本文件内容
H
HFO4 已提交
196
			share.GET("content/:id",
H
HFO4 已提交
197
				middleware.CheckShareUnlocked(),
H
HFO4 已提交
198 199 200
				middleware.BeforeShareDownload(),
				controllers.PreviewShareText,
			)
H
HFO4 已提交
201 202 203 204 205
			// 分享目录列文件
			share.GET("list/:id/*path",
				middleware.CheckShareUnlocked(),
				controllers.ListSharedFolder,
			)
H
HFO4 已提交
206 207
		}

H
HFO4 已提交
208 209 210 211
		// 需要登录保护的
		auth := v3.Group("")
		auth.Use(middleware.AuthRequired())
		{
H
HFO4 已提交
212
			// 用户
H
HFO4 已提交
213
			user := auth.Group("user")
H
HFO4 已提交
214 215
			{
				// 当前登录用户信息
H
HFO4 已提交
216
				user.GET("me", controllers.UserMe)
H
HFO4 已提交
217
				// 存储信息
218
				user.GET("storage", controllers.UserStorage)
H
HFO4 已提交
219 220
				// 退出登录
				user.DELETE("session", controllers.UserSignOut)
H
HFO4 已提交
221 222 223 224 225 226 227

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

H
HFO4 已提交
230
			// 文件
H
HFO4 已提交
231
			file := auth.Group("file")
H
HFO4 已提交
232
			{
H
HFO4 已提交
233
				// 文件上传
H
HFO4 已提交
234
				file.POST("upload", controllers.FileUploadStream)
H
HFO4 已提交
235 236
				// 获取上传凭证
				file.GET("upload/credential", controllers.GetUploadCredential)
H
HFO4 已提交
237 238
				// 更新文件
				file.PUT("update/*path", controllers.PutContent)
239 240
				// 创建文件下载会话
				file.PUT("download/*path", controllers.CreateDownloadSession)
241 242
				// 预览文件
				file.GET("preview/*path", controllers.Preview)
243 244
				// 获取文本文件内容
				file.GET("content/*path", controllers.PreviewText)
245 246
				// 取得Office文档预览地址
				file.GET("doc/*path", controllers.GetDocPreview)
247
				// 获取缩略图
H
HFO4 已提交
248
				file.GET("thumb/:id", controllers.Thumb)
249 250
				// 取得文件外链
				file.GET("source/:id", controllers.GetSource)
H
HFO4 已提交
251 252
				// 打包要下载的文件
				file.POST("archive", controllers.Archive)
H
HFO4 已提交
253 254
			}

H
HFO4 已提交
255
			// 目录
H
HFO4 已提交
256
			directory := auth.Group("directory")
H
HFO4 已提交
257
			{
258 259
				// 创建目录
				directory.PUT("", controllers.CreateDirectory)
H
HFO4 已提交
260
				// 列出目录下内容
H
HFO4 已提交
261 262 263 264 265 266
				directory.GET("*path", controllers.ListDirectory)
			}

			// 对象,文件和目录的抽象
			object := auth.Group("object")
			{
H
HFO4 已提交
267
				// 删除对象
H
HFO4 已提交
268
				object.DELETE("", controllers.Delete)
H
HFO4 已提交
269
				// 移动对象
H
HFO4 已提交
270
				object.PATCH("", controllers.Move)
H
HFO4 已提交
271 272
				// 复制对象
				object.POST("copy", controllers.Copy)
H
HFO4 已提交
273 274
				// 重命名对象
				object.POST("rename", controllers.Rename)
H
HFO4 已提交
275 276
			}

H
HFO4 已提交
277 278 279 280 281
			// 分享
			share := auth.Group("share")
			{
				// 创建新分享
				share.POST("", controllers.CreateShare)
H
HFO4 已提交
282 283 284
				// 转存他人分享
				share.POST("save/:id",
					middleware.ShareAvailable(),
H
HFO4 已提交
285
					middleware.CheckShareUnlocked(),
H
HFO4 已提交
286 287 288
					middleware.BeforeShareDownload(),
					controllers.SaveShare,
				)
H
HFO4 已提交
289 290
			}

H
HFO4 已提交
291 292
		}

H
HFO4 已提交
293
	}
H
HFO4 已提交
294 295

	// 初始化WebDAV相关路由
296
	initWebDAV(r.Group("dav"))
H
HFO4 已提交
297 298
	return r
}
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317

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

	}
}