sessionstore_test.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package sessionstore_test
  2. import (
  3. "encoding/base64"
  4. "net/http"
  5. "testing"
  6. "github.com/porter-dev/porter/internal/config"
  7. "github.com/gorilla/securecookie"
  8. "github.com/gorilla/sessions"
  9. "github.com/porter-dev/porter/internal/repository/test"
  10. sessionstore "github.com/porter-dev/porter/internal/auth"
  11. )
  12. type headerOnlyResponseWriter http.Header
  13. func (ho headerOnlyResponseWriter) Header() http.Header {
  14. return http.Header(ho)
  15. }
  16. func (ho headerOnlyResponseWriter) Write([]byte) (int, error) {
  17. panic("NOIMPL")
  18. }
  19. func (ho headerOnlyResponseWriter) WriteHeader(int) {
  20. panic("NOIMPL")
  21. }
  22. var secret = "secret"
  23. func TestPGStore(t *testing.T) {
  24. repo := test.NewRepository(true)
  25. ss, err := sessionstore.NewStore(repo, config.ServerConf{
  26. CookieSecret: []byte("secret"),
  27. })
  28. if err != nil {
  29. t.Fatal("Failed to get store", err)
  30. }
  31. // ROUND 1 - Check that the cookie is being saved
  32. req, err := http.NewRequest("GET", "http://www.example.com", nil)
  33. if err != nil {
  34. t.Fatal("failed to create request", err)
  35. }
  36. session, err := ss.Get(req, "mysess")
  37. if err != nil {
  38. t.Fatal("failed to get session", err.Error())
  39. }
  40. session.Values["counter"] = 1
  41. m := make(http.Header)
  42. if err = ss.Save(req, headerOnlyResponseWriter(m), session); err != nil {
  43. t.Fatal("Failed to save session:", err.Error())
  44. }
  45. if m["Set-Cookie"][0][0:6] != "mysess" {
  46. t.Fatal("Cookie wasn't set!")
  47. }
  48. // ROUND 2 - check that the cookie can be retrieved
  49. req, err = http.NewRequest("GET", "http://www.example.com", nil)
  50. if err != nil {
  51. t.Fatal("failed to create round 2 request", err)
  52. }
  53. encoded, err := securecookie.EncodeMulti(session.Name(), session.ID, ss.Codecs...)
  54. if err != nil {
  55. t.Fatal("Failed to make cookie value", err)
  56. }
  57. req.AddCookie(sessions.NewCookie(session.Name(), encoded, session.Options))
  58. session, err = ss.Get(req, "mysess")
  59. if err != nil {
  60. t.Fatal("failed to get round 2 session", err.Error())
  61. }
  62. if session.Values["counter"] != 1 {
  63. t.Fatal("Retrieved session had wrong value:", session.Values["counter"])
  64. }
  65. session.Values["counter"] = 9 // set new value for round 3
  66. if err = ss.Save(req, headerOnlyResponseWriter(m), session); err != nil {
  67. t.Fatal("Failed to save session:", err.Error())
  68. }
  69. // ROUND 2 - check that the cookie has been updated
  70. req, err = http.NewRequest("GET", "http://www.example.com", nil)
  71. if err != nil {
  72. t.Fatal("failed to create round 3 request", err)
  73. }
  74. req.AddCookie(sessions.NewCookie(session.Name(), encoded, session.Options))
  75. session, err = ss.Get(req, "mysess")
  76. if err != nil {
  77. t.Fatal("failed to get session round 3", err.Error())
  78. }
  79. if session.Values["counter"] != 9 {
  80. t.Fatal("Retrieved session had wrong value in round 3:", session.Values["counter"])
  81. }
  82. // ROUND 3 - Increase max length
  83. req, err = http.NewRequest("GET", "http://www.example.com", nil)
  84. if err != nil {
  85. t.Fatal("failed to create round 3 request", err)
  86. }
  87. req.AddCookie(sessions.NewCookie(session.Name(), encoded, session.Options))
  88. session, err = ss.New(req, "my session")
  89. if err != nil {
  90. t.Fatal("failed to create session", err)
  91. }
  92. session.Values["big"] = make([]byte, base64.StdEncoding.DecodedLen(4096*2))
  93. if err = ss.Save(req, headerOnlyResponseWriter(m), session); err == nil {
  94. t.Fatal("expected an error, got nil")
  95. }
  96. ss.MaxLength(4096 * 3) // A bit more than the value size to account for encoding overhead.
  97. if err = ss.Save(req, headerOnlyResponseWriter(m), session); err != nil {
  98. t.Fatal("Failed to save session:", err.Error())
  99. }
  100. }
  101. func TestSessionOptionsAreUniquePerSession(t *testing.T) {
  102. repo := test.NewRepository(true)
  103. ss, err := sessionstore.NewStore(repo, config.ServerConf{
  104. CookieSecret: []byte("secret"),
  105. })
  106. if err != nil {
  107. t.Fatal("Failed to get store", err)
  108. }
  109. ss.Options.MaxAge = 900
  110. req, err := http.NewRequest("GET", "http://www.example.com", nil)
  111. if err != nil {
  112. t.Fatal("Failed to create request", err)
  113. }
  114. session, err := ss.Get(req, "newsess")
  115. if err != nil {
  116. t.Fatal("Failed to create session", err)
  117. }
  118. session.Options.MaxAge = -1
  119. if ss.Options.MaxAge != 900 {
  120. t.Fatalf("PGStore.Options.MaxAge: expected %d, got %d", 900, ss.Options.MaxAge)
  121. }
  122. }