| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- package api
- import (
- "testing"
- authpublic "github.com/OliveTin/OliveTin/internal/auth/authpublic"
- config "github.com/OliveTin/OliveTin/internal/config"
- "github.com/OliveTin/OliveTin/internal/executor"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
- )
- func buildDashboardAclTestConfig() *config.Config {
- cfg := config.DefaultConfig()
- cfg.DefaultPermissions.View = false
- cfg.DefaultPermissions.Exec = false
- cfg.AccessControlLists = []*config.AccessControlList{
- {
- Name: "admins",
- MatchUsernames: []string{"admin"},
- Permissions: config.PermissionsList{View: true, Exec: true},
- },
- }
- cfg.Dashboards = []*config.DashboardComponent{
- {
- Title: "Public tools",
- Contents: []*config.DashboardComponent{
- {Title: "Welcome", Type: "display"},
- },
- },
- {
- Title: "Services",
- Acls: []string{"admins"},
- Contents: []*config.DashboardComponent{
- {Title: "Status: running", Type: "display"},
- },
- },
- }
- return cfg
- }
- func TestDashboardAclsRootNavAndGetDashboard(t *testing.T) {
- cfg := buildDashboardAclTestConfig()
- ex := executor.DefaultExecutor(cfg)
- api := newServer(ex)
- guest := &authpublic.AuthenticatedUser{Username: "guest", Provider: "system"}
- guest.BuildUserAcls(cfg)
- admin := &authpublic.AuthenticatedUser{Username: "admin"}
- admin.BuildUserAcls(cfg)
- guestRoots := api.buildRootDashboards(guest, cfg.Dashboards)
- assert.Contains(t, guestRoots, "Public tools")
- assert.NotContains(t, guestRoots, "Services")
- adminRoots := api.buildRootDashboards(admin, cfg.Dashboards)
- assert.Contains(t, adminRoots, "Public tools")
- assert.Contains(t, adminRoots, "Services")
- guestRR := api.createDashboardRenderRequest(guest, "", "")
- assert.Nil(t, renderDashboard(guestRR, "Services"),
- "GetDashboard must not leak ACL-restricted dashboard content via deep link")
- adminRR := api.createDashboardRenderRequest(admin, "", "")
- db := renderDashboard(adminRR, "Services")
- require.NotNil(t, db)
- assert.Equal(t, "Services", db.Title)
- }
- func TestRootDashboardEntriesIncludeCategory(t *testing.T) {
- cfg := config.DefaultConfig()
- cfg.Dashboards = []*config.DashboardComponent{
- {
- Title: "Misc Tools",
- Contents: []*config.DashboardComponent{{Title: "Hello", Type: "display"}},
- },
- {
- Title: "My Servers",
- Category: "Infrastructure",
- Contents: []*config.DashboardComponent{{Title: "Ping", Type: "display"}},
- },
- {
- Title: "Status Board",
- Category: "Monitoring",
- Contents: []*config.DashboardComponent{{Title: "Uptime", Type: "display"}},
- },
- {
- Title: "My Containers",
- Category: "Infrastructure",
- Contents: []*config.DashboardComponent{{Title: "Restart", Type: "display"}},
- },
- }
- ex := executor.DefaultExecutor(cfg)
- api := newServer(ex)
- user := &authpublic.AuthenticatedUser{Username: "guest", Provider: "system"}
- user.BuildUserAcls(cfg)
- entries := api.buildRootDashboardEntries(user, cfg.Dashboards)
- require.Len(t, entries, 4)
- assert.Equal(t, []string{"Misc Tools", "My Servers", "Status Board", "My Containers"}, rootDashboardTitles(entries))
- assert.Equal(t, "", entries[0].Category)
- assert.Equal(t, "Infrastructure", entries[1].Category)
- assert.Equal(t, "Monitoring", entries[2].Category)
- assert.Equal(t, "Infrastructure", entries[3].Category)
- }
- func TestRootDashboardEntriesOmitAclHiddenCategories(t *testing.T) {
- cfg := buildDashboardAclTestConfig()
- cfg.Dashboards[0].Category = "Public"
- cfg.Dashboards[1].Category = "Admin only"
- ex := executor.DefaultExecutor(cfg)
- api := newServer(ex)
- guest := &authpublic.AuthenticatedUser{Username: "guest", Provider: "system"}
- guest.BuildUserAcls(cfg)
- entries := api.buildRootDashboardEntries(guest, cfg.Dashboards)
- require.Len(t, entries, 1)
- assert.Equal(t, "Public tools", entries[0].Title)
- assert.Equal(t, "Public", entries[0].Category)
- }
- func TestDashboardAclsNestedDirectoryDeepLink(t *testing.T) {
- cfg := buildDashboardAclTestConfig()
- cfg.Dashboards = []*config.DashboardComponent{
- {
- Title: "Public tools",
- Contents: []*config.DashboardComponent{
- {Title: "Welcome", Type: "display"},
- },
- },
- {
- Title: "Services",
- Acls: []string{"admins"},
- Contents: []*config.DashboardComponent{
- {
- Title: "Infrastructure",
- Contents: []*config.DashboardComponent{
- {Title: "Status: running", Type: "display"},
- },
- },
- },
- },
- }
- ex := executor.DefaultExecutor(cfg)
- api := newServer(ex)
- guest := &authpublic.AuthenticatedUser{Username: "guest", Provider: "system"}
- guest.BuildUserAcls(cfg)
- admin := &authpublic.AuthenticatedUser{Username: "admin"}
- admin.BuildUserAcls(cfg)
- guestRR := api.createDashboardRenderRequest(guest, "", "")
- assert.Nil(t, renderDashboard(guestRR, "Infrastructure"),
- "nested directory under ACL-restricted root must not leak via deep link")
- adminRR := api.createDashboardRenderRequest(admin, "", "")
- db := renderDashboard(adminRR, "Infrastructure")
- require.NotNil(t, db)
- assert.Equal(t, "Infrastructure", db.Title)
- }
|