middle.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package dav
  2. import (
  3. "net/http"
  4. "strings"
  5. "github.com/G-Node/git-module"
  6. "github.com/G-Node/gogs/models"
  7. "github.com/G-Node/gogs/pkg/context"
  8. "gopkg.in/macaron.v1"
  9. )
  10. // DavMiddle initialises and returns a WebDav middleware handler (macaron.Handler)
  11. // [0]: issues, [1]: wiki
  12. func DavMiddle() macaron.Handler {
  13. return func(c *context.Context) {
  14. var (
  15. owner *models.User
  16. err error
  17. )
  18. ownerName := c.Params(":username")
  19. repoName := strings.TrimSuffix(c.Params(":reponame"), ".git")
  20. // Check if the user is the same as the repository owner
  21. if c.IsLogged && c.User.LowerName == strings.ToLower(ownerName) {
  22. owner = c.User
  23. } else {
  24. owner, err = models.GetUserByName(ownerName)
  25. if err != nil {
  26. Webdav401(c)
  27. return
  28. }
  29. }
  30. c.Repo.Owner = owner
  31. repo, err := models.GetRepositoryByName(owner.ID, repoName)
  32. if err != nil {
  33. Webdav401(c)
  34. return
  35. }
  36. c.Repo.Repository = repo
  37. c.Repo.RepoLink = repo.Link()
  38. // Admin has super access.
  39. if c.IsLogged && c.User.IsAdmin {
  40. c.Repo.AccessMode = models.ACCESS_MODE_OWNER
  41. } else {
  42. mode, err := models.UserAccessMode(c.UserID(), repo)
  43. if err != nil {
  44. c.WriteHeader(http.StatusInternalServerError)
  45. return
  46. }
  47. c.Repo.AccessMode = mode
  48. }
  49. if repo.IsMirror {
  50. c.Repo.Mirror, err = models.GetMirrorByRepoID(repo.ID)
  51. if err != nil {
  52. c.WriteHeader(http.StatusInternalServerError)
  53. return
  54. }
  55. }
  56. gitRepo, err := git.OpenRepository(models.RepoPath(ownerName, repoName))
  57. if err != nil {
  58. c.WriteHeader(http.StatusInternalServerError)
  59. return
  60. }
  61. c.Repo.GitRepo = gitRepo
  62. tags, err := c.Repo.GitRepo.GetTags()
  63. if err != nil {
  64. c.WriteHeader(http.StatusInternalServerError)
  65. return
  66. }
  67. c.Repo.Repository.NumTags = len(tags)
  68. // repo is bare and display enable
  69. if c.Repo.Repository.IsBare {
  70. return
  71. }
  72. brs, err := c.Repo.GitRepo.GetBranches()
  73. if err != nil {
  74. c.WriteHeader(http.StatusInternalServerError)
  75. return
  76. }
  77. // If not branch selected, try default one.
  78. // If default branch doesn't exists, fall back to some other branch.
  79. if len(c.Repo.BranchName) == 0 {
  80. if len(c.Repo.Repository.DefaultBranch) > 0 && gitRepo.IsBranchExist(c.Repo.Repository.DefaultBranch) {
  81. c.Repo.BranchName = c.Repo.Repository.DefaultBranch
  82. } else if len(brs) > 0 {
  83. c.Repo.BranchName = brs[0]
  84. }
  85. }
  86. }
  87. }