mirror of https://github.com/grafana/grafana
Chore: sanitize values before being logged from request headers (#49245)
* Chore: sanitize values being logged directly from request headerspull/49440/head
parent
51bc1bad1b
commit
dfab100dc7
@ -0,0 +1,57 @@ |
||||
package middleware |
||||
|
||||
import ( |
||||
"testing" |
||||
|
||||
"github.com/grafana/grafana/pkg/infra/log" |
||||
"github.com/grafana/grafana/pkg/models" |
||||
"github.com/stretchr/testify/assert" |
||||
) |
||||
|
||||
func Test_sanitizeURL(t *testing.T) { |
||||
type args struct { |
||||
ctx *models.ReqContext |
||||
s string |
||||
} |
||||
tests := []struct { |
||||
name string |
||||
args args |
||||
want string |
||||
}{ |
||||
{ |
||||
name: "Receiving empty string should return it", |
||||
args: args{ |
||||
ctx: &models.ReqContext{ |
||||
Logger: log.New("test.logger"), |
||||
}, |
||||
s: "", |
||||
}, |
||||
want: "", |
||||
}, |
||||
{ |
||||
name: "Receiving valid URL string should return it parsed", |
||||
args: args{ |
||||
ctx: &models.ReqContext{ |
||||
Logger: log.New("test.logger"), |
||||
}, |
||||
s: "https://grafana.com/", |
||||
}, |
||||
want: "https://grafana.com/", |
||||
}, |
||||
{ |
||||
name: "Receiving invalid URL string should return empty string", |
||||
args: args{ |
||||
ctx: &models.ReqContext{ |
||||
Logger: log.New("test.logger"), |
||||
}, |
||||
s: "this is not a valid URL", |
||||
}, |
||||
want: "", |
||||
}, |
||||
} |
||||
for _, tt := range tests { |
||||
t.Run(tt.name, func(t *testing.T) { |
||||
assert.Equalf(t, tt.want, sanitizeURL(tt.args.ctx, tt.args.s), "sanitizeURL(%v, %v)", tt.args.ctx, tt.args.s) |
||||
}) |
||||
} |
||||
} |
@ -0,0 +1,97 @@ |
||||
package web |
||||
|
||||
import ( |
||||
"net/http" |
||||
"testing" |
||||
|
||||
"github.com/grafana/grafana/pkg/infra/log" |
||||
) |
||||
|
||||
func TestContext_RemoteAddr(t *testing.T) { |
||||
type fields struct { |
||||
Req *http.Request |
||||
logger log.Logger |
||||
} |
||||
tests := []struct { |
||||
name string |
||||
fields fields |
||||
want string |
||||
}{ |
||||
{ |
||||
name: "Receive invalid ip address in headers should return RemoteAddr", |
||||
fields: fields{ |
||||
logger: log.New("test.logger"), |
||||
Req: &http.Request{ |
||||
RemoteAddr: "255.255.255.255", |
||||
Header: http.Header{ |
||||
"X-Real-Ip": []string{"this is not a valid IP"}, |
||||
"X-Forwarded-For": []string{"192.168.1.1"}, |
||||
}, |
||||
}, |
||||
}, |
||||
want: "255.255.255.255", |
||||
}, |
||||
{ |
||||
name: "Receive valid ip address in X-Real-Ip should return it", |
||||
fields: fields{ |
||||
logger: log.New("test.logger"), |
||||
Req: &http.Request{ |
||||
RemoteAddr: "255.255.255.255", |
||||
Header: http.Header{ |
||||
"X-Real-Ip": []string{"192.168.1.1"}, |
||||
"X-Forwarded-For": []string{"this is not a valid IP"}, |
||||
}, |
||||
}, |
||||
}, |
||||
want: "192.168.1.1", |
||||
}, |
||||
{ |
||||
name: "Receive valid ip addresses in X-Forwarded-For should return the first one", |
||||
fields: fields{ |
||||
logger: log.New("test.logger"), |
||||
Req: &http.Request{ |
||||
RemoteAddr: "255.255.255.255", |
||||
Header: http.Header{ |
||||
"X-Forwarded-For": []string{"192.168.1.1,255.255.255.255"}, |
||||
}, |
||||
}, |
||||
}, |
||||
want: "192.168.1.1", |
||||
}, |
||||
{ |
||||
name: "Receive valid ip addresses IPV6 in X-Forwarded-For should return it", |
||||
fields: fields{ |
||||
logger: log.New("test.logger"), |
||||
Req: &http.Request{ |
||||
RemoteAddr: "255.255.255.255", |
||||
Header: http.Header{ |
||||
"X-Forwarded-For": []string{"2001:db8:85a3:8d3:1319:8a2e:370:7348"}, |
||||
}, |
||||
}, |
||||
}, |
||||
want: "2001:db8:85a3:8d3:1319:8a2e:370:7348", |
||||
}, |
||||
{ |
||||
name: "When no header is informed, should return remote_addr without port", |
||||
fields: fields{ |
||||
logger: log.New("test.logger"), |
||||
Req: &http.Request{ |
||||
RemoteAddr: "[::1]:51299", |
||||
Header: http.Header{}, |
||||
}, |
||||
}, |
||||
want: "[::1]", |
||||
}, |
||||
} |
||||
for _, tt := range tests { |
||||
t.Run(tt.name, func(t *testing.T) { |
||||
ctx := &Context{ |
||||
Req: tt.fields.Req, |
||||
logger: tt.fields.logger, |
||||
} |
||||
if got := ctx.RemoteAddr(); got != tt.want { |
||||
t.Errorf("RemoteAddr() = %v, want %v", got, tt.want) |
||||
} |
||||
}) |
||||
} |
||||
} |
Loading…
Reference in new issue