2022-02-03 21:10:15 +00:00
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/urfave/cli/v2"
|
|
|
|
"heckel.io/ntfy/server"
|
|
|
|
"heckel.io/ntfy/test"
|
2023-01-03 02:12:42 +00:00
|
|
|
"heckel.io/ntfy/user"
|
2023-02-08 20:20:44 +00:00
|
|
|
"os"
|
2022-02-03 21:10:15 +00:00
|
|
|
"path/filepath"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestCLI_User_Add(t *testing.T) {
|
|
|
|
s, conf, port := newTestServerWithAuth(t)
|
|
|
|
defer test.StopServer(t, s, port)
|
|
|
|
|
|
|
|
app, stdin, _, stderr := newTestApp()
|
|
|
|
stdin.WriteString("mypass\nmypass")
|
|
|
|
require.Nil(t, runUserCommand(app, conf, "add", "phil"))
|
|
|
|
require.Contains(t, stderr.String(), "user phil added with role user")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCLI_User_Add_Exists(t *testing.T) {
|
|
|
|
s, conf, port := newTestServerWithAuth(t)
|
|
|
|
defer test.StopServer(t, s, port)
|
|
|
|
|
|
|
|
app, stdin, _, stderr := newTestApp()
|
|
|
|
stdin.WriteString("mypass\nmypass")
|
|
|
|
require.Nil(t, runUserCommand(app, conf, "add", "phil"))
|
|
|
|
require.Contains(t, stderr.String(), "user phil added with role user")
|
|
|
|
|
2022-02-04 01:07:23 +00:00
|
|
|
app, stdin, _, _ = newTestApp()
|
2022-02-03 21:10:15 +00:00
|
|
|
stdin.WriteString("mypass\nmypass")
|
|
|
|
err := runUserCommand(app, conf, "add", "phil")
|
|
|
|
require.Error(t, err)
|
|
|
|
require.Contains(t, err.Error(), "user phil already exists")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCLI_User_Add_Admin(t *testing.T) {
|
|
|
|
s, conf, port := newTestServerWithAuth(t)
|
|
|
|
defer test.StopServer(t, s, port)
|
|
|
|
|
|
|
|
app, stdin, _, stderr := newTestApp()
|
|
|
|
stdin.WriteString("mypass\nmypass")
|
|
|
|
require.Nil(t, runUserCommand(app, conf, "add", "--role=admin", "phil"))
|
|
|
|
require.Contains(t, stderr.String(), "user phil added with role admin")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCLI_User_Add_Password_Mismatch(t *testing.T) {
|
|
|
|
s, conf, port := newTestServerWithAuth(t)
|
|
|
|
defer test.StopServer(t, s, port)
|
|
|
|
|
|
|
|
app, stdin, _, _ := newTestApp()
|
|
|
|
stdin.WriteString("mypass\nNOTMATCH")
|
|
|
|
err := runUserCommand(app, conf, "add", "phil")
|
|
|
|
require.Error(t, err)
|
|
|
|
require.Contains(t, err.Error(), "passwords do not match: try it again, but this time type slooowwwlly")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCLI_User_ChangePass(t *testing.T) {
|
|
|
|
s, conf, port := newTestServerWithAuth(t)
|
|
|
|
defer test.StopServer(t, s, port)
|
|
|
|
|
|
|
|
// Add user
|
|
|
|
app, stdin, _, stderr := newTestApp()
|
|
|
|
stdin.WriteString("mypass\nmypass")
|
|
|
|
require.Nil(t, runUserCommand(app, conf, "add", "phil"))
|
|
|
|
require.Contains(t, stderr.String(), "user phil added with role user")
|
|
|
|
|
|
|
|
// Change pass
|
|
|
|
app, stdin, _, stderr = newTestApp()
|
|
|
|
stdin.WriteString("newpass\nnewpass")
|
|
|
|
require.Nil(t, runUserCommand(app, conf, "change-pass", "phil"))
|
|
|
|
require.Contains(t, stderr.String(), "changed password for user phil")
|
|
|
|
}
|
|
|
|
|
2022-02-04 01:07:23 +00:00
|
|
|
func TestCLI_User_ChangeRole(t *testing.T) {
|
|
|
|
s, conf, port := newTestServerWithAuth(t)
|
|
|
|
defer test.StopServer(t, s, port)
|
|
|
|
|
|
|
|
// Add user
|
|
|
|
app, stdin, _, stderr := newTestApp()
|
|
|
|
stdin.WriteString("mypass\nmypass")
|
|
|
|
require.Nil(t, runUserCommand(app, conf, "add", "phil"))
|
|
|
|
require.Contains(t, stderr.String(), "user phil added with role user")
|
|
|
|
|
|
|
|
// Change role
|
|
|
|
app, _, _, stderr = newTestApp()
|
|
|
|
require.Nil(t, runUserCommand(app, conf, "change-role", "phil", "admin"))
|
|
|
|
require.Contains(t, stderr.String(), "changed role for user phil to admin")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCLI_User_Delete(t *testing.T) {
|
|
|
|
s, conf, port := newTestServerWithAuth(t)
|
|
|
|
defer test.StopServer(t, s, port)
|
|
|
|
|
|
|
|
// Add user
|
|
|
|
app, stdin, _, stderr := newTestApp()
|
|
|
|
stdin.WriteString("mypass\nmypass")
|
|
|
|
require.Nil(t, runUserCommand(app, conf, "add", "phil"))
|
|
|
|
require.Contains(t, stderr.String(), "user phil added with role user")
|
|
|
|
|
|
|
|
// Delete user
|
|
|
|
app, _, _, stderr = newTestApp()
|
|
|
|
require.Nil(t, runUserCommand(app, conf, "del", "phil"))
|
|
|
|
require.Contains(t, stderr.String(), "user phil removed")
|
|
|
|
|
|
|
|
// Delete user again (does not exist)
|
|
|
|
app, _, _, _ = newTestApp()
|
|
|
|
err := runUserCommand(app, conf, "del", "phil")
|
|
|
|
require.Error(t, err)
|
|
|
|
require.Contains(t, err.Error(), "user phil does not exist")
|
|
|
|
}
|
|
|
|
|
2022-02-03 21:10:15 +00:00
|
|
|
func newTestServerWithAuth(t *testing.T) (s *server.Server, conf *server.Config, port int) {
|
2023-02-08 20:20:44 +00:00
|
|
|
configFile := filepath.Join(t.TempDir(), "server-dummy.yml")
|
|
|
|
require.Nil(t, os.WriteFile(configFile, []byte(""), 0600)) // Dummy config file to avoid lookup of real server.yml
|
2022-02-03 21:10:15 +00:00
|
|
|
conf = server.NewConfig()
|
2023-02-08 20:20:44 +00:00
|
|
|
conf.File = configFile
|
2022-02-03 21:10:15 +00:00
|
|
|
conf.AuthFile = filepath.Join(t.TempDir(), "user.db")
|
2023-01-03 02:12:42 +00:00
|
|
|
conf.AuthDefault = user.PermissionDenyAll
|
2022-02-03 21:10:15 +00:00
|
|
|
s, port = test.StartServerWithConfig(t, conf)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func runUserCommand(app *cli.App, conf *server.Config, args ...string) error {
|
2022-02-04 03:26:22 +00:00
|
|
|
userArgs := []string{
|
|
|
|
"ntfy",
|
2023-02-08 20:20:44 +00:00
|
|
|
"--log-level=ERROR",
|
2022-02-04 03:26:22 +00:00
|
|
|
"user",
|
2023-02-08 20:20:44 +00:00
|
|
|
"--config=" + conf.File, // Dummy config file to avoid lookups of real file
|
2022-02-04 03:26:22 +00:00
|
|
|
"--auth-file=" + conf.AuthFile,
|
2023-01-03 02:12:42 +00:00
|
|
|
"--auth-default-access=" + conf.AuthDefault.String(),
|
2022-02-04 03:26:22 +00:00
|
|
|
}
|
|
|
|
return app.Run(append(userArgs, args...))
|
|
|
|
}
|