1
0
mirror of https://github.com/Luzifer/cloudbox.git synced 2024-09-19 15:12:55 +00:00

Add share functionality for S3

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2019-06-17 00:46:52 +02:00
parent e8d04df376
commit 122eebbd25
Signed by: luzifer
GPG Key ID: DC2729FDD34BE99E

View File

@ -2,7 +2,9 @@ package s3
import ( import (
"bytes" "bytes"
"context"
"crypto/md5" "crypto/md5"
"fmt"
"hash" "hash"
"io" "io"
"net/url" "net/url"
@ -12,14 +14,16 @@ import (
"github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/Luzifer/cloudbox/providers" "github.com/Luzifer/cloudbox/providers"
) )
type Provider struct { type Provider struct {
bucket string bucket string
s3 *s3.S3 bucketRegion string
s3 *s3.S3
} }
func New(uri string) (providers.CloudProvider, error) { func New(uri string) (providers.CloudProvider, error) {
@ -39,11 +43,18 @@ func New(uri string) (providers.CloudProvider, error) {
cfg = cfg.WithCredentials(credentials.NewStaticCredentials(user, pass, "")) cfg = cfg.WithCredentials(credentials.NewStaticCredentials(user, pass, ""))
} }
svc := s3.New(session.Must(session.NewSession(cfg))) sess := session.Must(session.NewSession(cfg))
svc := s3.New(sess)
region, err := s3manager.GetBucketRegion(context.Background(), sess, u.Host, "us-east-1")
if err != nil {
return nil, errors.Wrap(err, "Unable to find bucket region")
}
return &Provider{ return &Provider{
bucket: u.Host, bucket: u.Host,
s3: svc, bucketRegion: region,
s3: svc,
}, nil }, nil
} }
@ -119,6 +130,7 @@ func (p *Provider) PutFile(f providers.File) (providers.File, error) {
} }
if _, err = p.s3.PutObject(&s3.PutObjectInput{ if _, err = p.s3.PutObject(&s3.PutObjectInput{
ACL: aws.String(p.getFileACL(f.Info().RelativeName)),
Body: bytes.NewReader(buf.Bytes()), Body: bytes.NewReader(buf.Bytes()),
Bucket: aws.String(p.bucket), Bucket: aws.String(p.bucket),
Key: aws.String(f.Info().RelativeName), Key: aws.String(f.Info().RelativeName),
@ -130,5 +142,33 @@ func (p *Provider) PutFile(f providers.File) (providers.File, error) {
} }
func (p *Provider) Share(relativeName string) (string, error) { func (p *Provider) Share(relativeName string) (string, error) {
return "", errors.New("Not implemented") _, err := p.s3.PutObjectAcl(&s3.PutObjectAclInput{
ACL: aws.String(s3.ObjectCannedACLPublicRead),
Bucket: aws.String(p.bucket),
Key: aws.String(relativeName),
})
if err != nil {
return "", errors.Wrap(err, "Unable to publish file")
}
return fmt.Sprintf("https://s3-%s.amazonaws.com/%s/%s", p.bucketRegion, p.bucket, relativeName), nil
}
func (p *Provider) getFileACL(relativeName string) string {
objACL, err := p.s3.GetObjectAcl(&s3.GetObjectAclInput{
Bucket: aws.String(p.bucket),
Key: aws.String(relativeName),
})
if err != nil {
return s3.ObjectCannedACLPrivate
}
for _, g := range objACL.Grants {
if *g.Grantee.URI == "http://acs.amazonaws.com/groups/global/AllUsers" && *g.Permission == "READ" {
return s3.ObjectCannedACLPublicRead
}
}
return s3.ObjectCannedACLPrivate
} }