123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- // Copyright (C) 2019-2023 Nicola Murino
- //
- // This program is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Affero General Public License as published
- // by the Free Software Foundation, version 3.
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU Affero General Public License for more details.
- //
- // You should have received a copy of the GNU Affero General Public License
- // along with this program. If not, see <https://www.gnu.org/licenses/>.
- package telemetry
- import (
- "net/http"
- "net/http/httptest"
- "os"
- "path/filepath"
- "runtime"
- "testing"
- "github.com/stretchr/testify/require"
- "github.com/drakkan/sftpgo/v2/internal/common"
- "github.com/drakkan/sftpgo/v2/internal/dataprovider"
- )
- 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) {
- configDir := filepath.Join(".", "..", "..")
- providerConf := dataprovider.Config{
- Driver: dataprovider.MemoryDataProviderName,
- BackupsPath: "backups",
- }
- err := dataprovider.Initialize(providerConf, configDir, false)
- require.NoError(t, err)
- commonConfig := common.Configuration{}
- err = common.Initialize(commonConfig, 0)
- require.NoError(t, err)
- c := Conf{
- BindPort: 10000,
- BindAddress: "invalid address",
- EnableProfiler: false,
- }
- err = c.Initialize(configDir)
- 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)
- }
|