Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 29 additions & 20 deletions api/object-handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ func setGetRespHeaders(w http.ResponseWriter, reqParams url.Values) {
func getStorageClassFromHeader(r *http.Request) (meta.StorageClass, error) {
storageClassStr := r.Header.Get("X-Amz-Storage-Class")


if storageClassStr != "" {
helper.Logger.Println(20, "Get storage class header:", storageClassStr)
return meta.MatchStorageClassIndex(storageClassStr)
Expand Down Expand Up @@ -681,12 +680,10 @@ func (api ObjectAPIHandlers) PutObjectHandler(w http.ResponseWriter, r *http.Req
// Get Content-Md5 sent by client and verify if valid
if _, ok := r.Header["Content-Md5"]; !ok {
metadata["md5Sum"] = ""
} else if len(r.Header.Get("Content-Md5")) == 0 {
helper.Debugln("Content Md5 is null!")
metadata["md5Sum"] = ""
} else {
if len(r.Header.Get("Content-Md5")) == 0 {
helper.Debugln("Content Md5 is null!")
WriteErrorResponse(w, r, ErrInvalidDigest)
return
}
md5Bytes, err := checkValidMD5(r.Header.Get("Content-Md5"))
if err != nil {
helper.Debugln("Content Md5 is invalid!")
Expand Down Expand Up @@ -841,12 +838,10 @@ func (api ObjectAPIHandlers) AppendObjectHandler(w http.ResponseWriter, r *http.
// Get Content-Md5 sent by client and verify if valid
if _, ok := r.Header["Content-Md5"]; !ok {
metadata["md5Sum"] = ""
} else if len(r.Header.Get("Content-Md5")) == 0 {
helper.Debugln("Content Md5 is null!")
metadata["md5Sum"] = ""
} else {
if len(r.Header.Get("Content-Md5")) == 0 {
helper.Debugln("Content Md5 is null!")
WriteErrorResponse(w, r, ErrInvalidDigest)
return
}
md5Bytes, err := checkValidMD5(r.Header.Get("Content-Md5"))
if err != nil {
helper.Debugln("Content Md5 is invalid!")
Expand Down Expand Up @@ -1172,12 +1167,19 @@ func (api ObjectAPIHandlers) PutObjectPartHandler(w http.ResponseWriter, r *http
authType := signature.GetRequestAuthType(r)

var incomingMd5 string
// get Content-Md5 sent by client and verify if valid
md5Bytes, err := checkValidMD5(r.Header.Get("Content-Md5"))
if err != nil {
// get Content-Md5 or HighwayHash sent by client and verify if valid
var err error
if r.Header.Get("Content-Md5") == "" {
incomingMd5 = ""
} else {
incomingMd5 = hex.EncodeToString(md5Bytes)
md5Bytes, err := checkValidMD5(r.Header.Get("Content-Md5"))
if err != nil {
helper.Debugln("Content MD5 is invalid!")
WriteErrorResponse(w, r, ErrInvalidDigest)
return
} else {
incomingMd5 = hex.EncodeToString(md5Bytes)
}
}

size := r.ContentLength
Expand Down Expand Up @@ -1411,9 +1413,14 @@ func (api ObjectAPIHandlers) CopyObjectPartHandler(w http.ResponseWriter, r *htt
pipeWriter.Close()
}()

// Note that sourceObject and targetObject are pointers
targetObject := &meta.Object{}
targetObject.BucketName = targetBucketName
targetObject.Name = targetObjectName
targetObject.Size = readLength

// Create the object.
result, err := api.ObjectAPI.CopyObjectPart(targetBucketName, targetObjectName, targetUploadId,
targetPartId, readLength, pipeReader, credential, sseRequest)
result, err := api.ObjectAPI.CopyObjectPart(targetObject, pipeReader, targetUploadId, targetPartId, credential, sseRequest)
if err != nil {
helper.ErrorIf(err, "Unable to copy object part from "+sourceObjectName+
" to "+targetObjectName)
Expand Down Expand Up @@ -1586,9 +1593,12 @@ func (api ObjectAPIHandlers) CompleteMultipartUploadHandler(w http.ResponseWrite
completeParts = append(completeParts, part)
}

targetObject := &meta.Object{}
targetObject.BucketName = bucketName
targetObject.Name = objectName

var result CompleteMultipartResult
result, err = api.ObjectAPI.CompleteMultipartUpload(credential, bucketName,
objectName, uploadId, completeParts)
result, err = api.ObjectAPI.CompleteMultipartUpload(credential, targetObject, uploadId, completeParts)

if err != nil {
helper.ErrorIf(err, "Unable to complete multipart upload.")
Expand Down Expand Up @@ -1694,7 +1704,6 @@ func (api ObjectAPIHandlers) DeleteObjectHandler(w http.ResponseWriter, r *http.

var ValidSuccessActionStatus = []string{"200", "201", "204"}


func (api ObjectAPIHandlers) PostObjectHandler(w http.ResponseWriter, r *http.Request) {
var err error
// Here the parameter is the size of the form data that should
Expand Down
7 changes: 3 additions & 4 deletions api/object-interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,11 @@
package api

import (
"io"

"github.com/journeymidnight/yig/api/datatype"
"github.com/journeymidnight/yig/api/datatype/policy"
"github.com/journeymidnight/yig/iam/common"
meta "github.com/journeymidnight/yig/meta/types"
"io"
)

// ObjectLayer implements primitives for object API layer.
Expand Down Expand Up @@ -86,12 +85,12 @@ type ObjectLayer interface {
PutObjectPart(bucket, object string, credential common.Credential, uploadID string, partID int,
size int64, data io.Reader, md5Hex string,
sse datatype.SseRequest) (result datatype.PutObjectPartResult, err error)
CopyObjectPart(bucketName, objectName, uploadId string, partId int, size int64, data io.Reader,
CopyObjectPart(targetObject *meta.Object, data io.Reader, uploadId string, partId int,
credential common.Credential, sse datatype.SseRequest) (result datatype.PutObjectResult,
err error)
ListObjectParts(credential common.Credential, bucket, object string,
request datatype.ListPartsRequest) (result datatype.ListPartsResponse, err error)
AbortMultipartUpload(credential common.Credential, bucket, object, uploadID string) error
CompleteMultipartUpload(credential common.Credential, bucket, object, uploadID string,
CompleteMultipartUpload(credential common.Credential, targetObject *meta.Object, uploadID string,
uploadedParts []meta.CompletePart) (result datatype.CompleteMultipartResult, err error)
}
43 changes: 43 additions & 0 deletions api/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,13 @@ package api

import (
"context"
"crypto/md5"
"encoding/base64"
"encoding/xml"
"errors"
"github.com/journeymidnight/yig/helper"
"github.com/minio/highwayhash"
"hash"
"io"
"net/http"
"regexp"
Expand All @@ -29,6 +33,16 @@ import (
"github.com/journeymidnight/yig/crypto"
)

var HwHSecretKey = []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 240, 224,
208, 192, 176, 160, 144, 128, 112, 96, 80, 64, 48, 32, 16, 0} // This is the key for hash sum !

type EtagPrefixType int

const (
EtagMd5 EtagPrefixType = iota
EtagHWH
)

// xmlDecoder provide decoded value in xml.
func xmlDecoder(body io.Reader, v interface{}) error {
d := xml.NewDecoder(body)
Expand Down Expand Up @@ -143,3 +157,32 @@ func setXmlHeader(w http.ResponseWriter, body []byte) {
func hasServerSideEncryptionHeader(header http.Header) bool {
return crypto.S3.IsRequested(header) || crypto.SSEC.IsRequested(header)
}

func JudgeHashWayByEtag(etagPrefix string) (hashWriter hash.Hash, err error) {
switch etagPrefix {
case "HwH":
hashWriter, err = highwayhash.New(HwHSecretKey)
if err != nil {
helper.Debugln("Failed to create HighwayHash instance: %v", err)
return nil, err
}
default:
hashWriter = md5.New()
}
return hashWriter, nil
}

func JudgeWayOfHash(md5um string) (hashWriter hash.Hash, err error) {
if md5um == "" {
helper.Logger.Println(20, "Calculate hash by HighwayHash")
hashWriter, err = highwayhash.New(HwHSecretKey)
if err != nil {
helper.Debugln(20, "Failed to create HighwayHash instance: %v", err)
return nil, err
}
} else {
helper.Logger.Println(20, "Calculate hash by Md5")
hashWriter = md5.New()
}
return hashWriter, nil
}
Loading