mirror of
https://github.com/project-zot/zot.git
synced 2025-02-17 23:45:36 -05:00
fix: do not recreate trustpolicy secret if the content doesn't change (#1800)
Signed-off-by: Andreea-Lupu <andreealupu1470@yahoo.com>
This commit is contained in:
parent
6461b661f1
commit
e3876879b0
2 changed files with 57 additions and 81 deletions
|
@ -709,6 +709,15 @@ func TestAWSTrustStore(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
secretsManagerCacheMock := mocks.SecretsManagerCacheMock{
|
||||||
|
GetSecretStringFn: func(secretID string) (string, error) {
|
||||||
|
return "", errUnexpectedError
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = imagetrust.NewCertificateAWSStorage(secretsManagerMock, secretsManagerCacheMock)
|
||||||
|
So(err, ShouldNotBeNil)
|
||||||
|
|
||||||
_, err = imagetrust.NewCertificateAWSStorage(secretsManagerMock, smCache)
|
_, err = imagetrust.NewCertificateAWSStorage(secretsManagerMock, smCache)
|
||||||
So(err, ShouldNotBeNil)
|
So(err, ShouldNotBeNil)
|
||||||
|
|
||||||
|
@ -913,21 +922,21 @@ func TestAWSTrustStore(t *testing.T) {
|
||||||
|
|
||||||
manifestDigest := image.Digest()
|
manifestDigest := image.Digest()
|
||||||
|
|
||||||
smanager, err := imagetrust.GetSecretsManagerClient("us-east-2", os.Getenv("DYNAMODBMOCK_ENDPOINT"))
|
secretsManagerMock := mocks.SecretsManagerMock{
|
||||||
So(err, ShouldBeNil)
|
CreateSecretFn: func(ctx context.Context, params *secretsmanager.CreateSecretInput,
|
||||||
|
optFns ...func(*secretsmanager.Options),
|
||||||
|
) (*secretsmanager.CreateSecretOutput, error) {
|
||||||
|
return &secretsmanager.CreateSecretOutput{}, nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
smCache := imagetrust.GetSecretsManagerRetrieval("us-east-2", os.Getenv("DYNAMODBMOCK_ENDPOINT"))
|
secretsManagerCacheMock := mocks.SecretsManagerCacheMock{
|
||||||
|
GetSecretStringFn: func(secretID string) (string, error) {
|
||||||
|
return "", errUnexpectedError
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
notationStorage, err := imagetrust.NewCertificateAWSStorage(smanager, smCache)
|
notationStorage, err := imagetrust.NewCertificateAWSStorage(secretsManagerMock, secretsManagerCacheMock)
|
||||||
So(err, ShouldBeNil)
|
|
||||||
|
|
||||||
force := true
|
|
||||||
|
|
||||||
_, err = smanager.DeleteSecret(context.Background(),
|
|
||||||
&secretsmanager.DeleteSecretInput{
|
|
||||||
SecretId: &trustpolicy,
|
|
||||||
ForceDeleteWithoutRecovery: &force,
|
|
||||||
})
|
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
imgTrustStore := &imagetrust.ImageTrustStore{
|
imgTrustStore := &imagetrust.ImageTrustStore{
|
||||||
|
@ -948,104 +957,61 @@ func TestAWSTrustStore(t *testing.T) {
|
||||||
|
|
||||||
manifestDigest := image.Digest()
|
manifestDigest := image.Digest()
|
||||||
|
|
||||||
smanager, err := imagetrust.GetSecretsManagerClient("us-east-2", os.Getenv("DYNAMODBMOCK_ENDPOINT"))
|
secretsManagerMock := mocks.SecretsManagerMock{
|
||||||
So(err, ShouldBeNil)
|
CreateSecretFn: func(ctx context.Context, params *secretsmanager.CreateSecretInput,
|
||||||
|
optFns ...func(*secretsmanager.Options),
|
||||||
|
) (*secretsmanager.CreateSecretOutput, error) {
|
||||||
|
return &secretsmanager.CreateSecretOutput{}, nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
smCache := imagetrust.GetSecretsManagerRetrieval("us-east-2", os.Getenv("DYNAMODBMOCK_ENDPOINT"))
|
secretsManagerCacheMock := mocks.SecretsManagerCacheMock{
|
||||||
|
GetSecretStringFn: func(secretID string) (string, error) {
|
||||||
|
return "invalid content", nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
notationStorage, err := imagetrust.NewCertificateAWSStorage(smanager, smCache)
|
notationStorage, err := imagetrust.NewCertificateAWSStorage(secretsManagerMock, secretsManagerCacheMock)
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
imgTrustStore := &imagetrust.ImageTrustStore{
|
imgTrustStore := &imagetrust.ImageTrustStore{
|
||||||
NotationStorage: notationStorage,
|
NotationStorage: notationStorage,
|
||||||
}
|
}
|
||||||
|
|
||||||
force := true
|
|
||||||
|
|
||||||
_, err = smanager.DeleteSecret(context.Background(),
|
|
||||||
&secretsmanager.DeleteSecretInput{
|
|
||||||
SecretId: &trustpolicy,
|
|
||||||
ForceDeleteWithoutRecovery: &force,
|
|
||||||
})
|
|
||||||
So(err, ShouldBeNil)
|
|
||||||
|
|
||||||
description := "notation trustpolicy file"
|
|
||||||
secret := "invalid content"
|
|
||||||
|
|
||||||
_, err = smanager.CreateSecret(context.Background(),
|
|
||||||
&secretsmanager.CreateSecretInput{
|
|
||||||
Name: &trustpolicy,
|
|
||||||
Description: &description,
|
|
||||||
SecretString: &secret,
|
|
||||||
})
|
|
||||||
So(err, ShouldBeNil)
|
|
||||||
|
|
||||||
_, _, _, err = imgTrustStore.VerifySignature("notation", []byte("signature"), "", manifestDigest,
|
_, _, _, err = imgTrustStore.VerifySignature("notation", []byte("signature"), "", manifestDigest,
|
||||||
manifestContent, repo)
|
manifestContent, repo)
|
||||||
So(err, ShouldNotBeNil)
|
So(err, ShouldNotBeNil)
|
||||||
|
|
||||||
smanager, err = imagetrust.GetSecretsManagerClient("us-east-2", os.Getenv("DYNAMODBMOCK_ENDPOINT"))
|
secretsManagerCacheMock = mocks.SecretsManagerCacheMock{
|
||||||
So(err, ShouldBeNil)
|
GetSecretStringFn: func(secretID string) (string, error) {
|
||||||
|
return base64.StdEncoding.EncodeToString([]byte("invalid content")), nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
smCache = imagetrust.GetSecretsManagerRetrieval("us-east-2", os.Getenv("DYNAMODBMOCK_ENDPOINT"))
|
notationStorage, err = imagetrust.NewCertificateAWSStorage(secretsManagerMock, secretsManagerCacheMock)
|
||||||
|
|
||||||
notationStorage, err = imagetrust.NewCertificateAWSStorage(smanager, smCache)
|
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
imgTrustStore = &imagetrust.ImageTrustStore{
|
imgTrustStore = &imagetrust.ImageTrustStore{
|
||||||
NotationStorage: notationStorage,
|
NotationStorage: notationStorage,
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = smanager.DeleteSecret(context.Background(),
|
|
||||||
&secretsmanager.DeleteSecretInput{
|
|
||||||
SecretId: &trustpolicy,
|
|
||||||
ForceDeleteWithoutRecovery: &force,
|
|
||||||
})
|
|
||||||
So(err, ShouldBeNil)
|
|
||||||
|
|
||||||
newSecret := base64.StdEncoding.EncodeToString([]byte(secret))
|
|
||||||
|
|
||||||
_, err = smanager.CreateSecret(context.Background(),
|
|
||||||
&secretsmanager.CreateSecretInput{
|
|
||||||
Name: &trustpolicy,
|
|
||||||
Description: &description,
|
|
||||||
SecretString: &newSecret,
|
|
||||||
})
|
|
||||||
So(err, ShouldBeNil)
|
|
||||||
|
|
||||||
_, _, _, err = imgTrustStore.VerifySignature("notation", []byte("signature"), "", manifestDigest,
|
_, _, _, err = imgTrustStore.VerifySignature("notation", []byte("signature"), "", manifestDigest,
|
||||||
manifestContent, repo)
|
manifestContent, repo)
|
||||||
So(err, ShouldNotBeNil)
|
So(err, ShouldNotBeNil)
|
||||||
|
|
||||||
smanager, err = imagetrust.GetSecretsManagerClient("us-east-2", os.Getenv("DYNAMODBMOCK_ENDPOINT"))
|
secretsManagerCacheMock = mocks.SecretsManagerCacheMock{
|
||||||
So(err, ShouldBeNil)
|
GetSecretStringFn: func(secretID string) (string, error) {
|
||||||
|
return base64.StdEncoding.EncodeToString([]byte(`{"Version": {"bad": "input"}}`)), nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
smCache = imagetrust.GetSecretsManagerRetrieval("us-east-2", os.Getenv("DYNAMODBMOCK_ENDPOINT"))
|
notationStorage, err = imagetrust.NewCertificateAWSStorage(secretsManagerMock, secretsManagerCacheMock)
|
||||||
|
|
||||||
notationStorage, err = imagetrust.NewCertificateAWSStorage(smanager, smCache)
|
|
||||||
So(err, ShouldBeNil)
|
So(err, ShouldBeNil)
|
||||||
|
|
||||||
imgTrustStore = &imagetrust.ImageTrustStore{
|
imgTrustStore = &imagetrust.ImageTrustStore{
|
||||||
NotationStorage: notationStorage,
|
NotationStorage: notationStorage,
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = smanager.DeleteSecret(context.Background(),
|
|
||||||
&secretsmanager.DeleteSecretInput{
|
|
||||||
SecretId: &trustpolicy,
|
|
||||||
ForceDeleteWithoutRecovery: &force,
|
|
||||||
})
|
|
||||||
So(err, ShouldBeNil)
|
|
||||||
|
|
||||||
newSecret = base64.StdEncoding.EncodeToString([]byte(`{"Version": {"bad": "input"}}`))
|
|
||||||
|
|
||||||
_, err = smanager.CreateSecret(context.Background(),
|
|
||||||
&secretsmanager.CreateSecretInput{
|
|
||||||
Name: &trustpolicy,
|
|
||||||
Description: &description,
|
|
||||||
SecretString: &newSecret,
|
|
||||||
})
|
|
||||||
So(err, ShouldBeNil)
|
|
||||||
|
|
||||||
_, _, _, err = imgTrustStore.VerifySignature("notation", []byte("signature"), "", manifestDigest,
|
_, _, _, err = imgTrustStore.VerifySignature("notation", []byte("signature"), "", manifestDigest,
|
||||||
manifestContent, repo)
|
manifestContent, repo)
|
||||||
So(err, ShouldNotBeNil)
|
So(err, ShouldNotBeNil)
|
||||||
|
|
|
@ -171,6 +171,16 @@ func (cloud *CertificateAWSStorage) InitTrustpolicy(trustpolicy []byte) error {
|
||||||
|
|
||||||
_, err := cloud.secretsManagerClient.CreateSecret(context.Background(), secretInputParam)
|
_, err := cloud.secretsManagerClient.CreateSecret(context.Background(), secretInputParam)
|
||||||
if err != nil && strings.Contains(err.Error(), "the secret trustpolicy already exists.") {
|
if err != nil && strings.Contains(err.Error(), "the secret trustpolicy already exists.") {
|
||||||
|
trustpolicyContent, err := cloud.secretsManagerCache.GetSecretString(name)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
existingTrustpolicy, err := base64.StdEncoding.DecodeString(trustpolicyContent)
|
||||||
|
if err == nil && bytes.Equal(trustpolicy, existingTrustpolicy) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
force := true
|
force := true
|
||||||
|
|
||||||
deleteSecretParam := &secretsmanager.DeleteSecretInput{
|
deleteSecretParam := &secretsmanager.DeleteSecretInput{
|
||||||
|
|
Loading…
Add table
Reference in a new issue