summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/minio/minio-go/api-compose-object.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/minio/minio-go/api-compose-object.go')
-rw-r--r--vendor/github.com/minio/minio-go/api-compose-object.go117
1 files changed, 17 insertions, 100 deletions
diff --git a/vendor/github.com/minio/minio-go/api-compose-object.go b/vendor/github.com/minio/minio-go/api-compose-object.go
index 88b60d604..99b2adae8 100644
--- a/vendor/github.com/minio/minio-go/api-compose-object.go
+++ b/vendor/github.com/minio/minio-go/api-compose-object.go
@@ -19,7 +19,6 @@ package minio
import (
"context"
- "encoding/base64"
"fmt"
"net/http"
"net/url"
@@ -27,58 +26,15 @@ import (
"strings"
"time"
+ "github.com/minio/minio-go/pkg/encrypt"
"github.com/minio/minio-go/pkg/s3utils"
)
-// SSEInfo - represents Server-Side-Encryption parameters specified by
-// a user.
-type SSEInfo struct {
- key []byte
- algo string
-}
-
-// NewSSEInfo - specifies (binary or un-encoded) encryption key and
-// algorithm name. If algo is empty, it defaults to "AES256". Ref:
-// https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html
-func NewSSEInfo(key []byte, algo string) SSEInfo {
- if algo == "" {
- algo = "AES256"
- }
- return SSEInfo{key, algo}
-}
-
-// internal method that computes SSE-C headers
-func (s *SSEInfo) getSSEHeaders(isCopySource bool) map[string]string {
- if s == nil {
- return nil
- }
-
- cs := ""
- if isCopySource {
- cs = "copy-source-"
- }
- return map[string]string{
- "x-amz-" + cs + "server-side-encryption-customer-algorithm": s.algo,
- "x-amz-" + cs + "server-side-encryption-customer-key": base64.StdEncoding.EncodeToString(s.key),
- "x-amz-" + cs + "server-side-encryption-customer-key-MD5": sumMD5Base64(s.key),
- }
-}
-
-// GetSSEHeaders - computes and returns headers for SSE-C as key-value
-// pairs. They can be set as metadata in PutObject* requests (for
-// encryption) or be set as request headers in `Core.GetObject` (for
-// decryption).
-func (s *SSEInfo) GetSSEHeaders() map[string]string {
- return s.getSSEHeaders(false)
-}
-
// DestinationInfo - type with information about the object to be
// created via server-side copy requests, using the Compose API.
type DestinationInfo struct {
bucket, object string
-
- // key for encrypting destination
- encryption *SSEInfo
+ encryption encrypt.ServerSide
// if no user-metadata is provided, it is copied from source
// (when there is only once source object in the compose
@@ -97,9 +53,7 @@ type DestinationInfo struct {
// if needed. If nil is passed, and if only a single source (of any
// size) is provided in the ComposeObject call, then metadata from the
// source is copied to the destination.
-func NewDestinationInfo(bucket, object string, encryptSSEC *SSEInfo,
- userMeta map[string]string) (d DestinationInfo, err error) {
-
+func NewDestinationInfo(bucket, object string, sse encrypt.ServerSide, userMeta map[string]string) (d DestinationInfo, err error) {
// Input validation.
if err = s3utils.CheckValidBucketName(bucket); err != nil {
return d, err
@@ -125,7 +79,7 @@ func NewDestinationInfo(bucket, object string, encryptSSEC *SSEInfo,
return DestinationInfo{
bucket: bucket,
object: object,
- encryption: encryptSSEC,
+ encryption: sse,
userMetadata: m,
}, nil
}
@@ -154,10 +108,8 @@ func (d *DestinationInfo) getUserMetaHeadersMap(withCopyDirectiveHeader bool) ma
// server-side copying APIs.
type SourceInfo struct {
bucket, object string
-
- start, end int64
-
- decryptKey *SSEInfo
+ start, end int64
+ encryption encrypt.ServerSide
// Headers to send with the upload-part-copy request involving
// this source object.
Headers http.Header
@@ -169,23 +121,17 @@ type SourceInfo struct {
// `decryptSSEC` is the decryption key using server-side-encryption
// with customer provided key. It may be nil if the source is not
// encrypted.
-func NewSourceInfo(bucket, object string, decryptSSEC *SSEInfo) SourceInfo {
+func NewSourceInfo(bucket, object string, sse encrypt.ServerSide) SourceInfo {
r := SourceInfo{
bucket: bucket,
object: object,
start: -1, // range is unspecified by default
- decryptKey: decryptSSEC,
+ encryption: sse,
Headers: make(http.Header),
}
// Set the source header
r.Headers.Set("x-amz-copy-source", s3utils.EncodePath(bucket+"/"+object))
-
- // Assemble decryption headers for upload-part-copy request
- for k, v := range decryptSSEC.getSSEHeaders(true) {
- r.Headers.Set(k, v)
- }
-
return r
}
@@ -245,10 +191,7 @@ func (s *SourceInfo) getProps(c Client) (size int64, etag string, userMeta map[s
// Get object info - need size and etag here. Also, decryption
// headers are added to the stat request if given.
var objInfo ObjectInfo
- opts := StatObjectOptions{}
- for k, v := range s.decryptKey.getSSEHeaders(false) {
- opts.Set(k, v)
- }
+ opts := StatObjectOptions{GetObjectOptions{ServerSideEncryption: encrypt.SSE(s.encryption)}}
objInfo, err = c.statObject(context.Background(), s.bucket, s.object, opts)
if err != nil {
err = ErrInvalidArgument(fmt.Sprintf("Could not stat object - %s/%s: %v", s.bucket, s.object, err))
@@ -478,37 +421,7 @@ func (c Client) ComposeObject(dst DestinationInfo, srcs []SourceInfo) error {
// involved, it is being copied wholly and at most 5GiB in
// size, emptyfiles are also supported).
if (totalParts == 1 && srcs[0].start == -1 && totalSize <= maxPartSize) || (totalSize == 0) {
- h := srcs[0].Headers
- // Add destination encryption headers
- for k, v := range dst.encryption.getSSEHeaders(false) {
- h.Set(k, v)
- }
-
- // If no user metadata is specified (and so, the
- // for-loop below is not entered), metadata from the
- // source is copied to the destination (due to
- // single-part copy-object PUT request behaviour).
- for k, v := range dst.getUserMetaHeadersMap(true) {
- h.Set(k, v)
- }
-
- // Send copy request
- resp, err := c.executeMethod(ctx, "PUT", requestMetadata{
- bucketName: dst.bucket,
- objectName: dst.object,
- customHeader: h,
- })
- defer closeResponse(resp)
- if err != nil {
- return err
- }
- // Check if we got an error response.
- if resp.StatusCode != http.StatusOK {
- return httpRespToErrorResponse(resp, dst.bucket, dst.object)
- }
-
- // Return nil on success.
- return nil
+ return c.CopyObject(dst, srcs[0])
}
// Now, handle multipart-copy cases.
@@ -527,7 +440,8 @@ func (c Client) ComposeObject(dst DestinationInfo, srcs []SourceInfo) error {
for k, v := range metaMap {
metaHeaders[k] = v
}
- uploadID, err := c.newUploadID(ctx, dst.bucket, dst.object, PutObjectOptions{UserMetadata: metaHeaders})
+
+ uploadID, err := c.newUploadID(ctx, dst.bucket, dst.object, PutObjectOptions{ServerSideEncryption: dst.encryption, UserMetadata: metaHeaders})
if err != nil {
return err
}
@@ -537,9 +451,12 @@ func (c Client) ComposeObject(dst DestinationInfo, srcs []SourceInfo) error {
partIndex := 1
for i, src := range srcs {
h := src.Headers
+ if src.encryption != nil {
+ src.encryption.Marshal(h)
+ }
// Add destination encryption headers
- for k, v := range dst.encryption.getSSEHeaders(false) {
- h.Set(k, v)
+ if dst.encryption != nil {
+ dst.encryption.Marshal(h)
}
// calculate start/end indices of parts after