router.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. package routers
  2. import (
  3. // "crypto/tls"
  4. // "log"
  5. "net/http"
  6. "net/http/httputil"
  7. "net/url"
  8. "strings"
  9. "github.com/beego/beego/v2/core/logs"
  10. "github.com/beego/beego/v2/server/web"
  11. "github.com/beego/beego/v2/server/web/context"
  12. // "github.com/mindoc-org/mindoc/conf"
  13. "github.com/mindoc-org/mindoc/controllers"
  14. "github.com/mindoc-org/mindoc/mcp"
  15. )
  16. type CorsTransport struct {
  17. http.RoundTripper
  18. }
  19. func (t *CorsTransport) RoundTrip(req *http.Request) (resp *http.Response, err error) {
  20. // refer: https://stackoverflow.com/questions/31535569/golang-how-to-read-response-body-of-reverseproxy/31536962#31536962
  21. resp, err = t.RoundTripper.RoundTrip(req)
  22. // beego.Debug(resp)
  23. if err != nil {
  24. return nil, err
  25. }
  26. /*
  27. b, err := ioutil.ReadAll(resp.Body)
  28. if err != nil {
  29. return nil, err
  30. }
  31. err = resp.Body.Close()
  32. if err != nil {
  33. return nil, err
  34. }
  35. b = bytes.Replace(b, []byte("server"), []byte("schmerver"), -1)
  36. body := ioutil.NopCloser(bytes.NewReader(b))
  37. resp.Body = body
  38. resp.ContentLength = int64(len(b))
  39. resp.Header.Set("Content-Length", strconv.Itoa(len(b)))
  40. */
  41. // resp.Body.Close()
  42. // resp.Header.Del("Access-Control-Request-Method")
  43. // resp.Header.Del("Access-Control-Request-Headers")
  44. resp.Header.Set("Access-Control-Allow-Origin", "*")
  45. resp.Header.Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
  46. // resp.Header.Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, X-Requested-With")
  47. hs := ""
  48. for name, values := range resp.Header {
  49. hs = hs + name + ", "
  50. _ = values
  51. }
  52. hs = strings.TrimRight(hs, " ")
  53. hs = strings.TrimRight(hs, ",")
  54. // beego.Debug(hs)
  55. resp.Header.Set("Access-Control-Allow-Headers", hs)
  56. resp.Header.Del("Mindoc-Version")
  57. resp.Header.Del("Mindoc-Site")
  58. resp.Header.Del("Server")
  59. resp.Header.Del("X-Xss-Protection")
  60. return resp, nil
  61. }
  62. func singleJoiningSlash(a, b string) string {
  63. aslash := strings.HasSuffix(a, "/")
  64. bslash := strings.HasPrefix(b, "/")
  65. switch {
  66. case aslash && bslash:
  67. return a + b[1:]
  68. case !aslash && !bslash:
  69. return a + "/" + b
  70. }
  71. return a + b
  72. }
  73. func init() {
  74. web.Any("/hello-any", func(ctx *context.Context) {
  75. ctx.Output.Body([]byte("hello any demo"))
  76. })
  77. web.Any("/cors-anywhere", func(ctx *context.Context) {
  78. u, _ := url.PathUnescape(ctx.Input.Query("url"))
  79. if len(u) > 0 && strings.HasPrefix(u, "http") {
  80. target, _ := url.Parse(u)
  81. if target.Path == ctx.Request.URL.Path {
  82. ctx.Output.Body([]byte(""))
  83. } else {
  84. logs.Error("target: ", target)
  85. reverseProxy := httputil.NewSingleHostReverseProxy(target)
  86. reverseProxy.Director = func(req *http.Request) {
  87. for name, values := range ctx.Request.Header {
  88. for _, value := range values {
  89. req.Header.Set(name, value)
  90. }
  91. }
  92. req.Header.Add("X-Forwarded-Host", req.Host)
  93. req.Header.Add("X-Origin-Host", target.Host)
  94. req.URL.Scheme = target.Scheme
  95. req.URL.Host = target.Host
  96. // proxyPath := singleJoiningSlash(target.Path, req.URL.Path)
  97. proxyPath := target.Path
  98. if strings.HasSuffix(proxyPath, "/") && len(proxyPath) > 1 {
  99. proxyPath = proxyPath[:len(proxyPath)-1]
  100. }
  101. req.URL.Path = proxyPath
  102. }
  103. reverseProxy.Transport = &CorsTransport{http.DefaultTransport}
  104. reverseProxy.ServeHTTP(ctx.ResponseWriter, ctx.Request)
  105. panic(web.ErrAbort)
  106. }
  107. } else {
  108. ctx.ResponseWriter.WriteHeader(http.StatusBadRequest)
  109. ctx.Output.Body([]byte("400 Bad Request"))
  110. }
  111. })
  112. web.Router("/", &controllers.HomeController{}, "*:Index")
  113. web.Router("/login", &controllers.AccountController{}, "*:Login")
  114. web.Router("/auth2/redirect/:app", &controllers.AccountController{}, "*:Auth2Redirect")
  115. web.Router("/auth2/callback/:app", &controllers.AccountController{}, "*:Auth2Callback")
  116. web.Router("/auth2/account/bind/:app", &controllers.AccountController{}, "*:Auth2BindAccount")
  117. web.Router("/auth2/account/auto/:app", &controllers.AccountController{}, "*:Auth2AutoAccount")
  118. //web.Router("/dingtalk_login", &controllers.AccountController{}, "*:DingTalkLogin")
  119. //web.Router("/qrlogin/:app", &controllers.AccountController{}, "*:QRLogin")
  120. web.Router("/logout", &controllers.AccountController{}, "*:Logout")
  121. web.Router("/register", &controllers.AccountController{}, "*:Register")
  122. web.Router("/find_password", &controllers.AccountController{}, "*:FindPassword")
  123. web.Router("/valid_email", &controllers.AccountController{}, "post:ValidEmail")
  124. web.Router("/captcha", &controllers.AccountController{}, "*:Captcha")
  125. web.Router("/manager", &controllers.ManagerController{}, "*:Index")
  126. web.Router("/manager/users", &controllers.ManagerController{}, "*:Users")
  127. web.Router("/manager/users/edit/:id", &controllers.ManagerController{}, "*:EditMember")
  128. web.Router("/manager/member/create", &controllers.ManagerController{}, "post:CreateMember")
  129. web.Router("/manager/member/delete", &controllers.ManagerController{}, "post:DeleteMember")
  130. web.Router("/manager/member/update-member-status", &controllers.ManagerController{}, "post:UpdateMemberStatus")
  131. web.Router("/manager/member/change-member-role", &controllers.ManagerController{}, "post:ChangeMemberRole")
  132. web.Router("/manager/books", &controllers.ManagerController{}, "*:Books")
  133. web.Router("/manager/books/edit/:key", &controllers.ManagerController{}, "*:EditBook")
  134. web.Router("/manager/books/delete", &controllers.ManagerController{}, "*:DeleteBook")
  135. web.Router("/manager/comments", &controllers.ManagerController{}, "*:Comments")
  136. web.Router("/manager/setting", &controllers.ManagerController{}, "*:Setting")
  137. web.Router("/manager/books/token", &controllers.ManagerController{}, "post:CreateToken")
  138. web.Router("/manager/books/transfer", &controllers.ManagerController{}, "post:Transfer")
  139. web.Router("/manager/books/open", &controllers.ManagerController{}, "post:PrivatelyOwned")
  140. web.Router("/manager/attach/list", &controllers.ManagerController{}, "*:AttachList")
  141. web.Router("/manager/attach/clean", &controllers.ManagerController{}, "post:AttachClean")
  142. web.Router("/manager/attach/detailed/:id", &controllers.ManagerController{}, "*:AttachDetailed")
  143. web.Router("/manager/attach/delete", &controllers.ManagerController{}, "post:AttachDelete")
  144. web.Router("/manager/label/list", &controllers.ManagerController{}, "get:LabelList")
  145. web.Router("/manager/label/delete/:id", &controllers.ManagerController{}, "post:LabelDelete")
  146. //web.Router("/manager/config", &controllers.ManagerController{}, "*:Config")
  147. web.Router("/manager/team", &controllers.ManagerController{}, "*:Team")
  148. web.Router("/manager/team/create", &controllers.ManagerController{}, "POST:TeamCreate")
  149. web.Router("/manager/team/edit", &controllers.ManagerController{}, "POST:TeamEdit")
  150. web.Router("/manager/team/delete", &controllers.ManagerController{}, "POST:TeamDelete")
  151. web.Router("/manager/team/member/list/:id", &controllers.ManagerController{}, "*:TeamMemberList")
  152. web.Router("/manager/team/member/add", &controllers.ManagerController{}, "POST:TeamMemberAdd")
  153. web.Router("/manager/team/member/delete", &controllers.ManagerController{}, "POST:TeamMemberDelete")
  154. web.Router("/manager/team/member/change_role", &controllers.ManagerController{}, "POST:TeamChangeMemberRole")
  155. web.Router("/manager/team/member/search", &controllers.ManagerController{}, "*:TeamSearchMember")
  156. web.Router("/manager/team/book/list/:id", &controllers.ManagerController{}, "*:TeamBookList")
  157. web.Router("/manager/team/book/add", &controllers.ManagerController{}, "POST:TeamBookAdd")
  158. web.Router("/manager/team/book/delete", &controllers.ManagerController{}, "POST:TeamBookDelete")
  159. web.Router("/manager/team/book/search", &controllers.ManagerController{}, "*:TeamSearchBook")
  160. web.Router("/manager/itemsets", &controllers.ManagerController{}, "*:Itemsets")
  161. web.Router("/manager/itemsets/edit", &controllers.ManagerController{}, "post:ItemsetsEdit")
  162. web.Router("/manager/itemsets/delete", &controllers.ManagerController{}, "post:ItemsetsDelete")
  163. web.Router("/setting", &controllers.SettingController{}, "*:Index")
  164. web.Router("/setting/password", &controllers.SettingController{}, "*:Password")
  165. web.Router("/setting/upload", &controllers.SettingController{}, "*:Upload")
  166. web.Router("/book", &controllers.BookController{}, "*:Index")
  167. web.Router("/book/:key/dashboard", &controllers.BookController{}, "*:Dashboard")
  168. web.Router("/book/:key/setting", &controllers.BookController{}, "*:Setting")
  169. web.Router("/book/:key/users", &controllers.BookController{}, "*:Users")
  170. web.Router("/book/:key/release", &controllers.BookController{}, "post:Release")
  171. web.Router("/book/:key/sort", &controllers.BookController{}, "post:SaveSort")
  172. web.Router("/book/:key/teams", &controllers.BookController{}, "*:Team")
  173. web.Router("/book/updatebookorder", &controllers.BookController{}, "post:UpdateBookOrder")
  174. web.Router("/book/create", &controllers.BookController{}, "*:Create")
  175. web.Router("/book/itemsets/search", &controllers.BookController{}, "*:ItemsetsSearch")
  176. web.Router("/book/users/create", &controllers.BookMemberController{}, "post:AddMember")
  177. web.Router("/book/users/change", &controllers.BookMemberController{}, "post:ChangeRole")
  178. web.Router("/book/users/delete", &controllers.BookMemberController{}, "post:RemoveMember")
  179. web.Router("/book/users/import", &controllers.BookController{}, "post:Import")
  180. web.Router("/book/users/copy", &controllers.BookController{}, "post:Copy")
  181. web.Router("/book/setting/save", &controllers.BookController{}, "post:SaveBook")
  182. web.Router("/book/setting/open", &controllers.BookController{}, "post:PrivatelyOwned")
  183. web.Router("/book/setting/transfer", &controllers.BookController{}, "post:Transfer")
  184. web.Router("/book/setting/upload", &controllers.BookController{}, "post:UploadCover")
  185. web.Router("/book/setting/delete", &controllers.BookController{}, "post:Delete")
  186. web.Router("/book/team/add", &controllers.BookController{}, "POST:TeamAdd")
  187. web.Router("/book/team/delete", &controllers.BookController{}, "POST:TeamDelete")
  188. web.Router("/book/team/search", &controllers.BookController{}, "*:TeamSearch")
  189. //管理文章的路由
  190. web.Router("/manage/blogs", &controllers.BlogController{}, "*:ManageList")
  191. web.Router("/manage/blogs/setting/?:id", &controllers.BlogController{}, "*:ManageSetting")
  192. web.Router("/manage/blogs/edit/?:id", &controllers.BlogController{}, "*:ManageEdit")
  193. web.Router("/manage/blogs/delete", &controllers.BlogController{}, "post:ManageDelete")
  194. web.Router("/manage/blogs/upload", &controllers.BlogController{}, "post:Upload")
  195. web.Router("/manage/blogs/attach/:id", &controllers.BlogController{}, "post:RemoveAttachment")
  196. //读文章的路由
  197. web.Router("/blogs", &controllers.BlogController{}, "*:List")
  198. web.Router("/blog-attach/:id:int/:attach_id:int", &controllers.BlogController{}, "get:Download")
  199. web.Router("/blog-:id([0-9]+).html", &controllers.BlogController{}, "*:Index")
  200. //模板相关接口
  201. web.Router("/api/template/get", &controllers.TemplateController{}, "get:Get")
  202. web.Router("/api/template/list", &controllers.TemplateController{}, "post:List")
  203. web.Router("/api/template/add", &controllers.TemplateController{}, "post:Add")
  204. web.Router("/api/template/remove", &controllers.TemplateController{}, "post:Delete")
  205. web.Router("/api/attach/remove/", &controllers.DocumentController{}, "post:RemoveAttachment")
  206. web.Router("/api/:key/edit/?:id", &controllers.DocumentController{}, "*:Edit")
  207. web.Router("/api/upload", &controllers.DocumentController{}, "post:Upload")
  208. web.Router("/api/:key/create", &controllers.DocumentController{}, "post:Create")
  209. web.Router("/api/:key/delete", &controllers.DocumentController{}, "post:Delete")
  210. web.Router("/api/:key/content/?:id", &controllers.DocumentController{}, "*:Content")
  211. web.Router("/api/:key/compare/:id", &controllers.DocumentController{}, "*:Compare")
  212. web.Router("/api/search/user/:key", &controllers.SearchController{}, "*:User")
  213. web.Router("/history/get", &controllers.DocumentController{}, "get:History")
  214. web.Router("/history/delete", &controllers.DocumentController{}, "*:DeleteHistory")
  215. web.Router("/history/restore", &controllers.DocumentController{}, "*:RestoreHistory")
  216. web.Router("/docs/:key", &controllers.DocumentController{}, "*:Index")
  217. web.Router("/docs/:key/check-password", &controllers.DocumentController{}, "post:CheckPassword")
  218. web.Router("/docs/:key/:id", &controllers.DocumentController{}, "*:Read")
  219. web.Router("/docs/:key/search", &controllers.DocumentController{}, "post:Search")
  220. web.Router("/export/:key", &controllers.DocumentController{}, "*:Export")
  221. web.Router("/qrcode/:key.png", &controllers.DocumentController{}, "get:QrCode")
  222. web.Router("/attach_files/:key/:attach_id", &controllers.DocumentController{}, "get:DownloadAttachment")
  223. web.Router("/comment/create", &controllers.CommentController{}, "post:Create")
  224. web.Router("/comment/delete", &controllers.CommentController{}, "post:Delete")
  225. web.Router("/comment/lists", &controllers.CommentController{}, "get:Lists")
  226. web.Router("/comment/index", &controllers.CommentController{}, "*:Index")
  227. web.Router("/search", &controllers.SearchController{}, "get:Index")
  228. web.Router("/tag/:key", &controllers.LabelController{}, "get:Index")
  229. web.Router("/tags", &controllers.LabelController{}, "get:List")
  230. web.Router("/items", &controllers.ItemsetsController{}, "get:Index")
  231. web.Router("/items/:key", &controllers.ItemsetsController{}, "get:List")
  232. if web.AppConfig.DefaultBool("enable_mcp_server", false) {
  233. mcpServer := mcp.NewMCPServer()
  234. web.Any("/mcp/*", func(ctx *context.Context) {
  235. mcpServer.ServeHTTP().ServeHTTP(ctx.ResponseWriter, ctx.Request)
  236. })
  237. }
  238. }