diff --git a/drivers/dropbox/driver.go b/drivers/dropbox/driver.go index 95148b94e96..9b1717b04d9 100644 --- a/drivers/dropbox/driver.go +++ b/drivers/dropbox/driver.go @@ -45,7 +45,25 @@ func (d *Dropbox) Init(ctx context.Context) error { if result != query { return fmt.Errorf("failed to check user: %s", string(res)) } - return nil + d.RootNamespaceId, err = d.GetRootNamespaceId(ctx) + + return err +} + +func (d *Dropbox) GetRootNamespaceId(ctx context.Context) (string, error) { + res, err := d.request("/2/users/get_current_account", http.MethodPost, func(req *resty.Request) { + req.SetBody(nil) + }) + if err != nil { + return "", err + } + var currentAccountResp CurrentAccountResp + err = utils.Json.Unmarshal(res, ¤tAccountResp) + if err != nil { + return "", err + } + rootNamespaceId := currentAccountResp.RootInfo.RootNamespaceId + return rootNamespaceId, nil } func (d *Dropbox) Drop(ctx context.Context) error { diff --git a/drivers/dropbox/meta.go b/drivers/dropbox/meta.go index 07ab44695c1..6e7bc014790 100644 --- a/drivers/dropbox/meta.go +++ b/drivers/dropbox/meta.go @@ -17,7 +17,8 @@ type Addition struct { ClientID string `json:"client_id" required:"false" help:"Keep it empty if you don't have one"` ClientSecret string `json:"client_secret" required:"false" help:"Keep it empty if you don't have one"` - AccessToken string + AccessToken string + RootNamespaceId string } var config = driver.Config{ diff --git a/drivers/dropbox/types.go b/drivers/dropbox/types.go index 7ddbb9683c1..f2ec4cb7e7d 100644 --- a/drivers/dropbox/types.go +++ b/drivers/dropbox/types.go @@ -23,6 +23,13 @@ type RefreshTokenErrorResp struct { ErrorDescription string `json:"error_description"` } +type CurrentAccountResp struct { + RootInfo struct { + RootNamespaceId string `json:"root_namespace_id"` + HomeNamespaceId string `json:"home_namespace_id"` + } `json:"root_info"` +} + type File struct { Tag string `json:".tag"` Name string `json:"name"` diff --git a/drivers/dropbox/util.go b/drivers/dropbox/util.go index 14a5c6c6fc6..5065f08d394 100644 --- a/drivers/dropbox/util.go +++ b/drivers/dropbox/util.go @@ -46,12 +46,22 @@ func (d *Dropbox) refreshToken() error { func (d *Dropbox) request(uri, method string, callback base.ReqCallback, retry ...bool) ([]byte, error) { req := base.RestyClient.R() req.SetHeader("Authorization", "Bearer "+d.AccessToken) - if method == http.MethodPost { - req.SetHeader("Content-Type", "application/json") + if d.RootNamespaceId != "" { + apiPathRootJson, err := utils.Json.MarshalToString(map[string]interface{}{ + ".tag": "root", + "root": d.RootNamespaceId, + }) + if err != nil { + return nil, err + } + req.SetHeader("Dropbox-API-Path-Root", apiPathRootJson) } if callback != nil { callback(req) } + if method == http.MethodPost && req.Body != nil { + req.SetHeader("Content-Type", "application/json") + } var e ErrorResp req.SetError(&e) res, err := req.Execute(method, d.base+uri)