You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

session.go 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // Copyright 2020 The Gitea 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. "fmt"
  7. "code.gitea.io/gitea/modules/timeutil"
  8. )
  9. // Session represents a session compatible for go-chi session
  10. type Session struct {
  11. Key string `xorm:"pk CHAR(16)"` // has to be Key to match with go-chi/session
  12. Data []byte `xorm:"BLOB"`
  13. Expiry timeutil.TimeStamp // has to be Expiry to match with go-chi/session
  14. }
  15. // UpdateSession updates the session with provided id
  16. func UpdateSession(key string, data []byte) error {
  17. _, err := x.ID(key).Update(&Session{
  18. Data: data,
  19. Expiry: timeutil.TimeStampNow(),
  20. })
  21. return err
  22. }
  23. // ReadSession reads the data for the provided session
  24. func ReadSession(key string) (*Session, error) {
  25. session := Session{
  26. Key: key,
  27. }
  28. sess := x.NewSession()
  29. defer sess.Close()
  30. if err := sess.Begin(); err != nil {
  31. return nil, err
  32. }
  33. if has, err := sess.Get(&session); err != nil {
  34. return nil, err
  35. } else if !has {
  36. session.Expiry = timeutil.TimeStampNow()
  37. _, err := sess.Insert(&session)
  38. if err != nil {
  39. return nil, err
  40. }
  41. }
  42. return &session, sess.Commit()
  43. }
  44. // ExistSession checks if a session exists
  45. func ExistSession(key string) (bool, error) {
  46. session := Session{
  47. Key: key,
  48. }
  49. return x.Get(&session)
  50. }
  51. // DestroySession destroys a session
  52. func DestroySession(key string) error {
  53. _, err := x.Delete(&Session{
  54. Key: key,
  55. })
  56. return err
  57. }
  58. // RegenerateSession regenerates a session from the old id
  59. func RegenerateSession(oldKey, newKey string) (*Session, error) {
  60. sess := x.NewSession()
  61. defer sess.Close()
  62. if err := sess.Begin(); err != nil {
  63. return nil, err
  64. }
  65. if has, err := sess.Get(&Session{
  66. Key: newKey,
  67. }); err != nil {
  68. return nil, err
  69. } else if has {
  70. return nil, fmt.Errorf("session Key: %s already exists", newKey)
  71. }
  72. if has, err := sess.Get(&Session{
  73. Key: oldKey,
  74. }); err != nil {
  75. return nil, err
  76. } else if !has {
  77. _, err := sess.Insert(&Session{
  78. Key: oldKey,
  79. Expiry: timeutil.TimeStampNow(),
  80. })
  81. if err != nil {
  82. return nil, err
  83. }
  84. }
  85. if _, err := sess.Exec("UPDATE "+sess.Engine().TableName(&Session{})+" SET `key` = ? WHERE `key`=?", newKey, oldKey); err != nil {
  86. return nil, err
  87. }
  88. s := Session{
  89. Key: newKey,
  90. }
  91. if _, err := sess.Get(&s); err != nil {
  92. return nil, err
  93. }
  94. return &s, sess.Commit()
  95. }
  96. // CountSessions returns the number of sessions
  97. func CountSessions() (int64, error) {
  98. return x.Count(&Session{})
  99. }
  100. // CleanupSessions cleans up expired sessions
  101. func CleanupSessions(maxLifetime int64) error {
  102. _, err := x.Where("expiry <= ?", timeutil.TimeStampNow().Add(-maxLifetime)).Delete(&Session{})
  103. return err
  104. }