github.com/gofiber/fiber/v2@v2.47.0/middleware/encryptcookie/encryptcookie_test.go (about)

     1  package encryptcookie
     2  
     3  import (
     4  	"encoding/base64"
     5  	"net/http/httptest"
     6  	"testing"
     7  
     8  	"github.com/gofiber/fiber/v2"
     9  	"github.com/gofiber/fiber/v2/utils"
    10  
    11  	"github.com/valyala/fasthttp"
    12  )
    13  
    14  var testKey = GenerateKey()
    15  
    16  func Test_Middleware_Encrypt_Cookie(t *testing.T) {
    17  	t.Parallel()
    18  	app := fiber.New()
    19  
    20  	app.Use(New(Config{
    21  		Key: testKey,
    22  	}))
    23  
    24  	app.Get("/", func(c *fiber.Ctx) error {
    25  		return c.SendString("value=" + c.Cookies("test"))
    26  	})
    27  	app.Post("/", func(c *fiber.Ctx) error {
    28  		c.Cookie(&fiber.Cookie{
    29  			Name:  "test",
    30  			Value: "SomeThing",
    31  		})
    32  		return nil
    33  	})
    34  
    35  	h := app.Handler()
    36  
    37  	// Test empty cookie
    38  	ctx := &fasthttp.RequestCtx{}
    39  	ctx.Request.Header.SetMethod(fiber.MethodGet)
    40  	h(ctx)
    41  	utils.AssertEqual(t, 200, ctx.Response.StatusCode())
    42  	utils.AssertEqual(t, "value=", string(ctx.Response.Body()))
    43  
    44  	// Test invalid cookie
    45  	ctx = &fasthttp.RequestCtx{}
    46  	ctx.Request.Header.SetMethod(fiber.MethodGet)
    47  	ctx.Request.Header.SetCookie("test", "Invalid")
    48  	h(ctx)
    49  	utils.AssertEqual(t, 200, ctx.Response.StatusCode())
    50  	utils.AssertEqual(t, "value=", string(ctx.Response.Body()))
    51  	ctx.Request.Header.SetCookie("test", "ixQURE2XOyZUs0WAOh2ehjWcP7oZb07JvnhWOsmeNUhPsj4+RyI=")
    52  	h(ctx)
    53  	utils.AssertEqual(t, 200, ctx.Response.StatusCode())
    54  	utils.AssertEqual(t, "value=", string(ctx.Response.Body()))
    55  
    56  	// Test valid cookie
    57  	ctx = &fasthttp.RequestCtx{}
    58  	ctx.Request.Header.SetMethod(fiber.MethodPost)
    59  	h(ctx)
    60  	utils.AssertEqual(t, 200, ctx.Response.StatusCode())
    61  
    62  	encryptedCookie := fasthttp.Cookie{}
    63  	encryptedCookie.SetKey("test")
    64  	utils.AssertEqual(t, true, ctx.Response.Header.Cookie(&encryptedCookie), "Get cookie value")
    65  	decryptedCookieValue, err := DecryptCookie(string(encryptedCookie.Value()), testKey)
    66  	utils.AssertEqual(t, nil, err)
    67  	utils.AssertEqual(t, "SomeThing", decryptedCookieValue)
    68  
    69  	ctx = &fasthttp.RequestCtx{}
    70  	ctx.Request.Header.SetMethod(fiber.MethodGet)
    71  	ctx.Request.Header.SetCookie("test", string(encryptedCookie.Value()))
    72  	h(ctx)
    73  	utils.AssertEqual(t, 200, ctx.Response.StatusCode())
    74  	utils.AssertEqual(t, "value=SomeThing", string(ctx.Response.Body()))
    75  }
    76  
    77  func Test_Encrypt_Cookie_Next(t *testing.T) {
    78  	t.Parallel()
    79  	app := fiber.New()
    80  
    81  	app.Use(New(Config{
    82  		Key: testKey,
    83  		Next: func(_ *fiber.Ctx) bool {
    84  			return true
    85  		},
    86  	}))
    87  
    88  	app.Get("/", func(c *fiber.Ctx) error {
    89  		c.Cookie(&fiber.Cookie{
    90  			Name:  "test",
    91  			Value: "SomeThing",
    92  		})
    93  		return nil
    94  	})
    95  
    96  	resp, err := app.Test(httptest.NewRequest(fiber.MethodGet, "/", nil))
    97  	utils.AssertEqual(t, nil, err)
    98  	utils.AssertEqual(t, "SomeThing", resp.Cookies()[0].Value)
    99  }
   100  
   101  func Test_Encrypt_Cookie_Except(t *testing.T) {
   102  	t.Parallel()
   103  	app := fiber.New()
   104  
   105  	app.Use(New(Config{
   106  		Key: testKey,
   107  		Except: []string{
   108  			"test1",
   109  		},
   110  	}))
   111  
   112  	app.Get("/", func(c *fiber.Ctx) error {
   113  		c.Cookie(&fiber.Cookie{
   114  			Name:  "test1",
   115  			Value: "SomeThing",
   116  		})
   117  		c.Cookie(&fiber.Cookie{
   118  			Name:  "test2",
   119  			Value: "SomeThing",
   120  		})
   121  
   122  		return nil
   123  	})
   124  
   125  	h := app.Handler()
   126  
   127  	ctx := &fasthttp.RequestCtx{}
   128  	ctx.Request.Header.SetMethod(fiber.MethodGet)
   129  	h(ctx)
   130  	utils.AssertEqual(t, 200, ctx.Response.StatusCode())
   131  
   132  	rawCookie := fasthttp.Cookie{}
   133  	rawCookie.SetKey("test1")
   134  	utils.AssertEqual(t, true, ctx.Response.Header.Cookie(&rawCookie), "Get cookie value")
   135  	utils.AssertEqual(t, "SomeThing", string(rawCookie.Value()))
   136  
   137  	encryptedCookie := fasthttp.Cookie{}
   138  	encryptedCookie.SetKey("test2")
   139  	utils.AssertEqual(t, true, ctx.Response.Header.Cookie(&encryptedCookie), "Get cookie value")
   140  	decryptedCookieValue, err := DecryptCookie(string(encryptedCookie.Value()), testKey)
   141  	utils.AssertEqual(t, nil, err)
   142  	utils.AssertEqual(t, "SomeThing", decryptedCookieValue)
   143  }
   144  
   145  func Test_Encrypt_Cookie_Custom_Encryptor(t *testing.T) {
   146  	t.Parallel()
   147  	app := fiber.New()
   148  
   149  	app.Use(New(Config{
   150  		Key: testKey,
   151  		Encryptor: func(decryptedString, _ string) (string, error) {
   152  			return base64.StdEncoding.EncodeToString([]byte(decryptedString)), nil
   153  		},
   154  		Decryptor: func(encryptedString, _ string) (string, error) {
   155  			decodedBytes, err := base64.StdEncoding.DecodeString(encryptedString)
   156  			return string(decodedBytes), err
   157  		},
   158  	}))
   159  
   160  	app.Get("/", func(c *fiber.Ctx) error {
   161  		return c.SendString("value=" + c.Cookies("test"))
   162  	})
   163  	app.Post("/", func(c *fiber.Ctx) error {
   164  		c.Cookie(&fiber.Cookie{
   165  			Name:  "test",
   166  			Value: "SomeThing",
   167  		})
   168  
   169  		return nil
   170  	})
   171  
   172  	h := app.Handler()
   173  
   174  	ctx := &fasthttp.RequestCtx{}
   175  	ctx.Request.Header.SetMethod(fiber.MethodPost)
   176  	h(ctx)
   177  	utils.AssertEqual(t, 200, ctx.Response.StatusCode())
   178  
   179  	encryptedCookie := fasthttp.Cookie{}
   180  	encryptedCookie.SetKey("test")
   181  	utils.AssertEqual(t, true, ctx.Response.Header.Cookie(&encryptedCookie), "Get cookie value")
   182  	decodedBytes, err := base64.StdEncoding.DecodeString(string(encryptedCookie.Value()))
   183  	utils.AssertEqual(t, nil, err)
   184  	utils.AssertEqual(t, "SomeThing", string(decodedBytes))
   185  
   186  	ctx = &fasthttp.RequestCtx{}
   187  	ctx.Request.Header.SetMethod(fiber.MethodGet)
   188  	ctx.Request.Header.SetCookie("test", string(encryptedCookie.Value()))
   189  	h(ctx)
   190  	utils.AssertEqual(t, 200, ctx.Response.StatusCode())
   191  	utils.AssertEqual(t, "value=SomeThing", string(ctx.Response.Body()))
   192  }