user.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package sqlstore
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. "github.com/go-xorm/xorm"
  7. "github.com/grafana/grafana/pkg/bus"
  8. "github.com/grafana/grafana/pkg/events"
  9. m "github.com/grafana/grafana/pkg/models"
  10. "github.com/grafana/grafana/pkg/setting"
  11. "github.com/grafana/grafana/pkg/util"
  12. )
  13. func init() {
  14. bus.AddHandler("sql", CreateUser)
  15. bus.AddHandler("sql", GetUserById)
  16. bus.AddHandler("sql", UpdateUser)
  17. bus.AddHandler("sql", ChangeUserPassword)
  18. bus.AddHandler("sql", GetUserByLogin)
  19. bus.AddHandler("sql", SetUsingOrg)
  20. bus.AddHandler("sql", GetUserInfo)
  21. bus.AddHandler("sql", GetSignedInUser)
  22. bus.AddHandler("sql", SearchUsers)
  23. bus.AddHandler("sql", GetUserOrgList)
  24. bus.AddHandler("sql", DeleteUser)
  25. bus.AddHandler("sql", SetUsingOrg)
  26. }
  27. func getOrgIdForNewUser(userEmail string, sess *session) (int64, error) {
  28. var org m.Org
  29. if setting.SingleOrgMode {
  30. has, err := sess.Where("name=?", setting.DefaultOrgName).Get(&org)
  31. if err != nil {
  32. return 0, err
  33. }
  34. if has {
  35. return org.Id, nil
  36. } else {
  37. org.Name = setting.DefaultOrgName
  38. }
  39. } else {
  40. org.Name = userEmail
  41. }
  42. org.Created = time.Now()
  43. org.Updated = time.Now()
  44. if _, err := sess.Insert(&org); err != nil {
  45. return 0, err
  46. }
  47. return org.Id, nil
  48. }
  49. func CreateUser(cmd *m.CreateUserCommand) error {
  50. return inTransaction2(func(sess *session) error {
  51. orgId, err := getOrgIdForNewUser(cmd.Email, sess)
  52. if err != nil {
  53. return err
  54. }
  55. // create user
  56. user := m.User{
  57. Email: cmd.Email,
  58. Name: cmd.Name,
  59. Login: cmd.Login,
  60. Company: cmd.Company,
  61. IsAdmin: cmd.IsAdmin,
  62. OrgId: orgId,
  63. Created: time.Now(),
  64. Updated: time.Now(),
  65. }
  66. if len(cmd.Password) > 0 {
  67. user.Salt = util.GetRandomString(10)
  68. user.Rands = util.GetRandomString(10)
  69. user.Password = util.EncodePassword(cmd.Password, user.Salt)
  70. }
  71. sess.UseBool("is_admin")
  72. if _, err := sess.Insert(&user); err != nil {
  73. return err
  74. }
  75. // create org user link
  76. orgUser := m.OrgUser{
  77. OrgId: orgId,
  78. UserId: user.Id,
  79. Role: m.ROLE_ADMIN,
  80. Created: time.Now(),
  81. Updated: time.Now(),
  82. }
  83. if setting.SingleOrgMode && !user.IsAdmin {
  84. orgUser.Role = m.RoleType(setting.DefaultOrgRole)
  85. }
  86. if _, err = sess.Insert(&orgUser); err != nil {
  87. return err
  88. }
  89. sess.publishAfterCommit(&events.UserCreated{
  90. Timestamp: user.Created,
  91. Id: user.Id,
  92. Name: user.Name,
  93. Login: user.Login,
  94. Email: user.Email,
  95. })
  96. cmd.Result = user
  97. return nil
  98. })
  99. }
  100. func GetUserById(query *m.GetUserByIdQuery) error {
  101. user := new(m.User)
  102. has, err := x.Id(query.Id).Get(user)
  103. if err != nil {
  104. return err
  105. } else if has == false {
  106. return m.ErrUserNotFound
  107. }
  108. query.Result = user
  109. return nil
  110. }
  111. func GetUserByLogin(query *m.GetUserByLoginQuery) error {
  112. if query.LoginOrEmail == "" {
  113. return m.ErrUserNotFound
  114. }
  115. user := new(m.User)
  116. if strings.Contains(query.LoginOrEmail, "@") {
  117. user = &m.User{Email: query.LoginOrEmail}
  118. } else {
  119. user = &m.User{Login: query.LoginOrEmail}
  120. }
  121. has, err := x.Get(user)
  122. if err != nil {
  123. return err
  124. } else if has == false {
  125. return m.ErrUserNotFound
  126. }
  127. query.Result = user
  128. return nil
  129. }
  130. func UpdateUser(cmd *m.UpdateUserCommand) error {
  131. return inTransaction2(func(sess *session) error {
  132. user := m.User{
  133. Name: cmd.Name,
  134. Email: cmd.Email,
  135. Login: cmd.Login,
  136. Updated: time.Now(),
  137. }
  138. if _, err := sess.Id(cmd.UserId).Update(&user); err != nil {
  139. return err
  140. }
  141. sess.publishAfterCommit(&events.UserUpdated{
  142. Timestamp: user.Created,
  143. Id: user.Id,
  144. Name: user.Name,
  145. Login: user.Login,
  146. Email: user.Email,
  147. })
  148. return nil
  149. })
  150. }
  151. func ChangeUserPassword(cmd *m.ChangeUserPasswordCommand) error {
  152. return inTransaction2(func(sess *session) error {
  153. user := m.User{
  154. Password: cmd.NewPassword,
  155. Updated: time.Now(),
  156. }
  157. if _, err := sess.Id(cmd.UserId).Update(&user); err != nil {
  158. return err
  159. }
  160. return nil
  161. })
  162. }
  163. func SetUsingOrg(cmd *m.SetUsingOrgCommand) error {
  164. return inTransaction(func(sess *xorm.Session) error {
  165. user := m.User{}
  166. sess.Id(cmd.UserId).Get(&user)
  167. user.OrgId = cmd.OrgId
  168. _, err := sess.Id(user.Id).Update(&user)
  169. return err
  170. })
  171. }
  172. func GetUserInfo(query *m.GetUserInfoQuery) error {
  173. var user m.User
  174. has, err := x.Id(query.UserId).Get(&user)
  175. if err != nil {
  176. return err
  177. } else if has == false {
  178. return m.ErrUserNotFound
  179. }
  180. query.Result = m.UserDTO{
  181. Name: user.Name,
  182. Email: user.Email,
  183. Login: user.Login,
  184. }
  185. return err
  186. }
  187. func GetUserOrgList(query *m.GetUserOrgListQuery) error {
  188. query.Result = make([]*m.UserOrgDTO, 0)
  189. sess := x.Table("org_user")
  190. sess.Join("INNER", "org", "org_user.org_id=org.id")
  191. sess.Where("org_user.user_id=?", query.UserId)
  192. sess.Cols("org.name", "org_user.role", "org_user.org_id")
  193. err := sess.Find(&query.Result)
  194. return err
  195. }
  196. func GetSignedInUser(query *m.GetSignedInUserQuery) error {
  197. var rawSql = `SELECT
  198. u.id as user_id,
  199. u.is_admin as is_grafana_admin,
  200. u.email as email,
  201. u.login as login,
  202. u.name as name,
  203. org.name as org_name,
  204. org_user.role as org_role,
  205. org.id as org_id
  206. FROM ` + dialect.Quote("user") + ` as u
  207. LEFT OUTER JOIN org_user on org_user.org_id = u.org_id and org_user.user_id = u.id
  208. LEFT OUTER JOIN org on org.id = u.org_id
  209. WHERE u.id=?`
  210. var user m.SignedInUser
  211. sess := x.Table("user")
  212. has, err := sess.Sql(rawSql, query.UserId).Get(&user)
  213. if err != nil {
  214. return err
  215. } else if !has {
  216. return m.ErrUserNotFound
  217. }
  218. query.Result = &user
  219. return err
  220. }
  221. func SearchUsers(query *m.SearchUsersQuery) error {
  222. query.Result = make([]*m.UserSearchHitDTO, 0)
  223. sess := x.Table("user")
  224. sess.Where("email LIKE ?", query.Query+"%")
  225. sess.Limit(query.Limit, query.Limit*query.Page)
  226. sess.Cols("id", "email", "name", "login", "is_admin")
  227. err := sess.Find(&query.Result)
  228. return err
  229. }
  230. func DeleteUser(cmd *m.DeleteUserCommand) error {
  231. return inTransaction(func(sess *xorm.Session) error {
  232. var rawSql = fmt.Sprintf("DELETE FROM %s WHERE id=?", x.Dialect().Quote("user"))
  233. _, err := sess.Exec(rawSql, cmd.UserId)
  234. return err
  235. })
  236. }