* [MM-18757] POST handler for `/plugins/marketplace` (#12372) * Implement installMarketplacePlugin * Add InstallMarketplacePlugin endpoint * Fix go.mod * merge with master * Fix go.mod * Fix plugin tests * Move get plugin to marketplace client * Fix stylistic concerns * Add trailing newline to the go.mod * [MM-16586] Add plugin signature settings (#12390) * MM-17149 - Extend config.json for marketplace settings (#11933) * MM-17149 - Extend config.json for marketplace settings * Renamed MarketplaceUrl, tracking default marketplace url * Added EnableMarketplace to the client config * Revert "Added EnableMarketplace to the client config" This reverts commit 0f982c4c661c2cd9bb96264e9a01a2363c40d9c5. * MM-17149 - Added EnableMarketplace to the client config (#11958) * Added EnableMarketplace to the client config * Moved EnableMarketplace setting out of limited client configuration * Add public key settings to the config.json * Rename PublicKeys to SignaturePublicKeyFiles * Change filepath.Split to Base * Remove additional prints * Force extention of a public key file * Remove config validation * Remove error on delete * Remove config cloning * Add error messages * Add plugin public key tests * Rename extension to PluginSignaturePublicKeyFileExtention * Remove EnforceVerification * Change []*PublicKeyDescription to []string * Change .asc extension to .plugin.asc * Change ordering of public methods * Change plugin key commands * Update examples in the plugin key commands * Remove forcing extention * Add verify signature in settings * Fix tabbing * Fix naming * Remove unused text * Remove unused text * Update command examples * Fix unit tests * Change errors.New to errors.Wrap * Fix verbose flag * Change .asc to .gpg * Fix } * Change AddPublicKey signature * Change public.key extension * Add plugin public key command tests * Update en.json * Bootstrap the public keys * Update en.json * Fix en.json * Fix en.json * Bootstrap hard-coded public key * Remove unused texts in en.json * Change file to name * Add license header * Update development public key * Remove writeFile method * Remove .plugin.asc extension * Rename publiKey to mattermostPublicKey * Remove init_public_keys string * GolangCI * Closing file handlers * Fixed test that was installing nps plugin * [MM-19798] Implement plugin signature verification (#12768) * MM-17149 - Extend config.json for marketplace settings (#11933) * MM-17149 - Extend config.json for marketplace settings * Renamed MarketplaceUrl, tracking default marketplace url * Added EnableMarketplace to the client config * Revert "Added EnableMarketplace to the client config" This reverts commit 0f982c4c661c2cd9bb96264e9a01a2363c40d9c5. * MM-17149 - Added EnableMarketplace to the client config (#11958) * Added EnableMarketplace to the client config * Moved EnableMarketplace setting out of limited client configuration * Add public key settings to the config.json * Rename PublicKeys to SignaturePublicKeyFiles * Change filepath.Split to Base * Remove additional prints * Force extention of a public key file * Remove config validation * Remove error on delete * Remove config cloning * Add error messages * Add plugin public key tests * Rename extension to PluginSignaturePublicKeyFileExtention * Remove EnforceVerification * Change []*PublicKeyDescription to []string * Change .asc extension to .plugin.asc * Change ordering of public methods * Change plugin key commands * Update examples in the plugin key commands * Remove forcing extention * Add verify signature in settings * Fix tabbing * Fix naming * Remove unused text * Remove unused text * Update command examples * Fix unit tests * Change errors.New to errors.Wrap * Fix verbose flag * Change .asc to .gpg * Fix } * Change AddPublicKey signature * Change public.key extension * Add plugin public key command tests * Update en.json * Bootstrap the public keys * Update en.json * Fix en.json * Fix en.json * Bootstrap hard-coded public key * Remove unused texts in en.json * Change file to name * Add license header * Implement plugin signature verification * Remove benburker openpgp * Update en.json * Update development public key * Add support of multiple signatures in filestore * Update en.json * Run go mod vendor * Fix style * Remove writeFile method * Remove .plugin.asc extension * Rename publiKey to mattermostPublicKey * Verify plugin with mattermost public key * Remove init_public_keys string * Add InstallPluginWithSignature method and Refactor * Add signature verification on claster notification * Remove armored signature headers * Add error strings * Fix en.json * Change signatureStorePath * Implement minor fixes * Refactor plugin install methods * Add installPlugin method to uploadPlugin * Update en.json * Refactor installPlugin * Limit number of signatures * Close signatures * Fix helper function * Fix fromReadCloseSeekerToReadSeeker * Cleaned up ReadCloseSeeker for signatures * Remove signature truncation on FS * GolangCI * Add tests for armored signatures and plugin uploads * Fix nil slice issue * Fix TestPluginSync * Fixed tests * Return io.ReadSeeker from downloadFromUrl * Add log for the found plugins in the file store * Remove logging plugin detection info * [MM-20134] Consume and store single-signature for each plugin (#13081) * Consume and store single-signature for each plugin * Fix en.json * Remove saveSignature method * Remove public key hash * PR Feedback * refactored config * PR feedback
163 строки
4.0 KiB
Go
163 строки
4.0 KiB
Go
// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved.
|
|
// See License.txt for license information.
|
|
|
|
package utils
|
|
|
|
import (
|
|
"net/http"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestStringArrayIntersection(t *testing.T) {
|
|
a := []string{
|
|
"abc",
|
|
"def",
|
|
"ghi",
|
|
}
|
|
b := []string{
|
|
"jkl",
|
|
}
|
|
c := []string{
|
|
"def",
|
|
}
|
|
|
|
assert.Len(t, StringArrayIntersection(a, b), 0)
|
|
assert.Len(t, StringArrayIntersection(a, c), 1)
|
|
}
|
|
|
|
func TestRemoveDuplicatesFromStringArray(t *testing.T) {
|
|
a := []string{
|
|
"a",
|
|
"b",
|
|
"a",
|
|
"a",
|
|
"b",
|
|
"c",
|
|
"a",
|
|
}
|
|
|
|
assert.Len(t, RemoveDuplicatesFromStringArray(a), 3)
|
|
}
|
|
|
|
func TestStringSliceDiff(t *testing.T) {
|
|
a := []string{"one", "two", "three", "four", "five", "six"}
|
|
b := []string{"two", "seven", "four", "six"}
|
|
expected := []string{"one", "three", "five"}
|
|
|
|
assert.Equal(t, expected, StringSliceDiff(a, b))
|
|
}
|
|
|
|
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",
|
|
}
|
|
|
|
assert.Equal(t, "10.0.0.1", GetIpAddress(&httpRequest1, []string{"X-Forwarded-For"}))
|
|
|
|
// 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",
|
|
}
|
|
|
|
assert.Equal(t, "10.0.0.1", GetIpAddress(&httpRequest2, []string{"X-Forwarded-For"}))
|
|
|
|
// 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",
|
|
}
|
|
|
|
assert.Equal(t, "10.1.0.1", GetIpAddress(&httpRequest3, []string{"X-Forwarded-For", "X-Real-Ip"}))
|
|
|
|
// 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",
|
|
}
|
|
|
|
assert.Equal(t, "10.1.0.1", GetIpAddress(&httpRequest4, []string{"X-Forwarded-For", "X-Real-Ip"}))
|
|
|
|
// Test without any headers
|
|
httpRequest5 := http.Request{
|
|
RemoteAddr: "10.2.0.1:12345",
|
|
}
|
|
|
|
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"}))
|
|
}
|
|
|
|
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)
|
|
}
|