Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

馃悰 Fix: EnvVar middleware parses base64 incorrectly #2069

Merged
merged 3 commits into from Sep 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
22 changes: 11 additions & 11 deletions middleware/envvar/README.md
Expand Up @@ -44,10 +44,12 @@ app.Use("/expose/envvars", envvar.New())
### Custom Config

```go
app.Use("/expose/envvars", envvar.New(envvar.Config{
ExportVars: map[string]string{"testKey": "", "testDefaultKey": "testDefaultVal"},
ExcludeVars: map[string]string{"excludeKey": ""}}
}))
app.Use("/expose/envvars", envvar.New(
envvar.Config{
ExportVars: map[string]string{"testKey": "", "testDefaultKey": "testDefaultVal"},
ExcludeVars: map[string]string{"excludeKey": ""},
}),
)
```

### Response
Expand All @@ -57,23 +59,21 @@ Http response contract:
{
"vars": {
"someEnvVariable": "someValue",
"anotherEnvVariable": "anotherValue",
"anotherEnvVariable": "anotherValue"
}
}

```

## Config

```go
// Config defines the config for middleware.
type Config struct {
// ExportVars specifies the environment variables that should export
ExportVars map[string]string
// ExcludeVars specifies the environment variables that should not export
ExcludeVars map[string]string
// ExportVars specifies the environment variables that should export
ExportVars map[string]string
// ExcludeVars specifies the environment variables that should not export
ExcludeVars map[string]string
}

```

## Default Config
Expand Down
16 changes: 6 additions & 10 deletions middleware/envvar/envvar.go
@@ -1,10 +1,10 @@
package envvar

import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/utils"
"os"
"strings"

"github.com/gofiber/fiber/v2"
)

// Config defines the config for middleware.
Expand Down Expand Up @@ -39,14 +39,10 @@ func New(config ...Config) fiber.Handler {
envVar := newEnvVar(cfg)
varsByte, err := c.App().Config().JSONEncoder(envVar)
if err != nil {
c.Response().SetBodyRaw(utils.UnsafeBytes(err.Error()))
c.Response().SetStatusCode(fiber.StatusInternalServerError)
return nil
return c.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
c.Response().SetBodyRaw(varsByte)
c.Response().SetStatusCode(fiber.StatusOK)
c.Response().Header.Set("Content-Type", "application/json; charset=utf-8")
return nil
c.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSONCharsetUTF8)
return c.Send(varsByte)
}
}

Expand All @@ -62,7 +58,7 @@ func newEnvVar(cfg Config) *EnvVar {
}
} else {
for _, envVal := range os.Environ() {
keyVal := strings.Split(envVal, "=")
keyVal := strings.SplitN(envVal, "=", 2)
if _, exists := cfg.ExcludeVars[keyVal[0]]; !exists {
vars.set(keyVal[0], keyVal[1])
}
Expand Down
40 changes: 38 additions & 2 deletions middleware/envvar/envvar_test.go
Expand Up @@ -2,12 +2,13 @@ package envvar

import (
"encoding/json"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/utils"
"io/ioutil"
"net/http"
"os"
"testing"

"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/utils"
)

func TestEnvVarStructWithExportVarsExcludeVars(t *testing.T) {
Expand Down Expand Up @@ -102,3 +103,38 @@ func TestEnvVarHandlerMethod(t *testing.T) {
utils.AssertEqual(t, nil, err)
utils.AssertEqual(t, fiber.StatusMethodNotAllowed, resp.StatusCode)
}

func TestEnvVarHandlerSpecialValue(t *testing.T) {
testEnvKey := "testEnvKey"
fakeBase64 := "testBase64:TQ=="
os.Setenv(testEnvKey, fakeBase64)
defer os.Unsetenv(testEnvKey)

app := fiber.New()
app.Use("/envvars", New())
app.Use("/envvars/export", New(Config{ExportVars: map[string]string{testEnvKey: ""}}))

req, _ := http.NewRequest("GET", "http://localhost/envvars", nil)
resp, err := app.Test(req)
utils.AssertEqual(t, nil, err)

respBody, err := ioutil.ReadAll(resp.Body)
utils.AssertEqual(t, nil, err)

var envVars EnvVar
utils.AssertEqual(t, nil, json.Unmarshal(respBody, &envVars))
val := envVars.Vars[testEnvKey]
utils.AssertEqual(t, fakeBase64, val)

req, _ = http.NewRequest("GET", "http://localhost/envvars/export", nil)
resp, err = app.Test(req)
utils.AssertEqual(t, nil, err)

respBody, err = ioutil.ReadAll(resp.Body)
utils.AssertEqual(t, nil, err)

var envVarsExport EnvVar
utils.AssertEqual(t, nil, json.Unmarshal(respBody, &envVarsExport))
val = envVarsExport.Vars[testEnvKey]
utils.AssertEqual(t, fakeBase64, val)
}