aboutsummaryrefslogtreecommitdiff
path: root/weed/s3api
diff options
context:
space:
mode:
authorChris Lu <chrislusf@users.noreply.github.com>2020-12-03 00:40:20 -0800
committerGitHub <noreply@github.com>2020-12-03 00:40:20 -0800
commit5fb60b713574d546922b6e13364396bd98325e48 (patch)
treecdef6045d04e86d3a6f6f42ab53282d24074cd53 /weed/s3api
parent4d2855476c35a2762a225c6707731067e84c71bc (diff)
parent14699dfcef11493b6823503be948841f6d2921bb (diff)
downloadseaweedfs-5fb60b713574d546922b6e13364396bd98325e48.tar.xz
seaweedfs-5fb60b713574d546922b6e13364396bd98325e48.zip
Merge pull request #1596 from kmlebedev/store_s3cred
S3 credentials store in filer
Diffstat (limited to 'weed/s3api')
-rw-r--r--weed/s3api/auth_credentials.go44
-rw-r--r--weed/s3api/auto_signature_v4_test.go6
-rw-r--r--weed/s3api/filer_util.go3
-rw-r--r--weed/s3api/s3api_server.go2
4 files changed, 40 insertions, 15 deletions
diff --git a/weed/s3api/auth_credentials.go b/weed/s3api/auth_credentials.go
index c5dae782d..de1a0e3a1 100644
--- a/weed/s3api/auth_credentials.go
+++ b/weed/s3api/auth_credentials.go
@@ -3,11 +3,15 @@ package s3api
import (
"bytes"
"fmt"
+ "github.com/chrislusf/seaweedfs/weed/pb"
+ "github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
+ "google.golang.org/grpc"
"io/ioutil"
"net/http"
xhttp "github.com/chrislusf/seaweedfs/weed/s3api/http"
"github.com/chrislusf/seaweedfs/weed/s3api/s3err"
+ "github.com/chrislusf/seaweedfs/weed/s3iam"
"github.com/golang/protobuf/jsonpb"
"github.com/chrislusf/seaweedfs/weed/glog"
@@ -44,23 +48,38 @@ type Credential struct {
SecretKey string
}
-func NewIdentityAccessManagement(fileName string, domain string) *IdentityAccessManagement {
+func NewIdentityAccessManagement(option *S3ApiServerOption) *IdentityAccessManagement {
iam := &IdentityAccessManagement{
- domain: domain,
+ domain: option.DomainName,
}
- if fileName == "" {
- return iam
+ if err := iam.loadS3ApiConfigurationFromFiler(option); err != nil {
+ glog.Warningf("fail to load config %v", err)
}
- if err := iam.loadS3ApiConfiguration(fileName); err != nil {
- glog.Fatalf("fail to load config file %s: %v", fileName, err)
+ if len(iam.identities) == 0 && option.Config != "" {
+ if err := iam.loadS3ApiConfigurationFromFile(option.Config); err != nil {
+ glog.Fatalf("fail to load config file %s: %v", option.Config, err)
+ }
}
return iam
}
-func (iam *IdentityAccessManagement) loadS3ApiConfiguration(fileName string) error {
-
+func (iam *IdentityAccessManagement) loadS3ApiConfigurationFromFiler(option *S3ApiServerOption) error {
s3ApiConfiguration := &iam_pb.S3ApiConfiguration{}
+ return pb.WithCachedGrpcClient(func(grpcConnection *grpc.ClientConn) error {
+ client := filer_pb.NewSeaweedFilerClient(grpcConnection)
+ store := s3iam.NewIAMFilerStore(&client)
+ if err := store.LoadIAMConfig(s3ApiConfiguration); err != nil {
+ return nil
+ }
+ if err := iam.loadS3ApiConfiguration(s3ApiConfiguration); err != nil {
+ return err
+ }
+ return nil
+ }, option.FilerGrpcAddress, option.GrpcDialOption)
+}
+func (iam *IdentityAccessManagement) loadS3ApiConfigurationFromFile(fileName string) error {
+ s3ApiConfiguration := &iam_pb.S3ApiConfiguration{}
rawData, readErr := ioutil.ReadFile(fileName)
if readErr != nil {
glog.Warningf("fail to read %s : %v", fileName, readErr)
@@ -72,8 +91,14 @@ func (iam *IdentityAccessManagement) loadS3ApiConfiguration(fileName string) err
glog.Warningf("unmarshal error: %v", err)
return fmt.Errorf("unmarshal %s error: %v", fileName, err)
}
+ if err := iam.loadS3ApiConfiguration(s3ApiConfiguration); err != nil {
+ return err
+ }
+ return nil
+}
- for _, ident := range s3ApiConfiguration.Identities {
+func (iam *IdentityAccessManagement) loadS3ApiConfiguration(config *iam_pb.S3ApiConfiguration) error {
+ for _, ident := range config.Identities {
t := &Identity{
Name: ident.Name,
Credentials: nil,
@@ -90,7 +115,6 @@ func (iam *IdentityAccessManagement) loadS3ApiConfiguration(fileName string) err
}
iam.identities = append(iam.identities, t)
}
-
return nil
}
diff --git a/weed/s3api/auto_signature_v4_test.go b/weed/s3api/auto_signature_v4_test.go
index 8f1c9b470..4c8255768 100644
--- a/weed/s3api/auto_signature_v4_test.go
+++ b/weed/s3api/auto_signature_v4_test.go
@@ -57,7 +57,8 @@ func TestIsRequestPresignedSignatureV4(t *testing.T) {
// Tests is requested authenticated function, tests replies for s3 errors.
func TestIsReqAuthenticated(t *testing.T) {
- iam := NewIdentityAccessManagement("", "")
+ option := S3ApiServerOption{}
+ iam := NewIdentityAccessManagement(&option)
iam.identities = []*Identity{
{
Name: "someone",
@@ -92,7 +93,8 @@ func TestIsReqAuthenticated(t *testing.T) {
}
func TestCheckAdminRequestAuthType(t *testing.T) {
- iam := NewIdentityAccessManagement("", "")
+ option := S3ApiServerOption{}
+ iam := NewIdentityAccessManagement(&option)
iam.identities = []*Identity{
{
Name: "someone",
diff --git a/weed/s3api/filer_util.go b/weed/s3api/filer_util.go
index b6ac52c80..3626ece98 100644
--- a/weed/s3api/filer_util.go
+++ b/weed/s3api/filer_util.go
@@ -3,11 +3,10 @@ package s3api
import (
"context"
"fmt"
- "strings"
-
"github.com/chrislusf/seaweedfs/weed/glog"
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
"github.com/chrislusf/seaweedfs/weed/util"
+ "strings"
)
func (s3a *S3ApiServer) mkdir(parentDirectoryPath string, dirName string, fn func(entry *filer_pb.Entry)) error {
diff --git a/weed/s3api/s3api_server.go b/weed/s3api/s3api_server.go
index b1e1cfe80..850a02171 100644
--- a/weed/s3api/s3api_server.go
+++ b/weed/s3api/s3api_server.go
@@ -27,7 +27,7 @@ type S3ApiServer struct {
func NewS3ApiServer(router *mux.Router, option *S3ApiServerOption) (s3ApiServer *S3ApiServer, err error) {
s3ApiServer = &S3ApiServer{
option: option,
- iam: NewIdentityAccessManagement(option.Config, option.DomainName),
+ iam: NewIdentityAccessManagement(option),
}
s3ApiServer.registerRouter(router)