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.
 
 
 

275 rivejä
6.6 KiB

  1. // Copyright 2012 The Gorilla Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package securecookie
  5. import (
  6. "crypto/aes"
  7. "crypto/hmac"
  8. "crypto/sha256"
  9. "encoding/base64"
  10. "fmt"
  11. "reflect"
  12. "strings"
  13. "testing"
  14. )
  15. // Asserts that cookieError and MultiError are Error implementations.
  16. var _ Error = cookieError{}
  17. var _ Error = MultiError{}
  18. var testCookies = []interface{}{
  19. map[string]string{"foo": "bar"},
  20. map[string]string{"baz": "ding"},
  21. }
  22. var testStrings = []string{"foo", "bar", "baz"}
  23. func TestSecureCookie(t *testing.T) {
  24. // TODO test too old / too new timestamps
  25. s1 := New([]byte("12345"), []byte("1234567890123456"))
  26. s2 := New([]byte("54321"), []byte("6543210987654321"))
  27. value := map[string]interface{}{
  28. "foo": "bar",
  29. "baz": 128,
  30. }
  31. for i := 0; i < 50; i++ {
  32. // Running this multiple times to check if any special character
  33. // breaks encoding/decoding.
  34. encoded, err1 := s1.Encode("sid", value)
  35. if err1 != nil {
  36. t.Error(err1)
  37. continue
  38. }
  39. dst := make(map[string]interface{})
  40. err2 := s1.Decode("sid", encoded, &dst)
  41. if err2 != nil {
  42. t.Fatalf("%v: %v", err2, encoded)
  43. }
  44. if !reflect.DeepEqual(dst, value) {
  45. t.Fatalf("Expected %v, got %v.", value, dst)
  46. }
  47. dst2 := make(map[string]interface{})
  48. err3 := s2.Decode("sid", encoded, &dst2)
  49. if err3 == nil {
  50. t.Fatalf("Expected failure decoding.")
  51. }
  52. err4, ok := err3.(Error)
  53. if !ok {
  54. t.Fatalf("Expected error to implement Error, got: %#v", err3)
  55. }
  56. if !err4.IsDecode() {
  57. t.Fatalf("Expected DecodeError, got: %#v", err4)
  58. }
  59. // Test other error type flags.
  60. if err4.IsUsage() {
  61. t.Fatalf("Expected IsUsage() == false, got: %#v", err4)
  62. }
  63. if err4.IsInternal() {
  64. t.Fatalf("Expected IsInternal() == false, got: %#v", err4)
  65. }
  66. }
  67. }
  68. func TestSecureCookieNilKey(t *testing.T) {
  69. s1 := New(nil, nil)
  70. value := map[string]interface{}{
  71. "foo": "bar",
  72. "baz": 128,
  73. }
  74. _, err := s1.Encode("sid", value)
  75. if err != errHashKeyNotSet {
  76. t.Fatal("Wrong error returned:", err)
  77. }
  78. }
  79. func TestDecodeInvalid(t *testing.T) {
  80. // List of invalid cookies, which must not be accepted, base64-decoded
  81. // (they will be encoded before passing to Decode).
  82. invalidCookies := []string{
  83. "",
  84. " ",
  85. "\n",
  86. "||",
  87. "|||",
  88. "cookie",
  89. }
  90. s := New([]byte("12345"), nil)
  91. var dst string
  92. for i, v := range invalidCookies {
  93. for _, enc := range []*base64.Encoding{
  94. base64.StdEncoding,
  95. base64.URLEncoding,
  96. } {
  97. err := s.Decode("name", enc.EncodeToString([]byte(v)), &dst)
  98. if err == nil {
  99. t.Fatalf("%d: expected failure decoding", i)
  100. }
  101. err2, ok := err.(Error)
  102. if !ok || !err2.IsDecode() {
  103. t.Fatalf("%d: Expected IsDecode(), got: %#v", i, err)
  104. }
  105. }
  106. }
  107. }
  108. func TestAuthentication(t *testing.T) {
  109. hash := hmac.New(sha256.New, []byte("secret-key"))
  110. for _, value := range testStrings {
  111. hash.Reset()
  112. signed := createMac(hash, []byte(value))
  113. hash.Reset()
  114. err := verifyMac(hash, []byte(value), signed)
  115. if err != nil {
  116. t.Error(err)
  117. }
  118. }
  119. }
  120. func TestEncryption(t *testing.T) {
  121. block, err := aes.NewCipher([]byte("1234567890123456"))
  122. if err != nil {
  123. t.Fatalf("Block could not be created")
  124. }
  125. var encrypted, decrypted []byte
  126. for _, value := range testStrings {
  127. if encrypted, err = encrypt(block, []byte(value)); err != nil {
  128. t.Error(err)
  129. } else {
  130. if decrypted, err = decrypt(block, encrypted); err != nil {
  131. t.Error(err)
  132. }
  133. if string(decrypted) != value {
  134. t.Errorf("Expected %v, got %v.", value, string(decrypted))
  135. }
  136. }
  137. }
  138. }
  139. func TestGobSerialization(t *testing.T) {
  140. var (
  141. sz GobEncoder
  142. serialized []byte
  143. deserialized map[string]string
  144. err error
  145. )
  146. for _, value := range testCookies {
  147. if serialized, err = sz.Serialize(value); err != nil {
  148. t.Error(err)
  149. } else {
  150. deserialized = make(map[string]string)
  151. if err = sz.Deserialize(serialized, &deserialized); err != nil {
  152. t.Error(err)
  153. }
  154. if fmt.Sprintf("%v", deserialized) != fmt.Sprintf("%v", value) {
  155. t.Errorf("Expected %v, got %v.", value, deserialized)
  156. }
  157. }
  158. }
  159. }
  160. func TestJSONSerialization(t *testing.T) {
  161. var (
  162. sz JSONEncoder
  163. serialized []byte
  164. deserialized map[string]string
  165. err error
  166. )
  167. for _, value := range testCookies {
  168. if serialized, err = sz.Serialize(value); err != nil {
  169. t.Error(err)
  170. } else {
  171. deserialized = make(map[string]string)
  172. if err = sz.Deserialize(serialized, &deserialized); err != nil {
  173. t.Error(err)
  174. }
  175. if fmt.Sprintf("%v", deserialized) != fmt.Sprintf("%v", value) {
  176. t.Errorf("Expected %v, got %v.", value, deserialized)
  177. }
  178. }
  179. }
  180. }
  181. func TestEncoding(t *testing.T) {
  182. for _, value := range testStrings {
  183. encoded := encode([]byte(value))
  184. decoded, err := decode(encoded)
  185. if err != nil {
  186. t.Error(err)
  187. } else if string(decoded) != value {
  188. t.Errorf("Expected %v, got %s.", value, string(decoded))
  189. }
  190. }
  191. }
  192. func TestMultiError(t *testing.T) {
  193. s1, s2 := New(nil, nil), New(nil, nil)
  194. _, err := EncodeMulti("sid", "value", s1, s2)
  195. if len(err.(MultiError)) != 2 {
  196. t.Errorf("Expected 2 errors, got %s.", err)
  197. } else {
  198. if strings.Index(err.Error(), "hash key is not set") == -1 {
  199. t.Errorf("Expected missing hash key error, got %s.", err.Error())
  200. }
  201. ourErr, ok := err.(Error)
  202. if !ok || !ourErr.IsUsage() {
  203. t.Fatalf("Expected error to be a usage error; got %#v", err)
  204. }
  205. if ourErr.IsDecode() {
  206. t.Errorf("Expected error NOT to be a decode error; got %#v", ourErr)
  207. }
  208. if ourErr.IsInternal() {
  209. t.Errorf("Expected error NOT to be an internal error; got %#v", ourErr)
  210. }
  211. }
  212. }
  213. func TestMultiNoCodecs(t *testing.T) {
  214. _, err := EncodeMulti("foo", "bar")
  215. if err != errNoCodecs {
  216. t.Errorf("EncodeMulti: bad value for error, got: %v", err)
  217. }
  218. var dst []byte
  219. err = DecodeMulti("foo", "bar", &dst)
  220. if err != errNoCodecs {
  221. t.Errorf("DecodeMulti: bad value for error, got: %v", err)
  222. }
  223. }
  224. func TestMissingKey(t *testing.T) {
  225. s1 := New(nil, nil)
  226. var dst []byte
  227. err := s1.Decode("sid", "value", &dst)
  228. if err != errHashKeyNotSet {
  229. t.Fatalf("Expected %#v, got %#v", errHashKeyNotSet, err)
  230. }
  231. if err2, ok := err.(Error); !ok || !err2.IsUsage() {
  232. t.Errorf("Expected missing hash key to be IsUsage(); was %#v", err)
  233. }
  234. }
  235. // ----------------------------------------------------------------------------
  236. type FooBar struct {
  237. Foo int
  238. Bar string
  239. }
  240. func TestCustomType(t *testing.T) {
  241. s1 := New([]byte("12345"), []byte("1234567890123456"))
  242. // Type is not registered in gob. (!!!)
  243. src := &FooBar{42, "bar"}
  244. encoded, _ := s1.Encode("sid", src)
  245. dst := &FooBar{}
  246. _ = s1.Decode("sid", encoded, dst)
  247. if dst.Foo != 42 || dst.Bar != "bar" {
  248. t.Fatalf("Expected %#v, got %#v", src, dst)
  249. }
  250. }