2024-08-16 18:43:52 +02:00
|
|
|
package plugin
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"fmt"
|
|
|
|
|
"io"
|
|
|
|
|
"net/http"
|
|
|
|
|
"net/url"
|
|
|
|
|
"strings"
|
|
|
|
|
"sync/atomic"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type OnCallPermission struct {
|
|
|
|
|
Action string `json:"action"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (a *App) GetPermissions(settings *OnCallPluginSettings, onCallUser *OnCallUser) ([]OnCallPermission, error) {
|
|
|
|
|
atomic.AddInt32(&a.PermissionsCallCount, 1)
|
|
|
|
|
reqURL, err := url.JoinPath(settings.GrafanaURL, fmt.Sprintf("api/access-control/users/%d/permissions", onCallUser.ID))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("error creating URL: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
req, err := http.NewRequest("GET", reqURL, nil)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("error creating creating new request: %v", err)
|
|
|
|
|
}
|
|
|
|
|
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", settings.GrafanaToken))
|
|
|
|
|
|
|
|
|
|
res, err := a.httpClient.Do(req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("error making request: %v", err)
|
|
|
|
|
}
|
|
|
|
|
defer res.Body.Close()
|
|
|
|
|
|
|
|
|
|
body, err := io.ReadAll(res.Body)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("error reading response: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var permissions []OnCallPermission
|
|
|
|
|
err = json.Unmarshal(body, &permissions)
|
|
|
|
|
if err != nil {
|
2024-08-29 12:36:35 -06:00
|
|
|
return nil, fmt.Errorf("failed to parse JSON response: %v body=%v", err, string(body))
|
2024-08-16 18:43:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if res.StatusCode == 200 {
|
|
|
|
|
var filtered []OnCallPermission
|
|
|
|
|
for _, permission := range permissions {
|
2024-08-26 07:39:07 +02:00
|
|
|
if strings.HasPrefix(permission.Action, settings.PluginID) {
|
2024-08-16 18:43:52 +02:00
|
|
|
filtered = append(filtered, permission)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return filtered, nil
|
|
|
|
|
}
|
|
|
|
|
return nil, fmt.Errorf("no permissions for %s, http status %s", onCallUser.Login, res.Status)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (a *App) GetAllPermissions(settings *OnCallPluginSettings) (map[string]map[string]interface{}, error) {
|
|
|
|
|
atomic.AddInt32(&a.AllPermissionsCallCount, 1)
|
|
|
|
|
reqURL, err := url.Parse(settings.GrafanaURL)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("error parsing URL: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
reqURL.Path += "api/access-control/users/permissions/search"
|
|
|
|
|
q := reqURL.Query()
|
2024-08-26 07:39:07 +02:00
|
|
|
q.Set("actionPrefix", settings.PluginID)
|
2024-08-16 18:43:52 +02:00
|
|
|
reqURL.RawQuery = q.Encode()
|
|
|
|
|
|
|
|
|
|
req, err := http.NewRequest("GET", reqURL.String(), nil)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("error creating creating new request: %v", err)
|
|
|
|
|
}
|
|
|
|
|
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", settings.GrafanaToken))
|
|
|
|
|
|
|
|
|
|
res, err := a.httpClient.Do(req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("error making request: %v", err)
|
|
|
|
|
}
|
|
|
|
|
defer res.Body.Close()
|
|
|
|
|
|
|
|
|
|
body, err := io.ReadAll(res.Body)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("error reading response: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var permissions map[string]map[string]interface{}
|
|
|
|
|
err = json.Unmarshal(body, &permissions)
|
|
|
|
|
if err != nil {
|
2024-08-29 12:36:35 -06:00
|
|
|
return nil, fmt.Errorf("failed to parse JSON response: %v body=%v", err, string(body))
|
2024-08-16 18:43:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if res.StatusCode == 200 {
|
|
|
|
|
return permissions, nil
|
|
|
|
|
}
|
|
|
|
|
return nil, fmt.Errorf("no permissions available, http status %s", res.Status)
|
|
|
|
|
}
|