acl_dashboard_test.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package acl
  2. import (
  3. "testing"
  4. authpublic "github.com/OliveTin/OliveTin/internal/auth/authpublic"
  5. config "github.com/OliveTin/OliveTin/internal/config"
  6. "github.com/stretchr/testify/assert"
  7. )
  8. func TestIsAllowedViewDashboardAbsentAclsUnrestricted(t *testing.T) {
  9. cfg := config.DefaultConfig()
  10. cfg.DefaultPermissions.View = false
  11. dashboard := &config.DashboardComponent{
  12. Title: "Public",
  13. Contents: []*config.DashboardComponent{
  14. {Title: "Status", Type: "display"},
  15. },
  16. }
  17. guest := &authpublic.AuthenticatedUser{Username: "guest", Provider: "system"}
  18. guest.BuildUserAcls(cfg)
  19. assert.True(t, IsAllowedViewDashboard(cfg, guest, dashboard))
  20. assert.True(t, IsAllowedViewDashboard(cfg, guest, nil))
  21. }
  22. func TestIsAllowedViewDashboardAllowDenyAndDefaultFallback(t *testing.T) {
  23. cfg := config.DefaultConfig()
  24. cfg.DefaultPermissions.View = false
  25. cfg.AccessControlLists = []*config.AccessControlList{
  26. {
  27. Name: "admins",
  28. MatchUsernames: []string{"admin"},
  29. Permissions: config.PermissionsList{View: true, Exec: true},
  30. },
  31. }
  32. dashboard := &config.DashboardComponent{
  33. Title: "Services",
  34. Acls: []string{"admins"},
  35. Contents: []*config.DashboardComponent{
  36. {Title: "Status: running", Type: "display"},
  37. },
  38. }
  39. guest := &authpublic.AuthenticatedUser{Username: "guest", Provider: "system"}
  40. guest.BuildUserAcls(cfg)
  41. admin := &authpublic.AuthenticatedUser{Username: "admin"}
  42. admin.BuildUserAcls(cfg)
  43. assert.False(t, IsAllowedViewDashboard(cfg, guest, dashboard))
  44. assert.True(t, IsAllowedViewDashboard(cfg, admin, dashboard))
  45. cfg.DefaultPermissions.View = true
  46. assert.True(t, IsAllowedViewDashboard(cfg, guest, dashboard),
  47. "when no relevant ACL matches, fall back to defaultPermissions.view")
  48. }
  49. func TestIsAllowedViewDashboardIgnoresAddToEveryAction(t *testing.T) {
  50. cfg := config.DefaultConfig()
  51. cfg.DefaultPermissions.View = false
  52. cfg.AccessControlLists = []*config.AccessControlList{
  53. {
  54. Name: "admins",
  55. MatchUsernames: []string{"admin"},
  56. AddToEveryAction: true,
  57. Permissions: config.PermissionsList{View: true, Exec: true},
  58. },
  59. }
  60. dashboard := &config.DashboardComponent{
  61. Title: "Secret",
  62. Acls: []string{"other"},
  63. Contents: []*config.DashboardComponent{
  64. {Title: "Hidden status", Type: "display"},
  65. },
  66. }
  67. admin := &authpublic.AuthenticatedUser{Username: "admin"}
  68. admin.BuildUserAcls(cfg)
  69. assert.False(t, IsAllowedViewDashboard(cfg, admin, dashboard),
  70. "AddToEveryAction must not grant dashboard view without listing the ACL on the dashboard")
  71. }