Skip to content

Commit db203ef

Browse files
authored
Merge pull request #7 from bloock/feature/EIT-3571
2 parents a246de3 + d3b9189 commit db203ef

File tree

11 files changed

+150
-27
lines changed

11 files changed

+150
-27
lines changed

go.mod

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.18
44

55
require (
66
entgo.io/ent v0.12.4
7-
github.com/bloock/bloock-sdk-go/v2 v2.7.2
7+
github.com/bloock/bloock-sdk-go/v2 v2.8.0-beta.1
88
github.com/cenkalti/backoff/v4 v4.2.1
99
github.com/gin-contrib/logger v0.2.6
1010
github.com/gin-gonic/gin v1.9.1
@@ -17,7 +17,6 @@ require (
1717
github.com/rs/zerolog v1.29.1
1818
github.com/spf13/viper v1.16.0
1919
github.com/stretchr/testify v1.8.4
20-
2120
)
2221

2322
require (

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ github.com/agext/levenshtein v1.2.1 h1:QmvMAjj2aEICytGiWzmxoE0x2KZvE0fvmqMOfy2tj
4747
github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
4848
github.com/apparentlymart/go-textseg/v13 v13.0.0 h1:Y+KvPE1NYz0xl601PVImeQfFyEy6iT90AvPUL1NNfNw=
4949
github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo=
50-
github.com/bloock/bloock-sdk-go/v2 v2.7.2 h1:1yNtZ6UFGoUFhDsPdKepZgui/u2qhUztI34Y/B4kJiA=
51-
github.com/bloock/bloock-sdk-go/v2 v2.7.2/go.mod h1:RrRlRYIeIWjkzibXo+m9uAUMcP5lASHgl04UhjwSLdw=
50+
github.com/bloock/bloock-sdk-go/v2 v2.8.0-beta.1 h1:Og6cJOuAMwlpOsIkV/Gm7gdeL36u2Hz+Te4TMj6lX6w=
51+
github.com/bloock/bloock-sdk-go/v2 v2.8.0-beta.1/go.mod h1:RrRlRYIeIWjkzibXo+m9uAUMcP5lASHgl04UhjwSLdw=
5252
github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
5353
github.com/bytedance/sonic v1.9.2 h1:GDaNjuWSGu09guE9Oql0MSTNhNCLlWwO8y/xM5BzcbM=
5454
github.com/bytedance/sonic v1.9.2/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package domain
2+
3+
import (
4+
"errors"
5+
"strings"
6+
)
7+
8+
var (
9+
ErrEmptyAccessCode = errors.New("empty access code provided")
10+
)
11+
12+
type AccessControlType int
13+
14+
const (
15+
TotpAccessControl AccessControlType = iota
16+
SecretAccessControl AccessControlType = iota
17+
)
18+
19+
func (t AccessControlType) String() string {
20+
switch t {
21+
case TotpAccessControl:
22+
return "totp"
23+
case SecretAccessControl:
24+
return "secret"
25+
}
26+
return ""
27+
}
28+
29+
func ParseAccessControlType(value string) (AccessControlType, error) {
30+
switch strings.ToLower(value) {
31+
case "totp":
32+
return TotpAccessControl, nil
33+
case "secret":
34+
return SecretAccessControl, nil
35+
}
36+
return 0, errors.New("invalid access control type")
37+
}

internal/domain/repository/authenticity_repository.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
type AuthenticityRepository interface {
1111
SignWithLocalKey(ctx context.Context, data []byte, localKey key.LocalKey) (string, *record.Record, error)
12-
SignWithManagedKey(ctx context.Context, data []byte, managedKey key.ManagedKey) (string, *record.Record, error)
12+
SignWithManagedKey(ctx context.Context, data []byte, managedKey key.ManagedKey, accessControl *key.AccessControl) (string, *record.Record, error)
1313
SignWithLocalCertificate(ctx context.Context, data []byte, localCertificate key.LocalCertificate) (string, *record.Record, error)
14-
SignWithManagedCertificate(ctx context.Context, data []byte, managedCertificate key.ManagedCertificate) (string, *record.Record, error)
14+
SignWithManagedCertificate(ctx context.Context, data []byte, managedCertificate key.ManagedCertificate, accessControl *key.AccessControl) (string, *record.Record, error)
1515
}

internal/domain/repository/encryption_repository.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ import (
99

1010
type EncryptionRepository interface {
1111
EncryptWithLocalKey(ctx context.Context, data []byte, localKey key.LocalKey) (*record.Record, error)
12-
EncryptWithManagedKey(ctx context.Context, data []byte, managedKey key.ManagedKey) (*record.Record, error)
13-
EncryptWithManagedCertificate(ctx context.Context, data []byte, managedCertificate key.ManagedCertificate) (*record.Record, error)
12+
EncryptWithManagedKey(ctx context.Context, data []byte, managedKey key.ManagedKey, accessControl *key.AccessControl) (*record.Record, error)
13+
EncryptWithManagedCertificate(ctx context.Context, data []byte, managedCertificate key.ManagedCertificate, accessControl *key.AccessControl) (*record.Record, error)
1414
}

internal/platform/repository/authenticity_repository.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ func (b BloockAuthenticityRepository) SignWithLocalKey(ctx context.Context, data
4444
return signatures[0].Signature, &rec, nil
4545
}
4646

47-
func (b BloockAuthenticityRepository) SignWithManagedKey(ctx context.Context, data []byte, managedKey key.ManagedKey) (string, *record.Record, error) {
48-
signer := authenticity.NewSignerWithManagedKey(managedKey, nil)
47+
func (b BloockAuthenticityRepository) SignWithManagedKey(ctx context.Context, data []byte, managedKey key.ManagedKey, accessControl *key.AccessControl) (string, *record.Record, error) {
48+
signer := authenticity.NewSignerWithManagedKey(managedKey, nil, accessControl)
4949
rec, err := b.client.RecordClient.FromBytes(data).WithSigner(signer).Build()
5050
if err != nil {
5151
b.logger.Error().Err(err).Msg("")
@@ -76,8 +76,8 @@ func (b BloockAuthenticityRepository) SignWithLocalCertificate(ctx context.Conte
7676
return signatures[0].Signature, &rec, nil
7777
}
7878

79-
func (b BloockAuthenticityRepository) SignWithManagedCertificate(ctx context.Context, data []byte, managedCertificate key.ManagedCertificate) (string, *record.Record, error) {
80-
signer := authenticity.NewSignerWithManagedCertificate(managedCertificate, nil)
79+
func (b BloockAuthenticityRepository) SignWithManagedCertificate(ctx context.Context, data []byte, managedCertificate key.ManagedCertificate, accessControl *key.AccessControl) (string, *record.Record, error) {
80+
signer := authenticity.NewSignerWithManagedCertificate(managedCertificate, nil, accessControl)
8181
rec, err := b.client.RecordClient.FromBytes(data).WithSigner(signer).Build()
8282
if err != nil {
8383
b.logger.Error().Err(err).Msg("")

internal/platform/repository/encryption_repository.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ func (b BloockEncryptionRepository) EncryptWithLocalKey(ctx context.Context, dat
3939
return &rec, nil
4040
}
4141

42-
func (b BloockEncryptionRepository) EncryptWithManagedKey(ctx context.Context, data []byte, managedKey key.ManagedKey) (*record.Record, error) {
43-
encrypter := encryption.NewEncrypterWithManagedKey(managedKey)
42+
func (b BloockEncryptionRepository) EncryptWithManagedKey(ctx context.Context, data []byte, managedKey key.ManagedKey, accessControl *key.AccessControl) (*record.Record, error) {
43+
encrypter := encryption.NewEncrypterWithManagedKey(managedKey, accessControl)
4444
rec, err := b.client.RecordClient.FromBytes(data).WithEncrypter(encrypter).Build()
4545
if err != nil {
4646
b.logger.Error().Err(err).Msg("")
@@ -50,8 +50,8 @@ func (b BloockEncryptionRepository) EncryptWithManagedKey(ctx context.Context, d
5050
return &rec, nil
5151
}
5252

53-
func (b BloockEncryptionRepository) EncryptWithManagedCertificate(ctx context.Context, data []byte, managedCertificate key.ManagedCertificate) (*record.Record, error) {
54-
encrypter := encryption.NewEncrypterWithManagedCertificate(managedCertificate)
53+
func (b BloockEncryptionRepository) EncryptWithManagedCertificate(ctx context.Context, data []byte, managedCertificate key.ManagedCertificate, accessControl *key.AccessControl) (*record.Record, error) {
54+
encrypter := encryption.NewEncrypterWithManagedCertificate(managedCertificate, accessControl)
5555
rec, err := b.client.RecordClient.FromBytes(data).WithEncrypter(encrypter).Build()
5656
if err != nil {
5757
b.logger.Error().Err(err).Msg("")

internal/platform/repository/key_repository.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package repository
22

33
import (
44
"context"
5-
65
"github.com/bloock/bloock-managed-api/internal/domain/repository"
76
"github.com/bloock/bloock-managed-api/internal/pkg"
87
"github.com/bloock/bloock-sdk-go/v2/client"

internal/service/process/process_service.go

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package process
33
import (
44
"context"
55
"errors"
6+
"github.com/bloock/bloock-sdk-go/v2/entity/key"
67
"net/http"
78
"net/url"
89
"path"
@@ -208,8 +209,13 @@ func (s ProcessService) sign(ctx context.Context, file *domain.File, request *re
208209
return nil, "", nil, err
209210
}
210211

212+
accessControl, err := s.buildAccessControl(request.AccessControl)
213+
if err != nil {
214+
return nil, "", nil, err
215+
}
216+
211217
signature, record, err := s.authenticityRepository.
212-
SignWithManagedKey(ctx, file.Bytes(), *managedKey)
218+
SignWithManagedKey(ctx, file.Bytes(), *managedKey, accessControl)
213219
if err != nil {
214220
return nil, "", nil, err
215221
}
@@ -235,8 +241,13 @@ func (s ProcessService) sign(ctx context.Context, file *domain.File, request *re
235241
return nil, "", nil, err
236242
}
237243

244+
accessControl, err := s.buildAccessControl(request.AccessControl)
245+
if err != nil {
246+
return nil, "", nil, err
247+
}
248+
238249
signature, record, err := s.authenticityRepository.
239-
SignWithManagedCertificate(ctx, file.Bytes(), *managedCertificate)
250+
SignWithManagedCertificate(ctx, file.Bytes(), *managedCertificate, accessControl)
240251
if err != nil {
241252
return nil, "", nil, err
242253
}
@@ -266,7 +277,12 @@ func (s ProcessService) encrypt(ctx context.Context, file *domain.File, request
266277
return nil, nil, err
267278
}
268279

269-
record, err := s.encryptionRepository.EncryptWithManagedKey(ctx, file.Bytes(), *managedKey)
280+
accessControl, err := s.buildAccessControl(request.AccessControl)
281+
if err != nil {
282+
return nil, nil, err
283+
}
284+
285+
record, err := s.encryptionRepository.EncryptWithManagedKey(ctx, file.Bytes(), *managedKey, accessControl)
270286
if err != nil {
271287
return nil, record, err
272288
}
@@ -280,7 +296,12 @@ func (s ProcessService) encrypt(ctx context.Context, file *domain.File, request
280296
return nil, nil, err
281297
}
282298

283-
record, err := s.encryptionRepository.EncryptWithManagedCertificate(ctx, file.Bytes(), *managedCertificate)
299+
accessControl, err := s.buildAccessControl(request.AccessControl)
300+
if err != nil {
301+
return nil, nil, err
302+
}
303+
304+
record, err := s.encryptionRepository.EncryptWithManagedCertificate(ctx, file.Bytes(), *managedCertificate, accessControl)
284305
if err != nil {
285306
return nil, record, err
286307
}
@@ -343,3 +364,23 @@ func (n ProcessService) notify(ctx context.Context, certifications []domain.Cert
343364

344365
return nil
345366
}
367+
368+
func (n ProcessService) buildAccessControl(request *request.AccessControlRequest) (*key.AccessControl, error) {
369+
var accessControl key.AccessControl
370+
371+
if request != nil {
372+
code := request.AccessCode
373+
switch request.AccessControlType {
374+
case domain.TotpAccessControl:
375+
accessControl.AccessControlTotp = key.NewAccessControlTotp(code)
376+
case domain.SecretAccessControl:
377+
accessControl.AccessControlSecret = key.NewAccessControlSecret(code)
378+
default:
379+
return nil, errors.New("invalid access control type")
380+
}
381+
} else {
382+
return nil, nil
383+
}
384+
385+
return &accessControl, nil
386+
}

internal/service/process/request/process_request.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,19 @@ type ManagedCertificateRequest struct {
3333
Uuid uuid.UUID
3434
}
3535

36+
type AccessControlRequest struct {
37+
AccessControlType domain.AccessControlType
38+
AccessCode string
39+
}
40+
3641
type AuthenticityRequest struct {
3742
Enabled bool
3843
KeySource domain.KeyType
3944
LocalKey *LocalKeyRequest
4045
LocalCertificate *LocalCertificateRequest
4146
ManagedKey *ManagedKeyRequest
4247
ManagedCertificate *ManagedCertificateRequest
48+
AccessControl *AccessControlRequest
4349
}
4450

4551
type EncryptionRequest struct {
@@ -49,6 +55,7 @@ type EncryptionRequest struct {
4955
LocalCertificate *LocalCertificateRequest
5056
ManagedKey *ManagedKeyRequest
5157
ManagedCertificate *ManagedCertificateRequest
58+
AccessControl *AccessControlRequest
5259
}
5360

5461
type AvailabilityRequest struct {
@@ -125,6 +132,23 @@ func NewProcessRequest(file domain.File, request *request.ProcessFormRequest) (*
125132
}
126133
}
127134

135+
if request.Authenticity.AccessEnabled {
136+
if request.Authenticity.AccessCode == "" {
137+
return nil, domain.ErrEmptyAccessCode
138+
}
139+
authenticityAccessType, err := domain.ParseAccessControlType(request.Authenticity.AccessType)
140+
if err != nil {
141+
return nil, err
142+
}
143+
accessControl := &AccessControlRequest{
144+
AccessControlType: authenticityAccessType,
145+
}
146+
accessControl.AccessCode = request.Authenticity.AccessCode
147+
authenticityRequest.AccessControl = accessControl
148+
} else {
149+
authenticityRequest.AccessControl = nil
150+
}
151+
128152
processRequestInstance.Authenticity = authenticityRequest
129153
}
130154

@@ -177,6 +201,23 @@ func NewProcessRequest(file domain.File, request *request.ProcessFormRequest) (*
177201
}
178202
}
179203

204+
if request.Encryption.AccessEnabled {
205+
if request.Encryption.AccessCode == "" {
206+
return nil, domain.ErrEmptyAccessCode
207+
}
208+
encryptionAccessType, err := domain.ParseAccessControlType(request.Encryption.AccessType)
209+
if err != nil {
210+
return nil, err
211+
}
212+
accessControl := &AccessControlRequest{
213+
AccessControlType: encryptionAccessType,
214+
}
215+
accessControl.AccessCode = request.Encryption.AccessCode
216+
encryptionRequest.AccessControl = accessControl
217+
} else {
218+
encryptionRequest.AccessControl = nil
219+
}
220+
180221
processRequestInstance.Encryption = encryptionRequest
181222
}
182223

pkg/request/process_request.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,21 @@ type ProcessFormIntegrityRequest struct {
99
}
1010

1111
type ProcessFormAuthenticityRequest struct {
12-
Enabled bool `form:"authenticity.enabled,default=false"`
13-
KeySource string `form:"authenticity.keySource"`
14-
Key string `form:"authenticity.key"`
12+
Enabled bool `form:"authenticity.enabled,default=false"`
13+
KeySource string `form:"authenticity.keySource"`
14+
Key string `form:"authenticity.key"`
15+
AccessEnabled bool `form:"authenticity.accessEnabled,default=false"`
16+
AccessType string `form:"authenticity.accessType"`
17+
AccessCode string `form:"authenticity.accessCode"`
1518
}
1619

1720
type ProcessFormEncryptionRequest struct {
18-
Enabled bool `form:"encryption.enabled,default=false"`
19-
KeySource string `form:"encryption.keySource"`
20-
Key string `form:"encryption.key"`
21+
Enabled bool `form:"encryption.enabled,default=false"`
22+
KeySource string `form:"encryption.keySource"`
23+
Key string `form:"encryption.key"`
24+
AccessEnabled bool `form:"encryption.accessEnabled,default=false"`
25+
AccessType string `form:"encryption.accessType"`
26+
AccessCode string `form:"encryption.accessCode"`
2127
}
2228

2329
type ProcessFormAvailabilityRequest struct {

0 commit comments

Comments
 (0)