|
|
|
@ -5,6 +5,8 @@ import ( |
|
|
|
|
"net/http" |
|
|
|
|
"strconv" |
|
|
|
|
|
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
"github.com/grafana/grafana/pkg/api/response" |
|
|
|
|
"github.com/grafana/grafana/pkg/api/routing" |
|
|
|
|
"github.com/grafana/grafana/pkg/middleware" |
|
|
|
@ -49,6 +51,7 @@ func (api *ServiceAccountsAPI) RegisterAPIEndpoints( |
|
|
|
|
serviceAccountsRoute.Delete("/:serviceAccountId", auth(middleware.ReqOrgAdmin, accesscontrol.EvalPermission(serviceaccounts.ActionDelete, serviceaccounts.ScopeID)), routing.Wrap(api.DeleteServiceAccount)) |
|
|
|
|
serviceAccountsRoute.Get("/upgrade", auth(middleware.ReqOrgAdmin, accesscontrol.EvalPermission(serviceaccounts.ActionCreate, serviceaccounts.ScopeID)), routing.Wrap(api.UpgradeServiceAccounts)) |
|
|
|
|
serviceAccountsRoute.Post("/", auth(middleware.ReqOrgAdmin, accesscontrol.EvalPermission(serviceaccounts.ActionCreate, serviceaccounts.ScopeID)), routing.Wrap(api.CreateServiceAccount)) |
|
|
|
|
serviceAccountsRoute.Get("/:serviceAccountId/tokens", auth(middleware.ReqOrgAdmin, accesscontrol.EvalPermission(serviceaccounts.ActionRead, serviceaccounts.ScopeID)), routing.Wrap(api.ListTokens)) |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -89,6 +92,33 @@ func (api *ServiceAccountsAPI) UpgradeServiceAccounts(ctx *models.ReqContext) re |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (api *ServiceAccountsAPI) ListTokens(ctx *models.ReqContext) response.Response { |
|
|
|
|
saID, err := strconv.ParseInt(web.Params(ctx.Req)[":serviceAccountId"], 10, 64) |
|
|
|
|
if err != nil { |
|
|
|
|
return response.Error(http.StatusBadRequest, "serviceAccountId is invalid", err) |
|
|
|
|
} |
|
|
|
|
if saTokens, err := api.store.ListTokens(ctx.Req.Context(), ctx.OrgId, saID); err == nil { |
|
|
|
|
result := make([]*models.ApiKeyDTO, len(saTokens)) |
|
|
|
|
for i, t := range saTokens { |
|
|
|
|
var expiration *time.Time = nil |
|
|
|
|
if t.Expires != nil { |
|
|
|
|
v := time.Unix(*t.Expires, 0) |
|
|
|
|
expiration = &v |
|
|
|
|
} |
|
|
|
|
result[i] = &models.ApiKeyDTO{ |
|
|
|
|
Id: t.Id, |
|
|
|
|
Name: t.Name, |
|
|
|
|
Role: t.Role, |
|
|
|
|
Expiration: expiration, |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return response.JSON(200, result) |
|
|
|
|
} else { |
|
|
|
|
return response.Error(500, "Internal server error", err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (api *ServiceAccountsAPI) ListServiceAccounts(ctx *models.ReqContext) response.Response { |
|
|
|
|
serviceAccounts, err := api.store.ListServiceAccounts(ctx.Req.Context(), ctx.OrgId) |
|
|
|
|
if err != nil { |
|
|
|
|