webdavserv.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package webdavserv
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "imuslab.com/arozos/mod/database"
  6. "imuslab.com/arozos/mod/fileservers"
  7. awebdav "imuslab.com/arozos/mod/storage/webdav"
  8. "imuslab.com/arozos/mod/user"
  9. "imuslab.com/arozos/mod/utils"
  10. )
  11. /*
  12. Handler for WebDAV
  13. */
  14. type ManagerOption struct {
  15. Sysdb *database.Database
  16. Hostname string
  17. TmpDir string
  18. Port int
  19. UseTls bool
  20. UserHandler *user.UserHandler
  21. }
  22. type Manager struct {
  23. WebDavHandler *awebdav.Server
  24. option *ManagerOption
  25. }
  26. //Create a new WebDAV Manager for handling related requests
  27. func NewWebDAVManager(option *ManagerOption) *Manager {
  28. m := Manager{
  29. option: option,
  30. }
  31. //Create a database table for webdav service
  32. m.option.Sysdb.NewTable("webdav")
  33. //Create a new webdav server
  34. newserver := awebdav.NewServer(m.option.Hostname, "/webdav", m.option.TmpDir, m.option.UseTls, m.option.UserHandler)
  35. m.WebDavHandler = newserver
  36. //Check the webdav default state
  37. enabled := false
  38. if m.option.Sysdb.KeyExists("webdav", "enabled") {
  39. m.option.Sysdb.Read("webdav", "enabled", &enabled)
  40. }
  41. m.WebDavHandler.Enabled = enabled
  42. return &m
  43. }
  44. func (m *Manager) HandleStatusChange(w http.ResponseWriter, r *http.Request) {
  45. //Show status for every user, only allow change if admin
  46. userinfo, _ := m.option.UserHandler.GetUserInfoFromRequest(w, r)
  47. isAdmin := userinfo.IsAdmin()
  48. set, _ := utils.Mv(r, "set", false)
  49. if set == "" {
  50. //Return the current status
  51. results := []bool{m.WebDavHandler.Enabled, isAdmin}
  52. js, _ := json.Marshal(results)
  53. utils.SendJSONResponse(w, string(js))
  54. } else if isAdmin && set == "disable" {
  55. m.WebDavHandler.Enabled = false
  56. m.option.Sysdb.Write("webdav", "enabled", false)
  57. utils.SendOK(w)
  58. } else if isAdmin && set == "enable" {
  59. m.WebDavHandler.Enabled = true
  60. m.option.Sysdb.Write("webdav", "enabled", true)
  61. utils.SendOK(w)
  62. } else {
  63. utils.SendErrorResponse(w, "Permission Denied")
  64. }
  65. }
  66. /*
  67. Functions required by new service mounting infrastructure
  68. */
  69. func (m *Manager) WebDavToogle(enabled bool) error {
  70. m.WebDavHandler.Enabled = enabled
  71. return nil
  72. }
  73. func (m *Manager) WebDavGetEndpoints(userinfo *user.User) []*fileservers.Endpoint {
  74. eps := []*fileservers.Endpoint{}
  75. protocolName := "http://"
  76. if m.option.UseTls {
  77. protocolName = "https://"
  78. }
  79. for _, fsh := range userinfo.GetAllAccessibleFileSystemHandler() {
  80. eps = append(eps, &fileservers.Endpoint{
  81. ProtocolName: protocolName,
  82. Port: m.option.Port,
  83. Subpath: "/webdav/" + fsh.UUID,
  84. })
  85. }
  86. return eps
  87. }
  88. func (m *Manager) GetWebDavEnabled() bool {
  89. return m.WebDavHandler.Enabled
  90. }
  91. //Mapper of the original Connection related features
  92. func (m *Manager) HandleConnectionList(w http.ResponseWriter, r *http.Request) {
  93. m.WebDavHandler.HandleConnectionList(w, r)
  94. }
  95. func (m *Manager) HandlePermissionEdit(w http.ResponseWriter, r *http.Request) {
  96. m.WebDavHandler.HandlePermissionEdit(w, r)
  97. }
  98. func (m *Manager) HandleClearAllPending(w http.ResponseWriter, r *http.Request) {
  99. m.WebDavHandler.HandleClearAllPending(w, r)
  100. }
  101. func (m *Manager) HandleRequest(w http.ResponseWriter, r *http.Request) {
  102. m.WebDavHandler.HandleRequest(w, r)
  103. }