mirror of
https://github.com/drakkan/sftpgo.git
synced 2024-11-22 15:40:23 +00:00
ca3e15578e
ioutil is deprecated in Go 1.16 and SFTPGo is an application, not a library, we have no reason to keep compatibility with old Go versions. Go 1.16 fix some cifs related issues too.
156 lines
4.4 KiB
Go
156 lines
4.4 KiB
Go
package telemetry
|
|
|
|
import (
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/drakkan/sftpgo/common"
|
|
)
|
|
|
|
const (
|
|
httpsCert = `-----BEGIN CERTIFICATE-----
|
|
MIICHTCCAaKgAwIBAgIUHnqw7QnB1Bj9oUsNpdb+ZkFPOxMwCgYIKoZIzj0EAwIw
|
|
RTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu
|
|
dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMDAyMDQwOTUzMDRaFw0zMDAyMDEw
|
|
OTUzMDRaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYD
|
|
VQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwdjAQBgcqhkjOPQIBBgUrgQQA
|
|
IgNiAARCjRMqJ85rzMC998X5z761nJ+xL3bkmGVqWvrJ51t5OxV0v25NsOgR82CA
|
|
NXUgvhVYs7vNFN+jxtb2aj6Xg+/2G/BNxkaFspIVCzgWkxiz7XE4lgUwX44FCXZM
|
|
3+JeUbKjUzBRMB0GA1UdDgQWBBRhLw+/o3+Z02MI/d4tmaMui9W16jAfBgNVHSME
|
|
GDAWgBRhLw+/o3+Z02MI/d4tmaMui9W16jAPBgNVHRMBAf8EBTADAQH/MAoGCCqG
|
|
SM49BAMCA2kAMGYCMQDqLt2lm8mE+tGgtjDmtFgdOcI72HSbRQ74D5rYTzgST1rY
|
|
/8wTi5xl8TiFUyLMUsICMQC5ViVxdXbhuG7gX6yEqSkMKZICHpO8hqFwOD/uaFVI
|
|
dV4vKmHUzwK/eIx+8Ay3neE=
|
|
-----END CERTIFICATE-----`
|
|
httpsKey = `-----BEGIN EC PARAMETERS-----
|
|
BgUrgQQAIg==
|
|
-----END EC PARAMETERS-----
|
|
-----BEGIN EC PRIVATE KEY-----
|
|
MIGkAgEBBDCfMNsN6miEE3rVyUPwElfiJSWaR5huPCzUenZOfJT04GAcQdWvEju3
|
|
UM2lmBLIXpGgBwYFK4EEACKhZANiAARCjRMqJ85rzMC998X5z761nJ+xL3bkmGVq
|
|
WvrJ51t5OxV0v25NsOgR82CANXUgvhVYs7vNFN+jxtb2aj6Xg+/2G/BNxkaFspIV
|
|
CzgWkxiz7XE4lgUwX44FCXZM3+JeUbI=
|
|
-----END EC PRIVATE KEY-----`
|
|
)
|
|
|
|
func TestInitialization(t *testing.T) {
|
|
c := Conf{
|
|
BindPort: 10000,
|
|
BindAddress: "invalid",
|
|
EnableProfiler: false,
|
|
}
|
|
err := c.Initialize(".")
|
|
require.Error(t, err)
|
|
|
|
c.AuthUserFile = "missing"
|
|
err = c.Initialize(".")
|
|
require.Error(t, err)
|
|
|
|
err = ReloadCertificateMgr()
|
|
require.NoError(t, err)
|
|
|
|
c.AuthUserFile = ""
|
|
c.CertificateFile = "crt"
|
|
c.CertificateKeyFile = "key"
|
|
|
|
err = c.Initialize(".")
|
|
require.Error(t, err)
|
|
|
|
certPath := filepath.Join(os.TempDir(), "test.crt")
|
|
keyPath := filepath.Join(os.TempDir(), "test.key")
|
|
err = os.WriteFile(certPath, []byte(httpsCert), os.ModePerm)
|
|
require.NoError(t, err)
|
|
err = os.WriteFile(keyPath, []byte(httpsKey), os.ModePerm)
|
|
require.NoError(t, err)
|
|
|
|
c.CertificateFile = certPath
|
|
c.CertificateKeyFile = keyPath
|
|
|
|
err = c.Initialize(".")
|
|
require.Error(t, err)
|
|
|
|
err = ReloadCertificateMgr()
|
|
require.NoError(t, err)
|
|
|
|
err = os.Remove(certPath)
|
|
require.NoError(t, err)
|
|
err = os.Remove(keyPath)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestShouldBind(t *testing.T) {
|
|
c := Conf{
|
|
BindPort: 10000,
|
|
EnableProfiler: false,
|
|
}
|
|
require.True(t, c.ShouldBind())
|
|
|
|
c.BindPort = 0
|
|
require.False(t, c.ShouldBind())
|
|
|
|
if runtime.GOOS != "windows" {
|
|
c.BindAddress = "/absolute/path"
|
|
require.True(t, c.ShouldBind())
|
|
}
|
|
}
|
|
|
|
func TestRouter(t *testing.T) {
|
|
authUserFile := filepath.Join(os.TempDir(), "http_users.txt")
|
|
authUserData := []byte("test1:$2y$05$bcHSED7aO1cfLto6ZdDBOOKzlwftslVhtpIkRhAtSa4GuLmk5mola\n")
|
|
err := os.WriteFile(authUserFile, authUserData, os.ModePerm)
|
|
require.NoError(t, err)
|
|
|
|
httpAuth, err = common.NewBasicAuthProvider(authUserFile)
|
|
require.NoError(t, err)
|
|
|
|
initializeRouter(true)
|
|
testServer := httptest.NewServer(router)
|
|
defer testServer.Close()
|
|
|
|
req, err := http.NewRequest(http.MethodGet, "/healthz", nil)
|
|
require.NoError(t, err)
|
|
rr := httptest.NewRecorder()
|
|
testServer.Config.Handler.ServeHTTP(rr, req)
|
|
require.Equal(t, http.StatusOK, rr.Code)
|
|
require.Equal(t, "ok", rr.Body.String())
|
|
|
|
req, err = http.NewRequest(http.MethodGet, "/metrics", nil)
|
|
require.NoError(t, err)
|
|
rr = httptest.NewRecorder()
|
|
testServer.Config.Handler.ServeHTTP(rr, req)
|
|
require.Equal(t, http.StatusUnauthorized, rr.Code)
|
|
|
|
req.SetBasicAuth("test1", "password1")
|
|
rr = httptest.NewRecorder()
|
|
testServer.Config.Handler.ServeHTTP(rr, req)
|
|
require.Equal(t, http.StatusOK, rr.Code)
|
|
|
|
req, err = http.NewRequest(http.MethodGet, pprofBasePath+"/pprof/", nil)
|
|
require.NoError(t, err)
|
|
rr = httptest.NewRecorder()
|
|
testServer.Config.Handler.ServeHTTP(rr, req)
|
|
require.Equal(t, http.StatusUnauthorized, rr.Code)
|
|
|
|
req.SetBasicAuth("test1", "password1")
|
|
rr = httptest.NewRecorder()
|
|
testServer.Config.Handler.ServeHTTP(rr, req)
|
|
require.Equal(t, http.StatusOK, rr.Code)
|
|
|
|
httpAuth, err = common.NewBasicAuthProvider("")
|
|
require.NoError(t, err)
|
|
|
|
req, err = http.NewRequest(http.MethodGet, "/metrics", nil)
|
|
require.NoError(t, err)
|
|
rr = httptest.NewRecorder()
|
|
testServer.Config.Handler.ServeHTTP(rr, req)
|
|
require.Equal(t, http.StatusOK, rr.Code)
|
|
|
|
err = os.Remove(authUserFile)
|
|
require.NoError(t, err)
|
|
}
|