api_keys.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package httpd
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "github.com/go-chi/render"
  7. "github.com/drakkan/sftpgo/v2/dataprovider"
  8. "github.com/drakkan/sftpgo/v2/util"
  9. )
  10. func getAPIKeys(w http.ResponseWriter, r *http.Request) {
  11. r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize)
  12. limit, offset, order, err := getSearchFilters(w, r)
  13. if err != nil {
  14. return
  15. }
  16. apiKeys, err := dataprovider.GetAPIKeys(limit, offset, order)
  17. if err != nil {
  18. sendAPIResponse(w, r, err, "", getRespStatus(err))
  19. return
  20. }
  21. render.JSON(w, r, apiKeys)
  22. }
  23. func getAPIKeyByID(w http.ResponseWriter, r *http.Request) {
  24. r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize)
  25. keyID := getURLParam(r, "id")
  26. apiKey, err := dataprovider.APIKeyExists(keyID)
  27. if err != nil {
  28. sendAPIResponse(w, r, err, "", getRespStatus(err))
  29. return
  30. }
  31. apiKey.HideConfidentialData()
  32. render.JSON(w, r, apiKey)
  33. }
  34. func addAPIKey(w http.ResponseWriter, r *http.Request) {
  35. r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize)
  36. claims, err := getTokenClaims(r)
  37. if err != nil || claims.Username == "" {
  38. sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest)
  39. return
  40. }
  41. var apiKey dataprovider.APIKey
  42. err = render.DecodeJSON(r.Body, &apiKey)
  43. if err != nil {
  44. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  45. return
  46. }
  47. apiKey.ID = 0
  48. apiKey.KeyID = ""
  49. apiKey.Key = ""
  50. apiKey.LastUseAt = 0
  51. err = dataprovider.AddAPIKey(&apiKey, claims.Username, util.GetIPFromRemoteAddress(r.RemoteAddr))
  52. if err != nil {
  53. sendAPIResponse(w, r, err, "", getRespStatus(err))
  54. return
  55. }
  56. response := make(map[string]string)
  57. response["message"] = "API key created. This is the only time the API key is visible, please save it."
  58. response["key"] = apiKey.DisplayKey()
  59. w.Header().Add("Location", fmt.Sprintf("%v/%v", apiKeysPath, apiKey.KeyID))
  60. w.Header().Add("X-Object-ID", apiKey.KeyID)
  61. ctx := context.WithValue(r.Context(), render.StatusCtxKey, http.StatusCreated)
  62. render.JSON(w, r.WithContext(ctx), response)
  63. }
  64. func updateAPIKey(w http.ResponseWriter, r *http.Request) {
  65. r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize)
  66. claims, err := getTokenClaims(r)
  67. if err != nil || claims.Username == "" {
  68. sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest)
  69. return
  70. }
  71. keyID := getURLParam(r, "id")
  72. apiKey, err := dataprovider.APIKeyExists(keyID)
  73. if err != nil {
  74. sendAPIResponse(w, r, err, "", getRespStatus(err))
  75. return
  76. }
  77. err = render.DecodeJSON(r.Body, &apiKey)
  78. if err != nil {
  79. sendAPIResponse(w, r, err, "", http.StatusBadRequest)
  80. return
  81. }
  82. apiKey.KeyID = keyID
  83. if err := dataprovider.UpdateAPIKey(&apiKey, claims.Username, util.GetIPFromRemoteAddress(r.RemoteAddr)); err != nil {
  84. sendAPIResponse(w, r, err, "", getRespStatus(err))
  85. return
  86. }
  87. sendAPIResponse(w, r, nil, "API key updated", http.StatusOK)
  88. }
  89. func deleteAPIKey(w http.ResponseWriter, r *http.Request) {
  90. r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize)
  91. keyID := getURLParam(r, "id")
  92. claims, err := getTokenClaims(r)
  93. if err != nil || claims.Username == "" {
  94. sendAPIResponse(w, r, err, "Invalid token claims", http.StatusBadRequest)
  95. return
  96. }
  97. err = dataprovider.DeleteAPIKey(keyID, claims.Username, util.GetIPFromRemoteAddress(r.RemoteAddr))
  98. if err != nil {
  99. sendAPIResponse(w, r, err, "", getRespStatus(err))
  100. return
  101. }
  102. sendAPIResponse(w, r, err, "API key deleted", http.StatusOK)
  103. }