util.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. var (
  11. app_key = "private build"
  12. app_secret = "private build"
  13. )
  14. func (d *Dropbox) getRefreshToken() error {
  15. url := "https://api.dropbox.com/oauth2/token"
  16. var resp base.TokenResp
  17. var e TokenError
  18. res, err := base.RestyClient.R().SetResult(&resp).SetError(&e).
  19. SetFormData(map[string]string{
  20. "code": d.Code,
  21. "grant_type": "authorization_code",
  22. "redirect_uri": "https://cloudoauth.files.casaos.app",
  23. }).SetBasicAuth(d.Addition.AppKey, d.Addition.AppSecret).SetHeader("Content-Type", "application/x-www-form-urlencoded").Post(url)
  24. if err != nil {
  25. return err
  26. }
  27. logger.Info("get refresh token", zap.String("res", res.String()))
  28. if e.Error != "" {
  29. return fmt.Errorf(e.Error)
  30. }
  31. d.RefreshToken = resp.RefreshToken
  32. return nil
  33. }
  34. func (d *Dropbox) refreshToken() error {
  35. url := "https://api.dropbox.com/oauth2/token"
  36. var resp base.TokenResp
  37. var e TokenError
  38. res, err := base.RestyClient.R().SetResult(&resp).SetError(&e).
  39. SetFormData(map[string]string{
  40. "refresh_token": d.RefreshToken,
  41. "grant_type": "refresh_token",
  42. }).SetBasicAuth(d.Addition.AppKey, d.Addition.AppSecret).SetHeader("Content-Type", "application/x-www-form-urlencoded").Post(url)
  43. if err != nil {
  44. return err
  45. }
  46. logger.Info("get refresh token", zap.String("res", res.String()))
  47. if e.Error != "" {
  48. return fmt.Errorf(e.Error)
  49. }
  50. d.AccessToken = resp.AccessToken
  51. return nil
  52. }
  53. func (d *Dropbox) request(url string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) {
  54. req := base.RestyClient.R()
  55. req.SetHeader("Authorization", "Bearer "+d.AccessToken)
  56. req.SetHeader("Content-Type", "application/json")
  57. if callback != nil {
  58. callback(req)
  59. }
  60. if resp != nil {
  61. req.SetResult(resp)
  62. }
  63. var e Error
  64. req.SetError(&e)
  65. res, err := req.Execute(method, url)
  66. if err != nil {
  67. return nil, err
  68. }
  69. if e.Error.Code != 0 {
  70. if e.Error.Code == 401 {
  71. err = d.refreshToken()
  72. if err != nil {
  73. return nil, err
  74. }
  75. return d.request(url, method, callback, resp)
  76. }
  77. return nil, fmt.Errorf("%s: %v", e.Error.Message, e.Error.Errors)
  78. }
  79. return res.Body(), nil
  80. }
  81. func (d *Dropbox) getFiles(path string) ([]File, error) {
  82. res := make([]File, 0)
  83. var resp Files
  84. body := base.Json{
  85. "limit": 2000,
  86. "path": path,
  87. }
  88. _, err := d.request("https://api.dropboxapi.com/2/files/list_folder", http.MethodPost, func(req *resty.Request) {
  89. req.SetBody(body)
  90. }, &resp)
  91. if err != nil {
  92. return nil, err
  93. }
  94. res = append(res, resp.Files...)
  95. return res, nil
  96. }
  97. func GetConfig() Dropbox {
  98. dp := Dropbox{}
  99. dp.RootFolderID = ""
  100. dp.AuthUrl = "https://www.dropbox.com/oauth2/authorize?client_id=" + app_key + "&redirect_uri=https://cloudoauth.files.casaos.app&response_type=code&token_access_type=offline&state=${HOST}%2Fv1%2Frecover%2FDropbox&&force_reapprove=true&force_reauthentication=true"
  101. dp.AppKey = app_key
  102. dp.AppSecret = app_secret
  103. dp.Icon = "./img/driver/Dropbox.svg"
  104. return dp
  105. }