|
|
|
|
@@ -3,6 +3,7 @@ package filedata
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
|
|
|
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
|
|
|
|
"github.com/aws/aws-sdk-go/service/s3"
|
|
|
|
|
"github.com/aws/aws-sdk-go/service/s3/s3manager"
|
|
|
|
|
@@ -20,6 +21,7 @@ import (
|
|
|
|
|
"github.com/gin-contrib/requestid"
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
|
"net/http"
|
|
|
|
|
"sync"
|
|
|
|
|
gTime "time"
|
|
|
|
|
)
|
|
|
|
|
@@ -95,6 +97,9 @@ func (c *Controller) InsertOrUpdateMetadata(ctx *gin.Context, req *fileData.PutF
|
|
|
|
|
if req.Type != ente.MlData {
|
|
|
|
|
return stacktrace.Propagate(ente.NewBadRequestWithMessage("unsupported object type "+string(req.Type)), "")
|
|
|
|
|
}
|
|
|
|
|
if versionErr := c._validateLastUpdatedAt(ctx, req.LastUpdatedAt, req.FileID, req.Type); versionErr != nil {
|
|
|
|
|
return stacktrace.Propagate(versionErr, "")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bucketID := c.S3Config.GetBucketID(req.Type)
|
|
|
|
|
objectKey := fileData.ObjectMetadataKey(req.FileID, fileOwnerID, req.Type, nil)
|
|
|
|
|
@@ -161,6 +166,7 @@ func (c *Controller) GetFileData(ctx *gin.Context, actorUser int64, req fileData
|
|
|
|
|
Type: doRows[0].Type,
|
|
|
|
|
EncryptedData: s3MetaObject.EncryptedData,
|
|
|
|
|
DecryptionHeader: s3MetaObject.DecryptionHeader,
|
|
|
|
|
UpdatedAt: doRows[0].UpdatedAt,
|
|
|
|
|
}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -205,6 +211,7 @@ func (c *Controller) GetFilesData(ctx *gin.Context, req fileData.GetFilesData) (
|
|
|
|
|
Type: obj.dbEntry.Type,
|
|
|
|
|
EncryptedData: obj.s3MetaObject.EncryptedData,
|
|
|
|
|
DecryptionHeader: obj.s3MetaObject.DecryptionHeader,
|
|
|
|
|
UpdatedAt: obj.dbEntry.UpdatedAt,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -317,6 +324,38 @@ func (c *Controller) _checkMetadataReadOrWritePerm(ctx *gin.Context, userID int6
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Controller) _validateLastUpdatedAt(ctx *gin.Context, lastUpdatedAt *int64, fileID int64, oType ente.ObjectType) error {
|
|
|
|
|
if lastUpdatedAt == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
doRows, err := c.Repo.GetFilesData(ctx, oType, []int64{fileID})
|
|
|
|
|
if err != nil {
|
|
|
|
|
return stacktrace.Propagate(err, "failed to get data")
|
|
|
|
|
}
|
|
|
|
|
var invalidVersionErr = &ente.ApiError{
|
|
|
|
|
HttpStatusCode: http.StatusConflict,
|
|
|
|
|
Code: "INVALID_VERSION",
|
|
|
|
|
Message: "",
|
|
|
|
|
}
|
|
|
|
|
if len(doRows) == 0 {
|
|
|
|
|
if *lastUpdatedAt == 0 {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
invalidVersionErr.Message = "non zero version empty data"
|
|
|
|
|
return invalidVersionErr
|
|
|
|
|
}
|
|
|
|
|
if doRows[0].IsDeleted {
|
|
|
|
|
invalidVersionErr.Message = "data deleted"
|
|
|
|
|
return invalidVersionErr
|
|
|
|
|
}
|
|
|
|
|
dbUpdatedAt := doRows[0].UpdatedAt
|
|
|
|
|
if dbUpdatedAt != *lastUpdatedAt {
|
|
|
|
|
invalidVersionErr.Message = fmt.Sprintf("version mismatch expected %d, found %d", dbUpdatedAt, *lastUpdatedAt)
|
|
|
|
|
return invalidVersionErr
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// _checkPreviewWritePerm is
|
|
|
|
|
func (c *Controller) _checkPreviewWritePerm(ctx *gin.Context, fileID int64, actorID int64) error {
|
|
|
|
|
err := c.AccessCtrl.VerifyFileOwnership(ctx, &access.VerifyFileOwnershipParams{
|
|
|
|
|
|