2019-11-29 12:59:40 +01:00
|
|
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
|
|
|
// See LICENSE.txt for license information.
|
2016-05-27 08:35:55 -07:00
|
|
|
|
|
|
|
|
package utils
|
|
|
|
|
|
|
|
|
|
import (
|
2017-09-05 20:34:17 +01:00
|
|
|
"net/http"
|
2016-05-27 08:35:55 -07:00
|
|
|
"testing"
|
2017-09-05 20:34:17 +01:00
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
2016-05-27 08:35:55 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestStringArrayIntersection(t *testing.T) {
|
|
|
|
|
a := []string{
|
|
|
|
|
"abc",
|
|
|
|
|
"def",
|
|
|
|
|
"ghi",
|
|
|
|
|
}
|
|
|
|
|
b := []string{
|
|
|
|
|
"jkl",
|
|
|
|
|
}
|
|
|
|
|
c := []string{
|
|
|
|
|
"def",
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-22 12:35:31 +01:00
|
|
|
assert.Empty(t, StringArrayIntersection(a, b))
|
2019-10-25 04:55:58 +02:00
|
|
|
assert.Len(t, StringArrayIntersection(a, c), 1)
|
2016-05-27 08:35:55 -07:00
|
|
|
}
|
2016-09-30 11:06:30 -04:00
|
|
|
|
|
|
|
|
func TestRemoveDuplicatesFromStringArray(t *testing.T) {
|
|
|
|
|
a := []string{
|
|
|
|
|
"a",
|
|
|
|
|
"b",
|
|
|
|
|
"a",
|
|
|
|
|
"a",
|
|
|
|
|
"b",
|
|
|
|
|
"c",
|
|
|
|
|
"a",
|
|
|
|
|
}
|
|
|
|
|
|
2019-10-25 04:55:58 +02:00
|
|
|
assert.Len(t, RemoveDuplicatesFromStringArray(a), 3)
|
2016-09-30 11:06:30 -04:00
|
|
|
}
|
2017-09-05 20:34:17 +01:00
|
|
|
|
2019-03-15 17:53:53 +00:00
|
|
|
func TestStringSliceDiff(t *testing.T) {
|
|
|
|
|
a := []string{"one", "two", "three", "four", "five", "six"}
|
|
|
|
|
b := []string{"two", "seven", "four", "six"}
|
|
|
|
|
expected := []string{"one", "three", "five"}
|
|
|
|
|
|
2019-10-25 04:55:58 +02:00
|
|
|
assert.Equal(t, expected, StringSliceDiff(a, b))
|
2019-03-15 17:53:53 +00:00
|
|
|
}
|
|
|
|
|
|
2017-09-05 20:34:17 +01:00
|
|
|
func TestGetIpAddress(t *testing.T) {
|
|
|
|
|
// Test with a single IP in the X-Forwarded-For
|
|
|
|
|
httpRequest1 := http.Request{
|
|
|
|
|
Header: http.Header{
|
|
|
|
|
"X-Forwarded-For": []string{"10.0.0.1"},
|
|
|
|
|
"X-Real-Ip": []string{"10.1.0.1"},
|
|
|
|
|
},
|
|
|
|
|
RemoteAddr: "10.2.0.1:12345",
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-24 20:22:13 +02:00
|
|
|
assert.Equal(t, "10.0.0.1", GetIpAddress(&httpRequest1, []string{"X-Forwarded-For"}))
|
2017-09-05 20:34:17 +01:00
|
|
|
|
|
|
|
|
// Test with multiple IPs in the X-Forwarded-For
|
|
|
|
|
httpRequest2 := http.Request{
|
|
|
|
|
Header: http.Header{
|
|
|
|
|
"X-Forwarded-For": []string{"10.0.0.1, 10.0.0.2, 10.0.0.3"},
|
|
|
|
|
"X-Real-Ip": []string{"10.1.0.1"},
|
|
|
|
|
},
|
|
|
|
|
RemoteAddr: "10.2.0.1:12345",
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-24 20:22:13 +02:00
|
|
|
assert.Equal(t, "10.0.0.1", GetIpAddress(&httpRequest2, []string{"X-Forwarded-For"}))
|
2017-09-05 20:34:17 +01:00
|
|
|
|
|
|
|
|
// Test with an empty X-Forwarded-For
|
|
|
|
|
httpRequest3 := http.Request{
|
|
|
|
|
Header: http.Header{
|
|
|
|
|
"X-Forwarded-For": []string{""},
|
|
|
|
|
"X-Real-Ip": []string{"10.1.0.1"},
|
|
|
|
|
},
|
|
|
|
|
RemoteAddr: "10.2.0.1:12345",
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-24 20:22:13 +02:00
|
|
|
assert.Equal(t, "10.1.0.1", GetIpAddress(&httpRequest3, []string{"X-Forwarded-For", "X-Real-Ip"}))
|
2017-09-05 20:34:17 +01:00
|
|
|
|
|
|
|
|
// Test without an X-Fowarded-For
|
|
|
|
|
httpRequest4 := http.Request{
|
|
|
|
|
Header: http.Header{
|
|
|
|
|
"X-Real-Ip": []string{"10.1.0.1"},
|
|
|
|
|
},
|
|
|
|
|
RemoteAddr: "10.2.0.1:12345",
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-24 20:22:13 +02:00
|
|
|
assert.Equal(t, "10.1.0.1", GetIpAddress(&httpRequest4, []string{"X-Forwarded-For", "X-Real-Ip"}))
|
2017-09-05 20:34:17 +01:00
|
|
|
|
|
|
|
|
// Test without any headers
|
|
|
|
|
httpRequest5 := http.Request{
|
|
|
|
|
RemoteAddr: "10.2.0.1:12345",
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-24 20:22:13 +02:00
|
|
|
assert.Equal(t, "10.2.0.1", GetIpAddress(&httpRequest5, []string{"X-Forwarded-For", "X-Real-Ip"}))
|
|
|
|
|
|
|
|
|
|
// Test with both headers, but both untrusted
|
|
|
|
|
httpRequest6 := http.Request{
|
|
|
|
|
Header: http.Header{
|
|
|
|
|
"X-Forwarded-For": []string{"10.3.0.1"},
|
|
|
|
|
"X-Real-Ip": []string{"10.1.0.1"},
|
|
|
|
|
},
|
|
|
|
|
RemoteAddr: "10.2.0.1:12345",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert.Equal(t, "10.2.0.1", GetIpAddress(&httpRequest6, nil))
|
|
|
|
|
|
|
|
|
|
// Test with both headers, but only X-Real-Ip trusted
|
|
|
|
|
httpRequest7 := http.Request{
|
|
|
|
|
Header: http.Header{
|
|
|
|
|
"X-Forwarded-For": []string{"10.3.0.1"},
|
|
|
|
|
"X-Real-Ip": []string{"10.1.0.1"},
|
|
|
|
|
},
|
|
|
|
|
RemoteAddr: "10.2.0.1:12345",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert.Equal(t, "10.1.0.1", GetIpAddress(&httpRequest7, []string{"X-Real-Ip"}))
|
|
|
|
|
|
|
|
|
|
// Test with X-Forwarded-For, comma separated, untrusted
|
|
|
|
|
httpRequest8 := http.Request{
|
|
|
|
|
Header: http.Header{
|
|
|
|
|
"X-Forwarded-For": []string{"10.3.0.1, 10.1.0.1"},
|
|
|
|
|
},
|
|
|
|
|
RemoteAddr: "10.2.0.1:12345",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert.Equal(t, "10.2.0.1", GetIpAddress(&httpRequest8, nil))
|
|
|
|
|
|
|
|
|
|
// Test with X-Forwarded-For, comma separated, untrusted
|
|
|
|
|
httpRequest9 := http.Request{
|
|
|
|
|
Header: http.Header{
|
|
|
|
|
"X-Forwarded-For": []string{"10.3.0.1, 10.1.0.1"},
|
|
|
|
|
},
|
|
|
|
|
RemoteAddr: "10.2.0.1:12345",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert.Equal(t, "10.3.0.1", GetIpAddress(&httpRequest9, []string{"X-Forwarded-For"}))
|
|
|
|
|
|
|
|
|
|
// Test with both headers, both allowed, first one in trusted used
|
|
|
|
|
httpRequest10 := http.Request{
|
|
|
|
|
Header: http.Header{
|
|
|
|
|
"X-Forwarded-For": []string{"10.3.0.1"},
|
|
|
|
|
"X-Real-Ip": []string{"10.1.0.1"},
|
|
|
|
|
},
|
|
|
|
|
RemoteAddr: "10.2.0.1:12345",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert.Equal(t, "10.1.0.1", GetIpAddress(&httpRequest10, []string{"X-Real-Ip", "X-Forwarded-For"}))
|
2017-09-05 20:34:17 +01:00
|
|
|
}
|
2019-11-18 19:02:41 -05:00
|
|
|
|
|
|
|
|
func TestRemoveStringFromSlice(t *testing.T) {
|
|
|
|
|
a := []string{"one", "two", "three", "four", "five", "six"}
|
|
|
|
|
expected := []string{"one", "two", "three", "five", "six"}
|
|
|
|
|
|
|
|
|
|
assert.Equal(t, RemoveStringFromSlice("four", a), expected)
|
|
|
|
|
}
|
2021-01-19 21:16:22 +05:30
|
|
|
|
|
|
|
|
func TestAppendQueryParamsToURL(t *testing.T) {
|
|
|
|
|
url := "mattermost://callback"
|
|
|
|
|
redirectUrl := AppendQueryParamsToURL(url, map[string]string{
|
|
|
|
|
"key1": "value1",
|
|
|
|
|
"key2": "value2",
|
|
|
|
|
})
|
|
|
|
|
expected := url + "?key1=value1&key2=value2"
|
|
|
|
|
assert.Equal(t, redirectUrl, expected)
|
|
|
|
|
}
|