pluginproxy_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package pluginproxy
  2. import (
  3. "net/http"
  4. "testing"
  5. "github.com/grafana/grafana/pkg/bus"
  6. m "github.com/grafana/grafana/pkg/models"
  7. "github.com/grafana/grafana/pkg/plugins"
  8. "github.com/grafana/grafana/pkg/setting"
  9. "github.com/grafana/grafana/pkg/util"
  10. . "github.com/smartystreets/goconvey/convey"
  11. )
  12. func TestPluginProxy(t *testing.T) {
  13. Convey("When getting proxy headers", t, func() {
  14. route := &plugins.AppPluginRoute{
  15. Headers: []plugins.AppPluginRouteHeader{
  16. {Name: "x-header", Content: "my secret {{.SecureJsonData.key}}"},
  17. },
  18. }
  19. setting.SecretKey = "password"
  20. bus.AddHandler("test", func(query *m.GetPluginSettingByIdQuery) error {
  21. key, err := util.Encrypt([]byte("123"), "password")
  22. if err != nil {
  23. return err
  24. }
  25. query.Result = &m.PluginSetting{
  26. SecureJsonData: map[string][]byte{
  27. "key": key,
  28. },
  29. }
  30. return nil
  31. })
  32. header, err := getHeaders(route, 1, "my-app")
  33. So(err, ShouldBeNil)
  34. Convey("Should render header template", func() {
  35. So(header.Get("x-header"), ShouldEqual, "my secret 123")
  36. })
  37. })
  38. Convey("When SendUserHeader config is enabled", t, func() {
  39. req := getPluginProxiedRequest(
  40. &m.ReqContext{
  41. SignedInUser: &m.SignedInUser{
  42. Login: "test_user",
  43. },
  44. },
  45. &setting.Cfg{SendUserHeader: true},
  46. nil,
  47. )
  48. Convey("Should add header with username", func() {
  49. // Get will return empty string even if header is not set
  50. So(req.Header.Get("X-Grafana-User"), ShouldEqual, "test_user")
  51. })
  52. })
  53. Convey("When SendUserHeader config is disabled", t, func() {
  54. req := getPluginProxiedRequest(
  55. &m.ReqContext{
  56. SignedInUser: &m.SignedInUser{
  57. Login: "test_user",
  58. },
  59. },
  60. &setting.Cfg{SendUserHeader: false},
  61. nil,
  62. )
  63. Convey("Should not add header with username", func() {
  64. // Get will return empty string even if header is not set
  65. So(req.Header.Get("X-Grafana-User"), ShouldEqual, "")
  66. })
  67. })
  68. Convey("When SendUserHeader config is enabled but user is anonymous", t, func() {
  69. req := getPluginProxiedRequest(
  70. &m.ReqContext{
  71. SignedInUser: &m.SignedInUser{IsAnonymous: true},
  72. },
  73. &setting.Cfg{SendUserHeader: true},
  74. nil,
  75. )
  76. Convey("Should not add header with username", func() {
  77. // Get will return empty string even if header is not set
  78. So(req.Header.Get("X-Grafana-User"), ShouldEqual, "")
  79. })
  80. })
  81. Convey("When getting templated url", t, func() {
  82. route := &plugins.AppPluginRoute{
  83. Url: "{{.JsonData.dynamicUrl}}",
  84. Method: "GET",
  85. }
  86. bus.AddHandler("test", func(query *m.GetPluginSettingByIdQuery) error {
  87. query.Result = &m.PluginSetting{
  88. JsonData: map[string]interface{}{
  89. "dynamicUrl": "https://dynamic.grafana.com",
  90. },
  91. }
  92. return nil
  93. })
  94. req := getPluginProxiedRequest(
  95. &m.ReqContext{
  96. SignedInUser: &m.SignedInUser{
  97. Login: "test_user",
  98. },
  99. },
  100. &setting.Cfg{SendUserHeader: true},
  101. route,
  102. )
  103. Convey("Headers should be updated", func() {
  104. header, err := getHeaders(route, 1, "my-app")
  105. So(err, ShouldBeNil)
  106. So(header.Get("X-Grafana-User"), ShouldEqual, "")
  107. })
  108. Convey("Should set req.URL to be interpolated value from jsonData", func() {
  109. So(req.URL.String(), ShouldEqual, "https://dynamic.grafana.com")
  110. })
  111. Convey("Route url should not be modified", func() {
  112. So(route.Url, ShouldEqual, "{{.JsonData.dynamicUrl}}")
  113. })
  114. })
  115. }
  116. // getPluginProxiedRequest is a helper for easier setup of tests based on global config and ReqContext.
  117. func getPluginProxiedRequest(ctx *m.ReqContext, cfg *setting.Cfg, route *plugins.AppPluginRoute) *http.Request {
  118. // insert dummy route if none is specified
  119. if route == nil {
  120. route = &plugins.AppPluginRoute{
  121. Path: "api/v4/",
  122. Url: "https://www.google.com",
  123. ReqRole: m.ROLE_EDITOR,
  124. }
  125. }
  126. proxy := NewApiPluginProxy(ctx, "", route, "", cfg)
  127. req, err := http.NewRequest(http.MethodGet, route.Url, nil)
  128. So(err, ShouldBeNil)
  129. proxy.Director(req)
  130. return req
  131. }