util.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package dropbox
  2. import (
  3. "fmt"
  4. "net/http"
  5. "github.com/IceWhaleTech/CasaOS-Common/utils/logger"
  6. "github.com/IceWhaleTech/CasaOS/drivers/base"
  7. "github.com/go-resty/resty/v2"
  8. "go.uber.org/zap"
  9. )
  10. func (d *Dropbox) getRefreshToken() error {
  11. url := "https://api.dropbox.com/oauth2/token"
  12. var resp base.TokenResp
  13. var e TokenError
  14. res, err := base.RestyClient.R().SetResult(&resp).SetError(&e).
  15. SetFormData(map[string]string{
  16. "code": d.Code,
  17. "grant_type": "authorization_code",
  18. "redirect_uri": "https://cloudoauth.files.casaos.app",
  19. }).SetBasicAuth(d.Addition.AppKey, d.Addition.AppSecret).SetHeader("Content-Type", "application/x-www-form-urlencoded").Post(url)
  20. if err != nil {
  21. return err
  22. }
  23. logger.Info("get refresh token", zap.String("res", res.String()))
  24. if e.Error != "" {
  25. return fmt.Errorf(e.Error)
  26. }
  27. d.RefreshToken = resp.RefreshToken
  28. return nil
  29. }
  30. func (d *Dropbox) refreshToken() error {
  31. url := "https://api.dropbox.com/oauth2/token"
  32. var resp base.TokenResp
  33. var e TokenError
  34. res, err := base.RestyClient.R().SetResult(&resp).SetError(&e).
  35. SetFormData(map[string]string{
  36. "refresh_token": d.RefreshToken,
  37. "grant_type": "refresh_token",
  38. }).SetBasicAuth(d.Addition.AppKey, d.Addition.AppSecret).SetHeader("Content-Type", "application/x-www-form-urlencoded").Post(url)
  39. if err != nil {
  40. return err
  41. }
  42. logger.Info("get refresh token", zap.String("res", res.String()))
  43. if e.Error != "" {
  44. return fmt.Errorf(e.Error)
  45. }
  46. d.AccessToken = resp.AccessToken
  47. return nil
  48. }
  49. func (d *Dropbox) request(url string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) {
  50. req := base.RestyClient.R()
  51. req.SetHeader("Authorization", "Bearer "+d.AccessToken)
  52. req.SetHeader("Content-Type", "application/json")
  53. if callback != nil {
  54. callback(req)
  55. }
  56. if resp != nil {
  57. req.SetResult(resp)
  58. }
  59. var e Error
  60. req.SetError(&e)
  61. res, err := req.Execute(method, url)
  62. if err != nil {
  63. return nil, err
  64. }
  65. if e.Error.Code != 0 {
  66. if e.Error.Code == 401 {
  67. err = d.refreshToken()
  68. if err != nil {
  69. return nil, err
  70. }
  71. return d.request(url, method, callback, resp)
  72. }
  73. return nil, fmt.Errorf("%s: %v", e.Error.Message, e.Error.Errors)
  74. }
  75. return res.Body(), nil
  76. }
  77. func (d *Dropbox) getFiles(path string) ([]File, error) {
  78. res := make([]File, 0)
  79. var resp Files
  80. body := base.Json{
  81. "limit": 2000,
  82. "path": path,
  83. }
  84. _, err := d.request("https://api.dropboxapi.com/2/files/list_folder", http.MethodPost, func(req *resty.Request) {
  85. req.SetBody(body)
  86. }, &resp)
  87. if err != nil {
  88. return nil, err
  89. }
  90. res = append(res, resp.Files...)
  91. return res, nil
  92. }