externalAPIUsers.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package admin
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "net/http"
  6. "time"
  7. "github.com/owncast/owncast/config"
  8. "github.com/owncast/owncast/controllers"
  9. "github.com/owncast/owncast/core/user"
  10. "github.com/owncast/owncast/utils"
  11. )
  12. type deleteExternalAPIUserRequest struct {
  13. Token string `json:"token"`
  14. }
  15. type createExternalAPIUserRequest struct {
  16. Name string `json:"name"`
  17. Scopes []string `json:"scopes"`
  18. }
  19. // CreateExternalAPIUser will generate a 3rd party access token.
  20. func CreateExternalAPIUser(w http.ResponseWriter, r *http.Request) {
  21. decoder := json.NewDecoder(r.Body)
  22. var request createExternalAPIUserRequest
  23. if err := decoder.Decode(&request); err != nil {
  24. controllers.BadRequestHandler(w, err)
  25. return
  26. }
  27. // Verify all the scopes provided are valid
  28. if !user.HasValidScopes(request.Scopes) {
  29. controllers.BadRequestHandler(w, errors.New("one or more invalid scopes provided"))
  30. return
  31. }
  32. token, err := utils.GenerateAccessToken()
  33. if err != nil {
  34. controllers.InternalErrorHandler(w, err)
  35. return
  36. }
  37. color := utils.GenerateRandomDisplayColor(config.MaxUserColor)
  38. if err := user.InsertExternalAPIUser(token, request.Name, color, request.Scopes); err != nil {
  39. controllers.InternalErrorHandler(w, err)
  40. return
  41. }
  42. w.Header().Set("Content-Type", "application/json")
  43. controllers.WriteResponse(w, user.ExternalAPIUser{
  44. AccessToken: token,
  45. DisplayName: request.Name,
  46. DisplayColor: color,
  47. Scopes: request.Scopes,
  48. CreatedAt: time.Now(),
  49. LastUsedAt: nil,
  50. })
  51. }
  52. // GetExternalAPIUsers will return all 3rd party access tokens.
  53. func GetExternalAPIUsers(w http.ResponseWriter, r *http.Request) {
  54. w.Header().Set("Content-Type", "application/json")
  55. tokens, err := user.GetExternalAPIUser()
  56. if err != nil {
  57. controllers.InternalErrorHandler(w, err)
  58. return
  59. }
  60. controllers.WriteResponse(w, tokens)
  61. }
  62. // DeleteExternalAPIUser will return a single 3rd party access token.
  63. func DeleteExternalAPIUser(w http.ResponseWriter, r *http.Request) {
  64. w.Header().Set("Content-Type", "application/json")
  65. if r.Method != controllers.POST {
  66. controllers.WriteSimpleResponse(w, false, r.Method+" not supported")
  67. return
  68. }
  69. decoder := json.NewDecoder(r.Body)
  70. var request deleteExternalAPIUserRequest
  71. if err := decoder.Decode(&request); err != nil {
  72. controllers.BadRequestHandler(w, err)
  73. return
  74. }
  75. if request.Token == "" {
  76. controllers.BadRequestHandler(w, errors.New("must provide a token"))
  77. return
  78. }
  79. if err := user.DeleteExternalAPIUser(request.Token); err != nil {
  80. controllers.InternalErrorHandler(w, err)
  81. return
  82. }
  83. controllers.WriteSimpleResponse(w, true, "deleted token")
  84. }