server_admin_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package server
  2. import (
  3. "github.com/stretchr/testify/require"
  4. "heckel.io/ntfy/user"
  5. "heckel.io/ntfy/util"
  6. "sync/atomic"
  7. "testing"
  8. "time"
  9. )
  10. func TestAccess_AllowReset(t *testing.T) {
  11. c := newTestConfigWithAuthFile(t)
  12. c.AuthDefault = user.PermissionDenyAll
  13. s := newTestServer(t, c)
  14. defer s.closeDatabases()
  15. // User and admin
  16. require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin))
  17. require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser))
  18. // Subscribing not allowed
  19. rr := request(t, s, "GET", "/gold/json?poll=1", "", map[string]string{
  20. "Authorization": util.BasicAuth("ben", "ben"),
  21. })
  22. require.Equal(t, 403, rr.Code)
  23. // Grant access
  24. rr = request(t, s, "POST", "/v1/access", `{"username": "ben", "topic":"gold", "permission":"ro"}`, map[string]string{
  25. "Authorization": util.BasicAuth("phil", "phil"),
  26. })
  27. require.Equal(t, 200, rr.Code)
  28. // Now subscribing is allowed
  29. rr = request(t, s, "GET", "/gold/json?poll=1", "", map[string]string{
  30. "Authorization": util.BasicAuth("ben", "ben"),
  31. })
  32. require.Equal(t, 200, rr.Code)
  33. // Reset access
  34. rr = request(t, s, "DELETE", "/v1/access", `{"username": "ben", "topic":"gold"}`, map[string]string{
  35. "Authorization": util.BasicAuth("phil", "phil"),
  36. })
  37. require.Equal(t, 200, rr.Code)
  38. // Subscribing not allowed (again)
  39. rr = request(t, s, "GET", "/gold/json?poll=1", "", map[string]string{
  40. "Authorization": util.BasicAuth("ben", "ben"),
  41. })
  42. require.Equal(t, 403, rr.Code)
  43. }
  44. func TestAccess_AllowReset_NonAdminAttempt(t *testing.T) {
  45. c := newTestConfigWithAuthFile(t)
  46. c.AuthDefault = user.PermissionDenyAll
  47. s := newTestServer(t, c)
  48. defer s.closeDatabases()
  49. // User
  50. require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser))
  51. // Grant access fails, because non-admin
  52. rr := request(t, s, "POST", "/v1/access", `{"username": "ben", "topic":"gold", "permission":"ro"}`, map[string]string{
  53. "Authorization": util.BasicAuth("ben", "ben"),
  54. })
  55. require.Equal(t, 401, rr.Code)
  56. }
  57. func TestAccess_AllowReset_KillConnection(t *testing.T) {
  58. c := newTestConfigWithAuthFile(t)
  59. c.AuthDefault = user.PermissionDenyAll
  60. s := newTestServer(t, c)
  61. defer s.closeDatabases()
  62. // User and admin, grant access to "gol*" topics
  63. require.Nil(t, s.userManager.AddUser("phil", "phil", user.RoleAdmin))
  64. require.Nil(t, s.userManager.AddUser("ben", "ben", user.RoleUser))
  65. require.Nil(t, s.userManager.AllowAccess("ben", "gol*", user.PermissionRead)) // Wildcard!
  66. start, timeTaken := time.Now(), atomic.Int64{}
  67. go func() {
  68. rr := request(t, s, "GET", "/gold/json", "", map[string]string{
  69. "Authorization": util.BasicAuth("ben", "ben"),
  70. })
  71. require.Equal(t, 200, rr.Code)
  72. timeTaken.Store(time.Since(start).Milliseconds())
  73. }()
  74. time.Sleep(500 * time.Millisecond)
  75. // Reset access
  76. rr := request(t, s, "DELETE", "/v1/access", `{"username": "ben", "topic":"gol*"}`, map[string]string{
  77. "Authorization": util.BasicAuth("phil", "phil"),
  78. })
  79. require.Equal(t, 200, rr.Code)
  80. // Wait for connection to be killed; this will fail if the connection is never killed
  81. waitFor(t, func() bool {
  82. return timeTaken.Load() >= 500
  83. })
  84. }