Skip to content

Commit 58240d4

Browse files
authored
Merge pull request #61 from passbolt/v5-fix-jsonschema
V5 fix jsonschema
2 parents 1ffa5a2 + c5c9259 commit 58240d4

File tree

6 files changed

+60
-69
lines changed

6 files changed

+60
-69
lines changed

api/resource_types.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ type ResourceType struct {
1717
}
1818

1919
type ResourceTypeSchema struct {
20-
Resource json.RawMessage `json:"resource"`
21-
Secret json.RawMessage `json:"secret"`
20+
Resource map[string]any `json:"resource"`
21+
Secret map[string]any `json:"secret"`
2222
}
2323

2424
// GetResourceTypesOptions is a placeholder for future options

go.mod

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ module github.com/passbolt/go-passbolt
33
go 1.23.0
44

55
require (
6-
github.com/ProtonMail/gopenpgp/v3 v3.1.3
6+
github.com/ProtonMail/gopenpgp/v3 v3.3.0
77
github.com/google/go-querystring v1.1.0
88
github.com/google/uuid v1.6.0
9-
github.com/santhosh-tekuri/jsonschema v1.2.4
9+
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2
1010
)
1111

1212
require (
13-
github.com/ProtonMail/go-crypto v1.1.6 // indirect
14-
github.com/cloudflare/circl v1.6.0 // indirect
15-
github.com/pkg/errors v0.9.1 // indirect
16-
golang.org/x/crypto v0.35.0 // indirect
17-
golang.org/x/sys v0.30.0 // indirect
13+
github.com/ProtonMail/go-crypto v1.3.0 // indirect
14+
github.com/cloudflare/circl v1.6.1 // indirect
15+
golang.org/x/crypto v0.41.0 // indirect
16+
golang.org/x/sys v0.35.0 // indirect
17+
golang.org/x/text v0.28.0 // indirect
1818
)

go.sum

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,31 @@
1-
github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw=
2-
github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
3-
github.com/ProtonMail/gopenpgp/v3 v3.1.3 h1:nxUd0Na4MeElx0sA1t6U8/IxmjmCv3MKnTJGhEUK+qY=
4-
github.com/ProtonMail/gopenpgp/v3 v3.1.3/go.mod h1:Ve9JYzwGau9DT0F9C9gsuEBU/T3Zbk0j1/+mPpWBogc=
5-
github.com/cloudflare/circl v1.6.0 h1:cr5JKic4HI+LkINy2lg3W2jF8sHCVTBncJr5gIIq7qk=
6-
github.com/cloudflare/circl v1.6.0/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
7-
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
8-
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1+
github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw=
2+
github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE=
3+
github.com/ProtonMail/gopenpgp/v3 v3.3.0 h1:N6rHCH5PWwB6zSRMgRj1EbAMQHUAAHxH3Oo4KibsPwY=
4+
github.com/ProtonMail/gopenpgp/v3 v3.3.0/go.mod h1:J+iNPt0/5EO9wRt7Eit9dRUlzyu3hiGX3zId6iuaKOk=
5+
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
6+
github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
7+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
8+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9+
github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI=
10+
github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
911
github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM=
1012
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
1113
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
1214
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
1315
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
1416
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
15-
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
16-
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
1717
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1818
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
19-
github.com/santhosh-tekuri/jsonschema v1.2.4 h1:hNhW8e7t+H1vgY+1QeEQpveR6D4+OwKPXCfD2aieJis=
20-
github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4=
21-
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
22-
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
23-
golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs=
24-
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
25-
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
26-
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
19+
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ=
20+
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
21+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
22+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
23+
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
24+
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
25+
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
26+
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
27+
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
28+
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
2729
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
28-
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
29-
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
30+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
31+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

helper/metadata.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package helper
22

33
import (
4-
"bytes"
54
"context"
65
"encoding/json"
76
"fmt"
8-
"strings"
97

108
"github.com/ProtonMail/gopenpgp/v3/crypto"
119
"github.com/passbolt/go-passbolt/api"
12-
"github.com/santhosh-tekuri/jsonschema"
10+
"github.com/santhosh-tekuri/jsonschema/v6"
1311
)
1412

1513
func GetResourceMetadata(ctx context.Context, c *api.Client, resource *api.Resource, rType *api.ResourceType) (string, error) {
@@ -75,7 +73,7 @@ func validateMetadata(rType *api.ResourceType, metadata string) error {
7573

7674
comp := jsonschema.NewCompiler()
7775

78-
err = comp.AddResource("metadata.json", bytes.NewReader(schemaDefinition.Resource))
76+
err = comp.AddResource("metadata.json", schemaDefinition.Resource)
7977
if err != nil {
8078
return fmt.Errorf("Adding Json Schema: %w", err)
8179
}
@@ -85,7 +83,13 @@ func validateMetadata(rType *api.ResourceType, metadata string) error {
8583
return fmt.Errorf("Compiling Json Schema: %w", err)
8684
}
8785

88-
err = schema.Validate(strings.NewReader(metadata))
86+
var parsedMetadata map[string]any
87+
err = json.Unmarshal([]byte(metadata), &parsedMetadata)
88+
if err != nil {
89+
return fmt.Errorf("Unmarshal Secret: %w", err)
90+
}
91+
92+
err = schema.Validate(parsedMetadata)
8993
if err != nil {
9094
return fmt.Errorf("Validating Metadata with Schema: %w", err)
9195
}

helper/resource_get.go

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -37,23 +37,24 @@ func GetResourceFromData(c *api.Client, resource api.Resource, secret api.Secret
3737

3838
ctx := context.TODO()
3939

40+
rawSecretData, err := c.DecryptMessage(secret.Data)
41+
if err != nil {
42+
return "", "", "", "", "", "", fmt.Errorf("Decrypting Secret Data: %w", err)
43+
}
44+
45+
err = validateSecretData(&rType, rawSecretData)
46+
if err != nil {
47+
return "", "", "", "", "", "", fmt.Errorf("Validate Secret Data: %w", err)
48+
}
49+
4050
switch rType.Slug {
4151
case "password-string":
42-
var err error
43-
pw, err = c.DecryptMessage(secret.Data)
44-
if err != nil {
45-
return "", "", "", "", "", "", fmt.Errorf("Decrypting Secret Data: %w", err)
46-
}
52+
pw = rawSecretData
4753
name = resource.Name
4854
username = resource.Username
4955
uri = resource.URI
5056
desc = resource.Description
5157
case "password-and-description":
52-
rawSecretData, err := c.DecryptMessage(secret.Data)
53-
if err != nil {
54-
return "", "", "", "", "", "", fmt.Errorf("Decrypting Secret Data: %w", err)
55-
}
56-
5758
var secretData api.SecretDataTypePasswordAndDescription
5859
err = json.Unmarshal([]byte(rawSecretData), &secretData)
5960
if err != nil {
@@ -65,11 +66,6 @@ func GetResourceFromData(c *api.Client, resource api.Resource, secret api.Secret
6566
pw = secretData.Password
6667
desc = secretData.Description
6768
case "password-description-totp":
68-
rawSecretData, err := c.DecryptMessage(secret.Data)
69-
if err != nil {
70-
return "", "", "", "", "", "", fmt.Errorf("Decrypting Secret Data: %w", err)
71-
}
72-
7369
var secretData api.SecretDataTypePasswordDescriptionTOTP
7470
err = json.Unmarshal([]byte(rawSecretData), &secretData)
7571
if err != nil {
@@ -103,11 +99,6 @@ func GetResourceFromData(c *api.Client, resource api.Resource, secret api.Secret
10399
uri = metadata.URIs[0]
104100
}
105101

106-
rawSecretData, err := c.DecryptMessage(secret.Data)
107-
if err != nil {
108-
return "", "", "", "", "", "", fmt.Errorf("Decrypting Secret Data: %w", err)
109-
}
110-
111102
var secretData api.SecretDataTypeV5Default
112103
err = json.Unmarshal([]byte(rawSecretData), &secretData)
113104
if err != nil {
@@ -133,11 +124,6 @@ func GetResourceFromData(c *api.Client, resource api.Resource, secret api.Secret
133124
uri = metadata.URIs[0]
134125
}
135126

136-
rawSecretData, err := c.DecryptMessage(secret.Data)
137-
if err != nil {
138-
return "", "", "", "", "", "", fmt.Errorf("Decrypting Secret Data: %w", err)
139-
}
140-
141127
var secretData api.SecretDataTypeV5DefaultWithTOTP
142128
err = json.Unmarshal([]byte(rawSecretData), &secretData)
143129
if err != nil {
@@ -166,11 +152,6 @@ func GetResourceFromData(c *api.Client, resource api.Resource, secret api.Secret
166152
// Not available in the Secret
167153
desc = metadata.Description
168154

169-
rawSecretData, err := c.DecryptMessage(secret.Data)
170-
if err != nil {
171-
return "", "", "", "", "", "", fmt.Errorf("Decrypting Secret Data: %w", err)
172-
}
173-
174155
pw = rawSecretData
175156
case "v5-totp-standalone":
176157
rawMetadata, err := GetResourceMetadata(ctx, c, &resource, &rType)

helper/secret.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
package helper
22

33
import (
4-
"bytes"
54
"encoding/json"
65
"fmt"
7-
"strings"
86

97
"github.com/passbolt/go-passbolt/api"
10-
"github.com/santhosh-tekuri/jsonschema"
8+
"github.com/santhosh-tekuri/jsonschema/v6"
119
)
1210

1311
func validateSecretData(rType *api.ResourceType, secretData string) error {
@@ -54,7 +52,7 @@ func validateSecretData(rType *api.ResourceType, secretData string) error {
5452

5553
comp := jsonschema.NewCompiler()
5654

57-
err = comp.AddResource("secret.json", bytes.NewReader(schemaDefinition.Secret))
55+
err = comp.AddResource("secret.json", schemaDefinition.Secret)
5856
if err != nil {
5957
return fmt.Errorf("Adding Json Schema: %w", err)
6058
}
@@ -64,7 +62,13 @@ func validateSecretData(rType *api.ResourceType, secretData string) error {
6462
return fmt.Errorf("Compiling Json Schema: %w", err)
6563
}
6664

67-
err = schema.Validate(strings.NewReader(secretData))
65+
var parsedSecretData map[string]any
66+
err = json.Unmarshal([]byte(secretData), &parsedSecretData)
67+
if err != nil {
68+
return fmt.Errorf("Unmarshal Secret: %w", err)
69+
}
70+
71+
err = schema.Validate(parsedSecretData)
6872
if err != nil {
6973
return fmt.Errorf("Validating Secret Data with Schema: %w", err)
7074
}

0 commit comments

Comments
 (0)