-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move aws auth library dp-elasticsearch --> dp-net
- Loading branch information
Showing
5 changed files
with
207 additions
and
9 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
package awsauth | ||
|
||
import ( | ||
"errors" | ||
"io" | ||
"net/http" | ||
"time" | ||
|
||
"github.com/aws/aws-sdk-go/aws/credentials" | ||
"github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds" | ||
"github.com/aws/aws-sdk-go/aws/ec2metadata" | ||
"github.com/aws/aws-sdk-go/aws/session" | ||
signerV4 "github.com/aws/aws-sdk-go/aws/signer/v4" | ||
) | ||
|
||
type Signer struct { | ||
awsRegion string | ||
awsService string | ||
v4 *signerV4.Signer | ||
} | ||
|
||
func NewAwsSigner(awsFilename, awsProfile, awsRegion, awsService string) (signer *Signer, err error) { | ||
if err = validateAwsSDKSigner(awsRegion, awsService); err != nil { | ||
return | ||
} | ||
|
||
var sess *session.Session | ||
sess, err = session.NewSession() | ||
if err != nil { | ||
return | ||
} | ||
|
||
creds := credentials.NewChainCredentials( | ||
[]credentials.Provider{ | ||
&credentials.EnvProvider{}, | ||
&credentials.SharedCredentialsProvider{ | ||
Filename: awsFilename, | ||
Profile: awsProfile, | ||
}, | ||
&ec2rolecreds.EC2RoleProvider{ | ||
Client: ec2metadata.New(sess), | ||
}, | ||
}, | ||
) | ||
|
||
signer = &Signer{ | ||
awsRegion: awsRegion, | ||
awsService: awsService, | ||
v4: signerV4.NewSigner(creds), | ||
} | ||
|
||
return | ||
} | ||
|
||
func (s *Signer) Sign(req *http.Request, bodyReader io.ReadSeeker, currentTime time.Time) (err error) { | ||
if s == nil || s.v4 == nil { | ||
return errors.New("v4 signer missing. Cannot sign request") | ||
} | ||
|
||
if _, err = s.v4.Sign(req, bodyReader, s.awsService, s.awsRegion, time.Now()); err != nil { | ||
return | ||
} | ||
|
||
return | ||
} | ||
|
||
func validateAwsSDKSigner(awsRegion, awsService string) error { | ||
if awsRegion == "" { | ||
return errors.New("no AWS region was provided. Cannot sign request") | ||
} | ||
|
||
if awsService == "" { | ||
return errors.New("no AWS service was provided. Cannot sign request") | ||
} | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
package awsauth | ||
|
||
import ( | ||
"errors" | ||
"net/http/httptest" | ||
"os" | ||
"testing" | ||
"time" | ||
|
||
. "github.com/smartystreets/goconvey/convey" | ||
) | ||
|
||
const ( | ||
envAccessKeyID = "AWS_ACCESS_KEY_ID" | ||
envSecretAccessKey = "AWS_SECRET_ACCESS_KEY" | ||
|
||
testAccessKey = "TEST_ACCESS_KEY" | ||
testSecretAccessKey = "TEST_SECRET_KEY" | ||
) | ||
|
||
func TestCreateNewSigner(t *testing.T) { | ||
Convey("Given that we want to create the aws sdk signer", t, func() { | ||
Convey("When the region is set to an empty string", func() { | ||
Convey("Then an error is returned when retrieving aws sdk signer", func() { | ||
signer, err := NewAwsSigner("", "", "", "es") | ||
So(err, ShouldResemble, errors.New("no AWS region was provided. Cannot sign request")) | ||
So(signer, ShouldBeNil) | ||
}) | ||
}) | ||
|
||
Convey("When the service is set to an empty string", func() { | ||
Convey("Then an error is returned when retrieving aws sdk signer", func() { | ||
signer, err := NewAwsSigner("", "", "eu-west-1", "") | ||
So(err, ShouldResemble, errors.New("no AWS service was provided. Cannot sign request")) | ||
So(signer, ShouldBeNil) | ||
}) | ||
}) | ||
|
||
Convey("When the service and region are set and credentials are set in environment variables", func() { | ||
accessKeyID, secretAccessKey := setEnvironmentVars() | ||
|
||
Convey("Then no error is returned when retrieving aws sdk signer", func() { | ||
signer, err := NewAwsSigner("", "", "eu-west-1", "es") | ||
So(err, ShouldBeNil) | ||
So(signer, ShouldNotBeNil) | ||
|
||
Convey("And no error is returned when attempting to Sign the request", func() { | ||
req := httptest.NewRequest("GET", "http://test-url", nil) | ||
|
||
err := signer.Sign(req, nil, time.Now()) | ||
So(err, ShouldBeNil) | ||
}) | ||
}) | ||
|
||
removeTestEnvironmentVariables(accessKeyID, secretAccessKey) | ||
}) | ||
}) | ||
} | ||
|
||
func TestSignFunc(t *testing.T) { | ||
Convey("Given that we want to use the aws sdk signer to sign request", t, func() { | ||
Convey("When the signer is nil", func() { | ||
Convey("Then an error is returned when attempting to Sign the request", func() { | ||
var signer *Signer | ||
req := httptest.NewRequest("GET", "http://test-url", nil) | ||
|
||
err := signer.Sign(req, nil, time.Now()) | ||
So(err, ShouldResemble, errors.New("v4 signer missing. Cannot sign request")) | ||
}) | ||
}) | ||
|
||
Convey("When the signer.v4 is nil", func() { | ||
Convey("Then an error is returned when attempting to Sign the request", func() { | ||
signer := &Signer{ | ||
v4: nil, | ||
} | ||
req := httptest.NewRequest("GET", "http://test-url", nil) | ||
|
||
err := signer.Sign(req, nil, time.Now()) | ||
So(err, ShouldResemble, errors.New("v4 signer missing. Cannot sign request")) | ||
}) | ||
}) | ||
|
||
Convey("When the signer.v4 is a valid aws v4 signer", func() { | ||
// Create valid v4 signer | ||
accessKeyID, secretAccessKey := setEnvironmentVars() | ||
|
||
signer, err := NewAwsSigner("", "", "eu-west-1", "es") | ||
So(err, ShouldBeNil) | ||
So(signer, ShouldNotBeNil) | ||
So(signer.v4, ShouldNotBeNil) | ||
|
||
Convey("Then the request successfully signs and does not return an error", func() { | ||
|
||
req := httptest.NewRequest("GET", "http://test-url", nil) | ||
|
||
err = signer.Sign(req, nil, time.Now()) | ||
So(err, ShouldBeNil) | ||
}) | ||
|
||
removeTestEnvironmentVariables(accessKeyID, secretAccessKey) | ||
}) | ||
}) | ||
} | ||
|
||
func setEnvironmentVars() (accessKeyID, secretAccessKey string) { | ||
accessKeyID = os.Getenv(envAccessKeyID) | ||
secretAccessKey = os.Getenv(envSecretAccessKey) | ||
|
||
os.Setenv(envAccessKeyID, testAccessKey) | ||
os.Setenv(envSecretAccessKey, testSecretAccessKey) | ||
|
||
return | ||
} | ||
|
||
func removeTestEnvironmentVariables(accessKeyID, secretAccessKey string) { | ||
os.Setenv(envAccessKeyID, accessKeyID) | ||
os.Setenv(envSecretAccessKey, secretAccessKey) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters