auth.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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 auth
  5. import (
  6. "net/http"
  7. "reflect"
  8. "strings"
  9. "github.com/Unknwon/macaron"
  10. "github.com/macaron-contrib/binding"
  11. "github.com/macaron-contrib/session"
  12. "github.com/gogits/gogs/models"
  13. "github.com/gogits/gogs/modules/log"
  14. "github.com/gogits/gogs/modules/setting"
  15. )
  16. // SignedInId returns the id of signed in user.
  17. func SignedInId(header http.Header, sess session.Store) int64 {
  18. if !models.HasEngine {
  19. return 0
  20. }
  21. if setting.Service.EnableReverseProxyAuth {
  22. webAuthUser := header.Get(setting.ReverseProxyAuthUser)
  23. if len(webAuthUser) > 0 {
  24. u, err := models.GetUserByName(webAuthUser)
  25. if err != nil {
  26. if err != models.ErrUserNotExist {
  27. log.Error(4, "GetUserByName: %v", err)
  28. }
  29. return 0
  30. }
  31. return u.Id
  32. }
  33. }
  34. uid := sess.Get("uid")
  35. if uid == nil {
  36. return 0
  37. }
  38. if id, ok := uid.(int64); ok {
  39. if _, err := models.GetUserById(id); err != nil {
  40. if err != models.ErrUserNotExist {
  41. log.Error(4, "GetUserById: %v", err)
  42. }
  43. return 0
  44. }
  45. return id
  46. }
  47. return 0
  48. }
  49. // SignedInUser returns the user object of signed user.
  50. func SignedInUser(header http.Header, sess session.Store) *models.User {
  51. uid := SignedInId(header, sess)
  52. if uid <= 0 {
  53. return nil
  54. }
  55. u, err := models.GetUserById(uid)
  56. if err != nil {
  57. log.Error(4, "GetUserById: %v", err)
  58. return nil
  59. }
  60. return u
  61. }
  62. type Form interface {
  63. binding.Validator
  64. }
  65. // AssignForm assign form values back to the template data.
  66. func AssignForm(form interface{}, data map[string]interface{}) {
  67. typ := reflect.TypeOf(form)
  68. val := reflect.ValueOf(form)
  69. if typ.Kind() == reflect.Ptr {
  70. typ = typ.Elem()
  71. val = val.Elem()
  72. }
  73. for i := 0; i < typ.NumField(); i++ {
  74. field := typ.Field(i)
  75. fieldName := field.Tag.Get("form")
  76. // Allow ignored fields in the struct
  77. if fieldName == "-" {
  78. continue
  79. }
  80. data[fieldName] = val.Field(i).Interface()
  81. }
  82. }
  83. func getSize(field reflect.StructField, prefix string) string {
  84. for _, rule := range strings.Split(field.Tag.Get("binding"), ";") {
  85. if strings.HasPrefix(rule, prefix) {
  86. return rule[8 : len(rule)-1]
  87. }
  88. }
  89. return ""
  90. }
  91. func GetMinSize(field reflect.StructField) string {
  92. return getSize(field, "MinSize(")
  93. }
  94. func GetMaxSize(field reflect.StructField) string {
  95. return getSize(field, "MaxSize(")
  96. }
  97. func validate(errs binding.Errors, data map[string]interface{}, f Form, l macaron.Locale) binding.Errors {
  98. if errs.Len() == 0 {
  99. return errs
  100. }
  101. data["HasError"] = true
  102. AssignForm(f, data)
  103. typ := reflect.TypeOf(f)
  104. val := reflect.ValueOf(f)
  105. if typ.Kind() == reflect.Ptr {
  106. typ = typ.Elem()
  107. val = val.Elem()
  108. }
  109. for i := 0; i < typ.NumField(); i++ {
  110. field := typ.Field(i)
  111. fieldName := field.Tag.Get("form")
  112. // Allow ignored fields in the struct
  113. if fieldName == "-" {
  114. continue
  115. }
  116. if errs[0].FieldNames[0] == field.Name {
  117. data["Err_"+field.Name] = true
  118. trName := l.Tr("form." + field.Name)
  119. switch errs[0].Classification {
  120. case binding.RequiredError:
  121. data["ErrorMsg"] = trName + l.Tr("form.require_error")
  122. case binding.AlphaDashError:
  123. data["ErrorMsg"] = trName + l.Tr("form.alpha_dash_error")
  124. case binding.AlphaDashDotError:
  125. data["ErrorMsg"] = trName + l.Tr("form.alpha_dash_dot_error")
  126. case binding.MinSizeError:
  127. data["ErrorMsg"] = trName + l.Tr("form.min_size_error", GetMinSize(field))
  128. case binding.MaxSizeError:
  129. data["ErrorMsg"] = trName + l.Tr("form.max_size_error", GetMaxSize(field))
  130. case binding.EmailError:
  131. data["ErrorMsg"] = trName + l.Tr("form.email_error")
  132. case binding.UrlError:
  133. data["ErrorMsg"] = trName + l.Tr("form.url_error")
  134. default:
  135. data["ErrorMsg"] = l.Tr("form.unknown_error") + " " + errs[0].Classification
  136. }
  137. return errs
  138. }
  139. }
  140. return errs
  141. }