access.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package models
  5. import (
  6. "strings"
  7. "time"
  8. )
  9. type AccessType int
  10. const (
  11. READABLE AccessType = iota + 1
  12. WRITABLE
  13. )
  14. // Access represents the accessibility of user to repository.
  15. type Access struct {
  16. Id int64
  17. UserName string `xorm:"UNIQUE(s)"`
  18. RepoName string `xorm:"UNIQUE(s)"` // <user name>/<repo name>
  19. Mode AccessType `xorm:"UNIQUE(s)"`
  20. Created time.Time `xorm:"CREATED"`
  21. }
  22. func addAccess(e Engine, access *Access) error {
  23. access.UserName = strings.ToLower(access.UserName)
  24. access.RepoName = strings.ToLower(access.RepoName)
  25. _, err := e.Insert(access)
  26. return err
  27. }
  28. // AddAccess adds new access record.
  29. func AddAccess(access *Access) error {
  30. return addAccess(x, access)
  31. }
  32. func updateAccess(e Engine, access *Access) error {
  33. if _, err := e.Id(access.Id).Update(access); err != nil {
  34. return err
  35. }
  36. return nil
  37. }
  38. // UpdateAccess updates access information.
  39. func UpdateAccess(access *Access) error {
  40. access.UserName = strings.ToLower(access.UserName)
  41. access.RepoName = strings.ToLower(access.RepoName)
  42. return updateAccess(x, access)
  43. }
  44. func deleteAccess(e Engine, access *Access) error {
  45. _, err := e.Delete(access)
  46. return err
  47. }
  48. // DeleteAccess deletes access record.
  49. func DeleteAccess(access *Access) error {
  50. return deleteAccess(x, access)
  51. }
  52. // HasAccess returns true if someone can read or write to given repository.
  53. // The repoName should be in format <username>/<reponame>.
  54. func HasAccess(uname, repoName string, mode AccessType) (bool, error) {
  55. if len(repoName) == 0 {
  56. return false, nil
  57. }
  58. access := &Access{
  59. UserName: strings.ToLower(uname),
  60. RepoName: strings.ToLower(repoName),
  61. }
  62. has, err := x.Get(access)
  63. if err != nil {
  64. return false, err
  65. } else if !has {
  66. return false, nil
  67. } else if mode > access.Mode {
  68. return false, nil
  69. }
  70. return true, nil
  71. }
  72. // GetAccessibleRepositories finds all repositories where a user has access to,
  73. // besides his own.
  74. func (u *User) GetAccessibleRepositories() (map[*Repository]AccessType, error) {
  75. accesses := make([]*Access, 0, 10)
  76. if err := x.Find(&accesses, &Access{UserName: u.LowerName}); err != nil {
  77. return nil, err
  78. }
  79. repos := make(map[*Repository]AccessType, len(accesses))
  80. for _, access := range accesses {
  81. repo, err := GetRepositoryByRef(access.RepoName)
  82. if err != nil {
  83. return nil, err
  84. }
  85. if err = repo.GetOwner(); err != nil {
  86. return nil, err
  87. } else if repo.OwnerId == u.Id {
  88. continue
  89. }
  90. repos[repo] = access.Mode
  91. }
  92. return repos, nil
  93. }