You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

presigned.go 4.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package cdsapi
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "net/url"
  7. "time"
  8. v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
  9. "github.com/aws/aws-sdk-go-v2/credentials"
  10. "github.com/google/go-querystring/query"
  11. cdssdk "gitlink.org.cn/cloudream/common/sdks/storage"
  12. )
  13. const (
  14. AuthService = "jcs"
  15. AuthRegion = "any"
  16. )
  17. type PresignedService struct {
  18. *Client
  19. accessKey string
  20. secretKey string
  21. }
  22. func (c *Client) Presigned(accessKey string, secretKey string) *PresignedService {
  23. return &PresignedService{
  24. Client: c,
  25. accessKey: accessKey,
  26. secretKey: secretKey,
  27. }
  28. }
  29. const PresignedObjectDownloadByPathPath = "/v1/presigned/object/downloadByPath"
  30. type PresignedObjectDownloadByPath struct {
  31. UserID cdssdk.UserID `form:"userID" url:"userID" binding:"required"`
  32. PackageID cdssdk.PackageID `form:"packageID" url:"packageID" binding:"required"`
  33. Path string `form:"path" url:"path" binding:"required"`
  34. Offset int64 `form:"offset" url:"offset,omitempty"`
  35. Length *int64 `form:"length" url:"length,omitempty"`
  36. }
  37. func (c *PresignedService) ObjectDownload(req PresignedObjectDownloadByPath, expireIn int) (string, error) {
  38. return c.presign(req, PresignedObjectDownloadByPathPath, http.MethodGet, expireIn)
  39. }
  40. const PresignedObjectUploadPath = "/v1/presigned/object/upload"
  41. type PresignedObjectUpload struct {
  42. UserID cdssdk.UserID `form:"userID" binding:"required" url:"userID"`
  43. PackageID cdssdk.PackageID `form:"packageID" binding:"required" url:"packageID"`
  44. Path string `form:"path" binding:"required" url:"path"`
  45. Affinity cdssdk.StorageID `form:"affinity" url:"affinity,omitempty"`
  46. LoadTo []cdssdk.StorageID `form:"loadTo" url:"loadTo,omitempty"`
  47. LoadToPath []string `form:"loadToPath" url:"loadToPath,omitempty"`
  48. }
  49. type PresignedObjectUploadResp struct {
  50. Object cdssdk.Object `json:"object"`
  51. }
  52. func (c *PresignedService) ObjectUpload(req PresignedObjectUpload, expireIn int) (string, error) {
  53. return c.presign(req, PresignedObjectUploadPath, http.MethodPost, expireIn)
  54. }
  55. const PresignedObjectNewMultipartUploadPath = "/v1/presigned/object/newMultipartUpload"
  56. type PresignedObjectNewMultipartUpload struct {
  57. UserID cdssdk.UserID `form:"userID" binding:"required" url:"userID"`
  58. PackageID cdssdk.PackageID `form:"packageID" binding:"required" url:"packageID"`
  59. Path string `form:"path" binding:"required" url:"path"`
  60. }
  61. type PresignedObjectNewMultipartUploadResp struct {
  62. Object cdssdk.Object `json:"object"`
  63. }
  64. func (c *PresignedService) ObjectNewMultipartUpload(req PresignedObjectNewMultipartUpload, expireIn int) (string, error) {
  65. return c.presign(req, PresignedObjectNewMultipartUploadPath, http.MethodPost, expireIn)
  66. }
  67. const PresignedObjectUploadPartPath = "/v1/presigned/object/uploadPart"
  68. type PresignedObjectUploadPart struct {
  69. UserID cdssdk.UserID `form:"userID" binding:"required" url:"userID"`
  70. ObjectID cdssdk.ObjectID `form:"objectID" binding:"required" url:"objectID"`
  71. Index int `form:"index" binding:"required" url:"index"`
  72. }
  73. type PresignedUploadPartResp struct{}
  74. func (c *PresignedService) ObjectUploadPart(req PresignedObjectUploadPart, expireIn int) (string, error) {
  75. return c.presign(req, PresignedObjectUploadPartPath, http.MethodPost, expireIn)
  76. }
  77. const PresignedObjectCompleteMultipartUploadPath = "/v1/presigned/object/completeMultipartUpload"
  78. type PresignedObjectCompleteMultipartUpload struct {
  79. UserID cdssdk.UserID `form:"userID" binding:"required" url:"userID"`
  80. ObjectID cdssdk.ObjectID `form:"objectID" binding:"required" url:"objectID"`
  81. Indexes []int `form:"indexes" binding:"required" url:"indexes"`
  82. }
  83. type PresignedObjectCompleteMultipartUploadResp struct {
  84. Object cdssdk.Object `json:"object"`
  85. }
  86. func (c *PresignedService) ObjectCompleteMultipartUpload(req PresignedObjectCompleteMultipartUpload, expireIn int) (string, error) {
  87. return c.presign(req, PresignedObjectCompleteMultipartUploadPath, http.MethodPost, expireIn)
  88. }
  89. func (c *PresignedService) presign(req any, path string, method string, expireIn int) (string, error) {
  90. u, err := url.Parse(c.baseURL)
  91. if err != nil {
  92. return "", err
  93. }
  94. u = u.JoinPath(path)
  95. us, err := query.Values(req)
  96. if err != nil {
  97. return "", err
  98. }
  99. us.Add("X-Expires", fmt.Sprintf("%v", expireIn))
  100. u.RawQuery = us.Encode()
  101. prod := credentials.NewStaticCredentialsProvider(c.accessKey, c.secretKey, "")
  102. cred, err := prod.Retrieve(context.TODO())
  103. if err != nil {
  104. return "", err
  105. }
  106. r, err := http.NewRequest(method, u.String(), nil)
  107. if err != nil {
  108. return "", err
  109. }
  110. signer := v4.NewSigner()
  111. signedURL, _, err := signer.PresignHTTP(context.Background(), cred, r, "", AuthService, AuthRegion, time.Now())
  112. return signedURL, err
  113. }