dashboard_acl_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package api
  2. import (
  3. "testing"
  4. authpublic "github.com/OliveTin/OliveTin/internal/auth/authpublic"
  5. config "github.com/OliveTin/OliveTin/internal/config"
  6. "github.com/OliveTin/OliveTin/internal/executor"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/stretchr/testify/require"
  9. )
  10. func buildDashboardAclTestConfig() *config.Config {
  11. cfg := config.DefaultConfig()
  12. cfg.DefaultPermissions.View = false
  13. cfg.DefaultPermissions.Exec = false
  14. cfg.AccessControlLists = []*config.AccessControlList{
  15. {
  16. Name: "admins",
  17. MatchUsernames: []string{"admin"},
  18. Permissions: config.PermissionsList{View: true, Exec: true},
  19. },
  20. }
  21. cfg.Dashboards = []*config.DashboardComponent{
  22. {
  23. Title: "Public tools",
  24. Contents: []*config.DashboardComponent{
  25. {Title: "Welcome", Type: "display"},
  26. },
  27. },
  28. {
  29. Title: "Services",
  30. Acls: []string{"admins"},
  31. Contents: []*config.DashboardComponent{
  32. {Title: "Status: running", Type: "display"},
  33. },
  34. },
  35. }
  36. return cfg
  37. }
  38. func TestDashboardAclsRootNavAndGetDashboard(t *testing.T) {
  39. cfg := buildDashboardAclTestConfig()
  40. ex := executor.DefaultExecutor(cfg)
  41. api := newServer(ex)
  42. guest := &authpublic.AuthenticatedUser{Username: "guest", Provider: "system"}
  43. guest.BuildUserAcls(cfg)
  44. admin := &authpublic.AuthenticatedUser{Username: "admin"}
  45. admin.BuildUserAcls(cfg)
  46. guestRoots := api.buildRootDashboards(guest, cfg.Dashboards)
  47. assert.Contains(t, guestRoots, "Public tools")
  48. assert.NotContains(t, guestRoots, "Services")
  49. adminRoots := api.buildRootDashboards(admin, cfg.Dashboards)
  50. assert.Contains(t, adminRoots, "Public tools")
  51. assert.Contains(t, adminRoots, "Services")
  52. guestRR := api.createDashboardRenderRequest(guest, "", "")
  53. assert.Nil(t, renderDashboard(guestRR, "Services"),
  54. "GetDashboard must not leak ACL-restricted dashboard content via deep link")
  55. adminRR := api.createDashboardRenderRequest(admin, "", "")
  56. db := renderDashboard(adminRR, "Services")
  57. require.NotNil(t, db)
  58. assert.Equal(t, "Services", db.Title)
  59. }
  60. func TestDashboardAclsNestedDirectoryDeepLink(t *testing.T) {
  61. cfg := buildDashboardAclTestConfig()
  62. cfg.Dashboards = []*config.DashboardComponent{
  63. {
  64. Title: "Public tools",
  65. Contents: []*config.DashboardComponent{
  66. {Title: "Welcome", Type: "display"},
  67. },
  68. },
  69. {
  70. Title: "Services",
  71. Acls: []string{"admins"},
  72. Contents: []*config.DashboardComponent{
  73. {
  74. Title: "Infrastructure",
  75. Contents: []*config.DashboardComponent{
  76. {Title: "Status: running", Type: "display"},
  77. },
  78. },
  79. },
  80. },
  81. }
  82. ex := executor.DefaultExecutor(cfg)
  83. api := newServer(ex)
  84. guest := &authpublic.AuthenticatedUser{Username: "guest", Provider: "system"}
  85. guest.BuildUserAcls(cfg)
  86. admin := &authpublic.AuthenticatedUser{Username: "admin"}
  87. admin.BuildUserAcls(cfg)
  88. guestRR := api.createDashboardRenderRequest(guest, "", "")
  89. assert.Nil(t, renderDashboard(guestRR, "Infrastructure"),
  90. "nested directory under ACL-restricted root must not leak via deep link")
  91. adminRR := api.createDashboardRenderRequest(admin, "", "")
  92. db := renderDashboard(adminRR, "Infrastructure")
  93. require.NotNil(t, db)
  94. assert.Equal(t, "Infrastructure", db.Title)
  95. }